效果预览

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

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

可交互视频

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

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

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

源代码下载

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

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

代码解读

定义 dom,容器中的 5 个 .finger 元素代表 5 根手指,.thumb 元素代表大拇指,.palm 元素代表手掌:

<div class="hand">
<span class="finger thumb"></span>
<span class="finger"></span>
<span class="finger"></span>
<span class="finger"></span>
<span class="finger"></span>
<span class="palm"></span>
</div>

居中显示:

body {
margin: 0;
height: 100vh;
display: flex;
align-items: center;
justify-content: center;
background: radial-gradient(white, lightcyan);
}

定义容器尺寸,其中 outline 属性是辅助线:

.hand {
width: 16em;
height: 8em;
font-size: 10px;
outline: 1px dashed black;
}

画出手掌:

.hand {
position: relative;
color: darksalmon;
} .palm {
position: absolute;
width: 8em;
height: 6em;
background-color: currentColor;
border-radius: 1em 4em;
right: 0;
}

画出大拇指的轮廓:

.thumb {
position: absolute;
width: 9.6em;
height: 3.2em;
background-color: currentColor;
border-radius: 3em 2em 2em 1em;
right: 0;
bottom: 1em;
transform-origin: calc(100% - 2em) 2em;
transform: rotate(-20deg);
border-bottom: 0.2em solid rgba(0, 0, 0, 0.1);
border-left: 0.2em solid rgba(0, 0, 0, 0.1);
}

画出大拇指上的指甲:

.thumb::before {
content: '';
position: absolute;
width: 1.9em;
height: 1.9em;
background-color: rgba(255, 255, 255, 0.3);
border-radius: 60% 10% 10% 30%;
bottom: -0.3em;
left: 0.5em;
border-right: 0.1em solid rgba(0, 0, 0, 0.1);
}

画出食指靠近手掌的后半部分:

.finger:not(:first-child) {
position: absolute;
width: 6.4em;
height: 3.5em;
background-color: currentColor;
right: 5.2em;
bottom: 4em;
transform-origin: 100% 2em;
transform: rotate(10deg);
}

画出食指的前半部分:

.finger:not(:first-child)::before {
content: '';
position: absolute;
width: 9em;
height: 3em;
background-color: currentColor;
right: 4.2em;
top: 0.2em;
border-radius: 2em;
transform-origin: calc(100% - 2em) 2em;
transform: rotate(-60deg);
}

为除大拇指以外其他 4 根手指设置下标变量,从食指到小指逐渐缩小并且颜色加深:

.finger:not(:first-child) {
--scale: calc(1 - (5 - var(--n)) * 0.2);
transform: rotate(10deg) scale(var(--scale));
filter: brightness(calc(100% - (5 - var(--n)) * 10%));
} .finger:nth-child(2) { --n: 2; }
.finger:nth-child(3) { --n: 3; }
.finger:nth-child(4) { --n: 4; }
.finger:nth-child(5) { --n: 5; }

用伪元素画出手的阴影:

.hand::before {
content: '';
position: absolute;
width: 14em;
height: 4.5em;
background-color: black;
border-radius: 4em 1em;
top: 4em;
filter: blur(1em) opacity(0.3);
}

增加手指敲击桌面的动画效果:

.finger:not(:first-child) {
animation: tap-upper 1.2s ease-in-out infinite;
animation-delay: calc((var(--n) - 2) * 0.1s);
} @keyframes tap-upper {
0%, 50%, 100% {
transform: rotate(10deg) scale(var(--scale));
} 40% {
transform: rotate(50deg) scale(var(--scale));
}
}

最后,不要忘记删掉辅助线。

大功告成!

前端每日实战:132# 视频演示如何用纯 CSS 创作一只思考的手的更多相关文章

  1. 前端每日实战:98# 视频演示如何用纯 CSS 创作一只愤怒小鸟中的绿猪

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

  2. 前端每日实战:124# 视频演示如何用纯 CSS 创作一只纸鹤

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

  3. 前端每日实战:103# 视频演示如何用纯 CSS 创作一只监视眼

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

  4. 前端每日实战:58# 视频演示如何用纯 CSS 创作一只卡通鹦鹉

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

  5. 前端每日实战:73# 视频演示如何用纯 CSS 创作一只卡通狐狸

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

  6. 前端每日实战:111# 视频演示如何用纯 CSS 创作一只艺术的鸭子

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

  7. 前端每日实战:70# 视频演示如何用纯 CSS 创作一只徘徊的果冻怪兽

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

  8. 前端每日实战:61# 视频演示如何用纯 CSS 创作一只咖啡壶

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

  9. 前端每日实战:62# 视频演示如何用纯 CSS 创作一只蒸锅

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

随机推荐

  1. Spring Boot 2.x 整合 Redis最佳实践

    一.前言 在前面的几篇文章中简单的总结了一下Redis相关的知识.本章主要讲解一下 Spring Boot 2.0 整合 Redis.Jedis 和 Lettuce 是 Java 操作 Redis 的 ...

  2. MDS算法及其matlab实现

    问题背景: 在求解MTSP问题的时候,因为已知的为各个巡检点之间路径耗时长度,而这个具体描述采用无向图结构可以很好的描述,在matlab中通过函数(graphallshortestpaths)可以得到 ...

  3. MyEclipse10安装properties文件插件

    安装步骤 1.下载PropertiesEditor插件 http://propedit.sourceforge.jp/index_en.html 2.解压出features.plugins文件 3.在 ...

  4. struts-dojo的使用

    1.导入struts2-dojo-plugin-2.1.8.jar 2.在用使用dojo的页面引入 <span style="font-size:14px;">< ...

  5. Redis实现高并发分布式锁

    分布式锁场景在分布式环境下多个操作需要以原子的方式执行首先启一个springboot项目,再引入redis依赖包: <!-- https://mvnrepository.com/artifa . ...

  6. 常用的mysql操作

    总结一下常用的mysql操作,避免下次遇到类似情况重复地去百度. 方法不是唯一的,但记录一种可行的方法就可以了. 遇到新的问题再继续补充. 1.增加一个列 ALTER TABLE 表名 ADD COL ...

  7. 如何单独卸载office2016中的one note

  8. Python: Socket网络编程,多线程处理小Demo

    一个简单的例子,深入研究一下socket的多线程处理任务 Server端: #!/usr/bin/env python #encoding:utf8 # # 注意:定义encoding时必须在第二行 ...

  9. mac命令日常总结

    查看某个端口被占用 lsof -i tcp:8080 kill进程: 找到进程的PID,使用kill命令:kill -9 716(PID) date 显示系统日期 mkdir xx 创建xx目录 rm ...

  10. MyBatis if test 传入一个数字进行比较报错 There is no getter for property named 'userState' in 'class java.lang.Integer'

    在写MyBatis映射文件中,我要传入一个 int 类型的参数,在映射文件中用 'test' 中进行比较,我花了很长时间百度,发现都是不靠谱的方法,有把数字在比较时转成字符串用 equals 比较的. ...