描述
大家好!我想制作一个立方体,当你将光标悬停在它上面时,它的边缘应该分开。您还需要在其边缘制作带有文本的箭头,当您悬停时,箭头应沿着其边缘移开,新文本将出现在下方。
.wrap {
width: 1920px;
position: relative;
margin-top: 400px;
perspective: 1000px;
perspective-origin: 50% 50%;
}
.leg {
position: relative;
width: 0px;
height: 100px;
border: 1px solid black;
}
.fr,
.sc,
.th {
position: relative;
}
.indicator {
top: -85px;
left: -170px;
position: absolute;
}
.line {
position: absolute;
overflow: hidden;
height: 300px;
/* transform: rotate(45deg); */
}
.text {
position: absolute;
top: -120px;
width: 100px;
}
.h-line {
width: 100px;
border: 1px solid black;
}
.d-line {
margin-left: 86.5px;
margin-top: 34px;
width: 100px;
border: 1px solid black;
transform: rotate(45deg);
}
.cube {
margin: auto;
position: relative;
height: 200px;
width: 200px;
transform-style: preserve-3d;
}
.cube>div {
position: absolute;
box-sizing: border-box;
padding: 10px;
height: 100%;
width: 100%;
opacity: 0.9;
background-color: #000;
border: solid 1px #eeeeee;
color: #ff0000;
}
.legs {
left: -65px;
margin-top: 240px;
position: absolute;
display: flex;
flex-direction: row;
gap: 70px;
}
.sc {
margin-left: 152px;
}
.th {
margin-top: -78px;
}
.third {
margin-top: 78px;
}
.front {
transform: translateZ(100px);
}
.front--1 {
transform: translateZ(100px);
}
.back {
transform: translateZ(-100px) rotateY(180deg);
}
.right {
transform: rotateY(-270deg) translateX(100px);
transform-origin: top right;
}
.right--1 {
transform: rotateY(-270deg) translateX(100px);
transform-origin: top right;
}
.left {
transform: rotateY(270deg) translateX(-100px);
transform-origin: center left;
}
.top {
transform: rotateX(-270deg) translateY(-100px);
transform-origin: top center;
}
.top--1 {
transform: rotateX(-270deg) translateY(-100px);
transform-origin: top center;
}
.bottom {
transform: rotateX(270deg) translateY(100px);
transform-origin: bottom center;
}
.wrap:hover .front {
transform: translateZ(200px) translateX(-200px);
/* margin-left: -200px;
transition: 0.3s ease-in; */
background-color: #fcf;
}
.wrap:hover .right {
transform: rotateY(-270deg) translateZ(150px) translateX(150px);
}
.wrap:hover .top {
transform: rotateX(-270deg) translateZ(120px) translateY(-100px);
}
.wrap:hover .bottom {
transform: rotateX(270deg) translateZ(100px) translateY(100px);
}
.wrap:hover .legs {
transform: translateY(100px);
transition: transform 0.3s ease-in;
}
.wrap:not(:hover) .legs {
transform: translateY(0);
transition: transform 0.3s ease-in;
}
.wrap:hover .first {
margin-top: 20px;
transition: 0.3s ease-in;
}
.wrap:not(:hover) .first {
margin-top: 0;
transition: 0.3s ease-in;
}
.wrap:hover .second {
margin-top: 12px;
transition: 0.3s ease-in;
}
.wrap:not(:hover) .second {
margin-top: 0;
transition: 0.3s ease-in;
}
.wrap:hover .third {
margin-top: -7px;
transition: 0.3s ease-in;
}
.wrap:not(:hover) .third {
margin-top: 0;
transition: 0.3s ease-in;
}
.wrap:hover .text {
top: 5px;
transition: 0.3s ease-in;
}
.wrap:not(:hover) .text {
top: -120px;
transition: 0.3s ease-in;
}
.cube>div {
transition: transform 0.3s ease-in;
}
.cube {
transform: rotateX(-15deg) rotateY(-25deg);
}
<div class="wrap">
<div class="cube">
<div class="front">
<div class="indicator">
1
<div class="line">
<div class="h-line"></div>
<span class="text">текст текст текст текст текст текст текст текст текст текст текст текст</span>
</div>
<div class="d-line"></div>
</div>
Front side
</div>
<div class="front--1">
Front side
</div>
<div class="top">
<div class="indicator">
2
<div class="line">
<div class="h-line"></div>
<span class="text">текст текст текст текст текст текст текст текст текст текст текст текст</span>
</div>
<div class="d-line"></div>
</div>
Top side
</div>
<div class="top--1">
Top side
</div>
<div class="bottom">
<div class="indicator">
3
<div class="line">
<div class="h-line"></div>
<span class="text">текст текст текст текст текст текст текст текст текст текст текст текст</span>
</div>
<div class="d-line"></div>
</div>
Bottom side
</div>
<div class="right">
<div class="indicator">
4
<div class="line">
<div class="h-line"></div>
<span class="text">текст текст текст текст текст текст текст текст текст текст текст текст</span>
</div>
<div class="d-line"></div>
</div>
Right side
</div>
<div class="right--1">
Right side
</div>
<section class="legs">
<div class="fr">
<div class="first leg"></div>
<div class="indicator">
4
<div class="line">
<div class="h-line"></div>
<span class="text">текст текст текст текст текст текст текст текст текст текст текст текст</span>
</div>
<div class="d-line"></div>
</div>
</div>
<div class="sc">
<div class="second leg"></div>
<div class="indicator">
4
<div class="line">
<div class="h-line"></div>
<span class="text">текст текст текст текст текст текст текст текст текст текст текст текст</span>
</div>
<div class="d-line"></div>
</div>
</div>
<div class="th">
<div class="third leg"></div>
<div class="indicator">
4
<div class="line">
<div class="h-line"></div>
<span class="text">текст текст текст текст текст текст текст текст текст текст текст текст</span>
</div>
<div class="d-line"></div>
</div>
</div>
</section>
</div>
</div>
问题
文本箭头不应与其所附着的立方体面位于同一平面,而应始终位于用户的正前方。
预先感谢您的合作!)
很高兴问题的作者能够在没有描述的情况下理解法官:)
但我会尽力为那些可能觉得这个问题有用的人解释一切。
如果您对某个元素应用 CSS 变换,那么它的子元素也会被变换,但如果您对它们应用反向变换值,那么它们将“正常”显示。
让我们看一个例子
skewX()从这个例子中可以看出,左边的红色和蓝色块具有相同的
skewX().右侧的蓝色块被分配
skewX(-45deg),即 其父级的反转值。因此,从视觉上看,蓝色块似乎不适合变形。
“对齐”元素的工作方式与在 CSS 中使用 3D 时完全相同,只是这里需要应用更多值进行反转。
首先,值得考虑的是它本身
.cube也在空间中沿着轴 Ycube = 45deg 和 Xcube = -25deg 旋转。接下来,我们来看看侧面:
X 边:沿 Y 轴旋转 90 度,因为 并沿同一轴旋转
.cube,因此“正常”显示的值为rotateY(90deg - Ycube)。沿 X 的旋转将简单地反转
rotateX(Xcube * -1);Y 边:沿 X 轴旋转 90 度,首先将这个值反转,然后将 Y 旋转
Ycube * -1,然后沿 X 相对旋转.cube,这里值也会反转。Z 面:这基本上是已经处于“正常”位置的面,因此您只需反转立方体的旋转即可。
为了在其他地方放置“提示”,您将需要其他值,您已经可以在此处选择它们。
或者甚至编写一个mixin(如果使用预处理器),其中所有值都将从工具提示的方向和位置替换,并且其旋转将相对于立方体的侧面。
这个立方体被用在 GIF 中:
顶部滑块 (
input[type="range"]) 负责旋转Y(水平),右侧滑块负责旋转X(垂直)。ПКМ滑块将重置为起始值。