如何在不改变高度的情况下让 SVG 具有流畅的宽度?

Posted

技术标签:

【中文标题】如何在不改变高度的情况下让 SVG 具有流畅的宽度?【英文标题】:How to get an SVG to have a fluid width without changing its height? 【发布时间】:2018-08-17 18:59:31 【问题描述】:

我想完成两件事:

    SVG 宽度动态缩放以占据容器宽度的 100%。

    当容器的宽度发生变化时,SVG 要么被拉伸要么被弄脏(意味着用 svg 的路径绘制的波浪)

    SVG 的高度保持固定为 760 像素。目前,如果您调整容器的大小,SVG 的高度会降低,这是不需要的。

.container 
  width: 100%;
  background: green;
  height: 760px;


svg 
 width: 100%;


svg path 
 width: 100%;
  <div class="container">
    <svg   viewBox="0 0 1440 760" fill="none" xmlns="http://www.w3.org/2000/svg">
      <path
        d="M677.112 54.1657C400.36 -43.9336 110.391 13.291 0 54.1657V760H1440V54.1657C1301.02 95.0404 953.865 152.265 677.112 54.1657Z"
        fill="purple"
      />
    </svg>
  </div>

【问题讨论】:

请注意,我们更喜欢这里的技术写作风格。我们轻轻地劝阻问候,希望你能帮助,谢谢,提前感谢,感谢信,问候,亲切的问候,签名,请你能帮助,聊天材料和缩写 txtspk,恳求,你多久了被卡住,投票建议,元评论等。只需解释您的问题,并展示您尝试过的内容,预期的内容以及实际发生的情况。 Meta is here的规范讨论。 【参考方案1】:

我可能会使用 SVG 作为 div 的背景,您可以固定 div 的高度并将background-position 调整为顶部

.container 
  width: 100%;
  background: green;
  height: 760px;


.container>div 
  height: 100%;
  background: 
   url('data:image/svg+xml;utf8,<svg   viewBox="0 0 1440 760" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M677.112 54.1657C400.36 -43.9336 110.391 13.291 0 54.1657V760H1440V54.1657C1301.02 95.0404 953.865 152.265 677.112 54.1657Z"  fill="purple"/></svg>') top/100% no-repeat, 
    /*cover the bottom part with the same color*/
   linear-gradient(purple, purple) bottom/ 100% calc(100% - 20vw) no-repeat;
<div class="container">
  <div>
  </div>
</div>

你也可以减少代码只保留容器:

.container 
  height: 760px;
  background: 
   url('data:image/svg+xml;utf8,<svg   viewBox="0 0 1440 760" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M677.112 54.1657C400.36 -43.9336 110.391 13.291 0 54.1657V760H1440V54.1657C1301.02 95.0404 953.865 152.265 677.112 54.1657Z"  fill="purple"/></svg>') top/100% no-repeat, 
    /*cover the bottom part with the same color*/
   linear-gradient(purple, purple) bottom/ 100% calc(100% - 20vw) no-repeat,
   green;
<div class="container">
</div>

【讨论】:

@AnApprentice 当然这是一个好方法! :p ...好吧,我想说唯一的技巧是底部的渐变,以便在 SVG 小于容器时填充相同的颜色 @AnApprentice 代码也可以缩减为只保留容器,检查更新【参考方案2】:

您可以尝试将preserveAspectRatio="none" 添加到svg 标签。这似乎与位置有点混乱,但可能是一个好的开始。

.container 
  width: 100%;
  background: green;
  height: 760px;


svg 
 width: 100%;


svg path 
 width: 100%;
  <div class="container">
    <svg   viewBox="0 0 1440 760" fill="none" preserveAspectRatio="none"  xmlns="http://www.w3.org/2000/svg">
      <path
        d="M677.112 54.1657C400.36 -43.9336 110.391 13.291 0 54.1657V760H1440V54.1657C1301.02 95.0404 953.865 152.265 677.112 54.1657Z"
        fill="purple"
      />
    </svg>
  </div>

【讨论】:

以上是关于如何在不改变高度的情况下让 SVG 具有流畅的宽度?的主要内容,如果未能解决你的问题,请参考以下文章

如何在具有特定宽度和高度的矩形中获取 svg 文本元素?

计算 SVG 文本高度和宽度的正确方法

如何使 svg 适合 html 的宽度和高度?

如何在不改变坐标的情况下转换(旋转)svg文本元素?

创建一个缩放到浏览器高度但具有设定宽度的 svg

在 D3 v4 中使 SVG 容器具有父容器的 100% 宽度和高度(而不是像素)