我想创建一个像蛋壳边缘从左到右移动的曲线动画。这是我已经做过的。
.box {
width: 25px;
height: 100px;
border: solid 3px #000;
border-color: transparent transparent transparent #000;
border-radius: 50%/50px 0 0 50px;
animation: animation 4s infinite;
}
@keyframes animation {
0% {
transform: rotateY(0deg);
}
50% {
transform: rotateY(180deg);
}
100% {
transform: rotateY(0deg);
}
}
和一个简单的div标签
<div class="box"></div>
问题是边框的宽度在旋转时发生变化,并且在旋转90/270度时完全消失。我怎样才能解决这个问题呢?
jsfiddle
我想你需要这样的东西。
.cube {
position: relative;
margin: 30vh 50vw;
transform-style: preserve-3d;
animation: animation 4s infinite;
}
@keyframes animation {
0% {
transform: rotateY(0deg)
}
50% {
transform: rotateY(180deg);
}
100% {
transform: rotateY(0deg);
}
}
.face {
position: absolute;
background: #000;
}
.front {
transform: translateZ(12.5px);
width: 25px;
height: 200px;
background: red;
}
.back {
transform: rotateY(180deg) translateZ(12.5px);
width: 25px;
height: 200px;
background: orange;
}
.right {
transform: rotateY(90deg) translateZ(12.5px);
width: 25px;
height: 200px;
background:lime;
}
.left {
transform: rotateY(-90deg) translateZ(12.5px);
width: 25px;
height: 200px;
background:blueviolet;
}
.top {
transform: rotateX(90deg) translateZ(100px);
width: 25px;
height: 200px;
}
.bottom {
transform: rotateX(-90deg) translateZ(100px);
width: 25px;
height: 200px;
}
<div class="cube">
<div class="face front"></div>
<div class="face back"></div>
<div class="face right"></div>
<div class="face left"></div>
<div class="face top"></div>
<div class="face bottom"></div>
</div>
要制作HTML+CSS曲线动画,你没有现成的、简单的解决方案。
我的建议是使用canvas和javascript编程对象的运动。
然而,我用一些类似于从一边到另一边的平滑运动的元素来剪辑。
main {
height: 100vh;
display: flex;
align-items: center;
justify-content: center;
}
.card {
position: relative;
width: 350px;
aspect-ratio: 1;
border-radius: 10px;
overflow: hidden;
background: white;
}
span {
box-sizing: border-box;
display: inline-block;
position: absolute;
width: 50%;
height: 100%;
backface-visibility: hidden;
}
span.left-border {
left: 0;
border-radius: 100vw 0 0 100vw;
transform-origin: right;
background-color: black;
animation: elastic-left linear 6s infinite;
}
span.left-cover {
left: 2%;
top: 2%;
height: 96%;
border-radius: 100vw 0 0 100vw;
transform-origin: right;
background-color: white;
animation: elastic-left linear 6s infinite;
}
span.middle{
width: 2%;
left: 49%;
background-color: black;
}
span.right-cover {
left: 48%;
top: 2%;
background-color: white;
border-radius: 0 100vw 100vw 0;
height: 96%;
transform-origin: left;
animation: elastic-right linear 6s infinite;
}
span.right-border {
left: 50%;
border-radius: 0 100vw 100vw 0;
transform-origin: left;
background-color: black;
animation: elastic-right linear 6s infinite;
}
@keyframes elastic-left {
0% {
transform: rotateY(180deg);
}
50% {
transform: rotateY(0);
}
100% {
transform: rotateY(180deg);
}
}
@keyframes elastic-right {
0% {
transform: rotateY(0);
}
50% {
transform: rotateY(180deg);
}
100% {
transform: rotateY(0);
}
}
<main>
<div class="card">
<span class="middle"></span>
<span class="left-border"></span>
<span class="left-cover"></span>
<span class="right-border"></span>
<span class="right-cover"></span>
</div>
</main>
代码可以被改进,所以感谢所有有价值的反馈。
我认为你现在有一个很好的代码库,你可以安排你想要的
.cube {
position: relative;
margin: 30vh 50vw;
transform-style: preserve-3d;
animation: animation 10s infinite;
}
@keyframes animation {
0% {
transform: rotateY(0deg)
}
50% {
transform: rotateY(180deg);
}
100% {
transform: rotateY(0deg);
}
}
.face {
position: absolute;
/* background: #000; */
}
.front {
transform: translateZ(0px);
width: 100px;
height: 200px;
/* background: red; */
border-radius:50%;
border-left:10px solid red;
}
.a{
transform: translateZ(0px);
border-left:5px solid red;
}
.b{
transform: translateZ(1px);
border-left:5px solid red;
}
.c{
transform: translateZ(2px);
border-left:5px solid red;
}
.d{
transform: translateZ(3px);
border-left:5px solid red;
}
.e{
transform: translateZ(4px);
border-left:5px solid red;
}
.f{
transform: translateZ(5px);
border-left:5px solid red;
}
.h{
transform: translateZ(6px);
border-left:5px solid red;
}
<div class="cube">
<div class="face front"></div>
<div class="face front a"></div>
<div class="face front b"></div>
<div class="face front c"></div>
<div class="face front d"></div>
<div class="face front e"></div>
<div class="face front f"></div>
<div class="face front g"></div>
<div class="face front h"></div>
</div>