效果预览

按下右侧的“点击预览”按钮可以在当前页面预览,点击链接可以全屏预览。

https://codepen.io/comehope/pen/pxLbjv

可交互视频

此视频是可以交互的,你可以随时暂停视频,编辑视频中的代码。

请用 chrome, safari, edge 打开观看。

https://scrimba.com/p/pEgDAM/cMV8euJ

源代码下载

每日前端实战系列的全部源代码请从 github 下载:

https://github.com/comehope/front-end-daily-challenges

代码解读

定义 dom,容器 .umbralla 中包含 2 个元素,.canopy 代表伞盖,.shaft 伞柄:

<figure class="umbralla">
<div class="canopy"></div>
<div class="shaft"></div>
</figure>

居中显示:

body {
margin: 0;
height: 100vh;
display: flex;
align-items: center;
justify-content: center;
background: linear-gradient(skyblue, lightblue);
}

设置伪元素的共有属性:

.umbrella *::before,
.umbrella *::after {
content: '';
position: absolute;
}

先画出雨伞打开的样子。
设置容器尺寸,其中 font-size 的属性值后面还要用到,所以定义了一个变量:

:root {
--font-size: 10px;
} .umbrella {
position: relative;
width: 25em;
height: 26em;
font-size: var(--font-size);
}

定义伞盖的尺寸:

.umbrella .canopy {
position: absolute;
width: inherit;
height: 5.5em;
top: 2.5em;
}

::before 伪元素画出伞盖的上半部分,方法先画一个半圆,然后在垂直方向上压缩它:

.umbrella .canopy::before {
width: inherit;
height: 12.5em;
background: rgb(100, 100, 100);
border-radius: 12.5em 12.5em 0 0;
transform: scaleY(0.4);
top: -4em;
}

::after 伪元素画出伞盖的下半部分:

.umbrella .canopy::after {
width: inherit;
height: 1.5em;
background-color: #333;
top: 4em;
border-radius: 50%;
}

画出伞柄的长杆:

.umbrella .shaft {
position: absolute;
width: 0.8em;
height: 18em;
background-color: rgba(100, 100, 100, 0.7);
top: 5.5em;
left: calc((100% - 0.8em) / 2);
}

用伪元素画出伞杆顶部露出伞盖的尖头,方法和画伞盖上半部分类似,先画出半圆,然后在水平方向上压缩它:

.umbrella .shaft::before {
width: 6em;
height: 3em;
background-color: rgba(100, 100, 100, 0.7);
left: calc((100% - 6em) / 2);
top: -5.5em;
border-radius: 6em 6em 0 0;
transform: scaleX(0.1);
}

画出雨伞的钩形把手:

.umbrella .shaft::after {
box-sizing: border-box;
width: 4em;
height: 2.5em;
border: 1em solid #333;
top: 100%;
left: calc(50% - 4em + 1em / 2);
border-radius: 0 0 2.5em 2.5em;
border-top: none;
}

至此,完成了雨伞打开的样子,接下来通过变形画出雨伞合上时的样子。
先把伞盖的合上,方法是在水平方向上压缩,在垂直方向上拉伸:

.umbrella .canopy {
transform-origin: top;
transform: scale(0.08, 4);
}

隐藏伞盖的下半部分:

.umbrella .canopy::after {
transform: scaleY(0);
}

让伞倾斜,因为竖着的伞有点呆板,所以增加一点变化:

.umbrella {
transform: rotate(-30deg);
}

至此,雨伞合上时的样子也完成了,接下来要把它变为 toggle 控件了。
在 dom 中增加一个 checkbox 控件:

<input type="checkbox" class="toggle">
<figure class="umbrella">
<!-- 略 -->
</figure>

设置控件与雨伞一样大,并置于雨伞图层的上层:

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

checkbox 控件的未选中状态对应雨伞合上时的样子,也就是目前雨伞的样子,所以只要指定控件被选中状态对应的雨伞打开时的样子就可以了。因为合上雨伞是对几个元素进行变形得到的,所以转换到雨伞打开状态就是取消变形。
先让伞正过来:

.toggle:checked ~ .umbrella {
transform: rotate(0deg);
}

然后把伞盖打开:

.toggle:checked ~ .umbrella .canopy {
transform: scale(1, 1);
}

再显示出伞盖的下半部分:

.toggle:checked ~ .umbrella .canopy::after {
transform: scaleY(1);
}

最后,设置以上几个元素的缓动效果:

.umbrella,
.umbrella .canopy,
.umbrella .canopy::after {
transition: 0.3s cubic-bezier(0.5, -0.25, 0.5, 1.25);
}

大功告成!

前端每日实战:158# 视频演示如何用纯 CSS 创作一个雨伞 toggle 控件的更多相关文章

  1. 前端每日实战:145# 视频演示如何用纯 CSS 创作一个电源开关控件

    效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/PdMyJd 可交互视频 此视频是可 ...

  2. 前端每日实战:157# 视频演示如何用纯 CSS 创作一个棋盘错觉动画(实际上每一行都是平行的)

    效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/VEyoGj 可交互视频 此视频是可 ...

  3. 前端每日实战:122# 视频演示如何用纯 CSS 创作一个苹果系统的相册图标

    效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/zJKwbO 可交互视频 此视频是可 ...

  4. 前端每日实战:156# 视频演示如何用纯 CSS 创作一个飞机舷窗风格的 toggle 控件

    效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/jeaOrw 可交互视频 此视频是可 ...

  5. 前端每日实战:25# 视频演示如何用纯 CSS 创作一个慧星拖尾效果的 loader 动画

    效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/YLRLaM 可交互视频教程 此视频 ...

  6. 前端每日实战:30# 视频演示如何用纯 CSS 创作一个晃动的公告板

    效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/wjZoGV 可交互视频教程 此视频 ...

  7. 前端每日实战:45# 视频演示如何用纯 CSS 创作一个菱形 loader 动画

    效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/eKzjqK 可交互视频教程 此视频 ...

  8. 前端每日实战:86# 视频演示如何用纯 CSS 创作一个方块旋转动画

    效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/gjgyWm 可交互视频 此视频是可 ...

  9. 前端每日实战:91# 视频演示如何用纯 CSS 创作一个行驶中的火车 loader

    效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/RBLWzJ 可交互视频 此视频是可 ...

随机推荐

  1. 调整Linux终端显示分辨率

    linux 默认cli (command line interface)分辨率一般都比较小,显示的字体很大,不太美观,有时还影响结果的显示(例如出现kernel panic).所以有必要改变一下cli ...

  2. Netflix颠覆HR:我们只雇“成年人”

    员工的最佳福利,是与优秀者一起工作 ● Patty McCord / 文 李钊/译 担任Netflix的首席人才官时,我与CEO里德·黑斯廷斯一起做了一份127页的PPT,命名为<自由& ...

  3. 纯CSS做3D旋转魔方

    昨天偶然看见网友(简单说 用CSS做一个魔方旋转的效果)做的一个3D旋转魔方  效果就是本博客右侧公告栏所示 在这里把做法展现出来 感兴趣的可以试试  做成自己特有的魔方 <!DOCTYPE h ...

  4. oracle 在sql中显示blob的字符串

    最近在用oracle的过程中用到了对blob字段模糊查询的问题,对oracle来说,我并不是高手,找了很多的资料终于能够查出来了. blob字段直接用 select * from table_name ...

  5. Action Script 3.0入门基本概念——IDE&编译与运行

    [编写ActionScript代码的工具] ActionScript代码是用纯文本编写的,所以ActionScript程序可以仅由简单的文本编辑器来创建,如Windows上的记事本或Macintosh ...

  6. 【HANA系列】SAP HANA的ini文件存储路径

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[HANA系列]SAP HANA的ini文件存储 ...

  7. 英特尔® Open Image Denoise 库有助于节省时间,提高质量

    在使用光线跟踪增强真实性与沉浸感时,游戏开发人员面临复杂的权衡.为了克服一系列挑战,英特尔创建了使用光线跟踪进行图像渲染的一整套解决方案,包含高性能开源滤波器.该解决方案已发布测试版,被集成至 Uni ...

  8. BZOJ3129方程(SDOI2013)

    https://blog.csdn.net/Maxwei_wzj/article/details/80152116 对变量有上界限制及下界限制.对于下界,可以从总数中减去即可,对于上界,容斥定理.

  9. [深度概念]·Attention Model(注意力模型)学习笔记

    此文源自一个博客,笔者用黑体做了注释与解读,方便自己和大家深入理解Attention model,写的不对地方欢迎批评指正.. 1.Attention Model 概述 深度学习里的Attention ...

  10. selenium学习-模拟键盘按键操作

    导入  from selenium.webdriver.common.keys import Keys  格式:Keys.XXX 一般这么用:send_keys(Keys.XXX) # coding= ...