整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

渐变边框文字效果?CSS 轻松拿捏!

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

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

元素叠加

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

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

我们尝试一下这种方式:

<div data-text="4"></div>
div {
    position: relative;
    width: 300px;
    height: 150px;
    font-size: 100px;
    text-align: center;
    font-weight: bold;

    &::before,
    &::after {
        content: attr(data-text);
        position: absolute;
        inset: 0;
        color: #000;
    }
    
    &::before {
        transform: scale(1.1);
        background: linear-gradient(cyan, #fc0);
        background-clip: text;
        color: transparent;
    }
}

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

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

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

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

通过 SVG feMorphology 滤镜实现

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

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

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

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

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

<div class="g-text">
    <p>Normal Text</p>
    <p class="dilate">Normal Text</p>
    <p class="erode">Normal Text</p>
</div>

<svg width="0" height="0">
    <filter id="dilate">
        <feMorphology in="SourceAlpha" result="DILATED" operator="dilate" radius="3"></feMorphology>
    </filter>
    <filter id="erode">
        <feMorphology in="SourceAlpha" result="ERODE" operator="erode" radius="1"></feMorphology>
    </filter>
</svg>
p {
    font-size: 64px;
}
.dilate {
    filter: url(#dilate);
}
.erode {
    filter: url(#erode);
}

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

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

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

代码如下:

<div data-text="123/678"></div>
<div data-text="123/678"></div>
<div data-text="123/678"></div>
<svg width="0" height="0">
    <filter id="outline">
        <feMorphology in="SourceAlpha" result="ERODE" operator="erode" radius="2"></feMorphology>
        <feFlood flood-color="#fff" flood-opacity="1" result="flood"></feFlood>
        <feComposite in="flood" in2="ERODE" operator="in" result="OUTLINE"></feComposite>
        <feMerge>
            <feMergeNode in="OUTLINE" />
        </feMerge>
    </filter>
</svg>

div {
    position: relative;
    width: 100vw;
    height: 150px;
    font-size: 120px;
    font-weight: bold;
    text-align: center;
    
    &::before,
    &::after {
        content: attr(data-text);
        position: absolute;
        inset: 0;
    }
    &::before {
        color: transparent;
        background: linear-gradient(0deg, #da00ff, #2a79b7, #7e3eff);
        background-clip: text;
    }
    &::after {
        filter: url(#outline);
    }
}
div:nth-child(2) {
    font-family: 'Cherry Bomb One', cursive;
    font-size: 90px;
}
div:nth-child(3) {
    font-family: 'Darumadrop One', cursive;
    font-size: 150px;
}

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

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

文字边框 -webkit-text-stroke

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

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

<div class="wrapper">
  <span class="text" data-text="1234567890"></span>
  <span class="text" data-text="我能吞下玻璃而不伤身体"></span>
</div>
.wrapper {
  position: relative;
  font-size: 128px;
  
  --stroke-width: 12px;
  --background-gradient: linear-gradient(red 0%, green 100%);
  --text-gradient: linear-gradient(white 0%, cyan 100%);
}

.text {
  position: relative;
}
.text::before,
.text::after {
  content: attr(data-text);
  display: block;
  background-clip: text;
  color: transparent;
}
.text::before {
  position: absolute;
  inset: 0;
  background-image: var(--background-gradient);
  -webkit-text-stroke: var(--stroke-width);
}
.text::after {
  position: relative;
  z-index: 1;
  background-image: var(--text-gradient);
}

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

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

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

最后

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

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



链接:https://juejin.cn/post/7363220159505694747

180个渐变颜色取了自己的颜色名字也是让我脑洞大开。

效果图

你经常为你的UI寻找好看的背景渐变吗?

一个集合180种免费的线性渐变网站,可在任何网站使用您不仅可以复制渐变的原生CSS颜色代码,还可以查看下载每个优质的渐变图片。

链接:http://color.oulu.me

复制CSS

放大全屏查看渐变效果

收录 180 个线性渐变背景免费集合的网站,你可以从这里挑选网站背景,利用产生的 CSS 语法将它快速套用到你网站的任何部分。让使用者能直接点击后预览背景效果,一键产生 CSS 语法或下载 PNG 图片格式。

大图

主页截图

测试浏览器版本号——chrome 75.0.3770.80;opera 60.0.3255.109;firefox 67.0;ie 11。

之前《CSS之图片特殊用法》有讲过不同用途的image属性,渐变作为image的属性值参与以上用途。下面主要讲一讲渐变的实际用法。

一 线性渐变(linear-gradient)

1 使用direction控制渐变方向

语法:

background-image: linear-gradient(to direction, color-1 percentage-1/length-1,color-2 percentage-2/length-2,...); 

解释说明:

  1. to direction表示的是渐变的方向,可以省略不写,若省略,则默认从上到下;direction可以是单个方向参数如top/bottom/left/right,也可以是两个方向参数如bottom right,其表示从左上角到右下角渐变。
  2. 后面color参数至少有两个。
  3. length参数表示当前颜色中心线位置,百分比percentage参数也表示当前颜色中心线的位置,可以省略,若省略则按照下图规则。


以上图为例,五种颜色将空间均分成四等份,其中五条分割线为各自颜色的中心线,以此为基准颜色渐变。

下面给出几个具体案例

/*方向缺省,百分比缺省,渐变从上到下,五种颜色按规则渐变*/
background-image: linear-gradient(red, yellow,blue,orange,black);
/*从左到右,按照百分比渐变*/
background-image: linear-gradient(to right, red 10%, yellow 30%,blue 70%,orange 90%,black);
/*从左上到右下,按照具体像素渐变*/
background-image: linear-gradient(to bottom right, red 10px, yellow 150px,blue 170px,orange 200px,black);

2 使用angle控制渐变方向

语法:

background-image: linear-gradient(angle, color-1 percentage-1/length-1,color-2 percentage-2/length-2,...); 

与上述(使用direction控制渐变方向)渐变方式唯一的区别就是该方法是使用角度(angle)控制方向,下图可以看出其渐变规则。当角度为0deg时,渐变方向从下到上;当角度是90deg时,渐变方向从左到右。

二 径向渐变(radial-gradient)

径向渐变由中心向外进行颜色渐变。

语法

background-image: radial-gradient(size shape, color-1 percentage-1/length-1, color-2 percentage-2/length-2, ...); 

解释说明:

  1. size参数定义渐变的大小,值可以是closest-side | farthest-side | closest-corner | farthest-corner | <length>。<length>可以去取单值,表示渐变形状为圆形(circle)且渐变半径为该值;也可以取双值,表示渐变形状为椭圆(ellipse)且其值依次为渐变的横轴半径和纵轴半径。该值也可以缺省,其默认值与shape有关,当shape为circle时,其默认值为farthest-corner;当shape为ellipse时,其默认值与容器尺寸相关,其横轴半径为容器宽的一半,纵轴半径为容器高的一半。
  2. shape参数定义渐变的形状,值可以是circe | ellipse。该值也可以缺省,默认值为ellipse。
  3. 渐变中心点的位置可以自定义,语法为circle at 20px 50px或者ellipse at 20% 50%

三 重复渐变(repeating-linear-gradient或者repeating-radial-gradient)

语法

/*重复线性渐变*/
background-image: repeating-linear-gradient(to direction, color-1 percentage-1/length-1,color-2 percentage-2/length-2,...); 
/*重复径向渐变*/
background-image: repeating-radial-gradient(size shape, color-1 percentage-1/length-1, color-2 percentage-2/length-2, ...); 

解释说明:

  1. 只需加repeating-即可变成重复渐变,其他参数没有变化。
  2. 最后一种颜色后必须加percentage/length参数,且其小于容器尺寸,否则没有重复渐变。

四 边框渐变

上面以背景为例讲述了渐变的分类及实现,下面简单扩展一下,讲一讲边框的渐变,之前写过一篇文章《CSS之图片特殊用法》,里面有讲到将图片作为边框的背景,渐变神色与上述情况类似,只需要将图片地址改为渐变色就可以了,示例代码如下

border-image: linear-gradient( blue ,green ,yellow ,black) 10; 

五 字体颜色渐变

同样由《CSS之图片特殊用法》可以延伸,要是字体颜色渐变,只需要将背景图改为渐变色就可以了,具体代码如下:

background-image:radial-gradient( blue 10px,green 20px,yellow ,black); 
background-clip: text;
-webkit-background-clip: text; /*兼容chrome*/
color: transparent; 

注:background-clip有兼容性问题,此需要根据浏览器不同使用不同的代码;text属性值目前是实验性值,且其在ie中无效,不建议在生产环境中使用。