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

news/2025/1/15 15:38:48/

在这里插入图片描述

效果预览

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

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

http://www.ppmy.cn/news/300444.html

相关文章

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

效果预览 按下右侧的“点击预览”按钮可以在当前页面预览,点击链接可以全屏预览。 https://codepen.io/comehope/pen/YjYgey 可交互视频 此视频是可以交互的,你可以随时暂停视频,编辑视频中的代码。 请用 chrome, safari, edge 打开观看。 ht…

Pr 拍立得风格图片展示

哈喽,各位小伙伴!今天我们来学习一下如何制作拍立得风格的照片展示效果? 新建三个序列 在开始之前,我们需要新建三个序列 序列1:总合成-尺寸1902*1080序列2:照片合成-尺寸1920*1080序列3:照片…

STM32实验-PWM DAC模拟输出

一般一个STM32只有2个DAC输出通道,如果需要多路DAC输出,可以选择外扩DAC,但成本回相当高。于是在一些精度要求不高的场合,我们采用定时器输出PWM和RC滤波器模拟DAC来代替外扩DAC。 PWM占空比可由以下式子计算出:p n …

【MySQL高级篇笔记-数据库其它调优策略(中) 】

此笔记为尚硅谷MySQL高级篇部分内容 目录 一、数据库调优的措施 1、调优的目标 2、如何定位调优问题 3、调优的维度和步骤 二、优化MySQL服务器 1、优化服务器硬件 2、优化MySQL的参数 三、优化数据库结构 1、拆分表:冷热数据分离 2、增加中间表 3、增加…

AI绘画:让你的想象在纸上自由绽放

AI绘画:让你的想象在纸上自由绽放 需要源码请在文章下评论或私信 引言 随着科技的不断发展,人工智能技术已经开始在各个领域大放异彩。其中,AI绘画成为了一个备受关注的话题。AI绘画是指利用人工智能算法生成艺术作品的新型艺术形式。与传统…

elementUI树形结构过滤后展示数据和多选框选择问题

elementUI树形结构过滤后展示数据和多选框选择问题 <template><div><div class"flex mt14"><InputSelect title"品牌" :options"taskObj" class"ml20" change"handleBrand" :val"treeBrand"…

lubcon turmogrease turmosynthgrease turmotemp

lubcon turmogrease turmosynthgrease turmotemp GORUBER 戈润勃 4SFLUID 4SFLUIDSPRAY BAC V101 BIOLUBEHK22 BREMSENREINIGERLOSE COMPCLEANSTS DL6 FG100 FG32 FG46 FG68 GPX100 GPX46 GPX68 HTO46 HTO68 MT32 MT46 MT68 PEB32 PEBCOOLANT VG46 VG68 VPO100 DIACUT DIACUT…

让Placeholder在IE中燥起来

网上有好多关于这方面解决兼容性问题的文章&#xff0c;很多招式&#xff0c;学会这一招&#xff0c;让你轻松搞定Placeholder的兼容性&#xff0c;叫我好人&#xff0c;拿走&#xff0c;不谢。。。。 placeholder属性是HTML5 中为input添加的。在input上提供一个占位符&#x…