前端每日实战:93# 视频演示如何用纯 CSS 创作一根闪电连接线
效果预览
按下右侧的“点击预览”按钮可以在当前页面预览,点击链接可以全屏预览。
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 个元素,分别代表插头和线缆:
<div class="cable">
    <span class="head"></span>
    <span class="body"></span>
</div>
居中显示:
body {
    margin: 0;
    height: 100vh;
    display: flex;
    align-items: center;
}
定义容器尺寸:
.cable {
    display: flex;
    align-items: center;
    font-size: 10px;
    margin-left: 5em;
}
画出插头的轮廓:
.head {
    width: 8.5em;
    height: 8.5em;
    border-radius: 2em 0 0 2em;
}
画出插头上针脚的轮廓:
.head {
    position: relative;
}
.head::before {
    content: '';
    position: absolute;
    width: 3em;
    height: 7.3em;
    top: calc((8.5em - 7.3em) / 2);
    left: 0.7em;
    border-radius: 1em;
    box-sizing: border-box;
}
画出线缆中手持部位的轮廓:
.body {
    width: 15.5em;
    height: 11em;
    border-radius: 0.5em;
}
画出线缆中稍粗部位的轮廓:
.body {
    position: relative;
    display: flex;
    align-items: center;
}
.body::before {
    content: '';
    position: absolute;
    width: 13.5em;
    height: 6em;
    left: 15.5em;
}
画出线缆的延长线部分:
.body::after {
    content: '';
    position: absolute;
    width: 100vh;
    height: 3.9em;
    left: calc(15.5em + 13.5em);
}
隐藏画面外的部分:
body {
    overflow: hidden;
}
接下来绘制细节。
为延长线涂上渐变色:
.body::after {
    background:
        linear-gradient(
            white,
            hsl(0, 0%, 96%) 5%,
            hsl(0, 0%, 97%) 25%,
            hsl(0, 0%, 95%) 40%,
            hsl(0, 0%, 81%) 95%,
            white
        );
}
为线缆中稍粗部位涂上渐变色:
.body::before {
    background:
        linear-gradient(
            white,
            hsl(0, 0%, 96%) 5%,
            hsl(0, 0%, 98%) 20%,
            hsl(0, 0%, 95%) 50%,
            hsl(0, 0%, 81%) 95%,
            white
        );
}
为线缆中手持部位涂上渐变色:
.body {
    background:linear-gradient(
        hsl(0, 0%, 91%),
        white 15%,
        hsl(0, 0%, 93%) 50%,
        hsl(0, 0%, 87%) 70%,
        hsl(0, 0%, 79%) 90%,
        hsl(0, 0%, 84%),
        hsl(0, 0%, 86%)
    );
}
为插头涂上渐变色:
.head {
    background:
        linear-gradient(
            -45deg,
            hsl(0, 0%, 75%),
            hsl(0, 0%, 79%),
            hsl(0, 0%, 78%),
            hsl(0, 0%, 87%) 80%
        );
}
在插头上画出针脚:
.head::before {
    background-color: white;
}
.head::after {
    content: '';
    position: absolute;
    box-sizing: border-box;
    width: 2.2em;
    height: 0.4em;
    color: goldenrod;
    background-color: currentColor;
    border-radius: 0.5em;
    left: 1.1em;
    top: 1.2em;
    box-shadow:
        0 0.8em 0,
        0 1.6em 0,
        0 2.4em 0,
        0 3.2em 0,
        0 4em 0,
        0 4.8em 0,
        0 5.6em 0;
}
接下来添加阴影,使线缆更立体。
绘制插头上的阴影:
.head {
    background:
        linear-gradient(
            90deg,
            transparent 80%,
            rgba(0,0,0,12%)
        ),
        linear-gradient(
            -45deg,
            hsl(0, 0%, 75%),
            hsl(0, 0%, 79%),
            hsl(0, 0%, 78%),
            hsl(0, 0%, 87%) 80%
        );
}
绘制线缆手持部分的阴影:
.body::before {
    background:
        linear-gradient(
            45deg,
            rgba(0,0,0,4%) 10%,
            transparent 20%
        ),
        linear-gradient(
            90deg,
            rgba(0,0,0,4%),
            transparent 10%
        ),
        linear-gradient(
            white,
            hsl(0, 0%, 96%) 5%,
            hsl(0, 0%, 98%) 20%,
            hsl(0, 0%, 95%) 50%,
            hsl(0, 0%, 81%) 95%,
            white
        );
}
绘制线缆中稍粗部位的阴影:
.body::after {
    background:
        linear-gradient(
            45deg,
            rgba(0,0,0,4%),
            transparent 4%
        ),
        linear-gradient(
            90deg,
            rgba(0,0,0,4%),
            transparent 2%
        ),
        linear-gradient(
            white,
            hsl(0, 0%, 96%) 5%,
            hsl(0, 0%, 97%) 25%,
            hsl(0, 0%, 95%) 40%,
            hsl(0, 0%, 81%) 95%,
            white
        );
}
最后,为画面增加入场动画
.cable {
    animation: show 5s linear infinite;
}
@keyframes show {
    0% {
        transform: translateX(100vw);
    }
    20%, 100% {
        transform: translateX(0);
    }
}
大功告成!
前端每日实战:93# 视频演示如何用纯 CSS 创作一根闪电连接线的更多相关文章
- 如何用纯 CSS 创作一根闪电连接线
		
效果预览 在线演示 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/RBjdzZ 可交互视频 ...
 - 前端每日实战:92# 视频演示如何用纯 CSS 创作一颗逼真的土星
		
效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/EpbaQX 可交互视频 此视频是可 ...
 - 前端每日实战:157# 视频演示如何用纯 CSS 创作一个棋盘错觉动画(实际上每一行都是平行的)
		
效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/VEyoGj 可交互视频 此视频是可 ...
 - 前端每日实战:158# 视频演示如何用纯 CSS 创作一个雨伞 toggle 控件
		
效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/pxLbjv 可交互视频 此视频是可 ...
 - 前端每日实战:140# 视频演示如何用纯 CSS 创作文本的淡入动画效果
		
效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/ZMwgqK 可交互视频 此视频是可 ...
 - 前端每日实战:161# 视频演示如何用纯 CSS 创作一张纪念卓别林的卡片(没有笑声的一天就是被荒废的一天)
		
效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/WaaBNV 可交互视频 此视频是可 ...
 - 前端每日实战:122# 视频演示如何用纯 CSS 创作一个苹果系统的相册图标
		
效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/zJKwbO 可交互视频 此视频是可 ...
 - 前端每日实战:126# 视频演示如何用纯 CSS 创作小球变矩形背景的按钮悬停效果
		
效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/yxbEzJ 可交互视频 此视频是可 ...
 - 前端每日实战:138# 视频演示如何用纯 CSS 创作一张 iPhone 价格信息图
		
效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/OorLGZ 可交互视频 此视频是可 ...
 
随机推荐
- jmeter的日常特殊参数化
			
1.map转译符号: 如果///Mobile///:///18888888888/// 需要再参数化请这样做,////Mobile////://///${Mobile}///// 2.in ...
 - jQuery实现三级联动菜单(鼠标悬停联动)
			
效果图: 代码: <!DOCTYPE html> <html> <head> <meta charset="utf-8"/> < ...
 - 【C++进阶:STL常见性质】
			
STL中的常用容器包括:顺序性容器(vector.deque.list).关联容器(map.set).容器适配器(queue.stac) 转载自:https://blog.csdn.net/u0134 ...
 - 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_04 IO字节流_7_字节输出流的续写和换行
			
再执行一次.内容会追加在后面 换行 不同系统下的换行符号 每次都写上换行符号,在for循环里面,循环10次
 - Jmeter之ForEach控制器(配合正则表达式使用)
			
在使用正则表达式提取响应信息时,存在部分信息有多个值,为了能使用所有的值,可以结合ForEach控制器使用. 一.界面显示 二.配置说明 1.名称:标识 2.注释:备注 3.输入变量前缀:是指需要提取 ...
 - 《Using Python to Access Web Data》 Week3 Networks and Sockets 课堂笔记
			
Coursera课程<Using Python to Access Web Data> 密歇根大学 Week3 Networks and Sockets 12.1 Networked Te ...
 - jvm  jstack log分析工具,在线分析
			
http://spotify.github.io/threaddump-analyzer Spotify提供的Web版在线分析工具,可以将锁或条件相关联的线程聚合到一起.
 - MySQL 编码:utf8 与 utf8mb4,utf8mb4_unicode_ci 与 utf8mb4_general_ci
			
参考:mysql字符集小结 utf8mb4 已成为 MySQL 8.0 的默认字符集,在MySQL 8.0.1及更高版本中将 utf8mb4_0900_ai_ci 作为默认排序规则. 新项目只考虑 u ...
 - git_02_git常用操作命令
			
前言 Git是一个开源的分布式版本控制系统,可以有效.高速地处理从小到大的项目版本管理.编写自动化测试脚本的过程中,经常要用到git命令,但总是记不住,每次都要百度有些麻烦.于是为了方便使用,在这总结 ...
 - auto_ptr与shared_ptr
			
注: 从c++11开始, auto_ptr已经被标记为弃用, 常见的替代品为shared_ptr shared_ptr的不同之处在于引用计数, 在复制(或赋值)时不会像auto_ptr那样直接转移所有 ...