这篇文章发布于 2019年04月21日,星期日,17:00,归类于 CSS相关。 阅读 39018 次, 今日 4 次 21 条评论
by zhangxinxu from https://www.zhangxinxu.com/wordpress/?p=8607
本文可全文转载,个人网站无需授权,但需要保留原作者、出处以及文中链接,任何网站均可摘要聚合,商用请联系授权。
之前有至少5个人在评论中询问我文章中链接hover时候波浪下划线动画是怎么实现的,类似下图gif示意:
这里就介绍下是如何实现的。
有两种实现方法,各有优劣。
一、使用径向渐变纯CSS实现
就是使用径向渐变绘制我们的波浪线效果,一个波浪线循环段是有一个朝上的半个圆弧和一个朝下的半个圆弧组合而成的。
所以,我们只要使用径向渐变绘制圆弧,再通过background-position
控制两个圆弧的位置,让其前后拼接在一起就可以实现波浪线效果。
相关CSS代码如下:
.flow-wave { background: radial-gradient(circle at 10px -7px, transparent 8px, currentColor 8px, currentColor 9px, transparent 9px) repeat-x, radial-gradient(circle at 10px 27px, transparent 8px, currentColor 8px, currentColor 9px, transparent 9px) repeat-x; background-size: 20px 20px; background-position: -10px calc(100% + 16px), 0 calc(100% - 4px); }
实时效果如下若无效果请访问原页面地址:https://www.zhangxinxu.com/wordpress/?p=8607:
有了静态的波浪线效果,剩下的就像这个波浪线动起来,用CSS3 animation
动画控制background-position
位置即可。
.flow-wave { animation: waveFlow 1s infinite linear; } @keyframes waveFlow { from { background-position-x: -10px, 0; } to { background-position-x: -30px, -20px; } }
于是波浪线动画效果就实现了。
您可以狠狠地点击这里:CSS径向渐变模拟波浪线demo
这种方法实现的优点是颜色控制非常方便,例如,我们修改文字颜色为原谅绿,弯弯水波的颜色也变成了原谅绿:
此方法实现的不足就是:理解成本有点高,如何使用CSS radial-gradient
模拟波浪线效果是需要相当的CSS功力积累的,上手不太容易,以后要修改个尺寸什么的也不太好维护。同时,在普通屏幕密度屏幕下的Chrome浏览器上,线条并不平滑,吹毛求疵的设计师不一定会接受。
此时,可以试试下面这种更利于理解的方法。
二、使用SVG波形矢量图作为背景
就是我们直接使用一个使用SVG波形矢量图作为背景,不用自己去手动CSS绘制,代码量差不多,还更容易理解。CSS代码示意:
.svg-wave { background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 4'%3E%3Cpath fill='none' stroke='%23333' d='M0 3.5c5 0 5-3 10-3s5 3 10 3 5-3 10-3 5 3 10 3'/%3E%3C/svg%3E") repeat-x 0 100%; background-size: 20px auto; }
实时效果如下若无效果请访问原页面地址:https://www.zhangxinxu.com/wordpress/?p=8607:
有了静态的波浪线效果,剩下的就像这个波浪线动起来,用CSS3 animation
动画控制background-position
位置即可。
.svg-wave { animation: waveMove 1s infinite linear; } @keyframes waveMove { from { background-position: 0 100%; } to { background-position: -20px 100%; } }
此方法就是我博客链接使用的方法。
优点是线条边缘平滑,效果细腻,易理解,易上手,易维护。
缺点也很明显,就是波浪线的颜色无法实时跟着文字的颜色发生变化,适用于文字颜色不会多变的场景。
如果我们想要改变波浪线的颜色也很简单,修改background
代码中的stroke='%23333'
这部分,'%23'
就是就是#
,因此,stroke='%23333'
其实就是stroke='#333'
的意思。例如,我们需要改成红色略带橙色,可以stroke='%23F30'
,也可以写完整stroke='%23FF3300'
。
这个颜色就是我博客链接波浪线的颜色,如下图:
大家可以根据自己实际开发的场景选择合适的方法。
三、每当要结束的时候
text-decoration
属性早已支持波浪线下划线:
text-decoration-style: wavy;
效果如下截图:
可以看到,线好粗好不协调,而且字符和装饰线发生重叠的时候,装饰线直接消失了,结果波浪线变成了一截一截的,还需要使用text-decoration-skip
进行额外控制。因此,实际开发,不建议在实际项目中使用。
更新于2020-03-21
text-decoration
属性实现可以在实际项目中使用的波浪线也是可以的,可以参见我的这篇文章:“CSS text-decoration实现宽度100%波浪线效果”。
更新于2022-10-10
如果希望文字内有水波荡漾的效果,可以参见这个 codepen:https://codepen.io/t_afif/pen/WNdPPEO
由于不同浏览器下的波浪线宽度不一样,因此我们无法预知每个波浪线重复片段的宽度,想要无限运动理论上就不太可行。
因此,文字或者图形的波浪线动画效果不能使用text-decoration
的波浪线。
PS:text-decoration新增不止波浪线,还有虚线点线等,有兴趣可以参阅我之前写的“了解CSS3 text-decoration波浪线等新特性”这篇文章。
最后,写一首诗吧:
每当要结束的时候,
我总想再扯点什么。
追问癖好源自哪里?
远方那里有个孤岛。
本文为原创文章,会经常更新知识点以及修正一些错误,因此转载请保留原出处,方便溯源,避免陈旧错误知识的误导,同时有更好的阅读体验。
本文地址:https://www.zhangxinxu.com/wordpress/?p=8607
(本篇完)
- 了解CSS3 text-decoration波浪线等新特性 (0.364)
- 使用wavesurfer.js显示mp3 audio音频的波形图 (0.243)
- 纯JS实现多个音频的拼接或者合并 (0.243)
- JS改变AudioBuffer音量并下载为新audio音频 (0.243)
- 独家,MP3音频淡入淡出播放和转换的JS实现 (0.243)
- 使用“变量种子计数器”扩展CSS动画更多可能性 (0.100)
- 纯CSS实现蜡烛、火焰以及熄灭后烟雾效果 (0.096)
- 第五届CSS大会主题分享之CSS创意与视觉表现 (0.096)
- CSS技术分享: 文字在圆形内沿着弧线边界排版 (0.078)
- 3种纯CSS实现中间镂空的12色彩虹渐变圆环方法 (0.073)
- 更好的纯CSS滚动指示器技术实现 (RANDOM - 0.005)
我做的电视上电子看板,老板说数字有的固定不变,有点是变动的,能不能区别开来
这下好了,参考了您的 css 版波浪线,效果极其明显,横线代表不变,波浪线代表变动的数据字。
参考了你的 css 版波浪线,感谢分享。
渐变属性作用在background没有background-image好
background-image: radial-gradient(circle at 10px -7px, transparent 8px, currentColor 8px, currentColor 9px, transparent 9px),
radial-gradient(circle at 10px 27px, transparent 8px, currentColor 8px, currentColor 9px, transparent 9px);
background-repeat: repeat-x;
在多行文本上使用时,波浪下划线只在最后一行文字上生效。这个问题如何解决呢?
(实际场景:网站中有段声明(多行)比较重要,用动态波浪下划线,使用第一种方式后,就出现只在这段文字的最后一行出现)
应用在内联标签上试试?
感谢大佬
鑫哥 你的诗不押韵 没有freestyle 哟哟哟
mark一下,现在的 text-decoration-skip 更新为 text-decoration-skip-ink
支持的值:none、auto、inherit、initial、unset
一般用none使下划线能穿过y、g这种字母
好诗,好诗
demo 混入文章又是怎么做到的呢,每篇文章又能够相互不影响,
我的想法是在博客系统的style.min.css里面声明一个类,比如.svg-wave,为这个类赋予波浪线并且加上动画,那么,写文章的时候,在需要加波浪线的句子或段落上使用这个类即可(将编辑器切换到html代码格式,不是可视化格式,这样就可以编辑代码了)
画波浪线很少用,这个可以试试。
学习了,谢谢博主
看了结尾的八言绝句, 我有点想家。
想念某个妹子的图
旭哥终于分享该技术啦 万分感谢~
文章是好文章,就是最后的那首诗拉低了本文的档次。
哦
哈哈哈,陈陈独秀你坐下~
哈哈,有点东西
我会说最好奇期待的就是最后的再说点什么吗