【问题标题】:CSS3 3D flip card effect with SVG elements带有 SVG 元素的 CSS3 3D 翻转卡片效果
【发布时间】:2014-10-11 05:16:17
【问题描述】:

有没有办法在使用 d3.js 创建的 SVG 中创建 CSS3 3D 类似翻转卡片的效果?

我需要翻转 D3 图表的一部分,在背面显示不同的内容,类似于this tutorial by David DeSandro 中针对 HTML 元素描述的效果。

animate.css library 包括这样的效果。有没有办法将其应用于 D3 图表的某些部分?

【问题讨论】:

  • 是的,当然,您可以将 CSS 应用到 SVG 或 SVG 的容器元素(可以进行转换)。
  • 并非如此,$('svg #myChartId').addClass('animatedbounceOutLeft') 不起作用,而 $('#someDiv').addClass('animatedbounceOutLeft') 起作用!
  • 并非所有适用于 HTML 的东西都适用于 SVG。但正如我所说,您始终可以将图表放在 HTML 容器元素中并对其应用样式。
  • 感谢 Lars,我实际上需要在 d3 生成图表的一部分内创建翻转效果。
  • 那么您可以为此在变换上使用过渡。这个想法是应用使其翻转的变换,然后简单地添加一个过渡。

标签: css svg d3.js


【解决方案1】:

您使用 d3.js 这一事实完全不会影响创建 3D 变换的能力。然而,您使用 SVG 的事实确实使它变得复杂。

SVG 有自己的变换系统和坐标系统,它与将 CSS 变换应用于 HTML 元素的方式不直接对应。虽然the CSS transforms spec is supposed to apply to SVG,浏览器实现还是很不一致的。

正如 Lars 在 cmets 中所说,如果您想翻转整个 SVG,只需将 CSS 转换(如 in the answer linked by @Harry 所述)应用于父 <div>。但是,为了让单个 SVG 元素或组“翻转”以显示不同的内容,您需要两个不同的 SVG 元素,当其中一个使用 CSS 变换翻转时,它们将一个叠加在另一个之上。

可以将 CSS 转换应用于单个 SVG 元素,但请注意:

  • IE 将完全忽略它们
  • Firefox(v32 及更早版本)和 Chrome(v37 及更早版本)计算变换原点的方式不同,因此您需要定位元素,使 SVG 坐标系原点(Chrome 使用)与边界框原点(由 Firefox 使用)。
  • Chrome 不会翻转单个文本元素。
  • SVG 当前没有 z-index,因此您不能使用它来确保正确的元素位于“顶部”。相反,您必须使用 backface-visibility property 隐藏翻转的元素。

下面的例子是提取from a longer discussion about CSS transforms and SVG that I wrote on CodePen。在几个不同的浏览器中对其进行测试,以了解您遇到的问题:

svg.graphic {
  padding:2em 1.2%;
  margin:0;
  float:left;
  overflow:visible;
  shape-rendering:geometricPrecision;
  stroke-width:3;
}
.graphic.CSS {
  -webkit-perspective:500px;
  perspective:500px;
}
.graphic.CSS.spin *{
  -webkit-transition:3s linear;
  transition:3s linear;
  -webkit-transform-origin:50% 50%;
  transform-origin:50% 50%;
}
.graphic.CSS.spin:hover *{
  -webkit-transform:rotateY(360deg);
  transform:rotateY(360deg);
}
<svg class="graphic CSS spin">
  <g id="svg-shapes">
    <rect width="100%" height="100%" rx="2em" 
          fill="lightblue" stroke="green" />
    <circle r="1.5em" cy="2.5em" cx="70%" 
            fill="lightyellow" stroke="goldenrod" />
    <rect width="5em" height="2em" x="20%" y="2.5em" 
          fill="lavender" stroke="indigo" />
  </g>
  <text x="20%" dx="2.5em" text-anchor="middle" 
        y="2.5em" dy="1em">3D???</text>
</svg>

尽管如此,如果您决定试一试并设法使其正常工作,请回来并在您的解决方案中留下另一个答案。

【讨论】:

  • 我试图让它正常工作,因为我需要一个项目:codepen.io/anon/pen/MYQyJL - 看看底部的悬停卡。我将 svg 元素包装在一个 div 中,并将它们上的相同类应用于 div 并将它们从 svg 中删除。 FF 37.0a2 和 Chrome 41 上的原点和 3d 对齐似乎是固定的(边框和大小被弄乱了,但似乎可以通过更改 css 来修复)(尽管在 Chrome 上,光标离开时的动画由于某种原因具有更长的持续时间)。这是一个解决方案还是我误解了问题所在?
  • @ivy_lynx 是的,这是许多问题的实用解决方案。我的演示更多地是一个让这个问题变得困难的一切的例子,而不是仔细考虑如何使它工作!缺少的一件事是为卡片创建两个“面”。您需要嵌套的&lt;div&gt;s 才能使其工作——一个 div 包裹卡片的每一侧(一个翻转开始),然后是一个外部 div,您将在其上应用翻转旋转。我不知道 Chrome 出了什么问题——自从我更新到 40 后,Codepen 上的 CSS 动画就被严重搞砸了。
  • @AmeliaBR 您知道 2016 年的兼容性改进吗?我在 caniuse.com 上找不到相关功能。
  • @IsaacLyman 恐怕这个消息仍然不好。 MS Edge 中根本不支持应用于 SVG 元素的 CSS 变换,并且在其他浏览器中变换原点和保留 3D 透视图和背面可见性仍然存在问题。对不起...
  • @IsaacLyman 很高兴你适应得很好。如果你小心,你可以避免变换原点问题,并使用不透明度来替换背面可见性。然后只需确保基本布局/transform 属性适用于 IE/Edge/等。这就是我在此演示中所做的:ameliabr.github.io/great-svg-retcon/images/…
猜你喜欢
  • 1970-01-01
  • 2012-04-04
  • 2015-08-22
  • 1970-01-01
  • 2013-01-04
  • 1970-01-01
  • 2014-08-21
  • 1970-01-01
  • 2013-08-27
相关资源
最近更新 更多