效果预览

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

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

可交互视频

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

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

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

源代码下载

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

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

代码解读

定义 dom,容器中包含 2 个元素,分别代表插头和线缆:

  1. <div class="cable">
  2. <span class="head"></span>
  3. <span class="body"></span>
  4. </div>

居中显示:

  1. body {
  2. margin: 0;
  3. height: 100vh;
  4. display: flex;
  5. align-items: center;
  6. }

定义容器尺寸:

  1. .cable {
  2. display: flex;
  3. align-items: center;
  4. font-size: 10px;
  5. margin-left: 5em;
  6. }

画出插头的轮廓:

  1. .head {
  2. width: 8.5em;
  3. height: 8.5em;
  4. border-radius: 2em 0 0 2em;
  5. }

画出插头上针脚的轮廓:

  1. .head {
  2. position: relative;
  3. }
  4. .head::before {
  5. content: '';
  6. position: absolute;
  7. width: 3em;
  8. height: 7.3em;
  9. top: calc((8.5em - 7.3em) / 2);
  10. left: 0.7em;
  11. border-radius: 1em;
  12. box-sizing: border-box;
  13. }

画出线缆中手持部位的轮廓:

  1. .body {
  2. width: 15.5em;
  3. height: 11em;
  4. border-radius: 0.5em;
  5. }

画出线缆中稍粗部位的轮廓:

  1. .body {
  2. position: relative;
  3. display: flex;
  4. align-items: center;
  5. }
  6. .body::before {
  7. content: '';
  8. position: absolute;
  9. width: 13.5em;
  10. height: 6em;
  11. left: 15.5em;
  12. }

画出线缆的延长线部分:

  1. .body::after {
  2. content: '';
  3. position: absolute;
  4. width: 100vh;
  5. height: 3.9em;
  6. left: calc(15.5em + 13.5em);
  7. }

隐藏画面外的部分:

  1. body {
  2. overflow: hidden;
  3. }

接下来绘制细节。
为延长线涂上渐变色:

  1. .body::after {
  2. background:
  3. linear-gradient(
  4. white,
  5. hsl(0, 0%, 96%) 5%,
  6. hsl(0, 0%, 97%) 25%,
  7. hsl(0, 0%, 95%) 40%,
  8. hsl(0, 0%, 81%) 95%,
  9. white
  10. );
  11. }

为线缆中稍粗部位涂上渐变色:

  1. .body::before {
  2. background:
  3. linear-gradient(
  4. white,
  5. hsl(0, 0%, 96%) 5%,
  6. hsl(0, 0%, 98%) 20%,
  7. hsl(0, 0%, 95%) 50%,
  8. hsl(0, 0%, 81%) 95%,
  9. white
  10. );
  11. }

为线缆中手持部位涂上渐变色:

  1. .body {
  2. background:linear-gradient(
  3. hsl(0, 0%, 91%),
  4. white 15%,
  5. hsl(0, 0%, 93%) 50%,
  6. hsl(0, 0%, 87%) 70%,
  7. hsl(0, 0%, 79%) 90%,
  8. hsl(0, 0%, 84%),
  9. hsl(0, 0%, 86%)
  10. );
  11. }

为插头涂上渐变色:

  1. .head {
  2. background:
  3. linear-gradient(
  4. -45deg,
  5. hsl(0, 0%, 75%),
  6. hsl(0, 0%, 79%),
  7. hsl(0, 0%, 78%),
  8. hsl(0, 0%, 87%) 80%
  9. );
  10. }

在插头上画出针脚:

  1. .head::before {
  2. background-color: white;
  3. }
  4. .head::after {
  5. content: '';
  6. position: absolute;
  7. box-sizing: border-box;
  8. width: 2.2em;
  9. height: 0.4em;
  10. color: goldenrod;
  11. background-color: currentColor;
  12. border-radius: 0.5em;
  13. left: 1.1em;
  14. top: 1.2em;
  15. box-shadow:
  16. 0 0.8em 0,
  17. 0 1.6em 0,
  18. 0 2.4em 0,
  19. 0 3.2em 0,
  20. 0 4em 0,
  21. 0 4.8em 0,
  22. 0 5.6em 0;
  23. }

接下来添加阴影,使线缆更立体。
绘制插头上的阴影:

  1. .head {
  2. background:
  3. linear-gradient(
  4. 90deg,
  5. transparent 80%,
  6. rgba(0,0,0,12%)
  7. ),
  8. linear-gradient(
  9. -45deg,
  10. hsl(0, 0%, 75%),
  11. hsl(0, 0%, 79%),
  12. hsl(0, 0%, 78%),
  13. hsl(0, 0%, 87%) 80%
  14. );
  15. }

绘制线缆手持部分的阴影:

  1. .body::before {
  2. background:
  3. linear-gradient(
  4. 45deg,
  5. rgba(0,0,0,4%) 10%,
  6. transparent 20%
  7. ),
  8. linear-gradient(
  9. 90deg,
  10. rgba(0,0,0,4%),
  11. transparent 10%
  12. ),
  13. linear-gradient(
  14. white,
  15. hsl(0, 0%, 96%) 5%,
  16. hsl(0, 0%, 98%) 20%,
  17. hsl(0, 0%, 95%) 50%,
  18. hsl(0, 0%, 81%) 95%,
  19. white
  20. );
  21. }

绘制线缆中稍粗部位的阴影:

  1. .body::after {
  2. background:
  3. linear-gradient(
  4. 45deg,
  5. rgba(0,0,0,4%),
  6. transparent 4%
  7. ),
  8. linear-gradient(
  9. 90deg,
  10. rgba(0,0,0,4%),
  11. transparent 2%
  12. ),
  13. linear-gradient(
  14. white,
  15. hsl(0, 0%, 96%) 5%,
  16. hsl(0, 0%, 97%) 25%,
  17. hsl(0, 0%, 95%) 40%,
  18. hsl(0, 0%, 81%) 95%,
  19. white
  20. );
  21. }

最后,为画面增加入场动画

  1. .cable {
  2. animation: show 5s linear infinite;
  3. }
  4. @keyframes show {
  5. 0% {
  6. transform: translateX(100vw);
  7. }
  8. 20%, 100% {
  9. transform: translateX(0);
  10. }
  11. }

大功告成!

前端每日实战:93# 视频演示如何用纯 CSS 创作一根闪电连接线的更多相关文章

  1. 如何用纯 CSS 创作一根闪电连接线

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

  2. 前端每日实战:92# 视频演示如何用纯 CSS 创作一颗逼真的土星

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

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

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

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

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

  5. 前端每日实战:140# 视频演示如何用纯 CSS 创作文本的淡入动画效果

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

  6. 前端每日实战:161# 视频演示如何用纯 CSS 创作一张纪念卓别林的卡片(没有笑声的一天就是被荒废的一天)

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

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

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

  8. 前端每日实战:126# 视频演示如何用纯 CSS 创作小球变矩形背景的按钮悬停效果

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

  9. 前端每日实战:138# 视频演示如何用纯 CSS 创作一张 iPhone 价格信息图

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

随机推荐

  1. ffmpeg 文件推流 rtsp和rtmp

    // rtsp推流  /opt/srs/srs2 ./objs/ffmpeg/bin/ffmpeg -re -i /root/mp4/1.mp4 -vcodec copy -codec copy -f ...

  2. docker-dnsmasq使用

    docker-dnsmasq支持通过web页面配置域名映射,镜像地址:https://hub.docker.com/r/jpillora/dnsmasq 使用步骤如下: 1.在Docker宿主上创建 ...

  3. cookie格式化

    #coding=utf- import requests url = 'http://www.baidu.com' f=open(r'cookies.txt','r') cookies={} for ...

  4. 阶段1 语言基础+高级_1-3-Java语言高级_1-常用API_1_第5节 String类_8_字符串的分割方法

    使用空格分割 这个参数其实是个正则表达式 如果用英文的句号来切分就会有问题.. 没有输出任何东西 输出他的长度看下 数组的长度输出为0 注意事项:

  5. 锐捷网络自动连接python脚本

    1 实现锐捷网络的连接,当断开后自动重连 import os import sys import time ip = 'www.baidu.com' print('开始ping百度') backinf ...

  6. jmeter之三种参数化

    前言:总结并记录几种jmeter比较有用的元件 1.接口文档 2.参数化 3.断言 1.接口文档 a.拿到接口文档 接口地址:http://localhost:8080/jpress/admin/lo ...

  7. 剑指offer--day02

    1.1题目:用两个栈实现队列:用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 1.2解题思路: 创建两个栈stack1和stack2,使用两个“先进后出”的栈实现 ...

  8. heaplog

    #ifdef _DEBUG #include <stdio.h> #include <stdlib.h> #include <string.h> #define _ ...

  9. oracle--本地网络配置tnsnames.ora和监听器listener.ora

    文件tnsnames.ora 是给orcl客户端使用 配置本地网络服务:(客户端) 第一种使用暴力方式直接操作: 修改:C:\app\Administrator\product\11.2.0\dbho ...

  10. 前端 CSS的选择器 伪类选择器

    伪类选择器 常用的几种伪类选择器. 伪类选择器一般会用在超链接a标签中 没有访问的超链接a标签样式: a:link { color: blue; } <!DOCTYPE html> < ...