ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

水滴按钮CSS实现指南:轮廓、质感与交互动效全解析

水滴按钮CSS实现指南:轮廓、质感与交互动效全解析 水滴按钮这名字听起来挺讨巧的实际上现在不管是App里的核心功能键、直播间的抢购入口还是网页端的悬浮操作按钮越来越多团队开始把这种圆润、带一点液态质感的形态当成视觉记忆点。我最初接触这个需求是给一个工具类产品的下载按钮做改版设计师给的标注图就叫“水滴按钮”要求悬停时要有“露珠滚落”的反馈点击时要有“涟漪荡开”的感觉。当时第一反应是这不就是圆角加大再加个渐变阴影吗真做起来才发现水滴和普通圆角按钮的底层逻辑完全不是一回事从轮廓比例、高光位置到动效物理参数每一步都在抠细节。这篇内容就围绕水滴按钮的完整实现来展开适合前端开发、UI设计师以及做交互动效的同学参考。我会把水滴轮廓的几何特征、CSS实现方案、质感渲染技巧以及悬停、点击、加载三种核心动效的物理模拟思路全部拆开讲。没有框架依赖原生HTML/CSS/JS就能落地拿到之后直接套进项目里改改配色和尺寸就能用。1. 先想清楚水滴按钮和普通圆角按钮差别在哪1.1 水滴不是“圆角更大”而是重心和方向感的问题普通按钮的设计逻辑是“容器思维”尺寸统一、圆角均匀视觉重心在正中心用户看到的第一反应是“这是一个功能区域”。水滴按钮完全不同它模拟的是液体的静态形态边界是不对称的顶部更饱满、底部收得更紧视觉重心明显偏上。这个重心偏移会带来一个微妙的心理暗示——它不像一个静止的方块更像“悬停中的一滴水”随时可能滑落。从几何层面拆解水滴轮廓通常需要满足三个特征顶部接近正圆的弧度、两侧中段有明显的向内收窄、底部收成一个较短的尖弧而非尖角。如果你只是把普通按钮的border-radius调成50%或者60%得到的是一个胶囊形或者椭圆视觉语义还是“被拉伸的圆”而不是“水滴”。这也是很多人第一步就做错的地方。在设计还原阶段我会用border-radius的多组值来实现这种不对称轮廓而不是依赖Png切图。CSS的border-radius支持八个值分别控制四个角的水平/垂直半径这给了我们很大的调形空间。真实的雨滴形态顶部的曲率大概在0.75到0.85之间底部的收窄曲率在0.3到0.5之间具体数值要看按钮的使用场景。像我自己做的话顶部用0.78、底部用0.42两侧不对称的比例控制在3:7左右出来的形状既不是“圆球”也不是“锥子”而是刚好有水滴感的那种弧度。1.2 水滴形态适合什么场景不适合什么场景水滴按钮的核心优势是亲和力和辨识度。它天然带一点“柔化”的效果比直角和标准圆角更有人情味适合用在需要降低操作压力、引导用户完成轻决策动作的场景。比较典型的像是播放器的播放/暂停键、收藏按钮、心理陪伴类App的主操作键、直播间的点赞按钮、内容社区的发帖按钮。这些场景的共同特点是用户操作频率高需要按钮看起来“软一点”、“友好一点”而不是冷冰冰的工具入口。但水滴形态不太适合承载强功能性的操作。比如表单提交、确认弹窗里的主按钮、管理后台的保存按钮这类场景用户的预期是“明确的、方正的、可预期的”水滴的不对称和液态感反而会削弱操作的安全感。同样如果一个页面里同时出现多个水滴按钮用户会很难快速扫出操作层级因为水滴的视觉注意力太强了。我的建议是一个页面最多出现一个水滴形态的主操作按钮其他按钮保持常规形态形成主次对比。2. 静态水滴按钮用CSS把形状和质感做扎实2.1 轮廓的CSS实现八个半径值怎么调先给一个可以直接用的基础轮廓值。假设按钮尺寸是120px乘120px我们用aspect-ratio保证宽高比然后用border-radius做水滴形.water-drop-btn { width: 120px; aspect-ratio: 1 / 1; background: linear-gradient(145deg, #6ec6ff, #0a84ff); border: none; border-radius: 78% 22% 50% 50% / 48% 62% 38% 52%; cursor: pointer; transition: border-radius 0.4s cubic-bezier(0.23, 1, 0.32, 1); }这组值看起来像绕口令我解释一下每个数字在干嘛border-radius的八个值从左到右分别对应左上角水平、右上角水平、右下角水平、左下角水平斜杠后面的四个值对应四个角的垂直半径。78%和22%让左上角特别鼓、右上角往里收48%和62%控制左上和右上的垂直拉伸让上半部分更接近圆润的穹顶38%和52%让下半部分左右不对称地收紧模拟水珠底部微微上翘的弧度。基础知识补充border-radius单个值如果写成百分比是基于元素自身的宽高计算的。120px的按钮78%就是93.6px但因为四个角相互影响实际渲染出来的曲率会受相邻角半径的抵消作用所以不需要太较真单个数值的数学意义更多是靠肉眼微调。这也是我建议的做法——先把按钮放在深色背景上反复看轮廓两三个像素的差异在浅色背景下看不出来但深色背景下水滴感差很多。2.2 质感渲染高光、暗部和环境光是水滴的关键轮廓对了下一步是做“水”的质感。水滴按钮区别于普通按钮的最大视觉特征就是它像液体——液态感的本质是光在曲面上的反射和折射落到CSS里就是一组精心排布的高光和阴影。之前我做第一版水滴按钮只加了一个浅色内阴影和常规box-shadow效果特别平看起来就是一个灰色的椭圆按钮完全没有水的通透感。后来琢磨了挺久给按钮拆了三层光影才解决第一层是顶部高光用一个伪元素模拟水滴左上方的反射光斑。这个反射光斑一定是偏椭圆形的白色、半透明位置靠近左上角而不是正中间。真实的水滴高光会在光源同侧偏上通常是左上或者右上取决于你的页面整体光源方向。我的习惯是统一放左上保持全局一致。第二层是底部暗部用内阴影在按钮下半部分压一层深色。这层暗部模拟的是水滴底部因为表面张力而聚拢的厚重感同时也能让按钮看起来有立体厚度不会像一张贴纸。第三层是外部的环境阴影用常规box-shadow做。水滴的投影应该比普通按钮更柔和、范围更大但透明度更低因为液体是半透明的落在地面的阴影是“光穿过水之后”形成的边缘要朦胧。综合起来我的静态按钮CSS是这样写的.water-drop-btn { position: relative; width: 120px; aspect-ratio: 1; border: none; outline: none; background: linear-gradient(145deg, #8fd0ff 0%, #1a8cff 55%, #0064d2 100%); border-radius: 78% 22% 50% 50% / 48% 62% 38% 52%; cursor: pointer; box-shadow: 0 12px 28px rgba(0, 100, 210, 0.35), 0 2px 6px rgba(0, 40, 100, 0.25), inset 0 -10px 18px rgba(0, 60, 150, 0.35), inset 0 8px 12px rgba(255, 255, 255, 0.28); -webkit-tap-highlight-color: transparent; } .water-drop-btn::before { content: ; position: absolute; width: 42%; height: 26%; left: 12%; top: 10%; background: radial-gradient( ellipse at center, rgba(255, 255, 255, 0.65) 0%, rgba(255, 255, 255, 0) 70% ); transform: rotate(-28deg); border-radius: 50%; pointer-events: none; } .water-drop-btn::after { content: ; position: absolute; width: 6%; height: 6%; right: 22%; top: 18%; background: rgba(255, 255, 255, 0.45); border-radius: 50%; filter: blur(1px); pointer-events: none; }这里::after模拟的是水滴右下侧的次反射小光斑就是光线经过内部折射后在另一侧形成的亮度点。真实的水滴渲染里这个点很小、很弱但加上之后液态感会有质的提升。我当时一个小技巧做完高光之后把按钮截图放到100%和20%两种尺寸下对比看。小尺寸下如果高光糊成一片说明透明度太高或者尺寸太大要往下压大尺寸下如果高光变成白块说明范围太大要缩小椭圆尺寸。适配不同使用场景的按钮高光参数基本都要重新微调。2.3 静态按钮的典型配色策略水滴按钮的配色基本决定了它是否“像水”蓝青色系是最安全的因为人们天然会把水和蓝色关联起来。但项目里客户不一定接受蓝色我做过的水滴按钮有珊瑚橙、薄荷绿甚至紫灰色结论是不挑色系挑的是明暗关系。水滴感的来源是“左上亮、右下暗、周边泛光”跟色调无关。秘诀在于渐变的明度跨度要够大同一色相从亮到暗的跨度如果少于30%水滴看起来就是一个扁平的圆形贴纸完全没有体积感。以薄荷绿为例我会把渐变写成linear-gradient(145deg, #baf7d4, #2fd37e 55%, #00a35c)高光保持白色阴影带一点灰绿这样既有水的通透感又不跳脱页面整体配色。2.4 兼容性说明这种基于border-radius加渐变和伪元素的做法兼容性还是比较稳的。需要注意几个点aspect-ratio在2021年之后的浏览器版本基本都支持了如果要覆盖老旧浏览器可以用padding-top的百分比技巧做占位radial-gradient和linear-gradient的多个颜色节点老浏览器也支持不用担心。真正需要留意的是如果你给水滴按钮加了backdrop-filter做毛玻璃背景效果在部分浏览器上会有渲染bug表现为子元素的圆角被撕开或者出现白边。这个项目里我没用backdrop-filter说句实话水滴按钮本身光影层次已经很丰富再加毛玻璃反而容易脏。3. 动效进阶让水滴真正“活”起来静态水滴只是形状对了离“惊艳”还差得远。我在项目里总结的经验是水滴按钮的动态反馈至少要包含三个层次悬停时的形变感知、点击时的水波扩散、以及特定场景下的加载反馈。这三层分别由CSS过渡和JavaScript驱动我会逐个拆解物理参数和实现思路。3.1 悬停动效形变优先别只顾着变色很多团队的按钮悬停动效都是“背景色变深阴影变大”这在水滴按钮上完全是浪费。水滴本身应该像真正的液体一样在受力鼠标悬停时发生轻微的形变——顶部更鼓、底部略微拉伸。我用CSS的transition去做border-radius的渐变动画悬停时把顶部曲率从0.78提高到0.84底部从0.42降到0.36视觉上就像水滴要从按钮表面“挣脱”出来一样。同时悬停时水滴的阴影会向外扩张形成一种“水珠微微离开接触面”的感觉。真实的水滴要脱落之前与桌面的接触面积变小、阴影变淡。所以悬停时的box-shadow要减少外阴影的扩散范围并降低透明度同时增加内阴影的顶部泛光。我实际调试下来外阴影的透明度降低15%左右、扩散半径缩小4px效果比较自然。高光位置也可以顺手做一个平滑的偏移让光斑往左上方再移动一点配合形变强化“即将滑落”的动势。这几个动效叠加下来悬停的反馈就会从“这个按钮变色了”变成“这个按钮活了过来”。需要注意的坑是border-radius的过渡动画在部分浏览器上会有点掉帧尤其是元素偏大或页面偏复杂的时候。我的解决方案是给transition显式声明耗时和缓动函数比如transition: border-radius 0.4s cubic-bezier(0.23, 1, 0.32, 1)这个缓动函数是easeOutQuint模拟的是液体回弹最常用的速度曲线。3.2 点击水波小成本做出“涟漪”的核心方案点击反馈我做的是“涟漪扩散变形回弹”的组合。涟漪通过动态插入一个span元素来实现——点击时在鼠标的落点处生成一个圆形水波然后让它以落点为圆心向外扩散同时透明度衰减到零动画结束后移除节点。这个方案不依赖任何第三方库也不影响按钮原本的布局。核心思路是监听pointerdown事件获取点击位置在按钮内部的相对坐标然后创建一个span定位到该坐标用一个CSS动画把它从scale(0)放大到scale(12)同时opacity从0.45降到0。动画结束后通过监听animationend事件移除这个span。加scale(12)而不是固定的scale值是为了保证水波在偏大尺寸的按钮上也能覆盖全按钮避免出现“涟漪还没扩散到边缘就消失了”的情况。代码示例style .water-drop-btn { position: relative; overflow: hidden; } .water-drop-btn .ripple { position: absolute; border-radius: 50%; pointer-events: none; background: rgba(255, 255, 255, 0.5); transform: scale(0); animation: ripple 0.7s ease-out; } keyframes ripple { to { transform: scale(12); opacity: 0; } } /style script const btn document.querySelector(.water-drop-btn); btn.addEventListener(pointerdown, function (e) { const rect btn.getBoundingClientRect(); const ripple document.createElement(span); const size Math.max(rect.width, rect.height) * 0.15; ripple.className ripple; ripple.style.width ripple.style.height size px; ripple.style.left e.clientX - rect.left - size / 2 px; ripple.style.top e.clientY - rect.top - size / 2 px; btn.appendChild(ripple); ripple.addEventListener(animationend, () ripple.remove()); }); /script注意几点pointerdown要在click之前触发所以水波反馈比点击事件的默认状态变化更早观感上更跟手overflow: hidden会把水滴按钮的边界作为裁剪区域水波不会溢出按钮边框正好形成“涟漪在水滴内部扩散”的效果。这里有一个很关键的小思考overflow:hidden会把前面设置的box-shadow外阴影也裁掉一半因为阴影的一部分在元素边界外。所以给按钮加overflow:hidden之后外阴影会从左右两侧消失只剩下上下方向的阴影。我在项目里遇到的第一个坑就是这个。解决办法有两个一是把外阴影单独提一层伪元素做按钮本体保持overflow:hidden二是放弃外阴影的整体裁切思路只保留内阴影利用水滴本身的渐变体积感外加绝对定位的阴影层。更推荐的做法是在按钮外层再包一个容器容器负责外阴影按钮本体负责内部彩色和overflow:hidden。结构变成这样div classdrop-wrapper button classwater-drop-btn span classdrop-icon▶/span /button /divdrop-wrapper有外阴影water-drop-btn保持overflow:hidden裁剪水波伪元素照常做高光和内部光影。分层各司其职互不干扰。3.3 加载状态液面上升最贴近“水滴”语义的loading水滴按钮还有一个常见场景是加载中。常规做法是按钮里放一个旋转的spinner但这在水滴按钮里很违和——水滴的液态质感被一个机械感很强的圆圈破坏了。我后来做了个液面上升的效果点击触发下载/提交之后按钮内的水滴从底部到顶部逐渐被填充一层“液面”填充过程中顶部微微波动加载完成之后整滴变成实色然后再恢复常态。液面上升的核心是一个绝对定位的伪元素背景色用半透明的白色定位在底部高度从0%过渡到100%过渡动画的时长根据实际加载时间去调整。关键点在于液面上升的顶部不是一条直线而是用border-radius做一个向上的弧形配合一个微弱的旋转或者缩放动画模拟水面的波动。这个动效虽然简单但配合水滴轮廓非常契合——加载形态和水滴形态在语义上是一致的都是“液体在变化”用户不需要额外学习就能理解按钮正在处理中。实现的时候注意loading状态下要禁用按钮的点击事件避免用户连续触发多次请求。我在项目里用的是btn.disabled true同时要调整按钮的cursor样式和透明度给用户明确的状态反馈。4. 水滴按钮的实战避坑与调优心得4.1 高光光斑容易显脏关键是控制透明度和模糊度做第一版水滴按钮的时候高光光斑的透明度给得太高0.8结果在深色背景上看起来像一个贴纸式的白色圆点特别廉价。后来我把主高光的透明度调到0.5左右次高光调到0.3加了1px的blur跟背景的融合度立刻好了很多。如果你的按钮背景颜色越深高光透明度需要降得越低这是一个经验值背景越深、光线越暗高光越弱。另外一个小细节高光光斑不要追求居中也不要正圆形。真实水滴的高光是椭圆形的长轴大致和液滴边缘的切线方向一致。我把高光的光斑用radial-gradient的ellipse at center做成椭圆形然后rotate(-28deg)让它的长轴方向指向右上角这样光线扫过曲面时的反射变化才自然。4.2 border-radius和overflow的组合坑以及按钮内部元素裁剪前面提过overflow:hidden裁掉外阴影的问题这里再补充一个更隐蔽的坑如果水滴按钮里放了图标或文字比如播放器按钮里的三角播放图标这些内容会被水滴轮廓裁掉一部分。看起来很正常的现象但如果图标偏大或者位置偏下就会有一条边被“看不见的轮廓”切断。我在做播放器场景时遇到过一次三角图标底部被水滴的收窄弧线切掉了一个角一开始还以为是图标绘制的问题后来逐层打开才发现是水滴轮廓的下半部分本来就比视觉框要窄。解决方案是给图标设置一个安全的内边距或者给图标套一层缩小版的容器并居中保证图标的主体在水滴轮廓的“可视安全区”内。大概经验是图标尺寸不要超过按钮宽度的45%图标中心点往上偏移8%到12%这样无论水滴轮廓怎么收窄图标都不会被裁剪。4.3 hover动效在移动端要小心“粘住”hover动效在桌面端体验很好但在移动端有个经典问题用户手指点了按钮之后hover状态不会自动消失按钮会一直保持悬停时的形变状态看起来就像“被粘住了”。我测试了几款安卓机这个问题仍然存在。最省事的解法是使用媒体查询把hover相关动效限制在支持hover的设备上用media (hover: hover)包裹悬停形变的CSS在触摸设备上直接跳过这层反馈只保留点击水波和按压效果。这样移动端用户点按的时候会直接触发按压的变化逻辑而不是先触发悬停再等待变化。按压反馈我通常用一个短平快的scale(0.94)来实现加上一个紧一点的缓动模拟“手指按压液体表面”的阻尼感。4.4 性能建议让动效只走transform和opacity水滴按钮的动效涉及border-radius的过渡、box-shadow的过渡和transform的缩放这三者在性能上的开销差距很大。border-radius的过渡在每一帧都会重新计算圆角几何box-shadow的模糊计算更是典型的GPU高成本操作。如果页面里同时存在多个水滴按钮这些动效叠加会把低端设备的主线程占满出现明显的卡顿。我的取舍是悬停形变的border-radius过渡时长控制在0.4秒以内并且只在必要的交互动作中触发阴影的变化尽量不叠加在border-radius过渡的同一时刻而是做一个延迟等形变快结束再切换阴影点击水波和按压反馈都只走transform:scale和opacity这两个属性可以触发合成器加速基本不会引起重排和重绘在移动端表现尤其重要。另外如果一个页面里有多个水滴按钮同时做动效建议统一使用will-change: transform, opacity来提示浏览器提前优化。但注意will-change不要一次性加太多否则会让浏览器驻留大量合成层挤占内存反而拖慢页面。我的做法是只在交互关键目标上加比如主操作按钮、播放键这类用户会频繁触碰的元素。4.5 可访问性形变动效别让弱视用户掉队动效在视觉上很讨喜但对部分用户可能是困扰。水滴按钮的形变如果幅度过大、时间过长会引起前庭敏感用户的不适。实际项目中我会遵循一个原则形变幅度控制在视觉可感知但不夸张的范围内悬停和点击动效时长不超过0.5秒另外确保按钮在高对比度模式或用户系统设置“减少动态效果”时回归静态显示。实现上可以用media (prefers-reduced-motion: reduce)来关闭形变和水波动画保留基本的透明度反馈。这个媒体查询在主流浏览器里都有不错的支持一行代码就能让动效对不适用户自动降级属于性价比极高的可访问性优化。标签方面如果水滴按钮承载的是图标操作记得加aria-label说明功能比如“播放”“收藏”而不是让屏幕阅读器念出一串无意义的ASCII符号。5. 一个完整的实现组合把代码拼起来跑一遍理论讲了不少这里我整理了一套可以直接复制到项目里的完整实现。场景是一个模仿“下载/安装”的C端操作按钮静态水滴、悬停形变、点击水波、加载上升、成功回弹五个状态都覆盖了。代码结构是HTML、CSS、JS分离的方便二开。div classdrop-wrapper button iddropBtn classwater-drop-btn aria-label下载 span classdrop-icon↓/span span classdrop-ripple/span span classdrop-fill/span /button span classdrop-status点击下载/span /div/* 外层容器负责外阴影 */ .drop-wrapper { position: relative; display: inline-flex; flex-direction: column; align-items: center; gap: 12px; filter: drop-shadow(0 12px 20px rgba(0, 100, 210, 0.3)); } .water-drop-btn { position: relative; width: 96px; height: 96px; border: none; outline: none; background: linear-gradient(145deg, #8fd0ff, #1a8cff 55%, #0064d2); border-radius: 78% 22% 50% 50% / 48% 62% 38% 52%; cursor: pointer; transition: border-radius 0.35s cubic-bezier(0.23, 1, 0.32, 1), filter 0.3s ease, transform 0.2s ease; overflow: hidden; -webkit-tap-highlight-color: transparent; } .water-drop-btn::before { content: ; position: absolute; width: 42%; height: 26%; left: 10%; top: 8%; background: radial-gradient(ellipse at center, rgba(255, 255, 255, 0.55), rgba(255, 255, 255, 0) 70%); transform: rotate(-28deg); border-radius: 50%; pointer-events: none; } .water-drop-btn::after { content: ; position: absolute; width: 8%; height: 8%; right: 20%; top: 16%; background: rgba(255, 255, 255, 0.35); border-radius: 50%; filter: blur(1px); pointer-events: none; } .water-drop-btn .drop-icon { position: relative; z-index: 2; font-size: 30px; color: rgba(255, 255, 255, 0.92); font-weight: 700; transform: translateY(-6px); display: inline-block; } .water-drop-btn .drop-fill { position: absolute; left: 0; right: 0; bottom: 0; height: 0%; background: linear-gradient(to top, rgba(255, 255, 255, 0.48), rgba(255, 255, 255, 0.1)); transition: height 1s cubic-bezier(0.23, 1, 0.32, 1); z-index: 1; pointer-events: none; } .water-drop-btn.loading .drop-fill { height: 100%; } .water-drop-btn:active { transform: scale(0.94); transition-duration: 0.06s; } media (hover: hover) { .water-drop-btn:hover { border-radius: 84% 16% 50% 50% / 52% 60% 40% 56%; filter: brightness(1.06); } } media (prefers-reduced-motion: reduce) { .water-drop-btn { transition: none; animation: none; } .water-drop-btn .drop-fill { transition: none; } }const btn document.getElementById(dropBtn); const status document.querySelector(.drop-status); let isLoading false; btn.addEventListener(pointerdown, (e) { if (isLoading) return; const rect btn.getBoundingClientRect(); const ripple document.createElement(span); const size Math.max(rect.width, rect.height) * 0.18; ripple.style.cssText position: absolute; width: ${size}px; height: ${size}px; left: ${e.clientX - rect.left - size / 2}px; top: ${e.clientY - rect.top - size / 2}px; border-radius: 50%; background: rgba(255,255,255,0.45); pointer-events: none; z-index: 3; transform: scale(0); animation: ripple 0.6s ease-out forwards; ; btn.appendChild(ripple); ripple.addEventListener(animationend, () ripple.remove()); }); btn.addEventListener(click, () { if (isLoading) return; isLoading true; btn.classList.add(loading); btn.setAttribute(aria-busy, true); status.textContent 下载中……; setTimeout(() { isLoading false; btn.classList.remove(loading); btn.setAttribute(aria-busy, false); status.textContent 已下载; }, 1600); }); keyframes ripple { to { transform: scale(12); opacity: 0; } }这段代码里有一个细节我觉得很关键水波动画的span是用JavaScript插入到按钮内部的它跟按钮内的图标之间会存在层级问题。我给图标设置了z-index:2给水波设置了z-index:3所以水波会覆盖在图标上方模拟“水纹从图标之上荡开”的效果而液面填充层放在z-index:1在图标之下避免遮住图标。层级关系对了整个加载过程的视觉层次才清晰。6. 水滴按钮的未来方向从具体控件走向系统语言水滴按钮这类“高质感拟物化交互”的设计早年被扁平化浪潮冲淡过一阵但这两年随着3D渲染和glassmorphism的重新流行它的热度又回来了。不过如果只是把按钮做得像水滴那还停留在“单个控件”的层面。我最近在几个项目里看到团队会把水滴形态扩展到更宏观的交互系统里下拉刷新时的水滴聚集与释放、滑动解锁时的水珠路径、进度条填充时的液面波动甚至按钮组之间用一条半透明的“水流”做联动。这些实践的底层逻辑和单体水滴按钮是一样的都是利用液态的形变、聚散和动态折射来传递状态变化。如果你打算入坑水滴交互动效我建议不要只盯着CSS怎么写而是先建立一个“物理直觉”水在什么情况下会加速、会减速、会变形、会回弹。把这套直觉映射成缓动函数和关键帧效果根本不需要复杂的JavaScript物理引擎。像我之前说的easeOutQuint模拟加速滴落、easeOutBack模拟轻微回弹掌握了这些你就能自然地把水滴语言延伸到更多场景里。最后提醒一下水滴按钮用多了容易审美疲劳设计的时候一定要想清楚它在你的产品里承担的角色——是用户每天都要碰的核心操作还是一次性引导的惊喜彩蛋。如果是后者动效可以做得更大胆一些沉浸感强一些如果是前者克制和稳定远比炫技重要。
返回列表