阅读视图

发现新文章,点击刷新页面。

咖啡冒气

前言

这次趁着周末休息的时间,又弄了一个新的动画效果,用CSS实现的一个咖啡冒气效果。整个实现过程比较简单,大家可以先看到下面的效果预览部分,十分简单,没有花里胡哨的技巧。话不多说,咱们直接进入主题。

效果预览

最终实现的相关效果如下。

HTML部分

首先我们看到HTML部分,相关代码如下。

 <div class="coffee">
      <div class="vapor">
        <span></span>
        <span></span>
        <span></span>
        <span></span>
        <span></span>
      </div>
      <div class="cup"></div>
      <div class="plate"></div>
    </div>

这里创建了一个带有热气动画的咖啡杯视觉效果

CSS部分

首先我们看到类名为coffee的样式,相关代码如下。

  .coffee {
      display: flex;
      flex-direction: column;
      align-items: center;
      height: calc(9em + 1em + 2em);
      position: relative;
    }
    .coffee .cup {
      width: 10em;
      height: 9em;
      background-color: white;
      border-radius: 0 0 1.5em 1.5em;
      position: relative;
    }

在.coffee容器中使用Flexbox布局,通过flex-direction: column让子元素垂直排列,通过align-items: center让子元素水平居中,最后为内部绝对定位元素提供定位上下文。

在.coffee .cup杯子样式中,设置杯子宽度和高度以及杯子的颜色,然后再给杯子设置底部的圆角,最后通过position: relative为伪元素提供定位上下文。

接下来便是上面提到的伪元素的样式,相关代码如下。

   .coffee .cup::before {
      content: "";
      position: absolute;
      width: 100%;
      height: 2em;
      background-color: chocolate;
      border: 0.5em solid white;
      box-sizing: border-box;
      border-radius: 50%;
      top: -1em;
      box-shadow: inset 0 0 1em rgba(0, 0, 0, 0.5);
    }
    .coffee .cup::after {
      content: "";
      position: absolute;
      width: 3em;
      height: 3.5em;
      border: 0.8em solid white;
      border-radius: 50%;
      top: 20%;
      left: 80%;
    }

这里主要使用伪元素 ::before::after 来绘制杯子的两部分。在.coffee .cup::before中,这个伪元素创建了杯子的杯身部分,杯身颜色为巧克力色,设置了白色边框,通过top: -1em向上偏移,使杯身部分露出,最后定义一个内部阴影,创造深度感。在.coffee .cup::after中,这个伪元素创建了杯子的把手部分,设置把手尺寸以及白色边框,形成环形把手,通过边框和圆形组合,创建出一个咖啡杯的环形把手。

综上所述,这里会创建一个具有巧克力色杯身、白色边框和右侧环形把手的咖啡杯视觉效果。

.coffee .vapor {
      width: 7em;
      height: 2em;
      display: flex;
      justify-content: space-between;
    }
    .coffee .vapor span {
      width: 0.1em;
      min-width: 1px;
      background-color: white;
      animation: evaporation 2s linear infinite;
      filter: opacity(0);
    }

这里创建了咖啡杯上方蒸汽飘动的动画效果。在.coffee .vapor中,设置了蒸汽容器的宽度和高度,并且使用flex布局让子元素均匀分布,两端对齐。

在.coffee .vapor span中,每个span代表一缕蒸汽,在这里应用名为 "evaporation"的动画,持续时间为2秒,速度曲线为匀速,并且无限循环。最后通过filter: opacity(0)让初始透明度为0(完全透明)。

这样就创造了咖啡杯上方热气腾腾的视觉效果。

最后我们看到这个效果的核心实现部分,相关代码如下。

.coffee .vapor span:nth-child(1) {
      animation-delay: 0.5s;
    }

    .coffee .vapor span:nth-child(2) {
      animation-delay: 0.1s;
    }

    .coffee .vapor span:nth-child(3) {
      animation-delay: 0.3s;
    }

    .coffee .vapor span:nth-child(4) {
      animation-delay: 0.4s;
    }

    .coffee .vapor span:nth-child(5) {
      animation-delay: 0.2s;
    }
    @keyframes evaporation {
      from {
        transform: translateY(0);
        filter: opacity(1) blur(0.2em);
      }
      to {
        transform: translateY(-4em);
        filter: opacity(0) blur(0.4em);
      }
    }

这里实现了咖啡蒸汽的动画效果,通过为每个蒸汽条设置不同的延迟和定义关键帧动画,创造出逼真的蒸汽飘散效果。

首先为5个蒸汽条(span元素)设置了不同的动画延迟,通过错开延迟让每个蒸汽条在不同的时间开始动画(0.1s到0.5s之间)。

然后在evaporation动画中,蒸汽从原始位置向上移动4em单位,从完全可见(opacity:1)渐变到完全透明(opacity:0),然后从轻微模糊(blur:0.2em)到更加模糊(blur:0.4em)吗,最终在模拟蒸汽上升过程中逐渐扩散、变淡直至消失的自然现象。

所以整体工作流程就是5个白色细条水平均匀分布,每个细条在不同时间开始动画(通过不同的animation-delay)最终通过动画创造出连续不断的蒸汽效果。

总结

以上就是整个效果的实现过程了,代码简单易懂。另外,感兴趣的小伙伴们还可以在现有基础上发散思维,比如增加点其他效果,或者更改颜色等等。关于该效果如果大家有更好的想法欢迎在评论区分享,互相学习。最后,完整代码在码上掘金里可以查看,如果有什么问题大家在评论区里讨论~

手把手教你实现一个写作翻页

前言

借着上篇三本书的动画灵感,这次我们通过CSS来实现一个写作翻页的效果。整个实现过程比较简单,大家可以先看到下面的效果预览部分,十分简单,没有花里胡哨的技巧。话不多说,咱们直接进入主题。

效果预览

最终实现的相关效果如下。

HTML部分

首先我们看到HTML部分,相关代码如下。

<div class="book">
<div class="page">
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
</div>
</div>

这里创建一个书本容器,右侧有一个翻页效果,通过设计多个span元素模拟书页上的文字行,然后在CSS中使用动画实现文字逐行显示效果。

CSS部分

首先我们看到类名book的样式,相关代码如下。

.book {
    --sw: 0.5em; /* stroke width */
    width: 15em;
    height: 10em;
    background-color: lightyellow;
    box-sizing: border-box;
    border: var(--sw) solid cadetblue;
    border-radius: var(--sw);
    font-size: 20px;
    position: relative;
}

.book .page {
    height: inherit;
    width: calc(50% + var(--sw) + var(--sw) / 2);
    background-color: inherit;
    box-sizing: border-box;
    border: inherit;
    border-radius: inherit;
    position: absolute;
    top: calc(-1 * var(--sw));
    right: calc(-1 * var(--sw));
    display: flex;
    flex-direction: column;
    justify-content: space-between;
    padding: 8% 5%;
    transform-origin: left;
    transform-style: preserve-3d;
    animation: flip 4s linear infinite;
}

.book .page span {
    display: block;
    width: 100%;
    border-top: var(--sw) solid cadetblue;
    border-radius: inherit;
    transform-origin: left;
    transform: scaleX(0);
    backface-visibility: hidden;
    animation: 4s linear infinite;
}

在这里,通过--sw: 0.5em;定义CSS变量"stroke width",表示边框宽度,使用box-sizing: border-box确保边框宽度包含在元素总尺寸内。接着使用Flexbox列布局,内容均匀分布,设置变换原点在左侧,保留3D效果,并且应用一个flip动画,持续4秒,线性,无限循环,该动画在后面会提到。这里的每个span代表书页上的一行文字(用横线表示),初始状态:宽度缩放为0(不可见),设置一个动画,持续4秒,线性,无限循环,最后通过backface-visibility: hidden来防止元素背面在3D变换时可见。

综上所述,这里给翻页添加了样式,丰富了整个效果,接着我们来看到剩下的动画实现,相关代码如下。

.book .page span:nth-child(1) {animation-name: stroke-1;}
.book .page span:nth-child(2) {animation-name: stroke-2;}
.book .page span:nth-child(3) {animation-name: stroke-3;}
.book .page span:nth-child(4) {animation-name: stroke-4;}
.book .page span:nth-child(5) {animation-name: stroke-5;}
@keyframes stroke-1 {
    0% {transform: scaleX(0);}
    10%, 100% {transform: scaleX(1);}
}
@keyframes stroke-2 {
    0%, 10% {transform: scaleX(0);}
    20%, 100% {transform: scaleX(1);}
}
@keyframes stroke-3 {
    0%, 20% {transform: scaleX(0);}
    30%, 100% {transform: scaleX(1);}
}
@keyframes stroke-4 {
    0%, 30% {transform: scaleX(0);}
    40%, 100% {transform: scaleX(1);}
}
@keyframes stroke-5 {
    0%, 40% {transform: scaleX(0);}
    50%, 100% {transform: scaleX(1);}
}
@keyframes flip {
    55% {
        transform: rotateY(0) translateX(0) skewY(0);
    }
    70% {
        transform: rotateY(-90deg) translateX(calc(-1 * var(--sw) / 2)) skewY(-20deg);
    }
    80%, 100% {
        transform: rotateY(-180deg) translateX(calc(-1 * var(--sw))) skewY(0);
    }
}

这里实现了书本翻页和文字逐行显示的动画效果,是整个效果实现的核心所在。

这五条规则为每个span元素分配不同的动画,创建逐行显示的效果。在stroke这个逐行显示的动画效果中,每行从宽度为0开始(scaleX(0)),然后每行在前一行完成后开始显示,最后每行显示后保持可见状态。

在翻页动画中,0-55%的时候页面保持原始位置。55-70%的时候页面开始翻转,旋转到90度,同时有一些位移和倾斜。在70-80%的时候,页面完成180度翻转。在80-100%的时候,页面保持翻转状态。

总结

以上就是整个效果的实现过程了,代码简单易懂。另外,感兴趣的小伙伴们还可以在现有基础上发散思维,比如增加点其他效果,或者更改颜色等等。关于该效果如果大家有更好的想法欢迎在评论区分享,互相学习。最后,完整代码在码上掘金里可以查看,如果有什么问题大家在评论区里讨论~

手把手教你实现三本前端书籍

前言

这次趁着周末休息的时间,弄了一个新的动画效果,用CSS实现了三本书,分别是HTMLCSSJS三本书,也算是回忆过去的学习经历了。整个实现过程比较简单,大家可以先看到下面的效果预览部分,十分简单,没有花里胡哨的技巧。话不多说,咱们直接进入主题。

效果预览

最终实现的相关效果如下。

HTML部分

首先我们看到HTML部分,相关代码如下。

<div class="books">
<div class="book html">
<p>HTML<span>&lt;devolopment /&gt;</span></p>
</div>
<div class="book css">
<p>CSS<span>.devolopment::</span></p>
</div>
<div class="book js">
<p>JavaScript<span>{ devolopment }</span></p>
</div>
</div>

这里创建了一个包含三本书的书籍展示区,每本书代表一种前端开发技术。当与相应的CSS结合后,这段HTML会呈现出三本倾斜的3D书本效果,每本书有独特的颜色标识(通常HTML橙色、CSS蓝色、JS黄色),以及鼠标悬停时有上浮动画效果。这种设计巧妙地展示了前端开发的三种核心技术。

CSS部分

首先我们看到类名books的样式,相关代码如下。

.books {
display: flex;
width: calc(12rem * 3 + 3rem * 2);
justify-content: space-between;
margin-top: 6rem;
}

这里定义了一个名为.books的容器样式,用于包含多个书本元素。将元素设置为Flex容器,使其子元素(书本)按照Flexbox规则布局,默认情况下,子元素会水平排列在一行中。

通过以上的方式实现了一个水平排列的书本容器,书本之间有3rem的间距,容器总宽度为42rem,书本在容器内均匀分布,首尾书本贴边。

这种布局方式确保了书本在不同屏幕尺寸下保持正确的相对位置和间距。

然后我们看到类名为book的样式,相关代码如下。

.book {
width: 12rem;
height: 18rem;
background: linear-gradient(navy, deeppink, tomato);
transform: skewY(-10deg);
box-shadow: -10px 5px 30px rgba(0, 0, 0, 0.5);
position: relative;
transition: 0.3s;
}
.book:hover {
margin-top: -1.5rem;
}

这里针对上面的样式继续优化书本的特点,加入鲜艳的渐变背景,设置倾斜的3D效果以及逼真的阴影,最后通过一个平滑的悬停动画(鼠标放上去时书上浮)来结束。

这种设计让静态的书本元素具有交互性和动态感,增强了用户体验。

最后我们看到剩下的样式,相关代码如下。

.book::before {
background: linear-gradient(navy, deeppink, tomato);
}
.book::after {
content: '';
position: absolute;
width: 100%;
height: 1.5rem;
background: white;
top: -1.5rem;
left: 0;
transform-origin: bottom;
transform: skewX(45deg);
filter: brightness(0.9);
}
.book p {
position: absolute;
width: inherit;
height: 8rem;
top: 3rem;
box-sizing: border-box;
padding-top: 2rem;
color: whitesmoke;
font-size: 2.2rem;
font-family: sans-serif;
text-align: center;
text-shadow: -2px 2px 10px rgba(0, 0, 0, 0.3);
}

这里使用伪元素和文本样式来增强书本的3D效果和内容展示。::before 伪元素创建书本的左侧厚度效果,使用与书本相同的渐变背景,保持视觉一致性。

::after 伪元素 创建书本的顶部厚度效果,模拟书脊,使其脱离文档流,相对于书本定位,通过transform: skewX(45deg)沿X轴倾斜45度,形成斜面效果,最后通过filter: brightness(0.9) 稍微降低亮度,模拟阴影效果。

综上所述这里通过伪元素和文本样式增强了书本的3D效果,::before 创建左侧厚度,::after 创建顶部厚度,完成3D立体效果,文本样式确保书本内容清晰可读且视觉吸引人,这些样式共同创建了逼真的3D书本效果。

总结

以上就是整个效果的实现过程了,代码简单易懂。另外,感兴趣的小伙伴们还可以在现有基础上发散思维,比如增加点其他效果,或者更改颜色等等。关于该效果如果大家有更好的想法欢迎在评论区分享,互相学习。最后,完整代码在码上掘金里可以查看,如果有什么问题大家在评论区里讨论~

手把手教你实现飞机上的开窗关窗效果

前言

接着上个小飞机的效果,在这个动画的基础上,用CSS实现的一个在飞机上开窗关窗的效果。整个实现过程比较简单,大家可以先看到下面的效果预览部分,十分简单,没有花里胡哨的技巧。话不多说,咱们直接进入主题。

效果预览

最终实现的相关效果如下。

HTML部分

首先我们看到HTML部分,相关代码如下。

  <input type="checkbox" class="toggle">
    <figure class="window">
        <div class="curtain"></div>
        <div class="clouds">
            <span></span>
            <span></span>
            <span></span>
            <span></span>
            <span></span>
        </div>
    </figure>

首先创建一个隐藏的复选框输入元素,用作交互触发器,通过CSS的:checked伪类实现状态切换。然后使用<figure>语义化标签作为窗户的主要容器,作为窗帘和云朵背景的父元素,通常通过CSS设置窗户的边框、阴影和整体样式,curtain代表窗户的窗帘部分,通过CSS实现窗帘的样式和动画效果。最后创建了多个<span>元素,每个代表一朵云。

CSS部分

首先我们看到类名toggle的样式,相关代码如下。

.toggle {
    position: absolute;
    filter: opacity(0);
    width: 25em;
    height: 35em;
    font-size: var(--font-size);
    cursor: pointer;
    z-index: 3;
}

这里定义了一个隐藏但可点击的切换开关元素。通过视觉隐藏 (filter: opacity(0)),使用滤镜将元素透明度设为0(完全透明),比opacity: 0visibility: hidden更好的选择,因为它可以保持元素完全可点击和可聚焦,不影响布局(元素仍占据空间),不会阻止鼠标事件。

配合CSS选择器如:checked,可以实现复杂的交互效果而无需JavaScript。

然后是窗户和窗帘的CSS部分,相关代码如下。

.toggle:checked ~ .window .curtain {
    top: -90%;
}
.window .curtain::before {
    content: '';
    position: absolute;
    width: 40%;
    height: 0.8em;
    background-color: #808080;
    left: 30%;
    bottom: 1.6em;
    border-radius: 0.4em;
}
.window .curtain::after {
    content: '';
    position: absolute;
    width: 1.6em;
    height: 0.8em;
    bottom: 1.6em;
    background-image: radial-gradient(orange, orangered);
    left: calc((100% - 1.6em) / 2);
    border-radius: 0.4em;
}
.toggle:checked ~ .window .curtain::after {
    background-image: radial-gradient(lightgreen, limegreen);
}

这里实现了窗帘的交互效果和样式细节。首先是窗帘开合动画控制,当复选框被选中时,将窗帘向上移动90%的高度,:checked是匹配被选中的复选框,~是通用兄弟选择器,选择.toggle之后的所有.window元素,最终选择.toggle之后.window内的.curtain元素。

所以最终的动画效果是当隐藏的复选框被点击时,窗帘会移动到顶部-90%的位置,实现"打开"效果。

当复选框被选中时,将把手颜色变为绿色渐变,当窗帘打开时,把手颜色从橙红色变为绿色,提供视觉反馈,表示状态已改变。

这里展示了如何通过纯CSS创建具有状态反馈的交互式组件,利用CSS的:checked伪类实现交互,使用::before::after添加装饰元素,无需额外HTML,通过颜色变化提供状态指示。

最后是窗外的云的CSS样式,相关代码如下。

.window .clouds {
    position: relative;
    width: 20em;
    height: 30em;
    background-color: deepskyblue;
    left: calc((100% - 20em) / 2);
    top: calc((100% - 30em) / 2);
    border-radius: 7em;
    box-shadow: 0 0 0 0.4em #808080;
    overflow: hidden;
}
.clouds span {
    position: absolute;
    width: 10em;
    height: 4em;
    background-color: white;
    top: 20%;
    border-radius: 4em;
    animation: move 4s linear infinite;
}
@keyframes move {
    from {left: -150%;}
    to {left: 150%;}
}

这里创建了一个天空背景和飘动的云朵动画效果:

精确定位

  • 使用calc()函数实现天空区域的完美居中
  • left: calc((100% - 20em) / 2) 水平居中
  • top: calc((100% - 30em) / 2) 垂直居中

云朵形状

  • 通过border-radius: 4em创建椭圆形云朵
  • 高度(4em)是宽度(10em)的40%,形成扁平椭圆形状

动画设计

  • 使用linear线性动画确保匀速移动
  • infinite无限循环创造持续飘动效果
  • 从-150%到150%确保云朵完全穿过可见区域

视觉层次

  • 天蓝色背景与白色云朵形成鲜明对比
  • 灰色边框定义天空区域边界
  • overflow: hidden确保动画元素不会破坏布局

这里创建了一个视觉上吸引人的天空背景,云朵从左侧进入,横穿天空区域,然后从右侧离开,形成连续循环的飘动效果。

总结

以上就是整个效果的实现过程了,代码简单易懂。另外,感兴趣的小伙伴们还可以在现有基础上发散思维,比如增加点其他效果,或者更改颜色等等。关于该效果如果大家有更好的想法欢迎在评论区分享,互相学习。最后,完整代码在码上掘金里可以查看,如果有什么问题大家在评论区里讨论~

手把手教你实现一个小飞机

前言

这次趁着周末休息的时间,弄了一个用 CSS实现的直升机的动画效果。整个实现过程比较简单,大家可以先看到下面的效果预览部分,十分简单,没有花里胡哨的技巧。话不多说,咱们直接进入主题。

效果预览

最终实现的相关效果如下。

HTML部分

首先我们看到HTML部分,相关代码如下。

 <div class="plane">
        <div class="fans">
            <span></span>
            <span></span>
            <span></span>
            <span></span>
        </div>
        <div class="wheels">
            <span class="wheel left"></span>
            <span class="wheel right"></span>
        </div>
    </div>

这里创建了一个飞机动画的基本结构,包含三个主要部分,首先看到<div class="plane">,这里是飞机的主体容器,紧接着是螺旋桨部分 (<div class="fans">),包含4个<span>元素,代表螺旋桨的叶片,每个<span>会通过CSS样式形成螺旋桨的各个叶片。

最后是起落架部分 (<div class="wheels">),包含左右两个轮子 (<span class="wheel left"><span class="wheel right">),每个轮子元素后续会通过CSS样式形成飞机的轮子和支撑结构。

CSS部分

接着我们看到CSS部分,首先我们看到飞机容器的样式,相关代码如下。

.plane {
    font-size: 10px;
    width: 28em;
    height: 13em;
    display: flex;
    justify-content: center;
    position: relative;
    color: black;
    /* wings */
    background: 
        linear-gradient(currentColor, currentColor)
            no-repeat center top / 100% 0.5em,
        linear-gradient(currentColor, currentColor)
            no-repeat center 4em / 90% 0.4em;
    animation: 
        plane-rotating 10s infinite,
        fly 5s infinite;
}

使用flex布局,水平居中内容,使用线性渐变创建出机翼样式,并且设置一些动画效果,旋转动画:持续10秒,无限循环;飞行动画:持续5秒,无限循环。

接着看到设置的飞机动画效果,相关代码如下。

@keyframes plane-rotating {
    10%, 30%, 50% {transform: rotate(0deg);}
    20% {transform: rotate(-4deg);}     
    80% {transform: rotate(8deg);}          
    100% {transform: rotate(-1turn);}
}
@keyframes fly {
    10%, 50%, 100% {top: 0;}    
    25% {top: 1em;}            
    75% {top: -1em;}            
}

这里创造了两个具有逼真飞行效果的飞机动画,包含旋转和上下浮动两种运动模式。在plane-rotating动画中,在10%、30%、50%时间点保持水平,在20%时间点向左倾斜4度,在80%时间点向右倾斜8度,在100%时间点完成一整圈旋转(逆时针)。

fly动画中,在10%、50%、100%时间点保持在原始位置,在25%时间点向下移动1em(10px),在75%时间点向上移动1em(10px)。

接着我们看到四叶螺旋桨的样式,相关代码如下。

.fans {
    width: 11em;
    height: 11em;
    background: radial-gradient(currentColor 2.5em, transparent 2.5em);
}
.fans span {
    width: inherit;
    height: 50%;
    background-color: hsla(100, 100%, 100%, 0.4);
    border-radius: 50% 50% 0 0 / 100% 100% 0 0;
    transform-origin: bottom;
    transform: rotate(calc((var(--n) - 1) * 90deg));
    animation: fans-rotating 0.8s linear infinite;
    animation-delay: calc(var(--n) * 0.1s);
}
@keyframes fans-rotating {
    to {transform: rotate(-1turn);}
}

从代码中可以看出,半圆形叶片是使用特殊border-radius语法border-radius: 50% 50% 0 0 / 100% 100% 0 0创建出来的半圆形顶部。使用CSS变量(--n) 控制每个叶片的角度和动画延迟,需要配合额外的CSS为每个span设置不同的--n值。使用transform-origin: bottom确保叶片围绕底部中心旋转。使用calc((var(--n) - 1) * 90deg)将4个叶片均匀分布(0°, 90°, 180°, 270°)。最后使用calc(var(--n) * 0.1s)为每个叶片设置不同的延迟,创建连续旋转效果。

综上所述,这里创建了一个四叶片螺旋桨,每个叶片从底部中心点旋转出来,并通过CSS动画实现连续旋转效果,模拟飞机螺旋桨的工作状态。

最后我们看到轮子的样式,相关代码如下。

.wheels {
    width: 16em;
    height: 2em;
    bottom: 0;
    display: flex;
    justify-content: space-between;
}
.wheel {
    position: relative;
    width: 1em;
    height: inherit;
    background-color: currentColor;
    border-radius: 0.5em;
    display: flex;
    justify-content: center;
}
.wheel::before {
    width: 0.2em;
    height: 8em;
    background-color: currentColor;
    transform-origin: bottom;
    bottom: 1em;
    z-index: -1;
}

对于整体的结构,使用display: flexjustify-content: space-between让两个轮子平均分布在起落架容器两端,使用::before伪元素创建轮子的支撑杆,无需额外HTML元素。position: relative为轮子创建定位上下文,position: absolute让支撑杆相对于轮子定位,bottom: 1em将支撑杆底部定位在轮子内部。

综上所述,这里创建了一个完整的飞机起落架结构,包含两个轮子和它们的支撑杆,形成完整的V形起落架结构。

总结

以上就是整个效果的实现过程了,代码简单易懂。另外,感兴趣的小伙伴们还可以在现有基础上发散思维,比如增加点其他效果,或者更改颜色等等。关于该效果如果大家有更好的想法欢迎在评论区分享,互相学习。最后,完整代码在码上掘金里可以查看,如果有什么问题大家在评论区里讨论~

❌