【问题标题】:create fluid (scaling) concentric arcs using css, canvas, or svg使用 css、canvas 或 svg 创建流体(缩放)同心圆弧
【发布时间】:2014-02-24 16:23:42
【问题描述】:

我正在尝试创建这样的图表:

http://bl.ocks.org/cmdoptesc/6228457

或者像这样

http://raphaeljs.com/polar-clock.html

但我希望它能够根据浏览器宽度进行缩放(最好不使用 javascript)。我希望能够仅使用 CSS 来做到这一点,如果不使用 CSS,最好没有像 raphael 或 d3 这样的库(尽管我会尽我所能)。有谁知道如何以缩小/放大的方式实现这一目标?

更新

我做了一个 JS Fiddle - 这正是我想要的图表:

http://jsfiddle.net/Q9hb5/

但我需要它来调整大小。我正在使用 Raphael,我在这里阅读了有关 SVG 调整大小的信息:

http://bertanguven.com/?tag=raphael-js

这里:

http://www.justinmccandless.com/blog/Making+Sense+of+SVG+viewBox%27s+Madness

但我不想用 JS 调整大小 - 我真的很想能够用 svg 属性(例如 viewBox and preserveAspectRatio)来做到这一点,但我仍然没有看到实现这一点的示例。

有什么想法吗?

【问题讨论】:

    标签: javascript css d3.js raphael fluid-layout


    【解决方案1】:

    既然您说您不想使用 Javascript 库,我假设您正在提前和/或在服务器上创建 SVG 图像,并且只是将静态 SVG 代码传输给用户。相比之下,画布图像总是使用 Javascript 制作的。

    (如果您想使用 Javascript 动态创建图表,但不使用库,那么困难的部分将是绘制图表,而不是调整大小!正如 @Lars Kotthoff 所说,使用 Javascript 很容易找出窗口的大小并相应地缩放所有内容。)

    要使 SVG 放大和缩小,您需要在 SVG 元素中包含 viewBox 属性,它会自动缩放。但是,在保持纵横比的同时动态调整图像大小可能有点令人沮丧。 preserveAspectRatio 属性可以防止失真,但只能通过留出空白空间,而不是按比例缩小。在 Firefox 中,使用 height:auto; 将导致 SVG 高度按比例缩小以匹配宽度和 viewBox 纵横比,但在 webkit 浏览器中不会。

    此处示例:
    http://fiddle.jshell.net/9dSbL/

    一个有点间接的解决方案是 + 将 svg 高度设置为可忽略不计(但不为零)的量,例如 1px; +在svg上设置overflow:visible;; + 为preserveAspectRatio 使用slice 选项,以便图像缩放到更大的高度或宽度尺寸; + 在 svg 元素上硬编码与 viewBox 的纵横比相匹配的底部填充样式; + 将整个 svg 包裹在 <div> 中,样式为 overflow:hidden;

    此处示例:
    http://fiddle.jshell.net/9dSbL/1/

    【讨论】:

    • 并响应@mheavers 的编辑。是的,您可以在动态创建的 SVG 上使用 viewBox 属性,使其无需监听窗口事件即可响应。 this answer 中的第一个示例通过添加带有 d3 的 viewBox 属性来使图形响应;你可以和 Raphael 一样轻松地做到这一点。我的其他关于正确获取比例和纵横比的方法仍然有效,您只需在代码中将所有正确的属性添加到 SVG 中。
    • 这太棒了,谢谢。我认为我在您的示例中唯一感到困惑的是您如何派生视图框。 Viewbox 数字对我来说似乎很随意(-3 -1 16 16)
    • 抱歉,这令人困惑的,他们任意的;我重新使用了其他东西的绘图,当形状的边缘被切断时,更改 viewBox 比更改所有曲线坐标更容易。这是the same example with a more standard viewBox。在动态创建 viewBox 时,只需要记住前两个数字是左上角的坐标,后两个数字是宽度和高度,用于所有绘图和布局命令。
    • 一个不那么随意的例子展示了为什么你可能对前两个数字使用非零值:为了显示一个 100*100 的正方形,每边有 30 个单位填充,我使用 viewBox "- 30 -30 160 160": codepen.io/AmeliaBR/pen/pIder
    猜你喜欢
    • 2012-07-16
    • 1970-01-01
    • 1970-01-01
    • 2019-12-28
    • 1970-01-01
    • 2017-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多