根据元素的可变高度设置 translateZ 值
set translateZ value based on variable height of element
我使用 3D css 变换创建了旋转立方体效果。为了实现这一点,我对子元素进行了此转换:
transform: translateY(-50%) translateZ(-75px) rotateX(90deg) ;
父元素上的这个:
transform-origin: center center -75px;
完整代码在这里:https://codepen.io/willdelphia/pen/JZOpMJ
如您所见,我在两个地方使用了常量“-75px”。这是因为父元素的高度是 150px。我正在寻找一种方法(最好是通过 CSS)来实现相同的效果,但使用任意高度的元素。
所以基本上我想要的是计算任何给定元素高度的一半,然后在我有 75px 的地方使用该值。
这在 CSS 中可行吗?我需要依赖 javascript 吗?是否有另一种方法可以实现可以采用任意大小的元素的相同效果?
关于child元素,把样式改成这样就可以了
transform-origin: center bottom;
transform: translateY(-100%) rotateX(90deg);
更改变换原点,现在所有移动都在 Y 轴上完成,而不是 Y 轴上的 50%% 和 Z 轴上的 50%。
关于parent,有点难。不是设置变换原点,而是将元素移动到旋转中心,旋转它,然后将其移回原始位置。所有这些都可以相对于 Y 完成(注意只有中心旋转发生变化):
.flipper {
transform: rotateX(90deg) translateY(-50%) rotateX(0deg) translateY(50%) rotateX(-90deg);
}
.item:hover .flipper {
transform: rotateX(90deg) translateY(-50%) rotateX(-90deg) translateY(50%) rotateX(-90deg);
}
html, body {
margin: 10px 0 0 0;
background: rgb(40, 40, 40);
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
}
.flex {
display: flex;
flex-wrap: wrap;
justify-content: center;
align-items: flex-start;
width: 100%;
max-width: 700px;
margin: auto;
}
.item {
width: 150px;
height: 150px;
margin: 10px;
perspective: 400px;
}
.flipper {
position: relative;
width: 100%;
height: 100%;
transition: transform 1s;
transform-style: preserve-3d;
transform: rotateX(90deg) translateY(-50%) rotateX(0deg) translateY(50%) rotateX(-90deg);
}
.item:hover .flipper {
position: relative;
transform: rotateX(90deg) translateY(-50%) rotateX(-90deg) translateY(50%) rotateX(-90deg);
}
.cubefront{
z-index: 2;
width: 100%;
height: 100%;
}
.cubetop{
z-index: 0;
transform-origin: center bottom;
transform: translateY(-100%) rotateX(90deg) ;
width: 100%;
height: 100%;
color: white;
background: rgb(62, 62, 62);
display: flex;
align-items: center;
justify-content: center;
}
.cubefront, .cubetop {
/* backface-visibility: hidden; */
position: absolute;
top: 0;
left: 0;
}
#item1 .cubefront {
background: rgb(179, 45, 45);
}
#item2 .cubefront {
background: rgb(179, 103, 45);
}
#item3 .cubefront {
background: rgb(179, 148, 45);
}
#item4 .cubefront {
background: rgb(157, 179, 45);
}
#item5 .cubefront {
background: rgb(74, 179, 45);
}
#item6 .cubefront {
background: rgb(45, 179, 132);
}
#item7 .cubefront {
background: rgb(45, 159, 179);
}
#item8 .cubefront {
background: rgb(45, 99, 179);
}
#item9 .cubefront {
background: rgb(45, 49, 179);
}
#item10 .cubefront {
background: rgb(87, 36, 170);
}
#item11 .cubefront {
background: rgb(137, 36, 170);
}
#item12 .cubefront {
background: rgb(170, 36, 143);
}
#item13 .cubefront {
background: rgb(170, 36, 103);
}
#item14 .cubefront {
background: rgb(170, 36, 36);
}
<div class="flex">
<div id="item1" class="item">
<div class="flipper">
<div class="cubefront"></div>
<div class="cubetop">
<div class="text">
Text
</div>
</div>
</div>
</div>
<div id="item2" class="item">
<div class="flipper">
<div class="cubefront"></div>
<div class="cubetop">
<div class="text">
Text
</div>
</div>
</div>
</div>
<div id="item3" class="item">
<div class="flipper">
<div class="cubefront"></div>
<div class="cubetop">
<div class="text">
Text
</div>
</div>
</div>
</div>
<div id="item4" class="item">
<div class="flipper">
<div class="cubefront"></div>
<div class="cubetop">
<div class="text">
Text
</div>
</div>
</div>
</div>
<div id="item5" class="item">
<div class="flipper">
<div class="cubefront"></div>
<div class="cubetop">
<div class="text">
Text
</div>
</div>
</div>
</div>
<div id="item6" class="item">
<div class="flipper">
<div class="cubefront"></div>
<div class="cubetop">
<div class="text">
Text
</div>
</div>
</div>
</div>
<div id="item7" class="item">
<div class="flipper">
<div class="cubefront"></div>
<div class="cubetop">
<div class="text">
Text
</div>
</div>
</div>
</div>
<div id="item8" class="item">
<div class="flipper">
<div class="cubefront"></div>
<div class="cubetop">
<div class="text">
Text
</div>
</div>
</div>
</div>
<div id="item9" class="item">
<div class="flipper">
<div class="cubefront"></div>
<div class="cubetop">
<div class="text">
Text
</div>
</div>
</div>
</div>
<div id="item10" class="item">
<div class="flipper">
<div class="cubefront"></div>
<div class="cubetop">
<div class="text">
Text
</div>
</div>
</div>
</div>
<div id="item11" class="item">
<div class="flipper">
<div class="cubefront"></div>
<div class="cubetop">
<div class="text">
Text
</div>
</div>
</div>
</div>
<div id="item12" class="item">
<div class="flipper">
<div class="cubefront"></div>
<div class="cubetop">
<div class="text">
Text
</div>
</div>
</div>
</div>
<div id="item13" class="item">
<div class="flipper">
<div class="cubefront"></div>
<div class="cubetop">
<div class="text">
Text
</div>
</div>
</div>
</div>
<div id="item14" class="item">
<div class="flipper">
<div class="cubefront"></div>
<div class="cubetop">
<div class="text">
Text
</div>
</div>
</div>
</div>
</div>
我使用 3D css 变换创建了旋转立方体效果。为了实现这一点,我对子元素进行了此转换:
transform: translateY(-50%) translateZ(-75px) rotateX(90deg) ;
父元素上的这个:
transform-origin: center center -75px;
完整代码在这里:https://codepen.io/willdelphia/pen/JZOpMJ
如您所见,我在两个地方使用了常量“-75px”。这是因为父元素的高度是 150px。我正在寻找一种方法(最好是通过 CSS)来实现相同的效果,但使用任意高度的元素。
所以基本上我想要的是计算任何给定元素高度的一半,然后在我有 75px 的地方使用该值。
这在 CSS 中可行吗?我需要依赖 javascript 吗?是否有另一种方法可以实现可以采用任意大小的元素的相同效果?
关于child元素,把样式改成这样就可以了
transform-origin: center bottom;
transform: translateY(-100%) rotateX(90deg);
更改变换原点,现在所有移动都在 Y 轴上完成,而不是 Y 轴上的 50%% 和 Z 轴上的 50%。
关于parent,有点难。不是设置变换原点,而是将元素移动到旋转中心,旋转它,然后将其移回原始位置。所有这些都可以相对于 Y 完成(注意只有中心旋转发生变化):
.flipper {
transform: rotateX(90deg) translateY(-50%) rotateX(0deg) translateY(50%) rotateX(-90deg);
}
.item:hover .flipper {
transform: rotateX(90deg) translateY(-50%) rotateX(-90deg) translateY(50%) rotateX(-90deg);
}
html, body {
margin: 10px 0 0 0;
background: rgb(40, 40, 40);
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
}
.flex {
display: flex;
flex-wrap: wrap;
justify-content: center;
align-items: flex-start;
width: 100%;
max-width: 700px;
margin: auto;
}
.item {
width: 150px;
height: 150px;
margin: 10px;
perspective: 400px;
}
.flipper {
position: relative;
width: 100%;
height: 100%;
transition: transform 1s;
transform-style: preserve-3d;
transform: rotateX(90deg) translateY(-50%) rotateX(0deg) translateY(50%) rotateX(-90deg);
}
.item:hover .flipper {
position: relative;
transform: rotateX(90deg) translateY(-50%) rotateX(-90deg) translateY(50%) rotateX(-90deg);
}
.cubefront{
z-index: 2;
width: 100%;
height: 100%;
}
.cubetop{
z-index: 0;
transform-origin: center bottom;
transform: translateY(-100%) rotateX(90deg) ;
width: 100%;
height: 100%;
color: white;
background: rgb(62, 62, 62);
display: flex;
align-items: center;
justify-content: center;
}
.cubefront, .cubetop {
/* backface-visibility: hidden; */
position: absolute;
top: 0;
left: 0;
}
#item1 .cubefront {
background: rgb(179, 45, 45);
}
#item2 .cubefront {
background: rgb(179, 103, 45);
}
#item3 .cubefront {
background: rgb(179, 148, 45);
}
#item4 .cubefront {
background: rgb(157, 179, 45);
}
#item5 .cubefront {
background: rgb(74, 179, 45);
}
#item6 .cubefront {
background: rgb(45, 179, 132);
}
#item7 .cubefront {
background: rgb(45, 159, 179);
}
#item8 .cubefront {
background: rgb(45, 99, 179);
}
#item9 .cubefront {
background: rgb(45, 49, 179);
}
#item10 .cubefront {
background: rgb(87, 36, 170);
}
#item11 .cubefront {
background: rgb(137, 36, 170);
}
#item12 .cubefront {
background: rgb(170, 36, 143);
}
#item13 .cubefront {
background: rgb(170, 36, 103);
}
#item14 .cubefront {
background: rgb(170, 36, 36);
}
<div class="flex">
<div id="item1" class="item">
<div class="flipper">
<div class="cubefront"></div>
<div class="cubetop">
<div class="text">
Text
</div>
</div>
</div>
</div>
<div id="item2" class="item">
<div class="flipper">
<div class="cubefront"></div>
<div class="cubetop">
<div class="text">
Text
</div>
</div>
</div>
</div>
<div id="item3" class="item">
<div class="flipper">
<div class="cubefront"></div>
<div class="cubetop">
<div class="text">
Text
</div>
</div>
</div>
</div>
<div id="item4" class="item">
<div class="flipper">
<div class="cubefront"></div>
<div class="cubetop">
<div class="text">
Text
</div>
</div>
</div>
</div>
<div id="item5" class="item">
<div class="flipper">
<div class="cubefront"></div>
<div class="cubetop">
<div class="text">
Text
</div>
</div>
</div>
</div>
<div id="item6" class="item">
<div class="flipper">
<div class="cubefront"></div>
<div class="cubetop">
<div class="text">
Text
</div>
</div>
</div>
</div>
<div id="item7" class="item">
<div class="flipper">
<div class="cubefront"></div>
<div class="cubetop">
<div class="text">
Text
</div>
</div>
</div>
</div>
<div id="item8" class="item">
<div class="flipper">
<div class="cubefront"></div>
<div class="cubetop">
<div class="text">
Text
</div>
</div>
</div>
</div>
<div id="item9" class="item">
<div class="flipper">
<div class="cubefront"></div>
<div class="cubetop">
<div class="text">
Text
</div>
</div>
</div>
</div>
<div id="item10" class="item">
<div class="flipper">
<div class="cubefront"></div>
<div class="cubetop">
<div class="text">
Text
</div>
</div>
</div>
</div>
<div id="item11" class="item">
<div class="flipper">
<div class="cubefront"></div>
<div class="cubetop">
<div class="text">
Text
</div>
</div>
</div>
</div>
<div id="item12" class="item">
<div class="flipper">
<div class="cubefront"></div>
<div class="cubetop">
<div class="text">
Text
</div>
</div>
</div>
</div>
<div id="item13" class="item">
<div class="flipper">
<div class="cubefront"></div>
<div class="cubetop">
<div class="text">
Text
</div>
</div>
</div>
</div>
<div id="item14" class="item">
<div class="flipper">
<div class="cubefront"></div>
<div class="cubetop">
<div class="text">
Text
</div>
</div>
</div>
</div>
</div>