- VisualStudio2022插件的安装及使用-编程手把手系列文章
- pprof-在现网场景怎么用
- C#实现的下拉多选框,下拉多选树,多级节点
- 【学习笔记】基础数据结构:猫树
今天,有个群友问了我这么一个问题,如果不想切图,是否有办法实现带渐变边框的字体效果?如下所示:
本文,就将尝试一下,在 CSS 中,我们可以如何尽可能的实现这种渐变边框字体效果.
首先,比较容易想到的写法是通过元素叠加实现.
background-clip: text
实现渐变文字,并且通过 transform 或者设置大几号的文字,实现渐变字体我们尝试一下这种方式:
<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 为形态滤镜,它的输入源通常是图形的 alpha 通道,用来它的两个操作可以使源图形腐蚀(变薄)或扩张(加粗).
使用属性 operator 确定是要腐蚀效果还是扩张效果。使用属性 radius 表示效果的程度,可以理解为笔触的大小.
erode
腐蚀模式,dilate
为扩张模式,默认为 erode
我们将这个滤镜简单的应用到文字上看看效果:
<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);
}
效果如下:最左边的是正常文字,中间的是扩张的模式,右边的是腐蚀模式,看看效果,非常好理解:
如果能理解到这一点,我们可以尝试:
background-clip: text
实现渐变文字代码如下:
<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 能够使源图形腐蚀(变薄)或扩张(加粗)的能力,我们巧妙的实现了文字的渐变边框效果.
完整的 DEMO,你可以戳这里:CodePen Demo -- SVG 实现渐变边框字体 。
结束了吗?还没有。一开始我就有想过使用 -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 解法思路本质上也是用的它的背景色,使用了 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 订阅收藏.
如果还有什么疑问或者建议,可以多多交流,原创文章,文笔有限,才疏学浅,文中若有不正之处,万望告知.
最后此篇关于渐变边框文字效果?CSS轻松拿捏!的文章就讲到这里了,如果你想了解更多关于渐变边框文字效果?CSS轻松拿捏!的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我的文本字段需要一个边框,如下图所示。我该怎么做? 最佳答案 试试这些..我希望它能帮助... UITextField *txt=[[UITextField alloc]initWithFrame:C
我尝试通过“GradientDrawable”改变颜色“描边”,但不起作用。 另外,我不知道如何获取 id stroke,并且只更改笔划(我看到 google,所有示例都失败了) 我的 XML 项目
有没有办法如何使用css(理想)来绘制元素边框但只是线条的一部分(在左右边框下方的图像中)? 最佳答案 是的,你可以,像这样,甚至 IE8 也可以这样做: div { position: re
我一直致力于自定义 GUI 框架,因为我无法处理需要通过标记 (XAML) 开发 UI 的托管废话或 native 代码。我正在尝试创建一个使用该 GUI 框架的应用程序原型(prototype),但
以下Microsoft example code包含以下内容: ... ... ... 但是,在运行时,此代码会生成以下数据绑定(bind)
所以基本上我在tex文件的顶部有这样的内容: \setbeamertemplate{footline}{Number \insertframenumber} 这会将“Number ”应用于所有帧的页脚
我不明白为什么我的 HBox 周围没有边框?现在什么也没有发生,除了 eclipse 抛出 IllegalArgumentException 之外,因为我猜是 this.setCenter(hbox)
我正在尝试使用 Colorbox,以便它在加载时打开并提醒访问者 session 注册已开放。我在 Javascript Coder 找到了我正在使用的代码。 我无法让“X”关闭Colorbox来显示
我制作了一个自定义面板,类似于 WrapPanel 但带有列(或类似于 Grid 但项目自动定位在网格中)。 这是它的样子: 我想在我的面板上有一个属性,它在每一列之间划一条线。是否可以在自定义面板上
我正在尝试为我的页面制作边框,但我没有这样做..我的代码是 @drawable/custom_border 我的问题是,黑色设置为整个 View (作为背景),我想要黑色边框而不是黑色背景
我目前正在开发一个小游戏,但我无法让圆圈正确击中左侧和顶部 Canvas 边框。它正确地击中了右侧和底部。 圆可以用 W A S D 移动,并且必须正确地碰到 Canvas 的所有边界 这是代码:ht
我有一个像这样的图像 slider :
如何绘制具有透明度的png图像轮廓(边框)。 就像我们有这张图片: 我们想要这个: 我正在通过 HTML5 创建图像阴影,但无法获得我想要的。我想使用 HTML5 或 jquery 或两者来绘制它,如
在我们的主页上,我们有几个元素作为菜单点。(图片+标题+小说明)。问题是当鼠标悬停时,菜单元素总是有边框。 (即使我隐藏边框)。 你可以看看:www.scf-software.com 图片问题: im
我对 HTML 和 CSS 完全陌生,所以我希望有人能给我指出正确的方向。我试图理解本教程以制作视差滚动网站: http://ihatetomatoes.net/simple-parallax-scr
如何使底部边框正好位于文本框下方? div { border-bottom: solid 2px #354458; } p { color: #ffffff; background-col
本质上,我想应用一个 bottom-border,但我不希望它位于单元格的底部,而是位于死 Angular 。 如何仅使用 CSS 和 HTML(并且不使用图形)做到这一点? 假设单元格/行的高度为
我有一个带有线性渐变的 block (div)。有没有可能让右上角切出一个三 Angular 形? 例如,你有 border-radius 5px 来制作一个圆 Angular 的 block 。但是
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 6 年前。 Improve this qu
我想按照下面的设计图实现下拉按钮。查看下拉菜单在按钮中间后开始。我的问题是按钮具有透明背景以利用根父 div 中的背景图像。 到目前为止,我已经实现了下图。正如我上面所说,我想在 border-rad
我是一名优秀的程序员,十分优秀!