最新要闻
- 天天有喜大结局是什么?天天有喜演员表
- 蜜糖三部曲是哪部电视剧?蜜糖三部曲有什么关系?
- 华约自主招生是什么意思?华约自主招生考试笔试经验
- 如何用环保袋制作衣服?用环保袋制作衣服的方法有哪些?
- 女医明妃传原型是谁?女医明妃传演员表
- 冒险岛怎么删除角色?冒险岛怎么提升面板?
- 高考穿什么衣服寓意好?高考穿什么衣服吉利?
- 红海行动是根据哪个真实事件改编的?红海行动真实事件原型
- 女娲传说之灵珠大结局是什么?女娲传说之灵珠演员表介绍
- 福州一中地址在哪里?福州一中录取分数线2022
- 还转投N卡阵营吗?国内AMD RX7900 XT货源开始变多 7599元起
- 最新资讯:本田真爱粉狂喜 全新思域两厢版上市:手动挡卖到16万
- 三只松鼠年货坚果礼盒大促:109立减60元 49包邮到手
- 高分天气应用Dark Sky即将关闭:苹果呼吁用户使用自带天气
- 天天新资讯:谷爱凌再创一新世界纪录:反脚1260板尾抓板女子世界第一
- 影响力无敌!梅西夺冠帖点赞量成Instagram史上第一:球衣被抢光
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
资讯:一颗红心,三手准备,分别基于图片(img)/SCSS(样式)/SVG动画实现动态拉轰的点赞按钮特效
华丽炫酷的动画特效总能够让人心旷神怡,不能自已。艳羡之余,如果还能够探究其华丽外表下的实现逻辑,那就是百尺竿头,更上一步了。本次我们使用图片、SCSS样式以及SVG图片动画来实现“点赞”按钮的动画特效,并比较不同之处。
(资料图片仅供参考)
图片实现
最简单,也最容易理解的实现方式就是使用图片。曾几何时,几乎所有前端特效都需要借助图片来完成。
实现原理很简单,通过不同的关键帧来“拼接”一段完整的动画影片,每一帧即该动画的每一个瞬间“状态”。
首先声明必要的盒子模型:
这里以div为例子,声明伪类对象heart。
随后通过样式对heart伪类进行控制:
.heart { cursor: pointer; height: 50px; width: 50px; background-image:url( "https://abs.twimg.com/a/1446542199/img/t1/web_heart_animation.png"); background-position: left; background-repeat:no-repeat; background-size:2900%; } .heart:hover { background-position:right; } .is_animating { animation: heart-burst .8s steps(28) 1; } @keyframes heart-burst { from {background-position:left;} to { background-position:right;} }
这里指定背景图片位置,只显示最左侧的背景元素,鼠标悬停时则只显示最右侧背景元素,然后当鼠标点击div时,触发@keyframes heart-burst动画,从左侧移动至右侧,一共进行28帧的侧移动作:
这样就完成了一段流畅的动画特效:
See the Pen Untitled by 刘悦的技术博客 (@v3ucom) on CodePen.
需要注意的是,这里需要借助JavaScript绑定单击事件,所以需要引入zepto.min.js文件
https://cdnjs.cloudflare.com/ajax/libs/zepto/1.2.0/zepto.min.js
通过zepto.min.js库就可以很方便的操作页面节点:
$(".heart").on("click touchstart", function(){ $(this).toggleClass("is_animating"); }); $(".heart").on("animationend", function(){ $(this).toggleClass("is_animating"); });
逻辑是单击事件触发动画,动画执行过程中再次点击则移除动画效果。
此种方式依赖多帧背景图、CSS动画以及JavaScript事件绑定,显然成本有些高,同时多帧图片平铺导致体积过大,也会占用系统带宽,得不偿失。
纯SCSS(样式)实现
使用纯CSS样式也可以完成这样的特效,但CSS3原生语法太过复杂,这里我们使用SCSS语法,SCSS是 CSS3的超集,在保证兼容性的前提下,允许使用变量、 嵌套、 混合、导入等特性, 在编写逻辑复杂的CSS代码时,可以简化逻辑,提高CSS的代码可读性。
首先还是创建基本盒子模型:
这里通过复选框和标签元素来控制点赞按钮的状态。
随后编写SCSS逻辑:
$bubble-d: 4.5rem; // bubble diameter $bubble-r: .5*$bubble-d; // bubble-radius @mixin bubble($ext) { transform: scale(1); border-color: #cc8ef5; border-width: $ext; } body { display: flex; justify-content: center; margin: 0; height: 100vh; } [id="toggle-heart"] { position: absolute; left: -100vw; &:checked + label { color: #e2264d; will-change: font-size; animation: heart 1s cubic-bezier(.17, .89, .32, 1.49); &:before, &:after { animation: inherit; animation-timing-function: cubic-bezier(.21, .61, .35, 1); } &:before { will-change: transform, border-width, border-color; animation-name: bubble; } } } [for="toggle-heart"] { align-self: center; position: relative; color: #aab8c2; font-size: 2em; cursor: pointer; &:before, &:after { position: absolute; z-index: -1; top: 50%; left: 50%; border-radius: 50%; content: ""; } &:before { box-sizing: border-box; margin: -$bubble-r; border: solid $bubble-r #e2264d; width: $bubble-d; height: $bubble-d; transform: scale(0); } } @keyframes heart { 0%, 17.5% { font-size: 0; } } @keyframes bubble { 15% { @include bubble($bubble-r); } 30%, 100% { @include bubble(0); } }
这里首先将复选框按钮移出界面,随后定义bubble对象,这里bubble指的是点击后膨胀的紫色(#cc8ef5)泡泡,直径是4.5rem,并且圆角修饰:$bubble-r: .5*$bubble-d
随后通过id选择器toggle-heart状态判断元素状态,触发heart和bubble动画,在一秒内动态的改变heart元素以及bubble元素的位置、大小以及边框透明度,从而完成动态特效。
接着添加烟花特效:
body { display: flex; justify-content: center; margin: 0; height: 100vh; background: linear-gradient(135deg, #121721, #000); font: 1em verdana, sans-serif; } [id="toggle-heart"] { position: absolute; left: -100vw; } [id="toggle-heart"]:checked + label { color: #e2264d; filter: none; will-change: font-size; -webkit-animation: heart 1s cubic-bezier(0.17, 0.89, 0.32, 1.49); animation: heart 1s cubic-bezier(0.17, 0.89, 0.32, 1.49); } [id="toggle-heart"]:checked + label:before, [id="toggle-heart"]:checked + label:after { -webkit-animation: inherit; animation: inherit; -webkit-animation-timing-function: ease-out; animation-timing-function: ease-out; } [id="toggle-heart"]:checked + label:before { will-change: transform, border-width, border-color; -webkit-animation-name: bubble; animation-name: bubble; } [id="toggle-heart"]:checked + label:after { will-change: opacity, box-shadow; -webkit-animation-name: sparkles; animation-name: sparkles; } [id="toggle-heart"]:focus + label { text-shadow: 0 0 3px white, 0 1px 1px white, 0 -1px 1px white, 1px 0 1px white, -1px 0 1px white; } [for="toggle-heart"] { align-self: center; position: relative; color: #888; font-size: 2em; filter: grayscale(1); -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; cursor: pointer; } [for="toggle-heart"]:before, [for="toggle-heart"]:after { position: absolute; z-index: -1; top: 50%; left: 50%; border-radius: 50%; content: ""; } [for="toggle-heart"]:before { box-sizing: border-box; margin: -2.25rem; border: solid 2.25rem #e2264d; width: 4.5rem; height: 4.5rem; transform: scale(0); } [for="toggle-heart"]:after { margin: -0.1875rem; width: 0.375rem; height: 0.375rem; box-shadow: 0.32476rem -3rem 0 -0.1875rem #ff8080, -0.32476rem -2.625rem 0 -0.1875rem #ffed80, 2.54798rem -1.61656rem 0 -0.1875rem #ffed80, 1.84982rem -1.89057rem 0 -0.1875rem #a4ff80, 2.85252rem 0.98418rem 0 -0.1875rem #a4ff80, 2.63145rem 0.2675rem 0 -0.1875rem #80ffc8, 1.00905rem 2.84381rem 0 -0.1875rem #80ffc8, 1.43154rem 2.22414rem 0 -0.1875rem #80c8ff, -1.59425rem 2.562rem 0 -0.1875rem #80c8ff, -0.84635rem 2.50595rem 0 -0.1875rem #a480ff, -2.99705rem 0.35095rem 0 -0.1875rem #a480ff, -2.48692rem 0.90073rem 0 -0.1875rem #ff80ed, -2.14301rem -2.12438rem 0 -0.1875rem #ff80ed, -2.25479rem -1.38275rem 0 -0.1875rem #ff8080; } @-webkit-keyframes heart { 0%, 17.5% { font-size: 0; } } @keyframes heart { 0%, 17.5% { font-size: 0; } } @-webkit-keyframes bubble { 15% { transform: scale(1); border-color: #cc8ef5; border-width: 2.25rem; } 30%, 100% { transform: scale(1); border-color: #cc8ef5; border-width: 0; } } @keyframes bubble { 15% { transform: scale(1); border-color: #cc8ef5; border-width: 2.25rem; } 30%, 100% { transform: scale(1); border-color: #cc8ef5; border-width: 0; } } @-webkit-keyframes sparkles { 0%, 20% { opacity: 0; } 25% { opacity: 1; box-shadow: 0.32476rem -2.4375rem 0 0rem #ff8080, -0.32476rem -2.0625rem 0 0rem #ffed80, 2.1082rem -1.26585rem 0 0rem #ffed80, 1.41004rem -1.53985rem 0 0rem #a4ff80, 2.30412rem 0.85901rem 0 0rem #a4ff80, 2.08305rem 0.14233rem 0 0rem #80ffc8, 0.76499rem 2.33702rem 0 0rem #80ffc8, 1.18748rem 1.71734rem 0 0rem #80c8ff, -1.35019rem 2.0552rem 0 0rem #80c8ff, -0.60229rem 1.99916rem 0 0rem #a480ff, -2.44865rem 0.22578rem 0 0rem #a480ff, -1.93852rem 0.77557rem 0 0rem #ff80ed, -1.70323rem -1.77366rem 0 0rem #ff80ed, -1.81501rem -1.03204rem 0 0rem #ff8080; } } @keyframes sparkles { 0%, 20% { opacity: 0; } 25% { opacity: 1; box-shadow: 0.32476rem -2.4375rem 0 0rem #ff8080, -0.32476rem -2.0625rem 0 0rem #ffed80, 2.1082rem -1.26585rem 0 0rem #ffed80, 1.41004rem -1.53985rem 0 0rem #a4ff80, 2.30412rem 0.85901rem 0 0rem #a4ff80, 2.08305rem 0.14233rem 0 0rem #80ffc8, 0.76499rem 2.33702rem 0 0rem #80ffc8, 1.18748rem 1.71734rem 0 0rem #80c8ff, -1.35019rem 2.0552rem 0 0rem #80c8ff, -0.60229rem 1.99916rem 0 0rem #a480ff, -2.44865rem 0.22578rem 0 0rem #a480ff, -1.93852rem 0.77557rem 0 0rem #ff80ed, -1.70323rem -1.77366rem 0 0rem #ff80ed, -1.81501rem -1.03204rem 0 0rem #ff8080; } }
新增sparkles对象,通过动态的控制元素的彩色阴影来表现点击后的烟花动态效果:
See the Pen Untitled by 刘悦的技术博客 (@v3ucom) on CodePen.
这里为了增加效果对比度,将背景设置为深色,同时为点赞按钮增加亮色边框:
[id="toggle-heart"]:focus + label { text-shadow: 0 0 3px #fff, 0 1px 1px #fff, 0 -1px 1px #fff, 1px 0 1px #fff, -1px 0 1px #fff; }
大体上,利用transform属性控制元素的绝对定位、颜色、边框以及盒子模型阴影来完成此种特效,带宽资源占用层面,明显比图片更具优势。
SVG实现
SVG是矢量图形,不受像素的影响,从而使得它在不同的平台或者媒体下表现出的兼容性更好,与此同时,SVG对动画的支持较好,其DOM结构可以被其特定语法或者CSS控制,从而轻松的实现动画效果。
首先依然声明盒子模型:
随后定义样式:
:root { --size: 100px; --frames: 62; } html { background-color: #15202B; min-height: 100vh; display: flex; justify-content: center; align-items: center; user-select: none; } input { display: none; } .like { display: block; width: var(--size); height: var(--size); cursor: pointer; border-radius: 999px; overflow: visible; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); -webkit-tap-highlight-color: transparent; } .hearth { background-image: url("https://assets.codepen.io/23500/Hashflag-AppleEvent.svg"); background-size: calc(var(--size) * var(--frames)) var(--size); background-repeat: no-repeat; background-position-x: calc(var(--size) * (var(--frames) * -1 + 2)); background-position-y: calc(var(--size) * 0.02); width: var(--size); height: var(--size); } input:checked + .hearth { animation: like 1s steps(calc(var(--frames) - 3)); animation-fill-mode: forwards; } @keyframes like { 0% { background-position-x: 0; } 100% { background-position-x: calc(var(--size) * (var(--frames) * -1 + 3)); } } @media (hover: hover) { .like:hover { background-color: #E1255E15; .hearth { background-position-x: calc(var(--size) * (var(--frames) * -1 + 1)); } } }
和普通图片如出一辙,通过background-image来控制背景SVG图片的顺序,对背景的横坐标进行侧移动画操作,只不过帧数提高到62帧:
See the Pen Untitled by 刘悦的技术博客 (@v3ucom) on CodePen.
可以看到这里通过input:checked状态就可以触发@keyframes like横移动画,并不需要单独撰写JavaScript逻辑。
结语
三种动画特效实现方式各有千秋,但从可维护性以及成本控制角度上看,SCSS显然是最优解。
-
资讯:一颗红心,三手准备,分别基于图片(img)/SCSS(样式)/SVG动画实现动态拉轰的点赞按钮特效
华丽炫酷的动画特效总能够让人心旷神怡,不能自已。艳羡之余,如果还能够探究其华丽外表下的实现逻辑,...
来源: -
快播:火山引擎 DataTester 为企业降本增效:1 个人也能成为一支 A/B 实验团队
更多技术交流、求职机会,欢迎关注字节跳动数据平台微信公众号,回复【1】进入官方交流群今年天猫电商、...
来源: 资讯:一颗红心,三手准备,分别基于图片(img)/SCSS(样式)/SVG动画实现动态拉轰的点赞按钮特效
一篇文章彻底明白java中的重要概念——注解
环球新消息丨【源码透视】SpringBoot的SPI机制
快播:火山引擎 DataTester 为企业降本增效:1 个人也能成为一支 A/B 实验团队
Netty-介绍-1
天天有喜大结局是什么?天天有喜演员表
Mybatis批量插入3种方法
蜜糖三部曲是哪部电视剧?蜜糖三部曲有什么关系?
华约自主招生是什么意思?华约自主招生考试笔试经验
如何用环保袋制作衣服?用环保袋制作衣服的方法有哪些?
全球资讯:青龙面板之淘宝
当前热点-彩虹女神跃长空,Go语言进阶之Go语言高性能Web框架Iris项目实战-JWT和中间件(Middleware)的使用EP07
全球资讯:数智赋能:透过低代码看企业如何实现数智转型
速读:基于 Dubbo Admin 实现流量灰度
女医明妃传原型是谁?女医明妃传演员表
冒险岛怎么删除角色?冒险岛怎么提升面板?
高考穿什么衣服寓意好?高考穿什么衣服吉利?
红海行动是根据哪个真实事件改编的?红海行动真实事件原型
女娲传说之灵珠大结局是什么?女娲传说之灵珠演员表介绍
福州一中地址在哪里?福州一中录取分数线2022
Qt做大型软件开发技术选型Part2:Qt调用C#编写的COM组件
世界视讯!Cpp Primer:Sec 4, 5, 6
【当前独家】项目管理工具飞项傍身,居家办公效率“快人一步”
要闻:redis—安装以及可视化
还转投N卡阵营吗?国内AMD RX7900 XT货源开始变多 7599元起
最新资讯:本田真爱粉狂喜 全新思域两厢版上市:手动挡卖到16万
三只松鼠年货坚果礼盒大促:109立减60元 49包邮到手
高分天气应用Dark Sky即将关闭:苹果呼吁用户使用自带天气
天天新资讯:谷爱凌再创一新世界纪录:反脚1260板尾抓板女子世界第一
管理经验
环球速看:程序员面试找替身 “作弊” 入职,结果大快人心。。。
影响力无敌!梅西夺冠帖点赞量成Instagram史上第一:球衣被抢光
最纯净的国产手机系统!博主实测努比亚Z50系统广告默认关闭:世界清净了
环球观焦点:当AI作画入侵鬼畜区
全球时讯:不适合中国观众 只有《流浪地球2》?出品方:《阿凡达2》没理由不引进
质感绝了!一加11海外官宣:2月7日登场
【环球新要闻】SSD白菜价先别下单:有猫腻
世界动态:使用brew安装历史版本的几种方式
当前快讯:第一百一十六篇: JavaScript理解对象
世界微资讯!Python参数解析器configparser
民间大神用虚幻5自制《原神》 :这视觉效果爱了
【环球报资讯】曾经缔造玛雅文明!为什么玉米的产量世界第一?
深扒《阿凡达2》背后的故事:才是真的“细思恐极”!
【全球快播报】蔚来CEO李斌回应数据泄露问题 绝不会与不法行为妥协
全球热推荐:我去大疆新总部逛了逛:评测了有史以来最大的“产品”
焦点速递!Python unittest+ddt+openpyxl接口自动化
今日热讯:MAUI新生4.4-笔刷Brush
每日焦点!梅西晒怀抱大力神杯入睡照!淘宝同款奖杯被抢光
速讯:python + selenium实现gitlab全文搜索
热资讯!Codeforces 1763 F Edge Queries 题解
天天视讯!如何使用Yum History查找已安装或已删除的软件包信息
天天新消息丨混合场景
当前热议!神似梅西男子成网红 被民众围堵合影:这也太像了
分析师称《阿凡达2》难以回本:卡梅隆标准定太高了
2199元 掌阅Smart Air Pro电纸书上架:8寸大屏、300PPI显示
前端工程化Vue-cli
天天微头条丨Python unittest数据处理ddt
前端CSS Flex布局8大重难点知识,收藏起来吧
世界新消息丨django10 分页器与Form组件
【全球新要闻】FreeSWITCH学习笔记:XML配置文件
天天即时:怀旧情怀拉满:宾得宣布将开发新款胶片相机
阿根廷夺冠“拯救”伊利 但“奶茅”光环渐黯
环球快讯:一加宣布与OPPO服务融合:12月底全面加入OPPO售后服务系统
东北将迎今冬以来最强降雪:持续时间最长、范围最广
世界速递!框架第九课---ajax补充说明,多对多三种创建方式,django内置序列化组件(drf前身),ORM批量操作数据(ORM操作优化),自定义分页器,f
WPF工控组态软件之温度计
每日播报!Iceberg在袋鼠云的探索及实践
每日关注!hibernate validate工具,小心你的姿势不对
PCIe 5.0 SSD终于满血了!读写都是14GB/s、容量8TB
热消息:蔚来遭遇225万美元数据勒索 官方声明
当前讯息:铃木“大G”!吉姆尼五门版无伪谍照:最多能塞进7个人
奇迹!女子手机从26楼掉落未摔坏 真身竟是这款手机
5499元 联合创新推出新款32英寸显示器:4K MiniLED屏、144Hz高刷
“非洲之王”拥抱新技术:传音首台折叠屏手机已通过蓝牙SIG认证
天天短讯!世界北极熊之都升温过快 已危及北极熊生存:吃不上饭了
天天热资讯!深度学习炼丹-数据处理和增强
世界热门:记录--可视化大屏-用threejs撸一个3d中国地图
Python操作Excel(openpyxl)
全球热点评!Html5 canvas创意特效合集
即时看!1月1日起:澳门私家车可经港珠澳大桥出入内地
观速讯丨巡游大巴太高 梅西险些撞上电缆!他带回阿根廷的大力神杯居然是复制品
天天短讯!中国联通科技人才占比已达30% 曾发话不能再用老眼光看电信行业
空难曾致346人死亡 波音737 Max飞机延期采用最新安全标准
每日观察!广州多个外卖平台下单后配送慢 平台:员工已是全负荷工作
世界视讯!数据结构堆(Heap)&排序&二叉树
今日播报!用好这个任务管理工具,轻松躲避职场明枪暗箭
世界今日报丨彩虹女神跃长空,Go语言进阶之Go语言高性能Web框架Iris项目实战-登录与图形验证码(captcha)EP06
今日热闻!低代码:如何成为企业业务价值提升的一大利器?
热消息:Intel第二代独立显卡1年后见:要追上RTX 4070!
主页不刷新了 小红书崩了累坏网友:WiFi、流量疯狂切换
罗永浩称他的失败不是理想主义的错 是他们自己的错
世界热讯:吴京《流浪地球2》吃苹果皮:大年初一上映
世界要闻:中国移动千兆宽带用户已达2.4亿!你是其中之一吗?
安全信息流工具-中文安全RSS小程序
supervisor+gunicorn+uvicorn部署fastapi项目
天天实时:四年保质期囤货无压力!900压缩饼干8斤85元
天天热资讯!iPhone 15系列或重新划分机型组合:14 Plus太拉胯 要大改
一加11质感绝了!刘作虎给员工秀真机:围观群众都发出WOW
美国“显卡税”又推迟9个月:一旦征收 最多涨价25%
全球讯息:大无语 车主称理想L9半个月坏三次 充电口从电动变手动