【问题标题】:Making inline SVG responsive in browsers without using javascript?在不使用 javascript 的情况下使内联 SVG 在浏览器中响应?
【发布时间】:2018-07-28 04:42:09
【问题描述】:

我一直在审查articles like this one,它们非常好,但可能过时了,我想知道在保持纵横比的同时使内联 svg 响应的简单方法是否取得了任何进展?

换句话说,如果我们在 div 容器内有 1:1 纵横比的 svg,并且容器从 400x400 像素缩小到 200x200 像素,那么视图框的宽度和高度参数会加倍。

【问题讨论】:

  • 确定使用viewBox
  • 没有Javascript?
  • 没有javascript?演示会很棒...
  • 之前: 使用文本编辑器更改标记之后:
  • 当其他人在不同尺寸的各种设备上查看页面时会发生什么?他们还需要进去手动更改viewbox参数吗?最终目标是 svg 在具有小屏幕空间的小型设备上自动收缩并在大屏幕上扩展...

标签: javascript html css svg


【解决方案1】:

我对你想要什么感到困惑。当您谈论“视图框宽度和高度参数加倍”时,我不知道您的意思是什么。也许您对viewBox 的工作方式感到困惑。

只要 SVG 有 viewBox,它就应该是响应式的。

在以下示例中,我将 SVG 放入 div 容器中,并为容器大小设置动画以模拟页面大小的变化。

#container {
  width: 200px;
  background: linen;
  animation: scale 1s alternate infinite;
}


@keyframes scale {
  from { width: 200px; }
  to   { width: 100px; }
}
<div id="container">

  <svg viewBox="0 0 100 100">
    <circle cx="50" cy="50" r="40" fill="gold"/>
    <rect x="10" y="50" width="20" height="50" fill="gold"/>
    <rect x="70" y="50" width="20" height="50" fill="gold"/>
    <circle cx="35" cy="45" r="5"/>
    <circle cx="65" cy="45" r="5"/>
  </svg>

</div>
    

但它也可以很容易地成为页面宽度的容器。尝试运行以下 sn-p。然后点击“整页”并调整浏览器窗口大小。:

#container {
  width: 100%;
  background: linen;
}
<div id="container">

  <svg viewBox="0 0 100 100">
    <circle cx="50" cy="50" r="40" fill="gold"/>
    <rect x="10" y="50" width="20" height="50" fill="gold"/>
    <rect x="70" y="50" width="20" height="50" fill="gold"/>
    <circle cx="35" cy="45" r="5"/>
    <circle cx="65" cy="45" r="5"/>
  </svg>

</div>

【讨论】:

  • 好吧!谢谢-那是大开眼界。在查看了一个角度组件和其他一些文件之后,我确信这比它应该的要困难得多……但现在我不相信。再次感谢。
【解决方案2】:

如果你不需要用css改变svg或修改它,我建议你将它用作img元素。您创建一个img 并将您的svg 的路径放在src 中。这就是我的意思:https://codepen.io/tlemaitre/pen/PBKGOo

【讨论】:

  • 这基本上就是我正在寻找的效果,只是响应速度更快。换句话说,如果 div 图像 container 缩小,则内联 svg 也会自动缩小。我希望浏览器现在可能已经解决了这个问题......
  • 如果问题已解决,谢谢您将其标记为已解决:)
【解决方案3】:

我最近遇到了类似的问题,我有一个需要preserveAspectRatio="none" 的容器,以在不同的窗口大小上保持形状流畅,但里面的图像会失真。无论有没有 JS,我都没有看到任何解决这个问题的方法,所以我认为这是不可能的。

【讨论】:

  • 你可能想看看这个角圆形进度组件。 github.com/crisbeto/angular-svg-round-progressbar 我正在研究它的响应部分是如何工作的。 IIUC,如果你设置preserveAspectRatio=none,那么纵横比将不会被保留,所以你的图像会失真。
  • 嗨@Ole,是的,我知道整个纵横比是如何工作的,我试图找到一种保持图像比例的剪辑形状的方法,我可以在其中放置溢出:hidden 形状上的属性,但这是不可能的。
  • 这里有一个非常好的教程:webdesign.tutsplus.com/tutorials/… 例如,当圆圈上的视口设置为 100x100px 时,整个圆圈都会显示,但如果视口 () 设置为 50x50px,然后只显示四分之一的圆圈,其余部分被剪裁……也许你知道……但至少它会剪裁图像……可能必须控制这些属性虽然使用 javascript ...
猜你喜欢
  • 1970-01-01
  • 2021-05-03
  • 1970-01-01
  • 1970-01-01
  • 2020-10-08
  • 2016-10-25
  • 2021-01-13
  • 1970-01-01
相关资源
最近更新 更多