效果预览

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

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

可交互视频

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

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

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

源代码下载

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

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

代码解读

定义 dom,容器中包含 3 个元素,分别代表耳朵、眼睛、鼻子:

<div class="pig">
<span class="ears"></span>
<span class="eyes"></span>
<span class="nose"></span>
</div>

居中显示:

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

设置伪元素的共有属性,后面有多处用到伪元素:

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

定义容器尺寸:

.pig {
width: 12em;
height: 10em;
font-size: 20px;
background-color: #50a032;
border: 0.2em solid #2b4d13;
}

用圆角属性画出头部轮廓:

.pig {
border-radius: 50% 50% 50% 50% / 55% 60% 40% 45%;
}

画出鼻子的轮廓:

.pig {
position: relative;
} .nose {
position: absolute;
width: 4.6em;
height: 4em;
background-color: #82b923;
border: 0.1em solid #1d3c07;
border-radius: 50% 50% 45% 45% / 55% 55% 45% 45%;
top: 3em;
left: 4.2em;
}

用伪元素画出鼻孔:

.nose::before,
.nose::after {
width: 1.2em;
background-color: #0f2d00;
border-radius: 50%;
top: 1.4em;
} .nose::before {
left: 0.8em;
height: 1.8em;
} .nose::after {
right: 0.8em;
height: 1.6em;
}

画出眼睛的轮廓:

.eyes::before,
.eyes::after {
width: 2.8em;
height: 2.8em;
background: white;
border-radius: 50%;
border: 0.1em solid #193c09;
top: 3.6em;
} .eyes::before {
left: 0.8em;
} .eyes::after {
right: 0.3em;
}

用径向渐变画出眼珠:

.eyes::before,
.eyes::after {
background:
radial-gradient(
circle at var(--eyeball-left) 1.5em,
black 0.4em,
transparent 0.4em
),
white;
} .eyes::before {
--eyeball-left: 1em;
} .eyes::after {
--eyeball-left: 1.9em;
}

画出内耳的轮廓:

.ears::before,
.ears::after {
width: 0.8em;
height: 0.9em;
background-color: #2f6317;
border: 0.1em solid #1d3a0d;
border-radius: 45% 45% 45% 45% / 55% 45% 55% 45%;
} .ears::before {
top: 0.3em;
left: 1.3em;
} .ears::after {
top: -1.1em;
right: 5.8em;
}

用阴影画出外耳:

.ears::before {
color: #50a032;
box-shadow:
0.4em 0.7em 0 -0.2em,
-0.2em 0.7em 0 -0.1em,
-0.6em 0.5em 0 -0.2em,
-0.1em -0.2em 0 0.4em,
-0.1em -0.2em 0 0.6em #2b4d13;
transform: rotate(-40deg);
} .ears::after {
color: #5cb739;
box-shadow:
0.3em 0.6em 0 -0.2em,
-0.1em 0.6em 0 -0.1em,
-0.6em 0.6em 0 -0.2em,
-0.1em -0.2em 0 0.4em,
-0.1em -0.2em 0 0.6em #2b4d13;
transform: rotate(-6deg);
}

用伪元素画出眉毛:

.pig::before,
.pig::after {
width: 1.4em;
height: 1em;
border-top: 0.5em solid #0f2d00;
top: 2.3em;
border-radius: 50% 50% 0 0 / 40% 40% 0 0;
} .pig::before {
left: 1.2em;
transform: rotate(-20deg);
} .pig::after {
right: 1em;
transform: rotate(25deg);
}

接下来设置阴影,增加立体效果。
为头部增加阴影效果:

.pig {
box-shadow:
inset -1.5em 1em 1.5em -0.5em rgba(255, 255, 255, 0.3),
inset 0.5em -0.5em 0.8em 0.2em rgba(0, 0, 0, 0.2);
}

为鼻子增加阴影效果:

.nose {
box-shadow: -0.1em 0.5em 0.2em 0.1em rgba(68, 132, 36, 0.6);
} .nose::before,
.nose::after {
box-shadow: inset -0.3em -0.2em 0.1em -0.1em #2d6b1f;
}

为眼睛增加阴影效果:

.eyes::before,
.eyes::after {
box-shadow:
inset 0.3em -0.6em 0.5em -0.2em rgba(0, 0, 0, 0.3),
-0.1em 0.5em 0.2em 0.1em rgba(68, 132, 36, 0.6);
}

大功告成!

最新文章

  1. ASP.NET中GridView数据导出到Excel
  2. Mybatis配置文件
  3. love easily fade
  4. Xcode里-ObjC, -all_load, -force_load
  5. NSString(或者说是UILabel)加入 “行间距” 之后的 “高度”计算
  6. 作业七:团队项目——Alpha版本冲刺阶段-06
  7. Unity 协程Coroutine综合测试
  8. update操作多张表
  9. 深入理解Redis主键失效原理及实现机制
  10. 给View换字体
  11. POJ1248 Safecracker
  12. Python自动化运维之7、生成器、迭代器、列表解析、迭代器表达式
  13. 后台gird表单按钮操作
  14. Excel和Word 简易工具类,JEasyPoi 2.1.5 版本发布
  15. Xcode Organizational Identifiers
  16. Jmeter二次开发代码(2)
  17. Android 弹出输入框
  18. Django auth认证系统
  19. Tomcat8 启动慢 Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [53,161] milliseconds
  20. 关于asyncio知识(一)

热门文章

  1. Linux添加目录到环境变量以及添加Sublime Text到环境变量
  2. 用Vue来实现音乐播放器(六):JSONP的封装
  3. python抽象篇:面向对象基础
  4. spring自动注入的三种方式
  5. 阶段1 语言基础+高级_1-3-Java语言高级_04-集合_02 泛型_5_定义和使用含有泛型的接口
  6. AWK之随心所欲-基础篇
  7. 测开之路九十七:js的引用方式
  8. ClientDataSet初步使用
  9. Dnsmasq 安装配置
  10. 当我写下Map&lt;String,Object&gt; map = new HashMap&lt;&gt;() https://www.jianshu.com/p/6b2e350e99be