html - 在 Z 方向倾斜 HTML 元素

标签 html css css-animations css-transforms

下面是我们想要在 ZX 方向上倾斜以创建对 Angular 线倾斜的基本“未倾斜”元素.

* {
  box-sizing: border-box;
  transform-style: preserve-3d;
  margin: 0; padding: 0;
}
html, body {
  height: 100%;
}
body {
  perspective: 30rem;
}
body, div, span {
  display: flex;
  justify-content: center;
  align-items: center;
}
section > div > div {
  transform: scaleX( 0.5 ) scaleZ( 0.5 );
}
div div:nth-of-type( 2 ) {
  transform: rotateY( 180deg ) rotateZ( 90deg );
}
span {
  position: absolute;
  box-shadow: 0rem 0rem 0rem 0.5rem #444 inset;
  width: 10rem;
  height: 10rem;
  background-color: rgba( 200,200,200,0.25 );
}
span:nth-of-type( 1 ) { transform: translateZ( 5rem ); }
span:nth-of-type( 2 ) { transform: rotateY( 90deg ) translateZ( 5rem ); }
span:nth-of-type( 3 ) { transform: rotateY( -90deg ) translateZ( 5rem ); }
<style>
  .rotate_y, .rotate_x {
    animation-name: rotateY;
    animation-duration: 6s;
    animation-timing-function: linear;
    animation-iteration-count: infinite;
  }
  @keyframes rotateY {
    0% { transform: rotateY( 0deg ); }
    100% { transform: rotateY( 360deg ); }  
  }
  .rotate_x {
    animation-name: rotateX;
  }
  @keyframes rotateX {
    0% { transform: rotateX( 0deg ); }
    100% { transform: rotateX( 360deg ); }  
  }
</style>

<section class='rotate_y'>
  <div class='rotate_x'>
    <div>
      <div> <span></span><span></span><span></span> </div>
      <div> <span></span><span></span><span></span> </div> 
    </div>
  </div>
</section>

在 HTML 窗口中将 transform: skewX( 45deg ) 添加到 body section > div > div 可以正常工作:

* {
  box-sizing: border-box;
  transform-style: preserve-3d;
  margin: 0; padding: 0;
}
html, body {
  height: 100%;
}
body {
  perspective: 30rem;
}
body, div, span {
  display: flex;
  justify-content: center;
  align-items: center;
}
section > div > div {
  transform: scaleX( 0.5 ) scaleZ( 0.5 );
}
div div:nth-of-type( 2 ) {
  transform: rotateY( 180deg ) rotateZ( 90deg );
}
span {
  position: absolute;
  box-shadow: 0rem 0rem 0rem 0.5rem #444 inset;
  width: 10rem;
  height: 10rem;
  background-color: rgba( 200,200,200,0.25 );
}
span:nth-of-type( 1 ) { transform: translateZ( 5rem ); }
span:nth-of-type( 2 ) { transform: rotateY( 90deg ) translateZ( 5rem ); }
span:nth-of-type( 3 ) { transform: rotateY( -90deg ) translateZ( 5rem ); }
<style>
  .rotate_y, .rotate_x {
    animation-name: rotateY;
    animation-duration: 6s;
    animation-timing-function: linear;
    animation-iteration-count: infinite;
  }
  @keyframes rotateY {
    0% { transform: rotateY( 0deg ); }
    100% { transform: rotateY( 360deg ); }  
  }
  .rotate_x {
    animation-name: rotateX;
  }
  @keyframes rotateX {
    0% { transform: rotateX( 0deg ); }
    100% { transform: rotateX( 360deg ); }  
  }
  
  /* skew in the X direction added */
  body section > div > div {
    transform: scaleX( 0.5 ) scaleZ( 0.5 ) skewX( 45deg );
  }
</style>

<section class='rotate_y'>
  <div class='rotate_x'>
    <div>
      <div> <span></span><span></span><span></span> </div>
      <div> <span></span><span></span><span></span> </div> 
    </div>
  </div>
</section>

transform: skewX( 45deg )transform: skewY( 45deg ) 工作得很好。但是添加 transform: skewZ( 45deg ) 不会。

Z 方向的倾斜是 CSS 规范的一部分吗?如果不是,什么是好的解决方法?

下面是我设置 skewZ() 时发生的示例片段。 (它使所有转换属性无效,就好像它是无效的 CSS 规则一样。)

* {
  box-sizing: border-box;
  transform-style: preserve-3d;
  margin: 0; padding: 0;
}
html, body {
  height: 100%;
}
body {
  perspective: 30rem;
}
body, div, span {
  display: flex;
  justify-content: center;
  align-items: center;
}
section > div > div {
  transform: scaleX( 0.5 ) scaleZ( 0.5 );
}
div div:nth-of-type( 2 ) {
  transform: rotateY( 180deg ) rotateZ( 90deg );
}
span {
  position: absolute;
  box-shadow: 0rem 0rem 0rem 0.5rem #444 inset;
  width: 10rem;
  height: 10rem;
  background-color: rgba( 200,200,200,0.25 );
}
span:nth-of-type( 1 ) { transform: translateZ( 5rem ); }
span:nth-of-type( 2 ) { transform: rotateY( 90deg ) translateZ( 5rem ); }
span:nth-of-type( 3 ) { transform: rotateY( -90deg ) translateZ( 5rem ); }
<style>
  .rotate_y, .rotate_x {
    animation-name: rotateY;
    animation-duration: 6s;
    animation-timing-function: linear;
    animation-iteration-count: infinite;
  }
  @keyframes rotateY {
    0% { transform: rotateY( 0deg ); }
    100% { transform: rotateY( 360deg ); }  
  }
  .rotate_x {
    animation-name: rotateX;
  }
  @keyframes rotateX {
    0% { transform: rotateX( 0deg ); }
    100% { transform: rotateX( 360deg ); }  
  }
  
  /* skewing in the Z direction doesn't register */
  body section > div > div {
    transform: scaleX( 0.5 ) scaleZ( 0.5 ) skewX( 45deg ) skewZ( 45deg );
  }
</style>

<section class='rotate_y'>
  <div class='rotate_x'>
    <div>
      <div> <span></span><span></span><span></span> </div>
      <div> <span></span><span></span><span></span> </div> 
    </div>
  </div>
</section>

此处期望的结果是相关 html 元素同时在 Z 和 X 方向上倾斜。

最佳答案

实际上,不可能简单地设置一个 skewZ,因为它比那个更难

您已经知道的倾斜是二维变换。它们的真正含义是 skewX(对于 Y 轴)和 skewY(对于 X 轴)。

如果是 3D,你会拥有

  • Y 偏斜 X
  • Z 的 skewX
  • X 的 skewY
  • Z 的 skewY
  • X 的 skewZ
  • Y 的 skewZ

没那么简单!

有两种方法可以得到一些 skewZ。

首先,使用旋转,正如您已经评论过的那样。请记住取消设置:

transform: rotateX(90deg) skewX(10deg) rotateX(-90deg)

另一种是使用变换矩阵。这是一个具有经典偏斜的矩阵

1          skewY      0        0
skewX         1       0        0
0             0       1        0
0             0       0        1 

这是一个有 Z 偏斜的矩阵

1             0      skewZ/x        0
0             1      skewZ/y        0
0             0       1             0
0             0       0             1 

关于html - 在 Z 方向倾斜 HTML 元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66201900/

相关文章:

html - 动态调整报告中的字体大小(要打印的 html 页面)

javascript - 表单提交仅运行 Javascript 函数一秒钟

html - wrapper-div 中的跨度边距不为空

javascript - 设置 HTML5 页面使其适合所有设备而无需滚动

html - 为什么边框底部比列表内容宽?

CSS3 - 不使用点击事件的 3D 卡片翻转动画

javascript - 如何使用 selenium webdriver 选择下拉值

html - 调整大小时将两个框居中

html - SVG 连续线加载器动画

CSS 动画 - 在 rotate3d 上防止 'sliding'