首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >CSS 奇技淫巧 | 巧妙实现文字二次加粗再加边框

CSS 奇技淫巧 | 巧妙实现文字二次加粗再加边框

作者头像
Sb_Coco
发布于 2021-10-29 03:08:22
发布于 2021-10-29 03:08:22
1.6K0
举报
文章被收录于专栏:Coco的专栏Coco的专栏

需求背景 - 文字的二次加粗

今天遇到这样一个有意思的问题:

  1. 在文字展示的时候,利用了 font-weight: bold 给文字进行加粗,但是觉得还是不够粗,有什么办法能够让文字更粗一点呢?

emm,不考虑兼容性的话,答案是可以利用文字的 -webkit-text-stroke 属性,给文字二次加粗。

MDN - webkit-text-stroke: 该属性为文本字符添加了一个边框(笔锋),指定了边框的颜色, 它是 -webkit-text-stroke-width-webkit-text-stroke-color 属性的缩写。

看下面的 DEMO,我们可以利用 -webkit-text-stroke,给文字二次加粗:

代码语言:javascript
AI代码解释
复制
<p>文字加粗CSS</p>
<p>文字加粗CSS</p>
<p>文字加粗CSS</p>
<p>文字加粗CSS</p>
代码语言:javascript
AI代码解释
复制
p {
    font-size: 48px;
    letter-spacing: 6px;   
}
p:nth-child(2) {
    font-weight: bold;
}
p:nth-child(3) {
    -webkit-text-stroke: 3px red;
}
p:nth-child(4) {
    -webkit-text-stroke: 3px #000;
}

对比一下下面 4 种文字,最后一种利用了 font-weight: bold-webkit-text-stroke,让文字变得更为

CodePen Demo -- font-weight: bold 和 -webkit-text-stroke 二次加粗文字

如何给二次加粗的文字再添加边框?

OK,完成了上述第一步,事情还没完,更可怕的问题来了。

现在文字要在二次加粗的情况下,再添加一个不同颜色的边框。

我们把原本可能可以给文字添加边框的 -webkit-text-stroke 属性用掉了,这下事情变得有点棘手了。这个问题也可以转变为,如何给文字添加 2 层不同颜色的边框?

当然,这也难不倒强大的 CSS(SVG),让我们来尝试下。

尝试方法一:使用文字的伪元素放大文字

第一种尝试方法,有点麻烦。我们可以对每一个文字进行精细化处理,利用文字的伪元素稍微放大一点文字,将原文字和访达后的文字贴合在一起。

  1. 将文字拆分成一个一个独立元素处理
  2. 利用伪元素的 attr() 特性,利用元素的伪元素实现同样的字
  3. 放大伪元素的字
  4. 叠加在原文字之下

上代码:

代码语言:javascript
AI代码解释
复制
<ul>
    <li data-text="文"></li>
    <li data-text="字"></li>
    <li data-text="加"></li>
    <li data-text="粗"></li>
    <li data-text="C">C</li>
    <li data-text="S">S</li>
    <li data-text="S">S</li>
</ul>
代码语言:javascript
AI代码解释
复制
ul {
    display: flex;
    flex-wrap: nowrap;
}

li {
    position: relative;
    font-size: 64px;
    letter-spacing: 6px;
    font-weight: bold;
    -webkit-text-stroke: 3px #000;
    
    &::before {
        content: attr(data-text);
        position: absolute;
        top: 0;
        left: 0;
        bottom: 0;
        right: 0;
        color: red;
        -webkit-text-stroke: 3px #f00;
        z-index: -1;
        transform: scale(1.15);
    }
}

可以简单给上述效果加个动画,一看就懂:

CodePen Demo -- 利用伪元素给加粗文字添加边框

看着不错,但是实际上仔细观察,边框效果很粗糙,文字每一处并非规则的被覆盖,效果不太能接受:

尝试方法二:利用 text-shadow 模拟边框

第一种方法宣告失败,我们继续尝试第二种方式,利用 text-shadow 模拟边框。

我们可以给二次加粗的文字添加一个文字阴影:

代码语言:javascript
AI代码解释
复制
<p>文字加粗CSS</p>
代码语言:javascript
AI代码解释
复制
p {
    font-size: 48px;
    letter-spacing: 6px;
    font-weight: bold;
    -webkit-text-stroke: 1px #000;
    text-shadow: 0 0 2px red;
}

看看效果:

好吧,这和边框差的也太远了,它就是阴影。

不过别着急,text-shadow 是支持多重阴影的,我们把上述的 text-shadow 多叠加几次:

代码语言:javascript
AI代码解释
复制
p {
    font-size: 48px;
    letter-spacing: 6px;
    font-weight: bold;
    -webkit-text-stroke: 1px #000;
  - text-shadow: 0 0 2px red;
  + text-shadow: 0 0 2px red,0 0 2px red,0 0 2px red,0 0 2px red,0 0 2px red,0 0 2px red,0 0 2px red,0 0 2px red,0 0 2px red,0 0 2px red;
}

Wow,不仔细看的话,利用这种叠加多层 text-shadow 的方式,还真的非常像边框!

当然,如果我们放大来看,瑕疵就比较明显了,还是能看出是阴影:

CodePen Demo -- 利用 text-shadow 给文字添加边框

尝试方法三:利用多重 drop-shadow()

在尝试了 text-shadow 之后,自然而然的就会想到多重 filter: drop-shadow(),主观上认为会和多重 text-shadow 的效果应该是一致的。

不过,实践出真知。

在实际测试中,发现利用 filter: drop-shadow() 的效果比多重 text-shadow 要好,模糊感会弱一些:

代码语言:javascript
AI代码解释
复制
p {
    font-weight: bold;
    -webkit-text-stroke: 1px #000;
    filter: 
        drop-shadow(0 0 0.25px red) 
        drop-shadow(0 0 0.25px red) 
        drop-shadow(0 0 0.25px red) 
        drop-shadow(0 0 0.25px red) 
        drop-shadow(0 0 0.25px red) 
        drop-shadow(0 0 0.25px red) 
        drop-shadow(0 0 0.25px red) 
        drop-shadow(0 0 0.25px red) 
        drop-shadow(0 0 0.25px red) 
        drop-shadow(0 0 0.25px red) 
        drop-shadow(0 0 0.25px red);
}

效果如下:

我们甚至可以利用它制作文字二次加粗后的多重边框:

代码语言:javascript
AI代码解释
复制
p {
    font-weight: bold;
    -webkit-text-stroke: 1px #000;
    filter: 
        drop-shadow(0 0 0.2px red) 
        // 重复 N 次
        drop-shadow(0 0 0.2px red)
        drop-shadow(0 0 0.25px blue) 
        // 重复 N 次
        drop-shadow(0 0 0.25px blue);
}

效果如下:

然而,在不同屏幕下(高清屏和普通屏),drop-shadow() 的表现效果差别非常之大,实则也难堪重用。

我们没有办法了吗?不,还有终极杀手锏 SVG。

尝试方法四:利用 SVG feMorphology 滤镜给文字添加边框

其实利用 SVG 的 feMorphology 滤镜,可以非常完美的实现这个需求。

这个技巧,我在 有意思!不规则边框的生成方案 这篇文章中也有提及。

借用 feMorphology 的扩张能力给不规则图形添加边框

直接上代码:

代码语言:javascript
AI代码解释
复制
<p>文字加粗CSS</p>

<svg width="0" height="0">
    <filter id="dilate">
        <feMorphology in="SourceAlpha" result="DILATED" operator="dilate" radius="2"></feMorphology>
        <feFlood flood-color="red" flood-opacity="1" result="flood"></feFlood>
        <feComposite in="flood" in2="DILATED" operator="in" result="OUTLINE"></feComposite>

        <feMerge>
            <feMergeNode in="OUTLINE" />
            <feMergeNode in="SourceGraphic" />
        </feMerge>
    </filter>
</svg>
代码语言:javascript
AI代码解释
复制
p {
    font-size: 64px;
    letter-spacing: 6px;
    font-weight: bold;
    -webkit-text-stroke: 2px #000;
    filter: url(#dilate);
}

效果如下:

我们可以通过 SVG feMorphology 滤镜中的 radius 控制边框大小,feFlood 滤镜中的 flood-color 控制边框颜色。并且,这里的 SVG 代码可以任意放置,只需要在 CSS 中利用 filter 引入即可。

本文不对 SVG 滤镜做过多的讲解,对 SVG 滤镜原理感兴趣的,可以翻看我上述提到的文章。

至此,我们就完美的实现了在已经利用 font-weight: bold-webkit-text-stroke 的基础上,再给文字添加不一样颜色的边框的需求。

放大了看,这种方式生成的边框,是真边框,不带任何的模糊:

CodePen Demo -- 利用 SVG feMorphology 滤镜给文字添加边框

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-10-28 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
Transformer注解及PyTorch实现(上)
"Attention is All You Need"[1] 一文中提出的Transformer网络结构最近引起了很多人的关注。Transformer不仅能够明显地提升翻译质量,还为许多NLP任务提供了新的结构。虽然原文写得很清楚,但实际上大家普遍反映很难正确地实现。
YoungTimes
2022/04/28
4570
Transformer注解及PyTorch实现(上)
实现Transformer模型
Transformer 是一种基于**自注意力机制(Self-Attention)**的深度学习模型,最初由 Vaswani 等人在 2017 年的论文《Attention is All You Need》中提出。它彻底改变了自然语言处理(NLP)领域,成为许多任务(如机器翻译、文本生成、文本分类等)的基石。与传统的循环神经网络(RNN)和卷积神经网络(CNN)相比,Transformer 具有以下优势:
@小森
2024/12/30
4010
实现Transformer模型
23_Transformer架构详解:从原理到PyTorch实现
Transformer架构自2017年Google发表的论文《Attention Is All You Need》中提出以来,彻底改变了深度学习特别是自然语言处理领域的格局。在短短几年内,Transformer已成为几乎所有现代大型语言模型(LLM)的基础架构,包括BERT、GPT系列、T5等革命性模型。与传统的RNN和LSTM相比,Transformer通过自注意力机制实现了并行化训练,极大提高了模型的训练效率和性能。
安全风信子
2025/11/13
5140
【留言送书】跟我一起从源码学习Transformer!
近几年NLP领域有了突飞猛进的发展,预训练模型功不可没。当前利用预训练模型(pretrain models)在下游任务中进行fine-tune,已经成为了大部分NLP任务的固定范式。Transformer摒弃了RNN的序列结构,完全采用attention和全连接,严格来说不属于预训练模型。但它却是当前几乎所有pretrain models的基本结构,为pretrain models打下了坚实的基础,并逐步发展出了transformer-XL,reformer等优化架构。本文结合论文和源码,对transformer基本结构,进行详细分析。
lujohn3li
2021/01/12
7350
一文看懂Transformer内部原理(含PyTorch实现)
  "Attention is All You Need" 一文中提出的Transformer网络结构最近引起了很多人的关注。Transformer不仅能够明显地提升翻译质量,还为许多NLP任务提供了新的结构。虽然原文写得很清楚,但实际上大家普遍反映很难正确地实现。
10JQKA
2018/12/28
2.9K0
Transformer深入浅出
我们从零开始用pytorch搭建Transformer模型(中文可以翻译成变形金刚)。
lyhue1991
2023/09/05
1.3K0
Transformer深入浅出
【AI大模型】深入Transformer架构:解码器部分的实现与解析
小言从不摸鱼
2024/10/20
4320
【AI大模型】深入Transformer架构:解码器部分的实现与解析
深入理解Transformer及其源码解读
深度学习广泛应用于各个领域。基于transformer的预训练模型(gpt/bertd等)基本已统治NLP深度学习领域,可见transformer的重要性。本文结合《Attention is all you need》与Harvard的代码《Annotated Transformer》深入理解transformer模型。 Harvard的代码在python3.6 torch 1.0.1 上跑不通,本文做了很多修改。修改后的代码地址:Transformer。
用户1432189
2019/10/24
2.5K0
深入理解Transformer及其源码解读
搞懂 Vision Transformer 原理和代码,看这篇技术综述就够了
本文对Vision Transformer的原理和代码进行了非常全面详细的解读,一切从Self-attention开始、Transformer的实现和代码以及Transformer+Detection:引入视觉领域的首创DETR。
AI算法与图像处理
2021/01/20
9.2K0
搞懂 Vision Transformer 原理和代码,看这篇技术综述就够了
基于注意力机制,机器之心带你理解与训练神经机器翻译系统
参与:蒋思源 本文是机器之心 GitHub 实现项目,我们根据谷歌的 Transformer 原论文与 Harvard NLP 所实现的代码学习构建了一个神经机器翻译系统。因此,我们希望各位读者也能根据这篇文章了解 Transformer 的架构,并动手实现一个神经机器翻译系统。 自去年 6 月份「Attention is All You Need」发表以来,Transformer 受到越来越多的关注。它除了能显著提升翻译质量,同时还为很多 NLP 任务提供了新的架构。这篇论文放弃了传统基于 RNN 或
机器之心
2018/06/12
1.9K0
百闻不如一码!手把手教你用Python搭一个Transformer
与基于RNN的方法相比,Transformer 不需要循环,主要是由Attention 机制组成,因而可以充分利用python的高效线性代数函数库,大量节省训练时间。
一墨编程学习
2019/05/08
8660
百闻不如一码!手把手教你用Python搭一个Transformer
百闻不如一码!手把手教你用Python搭一个Transformer
与基于RNN的方法相比,Transformer 不需要循环,主要是由Attention 机制组成,因而可以充分利用python的高效线性代数函数库,大量节省训练时间。
大数据文摘
2019/05/07
1.2K0
百闻不如一码!手把手教你用Python搭一个Transformer
【多模态大模型面经】 Transformer 专题面经
✍ 本专题假设读者已有相关基础知识储备,目标是帮助读者以更高效的方式快速回顾每个关键知识点。本专题汇集了个人在准备多模态、大模型、强化学习等前沿岗位面试过程中总结的核心知识点,同时记录了本人在真实面试中面试官的提问。通过高效回顾这些内容,读者可以快速掌握关键概念和实践经验,为面试和工作打下坚实基础。
九年义务漏网鲨鱼
2025/11/16
1070
【多模态大模型面经】 Transformer 专题面经
音视频开发之旅(89) - Transformer论文解读和源码解析
Transformer是续MLP RNN CNN后又一个影响深远的模型,  之前CNN RNN基本上都在各自的领域发光发热,  但是Transformer 在很多领域都有着很广泛的应用. eg: chatgpt  llama等语言大模型, sd文生图模型, 以及多模态 llava等. 我们最近探索的视频&图像画质评测以及画质增强很多算法也都是基于Transformer. 所以加强对Transformer学习理解和应用迫在眉睫.
音视频开发之旅
2024/09/07
2990
音视频开发之旅(89) - Transformer论文解读和源码解析
Transformer--解码器,输出部分
用户10950404
2024/07/30
4050
Transformer--解码器,输出部分
3W字长文带你轻松入门视觉Transformer
Transformer整个网络结构完全由Attention机制组成,其出色的性能在多个任务上都取得了非常好的效果。本文从Transformer的结构出发,结合视觉中的成果进行了分析,能够帮助初学者们快速入门。
石晓文
2020/12/08
1.2K0
3W字长文带你轻松入门视觉Transformer
Transformer--编码器和解码器(包含掩码张量,注意力机制,多头注意力机制)
编码器部分: 由N个编码器层堆叠而成,每个编码器层由两个子层连接结构组成,第一个子层连接结构包括一个多头自注意力子层和规范化层以及一个残差连接,第二个子层连接结构包括一个前馈全连接子层和规范化层以及一个残差连接
用户10950404
2024/07/30
1.5K0
Transformer--编码器和解码器(包含掩码张量,注意力机制,多头注意力机制)
10分钟带你深入理解Transformer原理及实现
基于 Transformer《Attention Is All You Need》构建的模型(比如 Bert ),在多个自然语言处理任务上都取得了革命性的效果,目前已取代 RNN 成为默认选项,可见 Transformer 的厉害之处。
小白学视觉
2021/08/05
2.4K0
10分钟带你深入理解Transformer原理及实现
Transformer - 3 - Transformer 的实现
Transformer 模型来源于 Google 发表的一篇论文 “Attention Is All You Need”,希望大家能在有一些了解的基础上,能够自己读一下这篇文章。
为为为什么
2023/05/11
7500
Transformer - 3 - Transformer 的实现
22_注意力机制详解:从基础到2025年最新进展
在深度学习的发展历程中,注意力机制(Attention Mechanism)扮演着越来越重要的角色,特别是在自然语言处理(NLP)、计算机视觉(CV)和语音识别等领域。注意力机制的核心思想是模拟人类视觉系统的聚焦能力,让模型能够在处理复杂数据时,选择性地关注输入的不同部分,从而提高模型的性能和可解释性。
安全风信子
2025/11/13
3280
推荐阅读
相关推荐
Transformer注解及PyTorch实现(上)
更多 >
LV.0
这个人很懒,什么都没有留下~
目录
  • 如何给二次加粗的文字再添加边框?
    • 尝试方法一:使用文字的伪元素放大文字
    • 尝试方法二:利用 text-shadow 模拟边框
    • 尝试方法三:利用多重 drop-shadow()
    • 尝试方法四:利用 SVG feMorphology 滤镜给文字添加边框
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
首页
学习
活动
专区
圈层
工具
MCP广场
首页
学习
活动
专区
圈层
工具
MCP广场