资讯专栏INFORMATION COLUMN

前端每日实战:158# 视频演示如何用纯 CSS 创作一个雨伞 toggle 控件

宠来也 / 1919人阅读

摘要:源代码下载每日前端实战系列的全部源代码请从下载代码解读定义,容器中包含个元素,代表伞盖,伞柄居中显示设置伪元素的共有属性先画出雨伞打开的样子。因为合上雨伞是对几个元素进行变形得到的,所以转换到雨伞打开状态就是取消变形。

效果预览

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

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 伞柄:

</>复制代码

居中显示:

</>复制代码

  1. body {
  2. margin: 0;
  3. height: 100vh;
  4. display: flex;
  5. align-items: center;
  6. justify-content: center;
  7. background: linear-gradient(skyblue, lightblue);
  8. }

设置伪元素的共有属性:

</>复制代码

  1. .umbrella *::before,
  2. .umbrella *::after {
  3. content: "";
  4. position: absolute;
  5. }

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

</>复制代码

  1. :root {
  2. --font-size: 10px;
  3. }
  4. .umbrella {
  5. position: relative;
  6. width: 25em;
  7. height: 26em;
  8. font-size: var(--font-size);
  9. }

定义伞盖的尺寸:

</>复制代码

  1. .umbrella .canopy {
  2. position: absolute;
  3. width: inherit;
  4. height: 5.5em;
  5. top: 2.5em;
  6. }

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

</>复制代码

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

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

</>复制代码

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

画出伞柄的长杆:

</>复制代码

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

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

</>复制代码

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

画出雨伞的钩形把手:

</>复制代码

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

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

</>复制代码

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

隐藏伞盖的下半部分:

</>复制代码

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

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

</>复制代码

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

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

</>复制代码

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

</>复制代码

  1. .toggle {
  2. position: absolute;
  3. filter: opacity(0);
  4. width: 25em;
  5. height: 26em;
  6. font-size: var(--font-size);
  7. cursor: pointer;
  8. z-index: 2;
  9. }

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

</>复制代码

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

然后把伞盖打开:

</>复制代码

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

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

</>复制代码

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

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

</>复制代码

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

大功告成!

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/53098.html

相关文章

  • 前端每日实战158# 视频演示何用 CSS 创作一个雨伞 toggle 控件

    摘要:源代码下载每日前端实战系列的全部源代码请从下载代码解读定义,容器中包含个元素,代表伞盖,伞柄居中显示设置伪元素的共有属性先画出雨伞打开的样子。因为合上雨伞是对几个元素进行变形得到的,所以转换到雨伞打开状态就是取消变形。 showImg(https://segmentfault.com/img/bVbikQw?w=400&h=301); 效果预览 按下右侧的点击预览按钮可以在当前页面预览...

    frolc 评论0 收藏0
  • 前端每日实战 2018年10月至2019年6月项目汇总(共 20 个项目)

    摘要:过往项目年月份项目汇总共个项目年月份项目汇总共个项目年月份项目汇总共个项目年月份项目汇总共个项目年月份项目汇总共个项目年月份项目汇总共个项目年月至年月发布的项目前端每日实战专栏每天分解一个前端项目,用视频记录编码过程,再配合详细的代码解读, 过往项目 2018 年 9 月份项目汇总(共 26 个项目) 2018 年 8 月份项目汇总(共 29 个项目) 2018 年 7 月份项目汇总(...

    muddyway 评论0 收藏0
  • 前端每日实战:145# 视频演示何用 CSS 创作一个电源开关控件

    摘要:源代码下载每日前端实战系列的全部源代码请从下载代码解读定义,包含个元素,分别代表控件开关和灯光居中显示定义控件的样式,把控件的设置为透明,使其不可见,但仍可与用户交互。 showImg(https://segmentfault.com/img/bVbhwqh?w=400&h=301); 效果预览 按下右侧的点击预览按钮可以在当前页面预览,点击链接可以全屏预览。 https://code...

    zhangke3016 评论0 收藏0

发表评论

0条评论

宠来也

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<