效果预览

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

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

可交互视频

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

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

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

源代码下载

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

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

代码解读

定义 dom,.windows 容器表示舷窗,它的子元素 .curtain 表示窗帘:

<figure class="window"><div class="curtain"></div>
</figure>

居中显示:

body {margin: 0;height: 100vh;display: flex;align-items: center;justify-content: center;background-color: skyblue;
}

设置舷窗的尺寸,因为后面还会用到字号,所以字号用变量定义:

:root {--font-size: 10px;
}.window {position: relative;box-sizing: border-box;width: 25em;height: 35em;font-size: var(--font-size);background-color: #d9d9d9;
}

用阴影画出厚窗框:

.window {border-radius: 5em;box-shadow: inset 0 0 8em rgba(0, 0, 0, 0.2),0 0 0 0.4em #808080,0 0 0 4em whitesmoke,0 0 0 4.4em #808080,0 2em 4em 4em rgba(0, 0, 0, 0.1);
}

设置窗帘样式,和窗口尺寸一样,但不拉到底:

.window .curtain {position: absolute;width: inherit;height: inherit;border-radius: 5em;box-shadow:0 0 0 0.5em #808080,0 0 3em rgba(0, 0, 0, 0.4);background-color: whitesmoke;left: 0;top: -5%;
}

用伪元素在窗帘上画出指示灯,当窗帘关闭时亮红色光:

.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;background-image: radial-gradient(orange, orangered);bottom: 1.6em;border-radius: 0.4em;left: calc((100% - 1.6em) / 2);
}

以上是舷窗关闭时的样子,接下来绘制舷窗打开时的效果。
先在 dom 中添加一个 checkbox,当它被 checked 时即表示舷窗被打开:

<input type="checkbox" class="toggle">
<figure class="window"><div class="handle"></div>
</figure>

隐藏 checkbox,用 opacity(0) 可以使元素在不可见的状态下仍可交互,把它的尺寸设置得到舷窗一样大,并且图层在舷窗之上,得到的效果就是点击舷窗时实际是点击了 checkbox

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

当舷窗打开时,.curtain 要向上移动,并且指示灯亮绿色光:

.window .curtain {transition: 0.5s ease-in-out;
}.toggle:checked ~ .window .curtain {top: -90%;
}.toggle:checked ~ .window .curtain::after {background-image: radial-gradient(lightgreen, limegreen);
}

隐藏超出窗户的部分:

.window {overflow: hidden;
}

接下来绘制舷窗外的风景。
在 dom 中增加表示云朵的 .clouds 元素,其中的 5 个 <span> 子元素分别表示 1 朵白云:

<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>

用云朵容器画出窗外的蓝天:

.window .clouds {position: relative;width: 20em;height: 30em;background-color: deepskyblue;box-shadow: 0 0 0 0.4em #808080;left: calc((100% - 20em) / 2);top: calc((100% - 30em) / 2);border-radius: 7em;
}

每朵云由 3 部分组成,先画面积最大的部分:

.clouds span {position: absolute;width: 10em;height: 4em;background-color: white;top: 20%;border-radius: 4em;
}

再用伪元素画 2 个突起的圆弧:

.clouds span::before,
.clouds span::after {content: '';position: absolute;width: 4em;height: 4em;background-color: white;border-radius: 50%;
}.clouds span::before {top: -2em;left: 2em;
}.clouds span::after {top: -1em;right: 1em;
}

增加云朵飘动的动画效果:

.clouds span {animation: move 4s linear infinite;
}@keyframes move {from {left: -150%;}to {left: 150%;}
}

使每朵云的大小、位置有一些变化:

.clouds span:nth-child(2) {top: 40%;animation-delay: -1s;
}.clouds span:nth-child(3) {top: 60%;animation-delay: -0.5s;
}.clouds span:nth-child(4) {top: 20%;transform: scale(2);animation-delay: -1.5s;
}.clouds span:nth-child(5) {top: 70%;transform: scale(1.5);animation-delay: -3s;
}

最后,隐藏容器外的内容:

.window .clouds {overflow: hidden;
}

大功告成!

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

  1. 如何用纯 CSS 创作一个飞机舷窗风格的 toggle 控件

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

  2. 如何用纯 CSS 创作一个飞机舷窗风格的 toggle 控件...

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

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

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

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

    效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. 可交互视频教程 此视频是可以交互的,你可以随时暂停视频,编辑视频中的代码. 请用 chrome, s ...

  5. 前端每日实战:102# 视频演示如何用纯 CSS 创作一个小和尚

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

  6. 前端每日实战:125# 视频演示如何用纯 CSS 创作一个失落的人独自行走的动画...

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

  7. 前端每日实战:160# 视频演示如何用纯 CSS 创作一个打开内容弹窗的交互动画...

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

  8. 前端每日实战:119# 视频演示如何用纯 CSS 创作一个接扎啤的动画(内含2个视频)...

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

  9. 前端每日实战:84# 视频演示如何用纯 CSS 创作一个极品飞车 loader

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

最新文章

  1. Oracle单实例打补丁
  2. Springboot使用JPA框架对数据库实现增删改查(附详细代码)
  3. UA MATH567 高维统计I 概率不等式3 亚高斯性与亚高斯范数
  4. 【CSON原创】HTML5游戏框架cnGameJS开发实录
  5. php转java知乎_做了三年多的php,在上一家公司转java一年多,如何找工作
  6. mysqli 扩展_MySQLi的优势
  7. html 监控键盘,后台监控鼠标和键盘(可监听全局的鼠标以及键盘按键)
  8. windows下安装ta-lib的方法
  9. 将PICTUREBOX中显示的图片,存入数据库中
  10. Ubuntu使用——9(搜狗输入法安装)
  11. X1000对于camera控制部分的翻译
  12. 【python】pycharts画关联图
  13. .mpp文件的使用技巧
  14. django实现websocket作为安卓开发后台(软件课设,oo聊天)
  15. Go语言学习之路(二)
  16. MVC项目功能之加入购物车,清空购物车
  17. redenvelope php,Red Envelope (红包)
  18. 乐高教育版45544零件---分类识别
  19. c语言的编程switch,C语言之switch详解
  20. AD元件库下载不了的用下面这个链接试试

热门文章

  1. 微信网页开发之缓存问题
  2. 相机的FOV计算公式
  3. ztree 树怎么写 简单树 关键代码
  4. Bootstrap 框架响应式网页开发
  5. first_week
  6. WIN7修改管理员Administrator的名称方法(详细步骤:图)
  7. 基于单片机的踢球智能车系统设计(电路+论文)
  8. TPL(事务处理语言)
  9. 开发快手爬票项目(最终章)
  10. 《VLSI仿真与验证》课程实验:TinyCore交叉编译验证思路