如何用纯 CSS 创作一台拍立得照相机

效果预览
按下右侧的“点击预览”按钮可以在当前页面预览,点击链接可以全屏预览。
https://codepen.io/comehope/pen/YjYgey
可交互视频
此视频是可以交互的,你可以随时暂停视频,编辑视频中的代码。
请用 chrome, safari, edge 打开观看。
https://scrimba.com/p/pEgDAM/cpQpGtQ
源代码下载
每日前端实战系列的全部源代码请从 github 下载:
https://github.com/comehope/front-end-daily-challenges
代码解读
定义 dom,容器中包含 2 个元素,分别代表镜头和照片:
<div class="camera">
<span class="lens"></span>
<span class="picture"></span>
</div>
居中显示:
body {
margin: 0;
height: 100vh;
display: flex;
align-items: center;
justify-content: center;
background: linear-gradient(to left bottom, linen, tan);
}
画出相机的轮廓:
.camera {
width: 20em;
height: 23em;
font-size: 10px;
background:
linear-gradient(
blanchedalmond, blanchedalmond 10em,
wheat 10em, wheat 14em,
tan 14em
);
border-radius: 2em;
}
画出镜头的轮廓:
.camera {
position: relative;
}
.lens {
position: absolute;
width: 8em;
height: 8em;
background:
radial-gradient(
cadetblue 2em,
#555 2em, #555 2.5em,
#333 2.5em, #333 4em
);
border-radius: 50%;
top: 3em;
left: 6em;
}
用线性渐变画出下方照片的出口:
.camera {
background:
linear-gradient(
transparent 18em,
#333 18em, #333 19.5em,
transparent 19.5em
) no-repeat center / 80% 100%,
linear-gradient(
blanchedalmond, blanchedalmond 10em,
wheat 10em, wheat 14em,
tan 14em
);
border-radius: 2em;
position: relative;
}
接下来修饰细节。
用伪元素画出相机的取景器和闪光灯:
.camera::before {
content: '';
position: absolute;
width: 4.5em;
height: 2em;
background-color: #333;
border-radius: 0.5em;
top: 1.5em;
left: 1.5em;
}
.camera::after {
content: '';
position: absolute;
width: 3em;
height: 3em;
background-color: #333;
background-image: radial-gradient(
teal 10%,
#333 30%,
transparent 40%
);
right: 1.5em;
top: 1.5em;
border-radius: 0.3em;
}
用径向渐变画出相机上的按钮:
.camera {
background:
radial-gradient(
circle at 17em 7em,
black 0.8em,
darkgray 0.8em, darkgray 1em,
transparent 1em
),
radial-gradient(
circle at 3.6em 7em,
tomato 1em,
darkgray 1em, darkgray 1.2em,
transparent 1.2em
),
linear-gradient(
transparent 18em,
#333 18em, #333 19.5em,
transparent 18em
) no-repeat center / 80% 100%,
linear-gradient(
blanchedalmond, blanchedalmond 10em,
wheat 10em, wheat 14em,
tan 14em
);
}
用径向渐变画出镜头上的光影:
.lens {
background:
radial-gradient(
circle at 60% 45%,
khaki 0.1em,
transparent 0.3em
),
radial-gradient(
circle at 50% 40%,
khaki 0.3em,
transparent 0.5em
),
radial-gradient(
cadetblue 2em,
#555 2em, #555 2.5em,
#333 2.5em, #333 4em
);
}
接下来制作动画效果。
用伪元素模拟快门:
.lens::before,
.lens::after {
content: '';
position: absolute;
width: 5em;
height: 0.1em;
background-color: #333;
}
.lens::before {
top: 1em;
}
.lens::after {
bottom: 1em;
}
增加快门开合动画效果:
.lens::before,
.lens::after {
animation: take-a-photo 3s infinite;
}
@keyframes take-a-photo {
10% {
height: calc(50% - 1em);
}
20% {
height: 0.1em;
}
}
画出照片:
.picture {
position: absolute;
width: inherit;
height: 13em;
top: 18em;
}
.picture::before {
content: '';
position: absolute;
box-sizing: border-box;
width: 15em;
height: 15em;
background: #555;
left: 2.5em;
border: solid linen;
border-width: 0 1em 2em 1em;
bottom: 0;
}
增加打印照片的动画效果:
.picture {
height: 0em;
overflow: hidden;
animation: print 3s infinite;
}
@keyframes print {
30% {
height: 0em;
}
80%, 100% {
height: 13em;
}
}
最后,把相机向上挪一点,保持垂直居中:
.camera {
transform: translateY(-3em);
}
大功告成!
原文地址:https://segmentfault.com/a/1190000015828039
如何用纯 CSS 创作一台拍立得照相机的更多相关文章
- 前端每日实战:94# 视频演示如何用纯 CSS 创作一台拍立得照相机
效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/YjYgey 可交互视频 此视频是可 ...
- 前端每日实战:63# 视频演示如何用纯 CSS 创作一台烤面包机
效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/OEBJRN 可交互视频 此视频是可 ...
- 前端每日实战:66# 视频演示如何用纯 CSS 创作一台咖啡机
效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/rKPLMW 可交互视频 此视频是可 ...
- 前端每日实战:74# 视频演示如何用纯 CSS 创作一台 MacBook Pro
效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/MXNNyR 可交互视频 此视频是可 ...
- 74.纯 CSS 创作一台 MacBook Pro
原文地址:https://segmentfault.com/a/1190000015568609 HTML code: <div class="macbook"> &l ...
- 如何用纯 CSS 创作文本滑动特效的 UI 界面
效果预览 在线演示 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/QrxxaW 可交互视频教 ...
- 如何用纯 CSS 创作一种有削铁如泥感觉的菜单导航特效
效果预览 在线演示 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/XqYroe 可交互视频教 ...
- 如何用纯 CSS 创作 404 文字变形为 NON 文字的交互特效
效果预览 在线演示 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/ZoxjXm 可交互视频教 ...
- 如何用纯 CSS 创作炫酷的同心矩形旋转动画
效果预览 在线演示 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/bMvbRp 可交互视频教 ...
随机推荐
- JSON 返回值JSONPath Syntax
{"sys":"ROC","code":0,"messages":"获取列表成功!","d ...
- 【BZOJ2428】均分数据
题解 先说说黄学长的做法: 当温度比较高的时候,贪心 每次随机一个数,把他放进当前和最少的那一组里面 温度足够低的时候就完全随机然后转移 对于一个排列,分组强制连续 答案显然唯一,做一遍(dp)就好 ...
- G.点我
链接:https://ac.nowcoder.com/acm/contest/903/G 题意: X腿与队友到河北省来参加2019河北省大学生程序设计竞赛,然而这场比赛的题目难度实在是太高了.比赛开始 ...
- BZOJ2595(状压dp)
要点 设\(f[i][j][k]\)为经过点\((i,j)\)且包含点集\(k\)的最小代价,其中k是指景点集合的枚举. 考虑有两种情况:1.点\((i,j)\)作为关键点连接了两个子集时\(f[i] ...
- jq:静态页面常会用到的jq操作(记录)
1 在php的mvc模式中通常需要做数据异步处理,其中也包含了对htm页面的操作,下面是近期长用到的jq操作,后续会继续补充 2 3 1:修改input框的value值 4 <input typ ...
- NET Core+MySql+Nginx
NET Core+MySql+Nginx 容器化部署 .NET Core容器化@Docker.NET Core容器化之多容器应用部署@Docker-Compose.NET Core+MySql+Ngi ...
- NET Core项目
在IIS上部署你的ASP.NET Core项目 概述 与ASP.NET时代不同,ASP.NET Core不再是由IIS工作进程(w3wp.exe)托管,而是使用自托管Web服务器(Kestrel) ...
- airodump-ng 界面参数比较详细的解释
BSSID: AP(access point)的MAC地址,,如果在client section中BSSID显示为"not associated" ,那么意味着该客户端没有和AP连 ...
- 《深入理解java虚拟机》笔记(2)HotSpot虚拟机对象探秘
一.对象的创建 1.类加载: 虚拟机在遇到一条new指令时候,检查类是否已被加载.解析.初始化过,如果没有,则执行类加载过程. 2.分配内存:类加载完成后,则为新对象从java堆上分配内存,分配内存有 ...
- Linux之shell命令实现-批量去掉文件名中空格,以及批量修改文件名为数字序号文件名
1 shell下批量出去文件名中的空格 执行看现象: 上面的是执行for循环以后看到的: 然而源目录下的文件如下: 这样的话想要cat某个具体文件是拿不到的,所以需要去空格处理: 处理方式有很多:如 ...