(四十)巧用CSS3之你争我夺

212 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第27天,点击查看活动详情

一个蛋糕🍰就那么大,你如果吃得多,别人就吃得少;反之,亦然。这个现象就像两国交战,争夺城池以壮大自身,所以今天就做个你争我夺的效果。

你争我夺

肥了自己,瘦了他人。

结构

一个元素作为战场,两个伪元素作为两军,结构如下:

<div class="container"></div>

样式

首先,我们要把容器也就是战场给规定一个范围,如下:

.container {
    --size: 20rem;
    width: var(--size);
    height: var(--size);
    position: relative;
    display: flex;
    justify-content: center;
    align-items: center;
}

然后,我们要使用两个军团的大小给画出来,它们遵循一个规律:直径之和等于容器的大小,也就是说当一方增大的,另一方就要减少,如下:

.container::before,
.container::after {
    content: '';
    display: block;
    border-radius: 50%;
}

.container::before {
    background-color: wheat;
    animation: _animate1 4s linear infinite;
}

.container::after {
    background-color: yellow;
    animation: _animate2 4s linear infinite;
}

未绘制完成的时候,可以先把animation取消掉,两个军团的动画效果如下:

@keyframes _animate1{
    0%,100%{
        width: calc(var(--size) * 0.25);
        height: calc(var(--size) * 0.25);
    }
    50%{
        width: calc(var(--size) * 0.75);
        height: calc(var(--size) * 0.75);
    }
}
@keyframes _animate2{
    0%,100%{
        width: calc(var(--size) * 0.75);
        height: calc(var(--size) * 0.75);
    }
    50%{
        width: calc(var(--size) * 0.25);
        height: calc(var(--size) * 0.25);
    }
}

_animate1代表一个军团的动画效果,_animate2代表另一个军团的动画效果,从设置的动画中我们可以看出,当_animate1最大的时候,_animate2最小。

最后,我们给容器加上动画,让它不停的旋转,代表两个军团在不停的交手,再给个颜色变化,代表他们打的很激烈,如下:

.container {
    animation: _animate 4s linear infinite;
}
@keyframes _animate{
    100%{
        transform: rotate(360deg);
        filter: hue-rotate(360deg);
    }
}

效果

效果及其代码详情,如下:

总结

这效果中,要注意两个伪元素的长度之和是恒定的且要等于容器长度。