【问题标题】:how to make svg responsive [duplicate]如何使svg响应[重复]
【发布时间】:2015-08-23 09:58:38
【问题描述】:

我正在努力使这个巨大的 svg 响应。但是,它不起作用,我不知道为什么。

我尝试了以下方法: - 设置宽度:100% 高度:自动(一旦我删除了以像素为单位的设置宽度/高度,图表就会消失,无论我放回什么) - 使用 @987654321 建议的 viewbox 属性@

这是代码(是的,我知道它很大。为什么我需要使其适合 100% 宽度):http://www.cssdesk.com/bsakG

有人可以提示我做错了什么吗?我尝试了其他文章建议的许多事情,但我似乎一直遇到同样的问题,如果我摆脱固定的高度/宽度,整个事情就消失了。

(是的,我知道这个问题之前可能已经被问过,但没有一个答案能解决我的问题)

【问题讨论】:

  • SVG 不是已经响应了吗?这不就是 SVG(可缩放矢量图形)的本质吗?
  • 是的,它是可扩展的,所以我在问如何扩展它,因为默认情况下,每个路径都有数字。不同的网站建议有不同的方法通过 标签中的不同属性来操作它,但我没有成功。
  • 你试过把这个添加到你最外层<g>:<g transform="scale(.5)">吗?
  • 也许是因为 SVG 规范不允许 % (这对我来说似乎很奇怪) SVG 节点的整体宽度和高度。请参阅here(查看“坐标系单位”部分)
  • 我脑子里唯一能想到的就是使用javascript。您必须将 SVG 宽度除以浏览器窗口宽度,然后将其设置为最外面 <g> 上的比例编号。即如果 SVG 宽度为 3840 像素,浏览器窗口为 2000 像素,则 - 2000 / 3840 = 0.5208333333333333,然后 <g transform="scale(0.5208333333333333)">。但我知道一定有更简单的方法

标签: html css svg responsive-design


【解决方案1】:

我找不到任何可以帮助您的 SVG 原生内容(我尝试过使用 viewBoxpreserveAspectRatio,但没有取得多大成功)。我相信一定有办法,但我可能会过度寻找一些东西。如果有人有更好的解决方案,一定要发布!

我确实得到了一种 JavaScript 方法,所以我想我会分享它。在这个演示中,我将使用 jQuery,但如果你不能使用 jQuery,所有这些都可以使用 vanilla JavaScript 来完成。

JavaScript:

$(function(){
    scaleSVG();
});

function scaleSVG(){
    var window_width = $(window).width(),
        $svg = $('svg'),
        ratio = window_width / $svg.width();

    $svg.css('min-width', window_width);
    $('g:first-child', $svg).attr('transform', 'scale(' + ratio + ')');
};

我做了一个小提琴演示这个方法here(由于 SVG 的大小,加载可能需要一秒钟)。

您也可以将这个scaleSVG() 函数附加到窗口调整大小事件,如下所示:

$(function(){
    $(window).on('resize', scaleSVG);
}); 

我无法让它在小提琴中工作,但我认为可能是因为小提琴环境?

【讨论】:

  • 感谢您的努力。实际上,我昨晚使用绝对位置和容器设法让它在没有 javascript 的情况下工作。我读过的一个网站建议这样做,但我第一次无法让它工作——可能是因为我当时不太了解 viewBox。这是一个更简单的解决方案jsfiddle.net 但是,我仍然不太明白这是如何工作的。我理解绝对位置的工作原理非常好,但我不认为绝对定位实际上也可以调整大小......
  • @Novina 是的,如果您可以避免使用 javascript,那将是最好的 ;)
【解决方案2】:

与 cmets 中的假设相反,使用指定为百分比的长度值是完全可以的。该规范在其基本数据类型部分涵盖了details

将这些知识与您在问题中链接到的文章中的提示相结合,您最终可能会得到类似以下内容的响应式布局:

<svg viewbox="0 0 3840 7000" width="100%" height="100%" preserveAspectRatio="xMinYMin meet">

【讨论】:

  • 可以,但不是设置文档的宽高。它只是告诉渲染器 SVG 内容的尺寸,以便它可以计算正确的比例以使用。假设您知道 SVG 文档的大小,那么这是最简单的方法。
  • 好的。我意识到我知道。虽然 svg 将由用户生成,但 svg 标签实际上确实指定了高度和宽度,但是,格式为 。所以我必须运行一些 jquery 来将其格式化为 viewbox="0 0 ... ...",这很容易做到。感谢您的回答!非常感谢您的帮助!
  • @Novina 问题不在于,如果您知道 svg 的 external 大小,而是知道其内容的大小。由于您使用坐标放置内容,因此您很可能会知道 svg 的这些 internal 尺寸。 viewBox 属性用于建立内容引用的内部 坐标系,而widthheight 引用外部 坐标系。当渲染器缩放内部坐标以适应符合preserveAspectRatio 的外部坐标时,响应的魔力就会发挥作用。
  • @Novina 要让 svg 单独响应宽度的变化,您需要将 height 设置为固定值。
  • @Novina Sara Soueidan 对svg coordinate systems 做了很好的介绍。它非常全面,但绝对值得一读。她还设置了一个interactive demo,可以玩各种值。
猜你喜欢
  • 2013-11-17
  • 2017-05-27
  • 2015-12-08
  • 1970-01-01
  • 1970-01-01
  • 2014-11-14
  • 1970-01-01
  • 2018-05-21
  • 2019-07-19
相关资源
最近更新 更多