首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >非比例缩放SVG图像以适应剩余空间

非比例缩放SVG图像以适应剩余空间
EN

Stack Overflow用户
提问于 2020-09-01 16:32:00
回答 3查看 303关注 0票数 1

下面的箭头由3个单一元素组成。中心部分应该水平伸展,这样箭头就可以填充它周围的容器。但是,正如您在呈现的代码中所看到的,拉伸不起作用。如何使伸展和确保,没有缺口的路口。也许,由于antialiasing (这是强制性的),各部分之间应该有一个小的重叠。

编辑:使用@Turnip建议的preserveAspectRatio="none"是在拉伸图像,但是它会在某些宽度上产生缝隙和跳跃。看这张截图:

根本解释不了这种奇怪的行为!

代码语言:javascript
复制
.arrow {
  display: flex;
  max-width: 200px;
  padding-bottom: 2em;
}

.arrow svg {
  height: 25px;
  shape-rendering: auto;
}

#arrow-1 svg.stretched {}

#arrow-2 svg.stretched {
  width: 100%;
}
代码语言:javascript
复制
<div class="arrow" id="arrow-1">
  <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 13 25">
  <path fill="none" stroke="#000" stroke-miterlimit="10" stroke-width="3" d="M13 2.5h-1.31A5.21 5.21 0 006.5 7.69v14.62"/>
</svg>

  <svg xmlns="http://www.w3.org/2000/svg" class="mid" viewBox="0 0 3 25"><rect y="1" width="3" height="3"/></svg>

  <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 11 25">
  <path fill="none" stroke="#000" stroke-miterlimit="10" stroke-width="3" d="M5.5 15.84V7.69A5.21 5.21 0 00.31 2.5H0"/>
  <path d="M5.5 24.31l4.88-11.94-4.88 2.84-4.88-2.84L5.5 24.31z"/>
</svg>
</div>

<div class="arrow" id="arrow-2">
  <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 13 25">
  <path fill="none" stroke="#000" stroke-miterlimit="10" stroke-width="3" d="M13 2.5h-1.31A5.21 5.21 0 006.5 7.69v14.62"/>
</svg>

  <svg xmlns="http://www.w3.org/2000/svg" class="stretched" viewBox="0 0 3 25"><rect y="1" width="3" height="3"/></svg>

  <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 11 25">
  <path fill="none" stroke="#000" stroke-miterlimit="10" stroke-width="3" d="M5.5 15.84V7.69A5.21 5.21 0 00.31 2.5H0"/>
  <path d="M5.5 24.31l4.88-11.94-4.88 2.84-4.88-2.84L5.5 24.31z"/>
</svg>
</div>

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-09-01 19:19:33

您可以使用CSS完成最大的部分,并且更容易处理:

代码语言:javascript
复制
.box {
  width: 50%;
  margin: auto;
  height: 50px;
  border: 10px solid;
  border-bottom: 0;
  border-radius: 20px 20px 0 0;
  position: relative;
}

.box::after {
  content: "";
  position: absolute;
  bottom: 0;
  right: -5px;
  width: 45px;
  height: 58px;
  transform: translate(50%, 30%);
  background: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 12 11 13"><path d="M5.5 24.31l4.88-11.94-4.88 2.84-4.88-2.84L5.5 24.31z"></path></svg>') bottom/contain no-repeat;
}
代码语言:javascript
复制
<div class="box"></div>

如下所示:

代码语言:javascript
复制
.box {
  width: 50%;
  margin: auto;
  height: 50px;
  border: 10px solid;
  border-bottom: 0;
  border-radius: 20px 20px 0 0;
  position: relative;
}

.box svg {
  position: absolute;
  bottom: 0;
  right: -5px;
  width: 45px;
  transform: translate(50%, 30%);
}
代码语言:javascript
复制
<div class="box">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 12 11 13"><path d="M5.5 24.31l4.88-11.94-4.88 2.84-4.88-2.84L5.5 24.31z"></path></svg>
</div>

票数 2
EN

Stack Overflow用户

发布于 2020-09-01 18:56:21

我只使用一个svg元素,而不是3个svg元素。我将“箭头”的开始和结束放在一个<symbol>元素中,以便在需要它们的地方使用这些形状。请注意,<symbol>元素有一个紧密的视图框( viewbox正在将形状包装得很紧,其大小与形状的边框相同,并为一行的1/2宽度增加了一些空间)。

现在我可以用这些符号的次数,我需要多少次,我需要的地方。

为了连接两个use元素,我使用了一条线。请注意,行(在第一组中)的x1属性为18,其中18 = 10 (第一个use元素的x属性)+8(第一个use元素的宽度属性)。

行的x2属性取决于您需要它的时间,并且它的值与第二个use元素的属性x相同。

代码语言:javascript
复制
<svg viewBox="0 0 130 70">
  <symbol id="start" xmlns="http://www.w3.org/2000/svg" viewBox="5 0 8 22">
    <path fill="none" stroke="#000" stroke-miterlimit="10" stroke-width="3" d="M13 2.5h-1.31A5.21 5.21 0 006.5 7.69v14.62" />
  </symbol>

  <symbol id="end" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 11 25">
    <path fill="none" stroke="#000" stroke-miterlimit="10" stroke-width="3" d="M5.5 15.84V7.69A5.21 5.21 0 00.31 2.5H0" />
    <path d="M5.5 24.31l4.88-11.94-4.88 2.84-4.88-2.84L5.5 24.31z" />
  </symbol>

  <g id="g1">
    <use xlink:href="#start" x="10" width="8" height="22" />
    <use xlink:href="#end" x="100" width="11" height="25" />
    <line x1="18" y1="2.5" x2="100" y2="2.5" stroke="black" stroke-width="3" stroke-linecap="round" />
  </g>
  
  <g id="g2">
    <use xlink:href="#start" x="20" y="35" width="8" height="22" />
    <use xlink:href="#end" x="70" y="35" width="11" height="25" />
    <line x1="28" x2="70" y1="37.5" y2="37.5" stroke="black" stroke-width="3" stroke-linecap="round" />
  </g>
</svg>

票数 2
EN

Stack Overflow用户

发布于 2020-09-01 16:42:33

在您想要扩展的SVG上使用preserveAspectRatio="none"。这将允许内部rect与SVG元素一起拉伸。

代码语言:javascript
复制
.arrow {
  display: flex;
  max-width: 200px;
  padding-bottom: 2em;
}

.arrow svg {
  height: 25px;
  shape-rendering: auto;
}

#arrow-1 svg.stretched {}

#arrow-2 svg.stretched {
  width: 100%;
}
代码语言:javascript
复制
<div class="arrow" id="arrow-1">
  <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 13 25">
  <path fill="none" stroke="#000" stroke-miterlimit="10" stroke-width="3" d="M13 2.5h-1.31A5.21 5.21 0 006.5 7.69v14.62"/>
</svg>

  <svg xmlns="http://www.w3.org/2000/svg" class="mid" viewBox="0 0 3 25"><rect y="1" width="3" height="3"/></svg>

  <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 11 25">
  <path fill="none" stroke="#000" stroke-miterlimit="10" stroke-width="3" d="M5.5 15.84V7.69A5.21 5.21 0 00.31 2.5H0"/>
  <path d="M5.5 24.31l4.88-11.94-4.88 2.84-4.88-2.84L5.5 24.31z"/>
</svg>
</div>

<div class="arrow" id="arrow-2">
  <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 13 25">
  <path fill="none" stroke="#000" stroke-miterlimit="10" stroke-width="3" d="M13 2.5h-1.31A5.21 5.21 0 006.5 7.69v14.62"/>
</svg>

  <svg xmlns="http://www.w3.org/2000/svg" class="stretched" viewBox="0 0 3 25" preserveAspectRatio="none"><rect y="2" width="3" height="3"/></svg>

  <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 11 25">
  <path fill="none" stroke="#000" stroke-miterlimit="10" stroke-width="3" d="M5.5 15.84V7.69A5.21 5.21 0 00.31 2.5H0"/>
  <path d="M5.5 24.31l4.88-11.94-4.88 2.84-4.88-2.84L5.5 24.31z"/>
</svg>
</div>

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63691837

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档