效果预览

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

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 创作一台拍立得照相机的更多相关文章

  1. 前端每日实战:94# 视频演示如何用纯 CSS 创作一台拍立得照相机

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

  2. 前端每日实战:63# 视频演示如何用纯 CSS 创作一台烤面包机

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

  3. 前端每日实战:66# 视频演示如何用纯 CSS 创作一台咖啡机

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

  4. 前端每日实战:74# 视频演示如何用纯 CSS 创作一台 MacBook Pro

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

  5. 74.纯 CSS 创作一台 MacBook Pro

    原文地址:https://segmentfault.com/a/1190000015568609 HTML code: <div class="macbook"> &l ...

  6. 如何用纯 CSS 创作文本滑动特效的 UI 界面

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

  7. 如何用纯 CSS 创作一种有削铁如泥感觉的菜单导航特效

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

  8. 如何用纯 CSS 创作 404 文字变形为 NON 文字的交互特效

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

  9. 如何用纯 CSS 创作炫酷的同心矩形旋转动画

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

随机推荐

  1. js中的面向对象程序设计

    面向对象的语言有一个标志,即拥有类的概念,抽象实例对象的公共属性与方法,基于类可以创建任意多个实例对象,一般具有封装.继承.多态的特性!但JS中对象与纯面向对象语言中的对象是不同的,ECMA标准定义J ...

  2. Unity 打包PC和安卓的路径注意事项

    if UNITY_STANDALONE_WIN || UNITY_EDITOR return Application.persistentDataPath + "/LocalData&quo ...

  3. 047 Permutations II 有重复数字的全排列

    给定一个可能包含重复数字的集合,返回所有可能的不同全排列.例如,[1,1,2] 有以下不同全排列:[  [1,1,2],  [1,2,1],  [2,1,1]] 详见:https://leetcode ...

  4. Smarty中的请求变量和保留变量的使用范例

    PHP中提供的超全局数组 Smarty中对应的请求变量 $_GET               <{$smarty.get}> $_POST                         ...

  5. JS中实现JSON对象和JSON字符串之间的相互转换

    对于主流的浏览器(比如:firefox,chrome,opera,safari,ie8+),浏览器自己提供了JSON对象,其中的parse和stringify方法实现了JSON对象和JSON字符串之间 ...

  6. 切记切记:Spring配置文件中,Component-scan无法扫描到的类中的自动装配对象无法被调用,报空指针错误。

    Spring单例注入,单例对象可设置成Spring元件. 只有Spring的元件中@Autowired才有用,在普通类中@Autowired虽然不会编译报错,但运行时会报空指针错误.

  7. Kendo MVVM 数据绑定(九) Text

    Kendo MVVM 数据绑定(九) Text Text 绑定可以使用 ViewModel 来设置 DOM 元素的文本属性,如果需要设置 input,textarea,或 select 的显示,需要使 ...

  8. Android RecyclerView使用GridLayoutManager间距设置

    使用RecyclerView设置间距,需要重写RecyclerView.ItemDecoration这个类.有如下的效果图需要实现,间距只有中间的格子和底部的格式之间有.   Paste_Image. ...

  9. Eucalyptus——EC2的开源实现(转载)

    Eucalyptus[22]是加利福尼亚大学的 Daniel Nurmi 等人实现的,是一个用于实现云计算的开源软件基础设施.Eucalyptus 是 Amazon EC2 的一个开源实现,它与 EC ...

  10. win7双网卡走哪个网卡路由设置

    有没有软件能做这个我还真不知道.说说我的做法吧: 单位里无线是可以访问Internet的,有线是用来访问公司内部系统的. 默认的54M无线网络和100M的有线网络,系统在选择默认路由的时候肯定是选择有 ...