经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » HTML/CSS » CSS » 查看文章
渐变边框文字效果?CSS 轻松拿捏!
来源:cnblogs  作者:ChokCoco  时间:2024/7/22 9:32:28  对本文有异议

今天,有个群友问了我这么一个问题,如果不想切图,是否有办法实现带渐变边框的字体效果?如下所示:

本文,就将尝试一下,在 CSS 中,我们可以如何尽可能的实现这种渐变边框字体效果。

元素叠加

首先,比较容易想到的写法是通过元素叠加实现。

  1. 元素本身实现文字效果本身
  2. 通过元素的伪元素,配合 background-clip: text 实现渐变文字,并且通过 transform 或者设置大几号的文字,实现渐变字体
  3. 将(1)(2)进行叠加

我们尝试一下这种方式:

  1. <div data-text="4"></div>
  1. div {
  2. position: relative;
  3. width: 300px;
  4. height: 150px;
  5. font-size: 100px;
  6. text-align: center;
  7. font-weight: bold;
  8. &::before,
  9. &::after {
  10. content: attr(data-text);
  11. position: absolute;
  12. inset: 0;
  13. color: #000;
  14. }
  15. &::before {
  16. transform: scale(1.1);
  17. background: linear-gradient(cyan, #fc0);
  18. background-clip: text;
  19. color: transparent;
  20. }
  21. }

这里,我们让 before 伪元素after 伪元素 两个伪元素进行具体内容的展示,after 伪元素 只展示具体的文字,字号为 100px,而before 伪元素放大一点点后叠加在另外一个伪元素下面,效果如下:

可以看到,这种方式,边框并不均匀。

而且,如果字数更多,效果更差:

所以,通过叠加实现,显然不可取。

通过 SVG feMorphology 滤镜实现

到这里,我又想到,在之前,写过的两篇文章:

我们借助了 SVG 滤镜能够实现对元素的腐蚀(变薄)或扩张(加粗)。

看看原理,feMorphology 为形态滤镜,它的输入源通常是图形的 alpha 通道,用来它的两个操作可以使源图形腐蚀(变薄)或扩张(加粗)。

使用属性 operator 确定是要腐蚀效果还是扩张效果。使用属性 radius 表示效果的程度,可以理解为笔触的大小。

  • operator:erode 腐蚀模式,dilate 为扩张模式,默认为 erode
  • radius:笔触的大小,接受一个数字,表示该模式下的效果程度,默认为 0

我们将这个滤镜简单的应用到文字上看看效果:

  1. <div class="g-text">
  2. <p>Normal Text</p>
  3. <p class="dilate">Normal Text</p>
  4. <p class="erode">Normal Text</p>
  5. </div>
  6. <svg width="0" height="0">
  7. <filter id="dilate">
  8. <feMorphology in="SourceAlpha" result="DILATED" operator="dilate" radius="3"></feMorphology>
  9. </filter>
  10. <filter id="erode">
  11. <feMorphology in="SourceAlpha" result="ERODE" operator="erode" radius="1"></feMorphology>
  12. </filter>
  13. </svg>
  1. p {
  2. font-size: 64px;
  3. }
  4. .dilate {
  5. filter: url(#dilate);
  6. }
  7. .erode {
  8. filter: url(#erode);
  9. }

效果如下:最左边的是正常文字,中间的是扩张的模式,右边的是腐蚀模式,看看效果,非常好理解:

如果能理解到这一点,我们可以尝试:

  1. 利用 background-clip: text 实现渐变文字
  2. 利用 SVG feMorphology 的腐蚀模式,实现被细化的文字
  3. 将两者叠加起来

代码如下:

  1. <div data-text="123/678"></div>
  2. <div data-text="123/678"></div>
  3. <div data-text="123/678"></div>
  4. <svg width="0" height="0">
  5. <filter id="outline">
  6. <feMorphology in="SourceAlpha" result="ERODE" operator="erode" radius="2"></feMorphology>
  7. <feFlood flood-color="#fff" flood-opacity="1" result="flood"></feFlood>
  8. <feComposite in="flood" in2="ERODE" operator="in" result="OUTLINE"></feComposite>
  9. <feMerge>
  10. <feMergeNode in="OUTLINE" />
  11. </feMerge>
  12. </filter>
  13. </svg>
  1. div {
  2. position: relative;
  3. width: 100vw;
  4. height: 150px;
  5. font-size: 120px;
  6. font-weight: bold;
  7. text-align: center;
  8. &::before,
  9. &::after {
  10. content: attr(data-text);
  11. position: absolute;
  12. inset: 0;
  13. }
  14. &::before {
  15. color: transparent;
  16. background: linear-gradient(0deg, #da00ff, #2a79b7, #7e3eff);
  17. background-clip: text;
  18. }
  19. &::after {
  20. filter: url(#outline);
  21. }
  22. }
  23. div:nth-child(2) {
  24. font-family: 'Cherry Bomb One', cursive;
  25. font-size: 90px;
  26. }
  27. div:nth-child(3) {
  28. font-family: 'Darumadrop One', cursive;
  29. font-size: 150px;
  30. }

基于此,看看效果,这里我尝试了 3 种不同的字体:

看着还是挺不错的,利用 SVG 能够使源图形腐蚀(变薄)或扩张(加粗)的能力,我们巧妙的实现了文字的渐变边框效果。

完整的 DEMO,你可以戳这里:CodePen Demo -- SVG 实现渐变边框字体

文字边框 -webkit-text-stroke

结束了吗?还没有。一开始我就有想过使用 -webkit-text-stroke 来实现。

但是转念一想,认为 -webkit-text-stroke 无法实现渐变边框,并且它需要使用 -webkit- 前缀,可能会存在兼容问题,结果在讨论的过程中,牛逼的群友给出了使用 -webkit-text-stroke 实现的方式:

  1. <div class="wrapper">
  2. <span class="text" data-text="1234567890"></span>
  3. <span class="text" data-text="我能吞下玻璃而不伤身体"></span>
  4. </div>
  1. .wrapper {
  2. position: relative;
  3. font-size: 128px;
  4. --stroke-width: 12px;
  5. --background-gradient: linear-gradient(red 0%, green 100%);
  6. --text-gradient: linear-gradient(white 0%, cyan 100%);
  7. }
  8. .text {
  9. position: relative;
  10. }
  11. .text::before,
  12. .text::after {
  13. content: attr(data-text);
  14. display: block;
  15. background-clip: text;
  16. color: transparent;
  17. }
  18. .text::before {
  19. position: absolute;
  20. inset: 0;
  21. background-image: var(--background-gradient);
  22. -webkit-text-stroke: var(--stroke-width);
  23. }
  24. .text::after {
  25. position: relative;
  26. z-index: 1;
  27. background-image: var(--text-gradient);
  28. }

-webkit-text-stroke 解法思路本质上也是用的它的背景色,使用了 stroke 的伪元素只是为了让其字更大一圈,从而背景色可以露出来。

并且,-webkit-text-stroke 的边框颜色,可以支持直接设置渐变色,如此一来,我们就得到非常完美的效果:

并且,从 CanIUse - text-stroke,到今天,-webkit-text-stroke 的兼容性已经非常好了:

我们完全可以放心使用 -webkit-text-stroke 设置文字的各种类型边框效果。

完整的 DEMO,你可以戳这里:CodePen Demo -- CSS text stroke with gradient By Rex Zeng

最后

简单总结一下,综上所述,其实 -webkit-text-stroke 是最简单最便捷的实现渐变文字边框的方式。当然,SVG 方法也有其优势,如果需要多重边框效果,甚至是多重渐变文字边框效果,此时,SVG 会更为强大。

好了,本文到此结束,希望本文对你有所帮助 ??

更多精彩 CSS 技术文章汇总在我的 Github -- iCSS ,持续更新,欢迎点个 star 订阅收藏。

如果还有什么疑问或者建议,可以多多交流,原创文章,文笔有限,才疏学浅,文中若有不正之处,万望告知。

原文链接:https://www.cnblogs.com/coco1s/p/18312942

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号