【发布时间】:2021-05-17 23:28:18
【问题描述】:
下面是我们想要在 Z 和 X 方向上倾斜的基本“未倾斜”元素,以创建 对角线倾斜 .
* {
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() 时发生的示例 sn-p。 (它会使所有转换属性无效,就好像它是无效的 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()是无效属性。可以应用倾斜的唯一有效轴是 X 和 Y 轴。您可能必须使用其他方法来实现skewZ效果。可以尝试使用transform-origin()? -
@sagar1025 是的,看起来是这样 :(。我很好奇是否有一种直接的方法来实现对角倾斜。
-
由于倾斜仅应用于二维平面,因此您需要
rotate3d()。如果您需要在 3D 空间中剪切,rotate3d(0,0,0,45deg)可能会解决问题 -
@sagar1025 示例,否则它不起作用大声笑。实际上,自从提出这个问题以来,我已经解决了它。使用包装元素来倾斜X。将孩子旋转 90 度,然后再次 skewX。如果有一些更优雅的解决方案,我仍然很好奇。
-
但是我们可以在 2 维元素上 transalteZ() --> 我们在 3D 空间中平移 2D,所以使用 translateZ 和 rotateZ 是合乎逻辑的,因为它们是相对于空间而不是元素的(这种变换不会扭曲元素,它们会移动它)。 scaleZ() 的逻辑相同,尝试将其应用于元素并不会发生任何事情,它仅在处理 3D 空间时才有意义
标签: html css css-animations css-transforms