如何用纯 CSS 创作一个冒着热气的咖啡杯

效果预览

在线演示

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


https://codepen.io/zhang-ou/pen/xjXxoz


可交互视频教程


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


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


https://scrimba.com/c/cBm4eU9


源代码下载


本地下载

请从 github 下载。


https://github.com/comehope/front-end-daily-challenges/tree/master/013-hot-coffee-cup


代码解读


定义 dom,一个名为 coffee 的容器,其中包含一个名为 cup 的元素:

<div class="coffee"><div class="cup"></div>
</div>

居中显示:

html, body {height: 100%;align-items: center;justify-content: center;background-color: brown;
}

画出杯子主体:

.coffee .cup {width: 10em;height: 9em;background-color: white;border-bottom-left-radius: 1.5em;border-bottom-right-radius: 1.5em;
}

用伪元素画出杯口:

.coffee .cup {position: relative;
}.coffee .cup::before {content: '';position: absolute;width: 100%;height: 2em;background-color: chocolate;border: 0.5em solid white;box-sizing: border-box;border-radius: 50%;top: -1em;box-shadow: inset 0 0 1em rgba(0, 0, 0, 0.5);
}

用伪元素画出杯子把手:

.coffee .cup::after {content: '';position: absolute;width: 3em;height: 3.5em;border: 0.8em solid white;border-radius: 50%;top: 20%;left: 80%;
}

dom 元素增加托盘:

<div class="coffee"><div class="cup"></div><div class="plate"></div>
</div>

画出托盘:

.coffee {display: flex;flex-direction: column;align-items: center;height: calc(9em   1em);position: relative;
}.coffee .plate {width: 16em;height: 1em;background-color: white;border-bottom-left-radius: 50%;border-bottom-right-radius: 50%;position: absolute;bottom: -1px;
}

dom 元素增加杯中冒出的热气:

<div class="coffee"><div class="vapor"><span></span><span></span><span></span><span></span><span></span></div><div class="cup"></div><div class="plate"></div>
</div>

画出杯中冒出的热气:

.coffee {height: calc(9em   1em   2em);
}.coffee .vapor {width: 7em;display: flex;justify-content: space-between;
}.coffee .vapor span {width: 0.1em;min-width: 1px;height: 2em;background-color: white;
}

定义热气冒出的动画:

.coffee .vapor span {animation: evaporation 2s linear infinite;filter: opacity(0);
}@keyframes evaporation {from {transform: translateY(0);filter: opacity(1) blur(0.2em);}to {transform: translateY(-4em);filter: opacity(0) blur(0.4em);}
}

最后,调整每条热气的延迟时间,使动感更强:

.coffee .vapor span:nth-child(1) {animation-delay: 0.5s;
}.coffee .vapor span:nth-child(2) {animation-delay: 0.1s;
}.coffee .vapor span:nth-child(3) {animation-delay: 0.3s;
}.coffee .vapor span:nth-child(4) {animation-delay: 0.4s;
}.coffee .vapor span:nth-child(5) {animation-delay: 0.2s;
}

大功告成!

知识点

  • border-bottom-left-radius https://developer.mozilla.org/en-US/docs/Web/CSS/border-bottom-left-radius
  • border-bottom-right-radius https://developer.mozilla.org/en-US/docs/Web/CSS/border-bottom-right-radius
  • box-shadow https://developer.mozilla.org/en-US/docs/Web/CSS/box-shadow
  • calc() https://developer.mozilla.org/en-US/docs/Web/CSS/calc
  • translateY() https://developer.mozilla.org/en-US/docs/Web/CSS/transform-function/translateY
  • filter https://developer.mozilla.org/en-US/docs/Web/CSS/filter
  • animation-delay https://developer.mozilla.org/en-US/docs/Web/CSS/animation-delay

原文地址:https://segmentfault.com/a/1190000014734039


更多专业前端知识,请上 【猿2048】www.mk2048.com

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/364699.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

用keras实现基本的回归问题

数据集介绍 共有506个样本,拆分为404个训练样本和102个测试样本 该数据集包含 13 个不同的特征: 人均犯罪率。占地面积超过 25000 平方英尺的住宅用地所占的比例。非零售商业用地所占的比例(英亩/城镇)。查尔斯河虚拟变量&#xf…

Java:计算类的serialVersionUID

在本周早些时候,我想计算可序列化类的serialVersionUID ,以便可以覆盖其toString方法而不会破坏所有内容。 我遇到了Frank Kim的博客文章 ,该文章建议使用JDK附带的serialver工具。 我创建了一个Maven小项目来在一个非常简单的类上测试该工…

Codeforces Round #556 (Div. 1)

Codeforces Round #556 (Div. 1) A. Prefix Sum Primes 给你一堆1,2,你可以任意排序,要求你输出的数列的前缀和中质数个数最大。 发现只有\(2\)是偶质数,那么我们先放一个\(2\),再放一个\(1\),接下来把\(2\)全部放掉再…

FC冒险岛java版_冒险岛单机版

游戏概述冒险岛单机版是一款非常好玩的横版动作RPG游戏,游戏难度很适中,冒险岛单机版采用了与其他Q版2D游戏不同的横向卷轴的移动方式,场景高低落差的设计,整个画面层次感设计算是一级,喜欢这类手柄闯关游戏的玩家快来…

通过小程序实现网站扫码登录!每年都可以省 300 块...代替微信开放平台和服务号的登陆模式!

我们知道,要接入微信登陆有两种方式 1、微信开放平台2、微信服务号 这两种方式均可生成带参数的二维码,然后扫码获取用户基本信息的,所以我们可以在网站上用这两种方式开发网站的扫码登录,也是现在很多网站的通用做法。 微信开…

WAR文件与具有嵌入式服务器的Java应用程序

大多数服务器端Java应用程序(例如,面向Web或面向服务的)都希望在容器中运行。 打包这些应用程序以进行分发的传统方法是将它们捆绑为WAR文件。 这无非是具有标准目录布局的ZIP归档文件,其中包含运行时所需的所有库和应用程序级依赖…

JavaFX自定义控件– Nest Thermostat第3部分

嗨,经过与同事的讨论,我今天决定展示css方法不是唯一可用于创建自定义控件的方法。 当然,它允许提供一些外观扩展点,但是可以使用代码API使用相同的方法(与向JavaFX的转换)一起使用。 这是图形初始化方法&…

ceph rgw java_ceph rgw multisite基本用法

Realm: Zonegroup: 理解为数据中心,由一个或多个Zone组成,每个Realm有且仅有 一个Master Zonegroup,用于处理系统变更,其他的称为Slave Zonegroup,元数据与Master Zonegroup保持一致&#xff1b…

Python基础-Hello Word!

老师说,学习语言一定要有仪式感,So... print (“Hello Word”) 哈哈,好牛叉! 一、 Python安装 Windows 1、 下载安装包 https://www.python.org/downloads/ 2、 安装 默认安装路径: C:\Users\admin\AppData\Local\Programs\Python…

微信小程序 request请求封装

request 只用 POST,只封装了 POST,等有用到 GET再重写,接口用的 ThinkPHP5.0主要代码 var apiurl "xxxxx"; function http_post(controller,data,cb){wx.request({url:apiurl controller,data:data,method:post,header:{Content-…

MySQL基本语句

MySQL基本语句 数据库语句介绍: 语言分类: DDL:数据库和表 DML:表中的数据 DQL:查询表中的数据 DCL:(授权) DDL: 1、操作数据库 创建数据库: create database 数据库名; 创建数据库,…

使用Java注解不正确的方法

几乎没有什么Deprecated没有适当的文档看到Deprecated方法更令人生气的了。 我感到失落。 我应该仍然使用该方法吗? 可能这不是开发人员的意图,这就是为什么他/她添加了弃用注释。 我应该使用其他东西吗? 所以…。 使用Deprecated的规则是什…

easypanel mysql错误_Easypanel v1.6(虚拟主机控制面板)图文使用教程

一、Easypanel软件简介:Easypanel是一款虚拟主机管理工具,它支持php(windows系统还支持asp、asp.net)、磁盘配额、在线文件管理、在线web软件安装,是一款集虚拟主机、ftp、mysql等功能为一体的管理系统,本身还集成了kangle web服务…

游戏、脑洞大开1(密码简单破译)

“二八”妙龄写密码,看谁聪明“爱死他”。 密文:766C7273626F76706A5E6F715F7271766C72706D626B71716C6C71666A62 注意:(1)此题由正心41上课的同学做 (2)第一个提交,答案&#xff1a…

html-字体属性

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><style>* {margin: 0;padding: 0;}/*font-family 字体类型浏览器默认的字体是微软雅黑&#xff0c;字体中有多个字体的时候&…

thinkPHP利用ajax异步上传图片并显示、删除

近来学习tp5的过程中&#xff0c;项目中有个发帖功能&#xff0c;选择主题图片。如下&#xff1a; 利用原始的文件上传处理&#xff0c;虽然通过原始js语句能实时显示上传图片&#xff0c;但是这样的话会涉及很多兼容问题。使用ajax技术&#xff0c;实现选择性删除所选图片功能…

我喜欢构建器模式的三个原因

有三种方法可以用Java编程语言创建新对象&#xff1a; 伸缩构造函数&#xff08;反&#xff09;模式 Javabeans模式 建造者模式 与其他两种方法相比&#xff0c;我更喜欢使用构建器模式。 为什么&#xff1f; Joshua Bloch描述了构建器模式以及在Effective Java中使用它的…

表单php跳转页面跳转,form表单页面跳转方式提交练习

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼//form表单提交练习/*新建一个form.html网页用来书写前端HTML表单*/表单提交练习姓名:年龄:电话:地址:QQ:自我评价://以上功能可自己添加或修改/*在form.html网页的基础上新建一个foms.php网页关联之前的form.html网页并书写php测试…

.NetCore模拟Postman的BasicAuth生成Authrization

一、思路 BasicAuth 是一种简单权限&#xff0c;传输UserName<userName>,Password<password> 1.用:连接Username,Password 2.进行Base64编码 3."Basic空格"拼接 二、代码示例 string authorization $"{userName}:{password}"; var authorizat…

Vue项目页面跳转时候的,浏览器窗口上方的进度条显示

1.安装&#xff1a; cnpm install --save nprogress 2.在main.js中引入&#xff1a; 1 import NProgress from nprogress 2 import nprogress/nprogress.css 3.在main.js中进行配置&#xff1a; 1 NProgress.configure({ 2 easing: ease, // 动画方式 3 spee…