<!-- 主容器,包含两个漏斗元素 -->
<div class="container">
<div class="half"></div>
<div class="half"></div>
</div>
HTML
格式化
支持Emmet,输入 p 后按 Tab键试试吧!
<head> ... </head>
<body>
</body>
/* 设置页面基本样式,使内容居中显示 */
body {
background: #282c34;
height: 100vh;
display: flex;
align-items: center;
justify-content: center;
}
/* 容器样式,定义基本变量和旋转动画 */
.container {
/* 自定义变量 */
--uib-size: 45px; /* 控制整体大小 */
--uib-color: #c7f93e; /* 设置主要颜色 */
--uib-speed: 1.75s; /* 动画速度 */
--uib-bg-opacity: .1; /* 背景透明度 */
position: relative;
display: flex;
flex-direction: column;
height: var(--uib-size);
width: var(--uib-size);
transform: rotate(45deg);
animation: rotate calc(var(--uib-speed) * 2) ease-in-out infinite;
}
/* 半圆形元素的基本样式 */
.half {
--uib-half-size: calc(var(--uib-size) * 0.435);
position: absolute;
display: flex;
align-items: center;
justify-content: center;
width: var(--uib-half-size);
height: var(--uib-half-size);
overflow: hidden;
isolation: isolate;
/* 第一个半圆形元素的位置和样式 */
&:first-child {
top: 8.25%;
left: 8.25%;
border-radius: 50% 50% calc(var(--uib-size) / 15);
}
/* 第二个半圆形元素的位置和样式 */
&:last-child {
bottom: 8.25%;
right: 8.25%;
transform: rotate(180deg);
align-self: flex-end;
border-radius: 50% 50% calc(var(--uib-size) / 15);
&::after {
animation-delay: calc(var(--uib-speed) * -1);
}
}
/* 半圆形元素的背景层 */
&::before {
content: '';
height: 100%;
width: 100%;
position: absolute;
top: 0;
left: 0;
background-color: var(--uib-color);
opacity: var(--uib-bg-opacity);
transition: background-color 0.3s ease;
}
/* 半圆形元素的流动效果层 */
&::after {
content: '';
position: relative;
z-index: 1;
display: block;
background-color: var(--uib-color);
height: 100%;
transform: rotate(45deg) translate(-3%, 50%) scaleX(1.2);
width: 100%;
transform-origin: bottom right;
border-radius: 0 0 calc(var(--uib-size) / 20) 0;
animation: flow calc(var(--uib-speed) * 2) linear infinite both;
transition: background-color 0.3s ease;
}
}
/* 流动动画关键帧 */
@keyframes flow {
0% {
transform: rotate(45deg) translate(-3%, 50%) scaleX(1.2);
}
30% {
transform: rotate(45deg) translate(115%, 50%) scaleX(1.2);
}
30.001%, 50% {
transform: rotate(0deg) translate(-85%, -85%) scaleX(1);
}
80%, 100% {
transform: rotate(0deg) translate(0%, 0%) scaleX(1);
}
}
/* 旋转动画关键帧 */
@keyframes rotate {
0%, 30% {
transform: rotate(45deg);
}
50%, 80% {
transform: rotate(225deg);
}
100% {
transform: rotate(405deg);
}
}
预览
控制台