css 变换:二维空间的网页样式

Firefox 3.5 在其 CSS 实现中增加了一项功能,即 变换函数。这些函数允许您通过旋转、倾斜、缩放和平移元素来操纵二维空间中的元素,从而改变其外观。

我已经 制作了一个演示,展示了这些函数是如何工作的。

这个演示中有四个动画对象。让我们逐个看一下它们。

旋转 Firefox 徽标

在左侧,我们看到一个漂亮的盒子里的 Firefox 徽标,愉快地原地旋转。这是通过定期设置图像对象的旋转值来实现的,图像对象的 ID 是logoimg,就像这样

  var logo = document.getElementById("logoimg");

  logoAngle = logoAngle + 2;
  if (logoAngle >= 360) {
    logoAngle = logoAngle - 360;
  }

  var style = "-moz-transform: rotate(" + logoAngle + "deg)";
  logo.setAttribute("style", style);

每次运行动画函数时,我们都会通过构造以下形式的样式字符串,使其绕其原点旋转 2°:-moz-transform: rotate(Ndeg).

默认情况下,所有元素的原点都在其中心(即每个轴的 50%)。可以使用-moz-transform-origin属性更改原点。

倾斜文本

在这个演示中,我们有两个倾斜的例子;第一个是水平倾斜,这会导致文本沿着 X 轴“倾斜”来回移动。第二个是垂直倾斜,这会导致基线沿着 Y 轴枢轴旋转。

在这两种情况下,实现此动画的代码基本相同,因此我们只看一下水平倾斜的代码

  text1SkewAngle = text1SkewAngle + text1SkewOffset;
  if (text1SkewAngle > 45) {
    text1SkewAngle = 45;
    text1SkewOffset = -2;
  } else if (text1SkewAngle < -45) {
    text1SkewAngle = -45;
    text1SkewOffset = 2;
  }

  text1.style.MozTransform = "skewx(" + text1SkewAngle + "deg)";

此代码更新文本倾斜的当前量,从零度开始,在 -45° 和 45° 之间来回移动,每次调用动画函数时移动 2°。正值将元素倾斜到右侧,负值将元素倾斜到左侧。

然后更新元素的变换样式,将变换函数设置为以下形式skewx(Ndeg),然后设置元素的style.MozTransform属性为该值。

缩放元素

演示中包含的最后一个示例展示了如何使用scale变换函数缩放元素

  text3Scale = text3Scale + text3ScaleOffset;
  if (text3Scale > 6) {
    text3Scale = 6;
    text3ScaleOffset = -0.1;
    text3.innerHTML = "It's going away so fast!"
    text3.style.color = "blue";
  } else if (text3Scale < 1) {
    text3Scale = 1;
    text3ScaleOffset = 0.1;
    text3.innerHTML = "It's coming right at us!";
    text3.style.color = "red";
  }

  text3.style.MozTransform = "scale(" + text3Scale + ")";

此代码将元素放大和缩小到其原始大小(缩放因子为 1)和缩放因子为 6 之间,每帧移动 0.1 个单位。这是通过构建以下形式的变换来实现的scale(N),然后设置元素的style.MozTransform属性为该值。

此外,只是为了好玩,我们还通过设置块的innerHTML属性为新内容,在切换缩放方向时更改文本和文本的颜色。

最后说明

从这里带走另外三个要点

首先,请注意,随着缩放文本变宽,文档的宽度会发生变化以适应它,随着文本变宽而变宽,因此其右侧边缘会超过文档的边缘,然后随着文本缩小而变窄。您可以通过观察 Firefox 浏览器窗口底部的滚动条来看到这一点。

其次,请注意,您实际上不仅可以在元素变换时选择和复制文本,而且在文本继续变换时选择仍然保持不变(尽管当我们更改缩放示例的内容时,选择会消失)。

第三,我没有在这里涵盖所有可能的变换。例如,我跳过了translate变换函数,它允许您水平或垂直平移对象(基本上,通过偏移量移动其位置)。您可以从 支持的变换的完整列表 中获取 Mozilla 开发者中心 网站。

显然,这个演示有点儿琐碎(就像演示通常那样)。但是,在设计界面时,您可以用它们做一些真正有用的事情;例如,您可以沿表格的 Y 轴绘制旋转 90° 的文本,以便将行标签放在狭窄但高的空间中。


9 条评论

  1. 匿名

    据我所知,这些变换实际上并没有将任何内容放到屏幕的右侧边缘之外,那么为什么它们会产生一个加宽的文档和相应的水平滚动条呢?

    2009 年 7 月 13 日 下午 12:15

  2. Jim B

    哇,那个文本看起来很糟糕。理想情况下,文本在平移/旋转/缩放期间应该看起来很僵硬,但字符间距到处乱跳。看起来似乎有一些量化正在进行,并且与最终的显示分辨率/方向无关。

    也许字体提示是假设某些默认大小/偏移量/旋转完成的,然后应用变换,从而导致棘轮现象。

    2009 年 7 月 13 日 下午 12:40

  3. Ken Arnold

    刚刚玩了这个,试图找到一个对倾斜变换的有效用法。好吧,我不知道这算不算,但是:打开 Firebug 并检查其中一个 .wp_syntax 元素。将 `-moz-transform: skewx(-3deg)` 添加到 .wp_syntax 样式(右侧窗格),并将 `-moz-transform: skewx(3deg)` 添加到 `.wp_syntax pre` 的样式(向下两个元素)。

    结合一点 -moz-border-radius,它可能是使文本脱颖而出的一个不错的效果。或者它可能只是让你感觉你的显示器倾斜了。你的选择。

    2009 年 7 月 13 日 下午 3:48

  4. Ken Arnold

    仍然使用 Firebug 玩这个页面... 如果你旋转一个元素,比如这篇文章中的 `div.code` 或 `pre` 元素,则包含元素(带有滚动条的 `div.wp_syntax`)的高度不会改变,旋转的文本会被切断。有人能解释一下为什么会发生这种情况,以及如何使边界框覆盖变换后的元素吗?

    2009 年 7 月 14 日 上午 8:09

  5. nemo

    http://m8y.org/tmp/www.bitstampede.com/demos/css-transforms/

    这是对他的演示的修复,以支持 Webkit。

    2009 年 7 月 15 日 上午 6:01

  6. nemo

    哦。而且滚动条在 Safari 中没有那种奇怪的行为。

    2009 年 7 月 15 日 上午 8:31

  7. Eric Shepherd

    对于 Webkit 兼容性,我表示歉意;明天我如果有几分钟来更新演示,我会修复它。只是溜走了。

    2009 年 7 月 16 日 下午 2:55

  8. Eric Shepherd

    我已经更新了我的网站上的示例,使其在基于 WebKit 的浏览器中工作。区别很小;不是

    text1.style.MozTransform = “skewx(” + text1SkewAngle + “deg)”;

    我只是做

    text1.style.MozTransform = “skewx(” + text1SkewAngle + “deg)”;
    text1.style.WebkitTransform = “skewx(” + text1SkewAngle + “deg)”;

    2009 年 7 月 17 日 上午 11:51

  9. Sjoerd Visscher

    变换后的文本在 Chrome 中比在 Firefox 中看起来好多了。Chrome 没有 Jim B 提到的问题。

    2009 年 7 月 22 日 上午 4:23

本文的评论已关闭。