【问题标题】:Difference between skew() and skewX() skewY()skew() 和 skewX() 的区别 skewY()
【发布时间】:2015-04-18 17:16:25
【问题描述】:

在为我的网站中的某些对象创建一些转换时,我发现以下内容。如果给定对象,则转换属性 skew(20deg,45deg) 将不同于具有 skewX(20deg)skewY(45deg) 的其他对象。

谁能解释一下为什么会这样?

.skew {
  height:10em;
  width:10em;
  background:red;
  margin:auto;
}

#first {
  transform:skew(20deg,45deg);
}

#second {
  transform:skewX(20deg) skewY(45deg);
}
<div class="skew" id="first"> skew(20deg,45deg) </div> <hr>
<div class="skew" id="second"> skewX(20deg) skewY(45deg) </div>

更新: skew 的语法很短。如何使用 skew() 短语法达到与 skewX()skewY() 相同的效果。

【问题讨论】:

    标签: html css css-transforms


    【解决方案1】:

    考虑矩阵,当你这样做时

     transform : skew(x, y);
    

    这就像矩阵的交叉乘法

    [ X , Y, Z ]

    | 1,  sx,  0 |
    | sy,  1,  0 |
    | 0,   0,  1 |
    

    sx = tan(x)sy = tan(y) 的位置

    产生新的坐标

    X' = X + Y * sx
    Y' = Y + X * sy
    Z' = Z
    

    但是当你这样做时

    transform : skewX(x) skewY(y);
    

    这就像第一个交叉乘法矩阵

    [ X, Y, Z ]

    带矩阵

    | 1, sx, 0 |
    | 0,  1, 0 |
    | 0,  0, 1 |
    

    产生新的坐标

    X' = X + Y * sx
    Y' = Y
    Z' = Z  
    

    然后是新矩阵

    [ X', Y', Z' ]

    交叉乘以

    | 1,  0, 0 |
    | sy, 1, 0 |
    | 0,  0, 1 |
    

    产生新的坐标

    X" = X + Y * sx
    Y" = Y + ( X + Y * sx ) * sy
    Z" = Z
    

    因此 Y 坐标从 Y + X * sy 变为 Y + ( X + Y * sx ) * sy

    【讨论】:

    • 这是正确答案!坐标在第二个倾斜函数之前更改。
    • @singhiskng 已接受。但如果您能找到解决问题的方法,我将不胜感激,因为我对矩阵一无所知。我数学不太好
    • 我想在不使用 skewX 和 skewY 但只使用简短语法的情况下获得相同的结果
    • @cssGEEK :- 你的意思是通过矩阵样式或其他方式的简短语法
    • @cssGEEK :- 对于矩阵操作,我希望您通过此链接 w3.org/TR/css3-transforms/#funcdef-skew
    【解决方案2】:

    正如W3 所引用的:

    请注意,skew() 的行为不同于乘以 skewX()skewY()。实现必须支持此功能 与旧内容的兼容性。

    因此,如果您想同时设置两者,请使用skew(x,y),或者如果您想设置特定的倾斜轴,请使用skewX()skewY()

    此外,从逻辑上讲,在同一 transform 上使用 skewX()skewY() 没有任何意义,您可以单独使用 skew() 来设置两者。

    【讨论】:

    • transform 可以接受任意数量的变换函数的任意组合。甚至您引用的注释也说“将skewX()skewY() 相乘”,这意味着您确实可以将它们组合成一个声明。如果您尝试指定两个单独的 transform 声明,一个会覆盖另一个。
    • 所以我认为这是一个实施问题。
    【解决方案3】:

    CSS skew 属性没有简短的语法: http://css-tricks.com/almanac/properties/t/transform/

    你必须使用:

    transform: skewX(value);  /* e.g. skewX(25deg) */
    transform: skewY(value);
    

    【讨论】:

    • 您链接到的那篇博文 1. 不是官方资源,并且 2. 创建于之前添加了 skew 短语法。 Skew 确实有一个简短的语法:w3.org/TR/css-transforms-1.
    • 很抱歉我不知道
    猜你喜欢
    • 2016-01-11
    • 2018-11-29
    • 2021-04-26
    • 2023-04-02
    • 2020-01-24
    • 1970-01-01
    • 2019-02-04
    • 2013-08-07
    • 2011-10-20
    相关资源
    最近更新 更多