有很多种添加下划线样式的方法。可能你还记得《Crafting link underlines on Medium》这篇文章。Medium 并没有尝试特殊的方法,只是想创建一个漂亮的看起来正常的下划线。

一条纤细的黑色下划线并且与下行字母有间隙——引自 Marcin Wichary 的《 Crafting link underlines on Medium 》

这是基本的下划线样式,但是尺寸适中并且避开了下行字母。比大多数浏览器的默认效果要

目标

使用 text-decoration: underline 添加下划线有什么问题吗?如果我们讨论一个理想的场景,下划线应该符合以下特点:位于文本基线以下

避开下行字母

可以改变颜色、粗细及样式

适用于文本换行的情况

适用于任意背景

我认为这些要求非常合理,但是据我所知,CSS 中还没有简单的方法实现上述所有要求。

方法

那么有哪些在网页中添加下划线的方法?

以下是我能想到的方法:text-decoration

border-bottom

box-shadow

background-image

SVG 滤镜

Underline.js (canvas)

text-decoration-*

让我们逐一分析这些方法的优缺点。

text-decoration

text-decoration 是添加文本下划线最直接的方式。你只需要应用一个单独的属性就可以全部搞定。字号较小的话,下划线看起来不错,但增加字号之后,同样的下划线就很难看。

text-decoration 的最大问题是缺乏自定义。它继承文字的颜色及字号,并且无法通过跨浏览器的方式改变样式。稍后做详细介绍。

优点易于使用

位于文本基线以下

默认在 Safari 和 iOS 上会避开下行字母

可以换行

适用于任意背景

缺点在其它浏览器中不能避开下行字母

不能改变颜色、粗细或样式

border-bottom

border-bottom 介于快速及可自定义之间。这种方法使用真正的 CSS border,意味着你可以改变它的颜色、粗细及风格样式。

以下就是 border-bottom 添加到 inline 元素上的效果。

最大的问题是下划线到文本的距离——它完全在下行字母以下。可以通过设置元素为 inline-block 以及减少 line-height 解决这个问题,但是文本换行就不行了。这种方法只适合单行文本,不适合多行文本。

另外,可以使用 text-shadow 覆盖下行字母附近的下划线,但必须使用与背景色一样的颜色。这意味着只在纯色背景上有效,而不能应用于渐变色或者图片上。

现在,需要四个属性来定义一个单下划线。相比 text-decoration 的工作量要大。

优点可以使用 text-shadow 避开下行字母

可以改变颜色、粗细及样式

可以给颜色及粗细添加 transition 和 animate 属性

只要不使用 inline-block ,可以换行

只要不使用 text-shadow ,可以适用于任意背景

缺点下划线距离文本较远,难以定位

需要很多不想关的属性才能正确显示

使用 text-shadow 之后选择文本显得粗糙

box-shadow

box-shadow 使用两个内阴影画一条下划线:一个用于创建长方形,另一个覆盖在上面。这意味着该属性必须在纯色背景上使用。

同样要使用 text-shadow 的方法伪造下划线与下行字母的间隙。但是如果下划线与文本的颜色不一样,或者太细,并不会像 text-decoration 那样不协调。

优点可以位于文本基线以下

使用 text-shadow 属性可以避开下行字母

可以改变颜色及粗细

可以换行

缺点不能改变样式

不能适用于任意背景

background-image

background-image 是最容易满足我们要求的属性并且问题较少。思路就是通过 linear-gradient 和 background-position 创建沿着文本水平复制的图像。

这个方法也要设置 display: inline;

下面的方法不必使用 linear-gradient ,你可以用自己的图片做出酷炫的效果。

优点可以位于文本基线以下

使用 text-shadow 属性可以避开下行字母

可以改变颜色、粗细(允许半个像素)及样式

适用于自定义图片

可以换行

只要不使用 text-shadow ,可以适用于任意背景

缺点图片在不同的分辨率、浏览器及缩放级别下可能大小不同

SVG filters

我一直在考虑使用 SVG 滤镜的方法。可以创建一个行内 SVG 滤镜元素画一条线,通过扩展文本边界遮盖下行字母附近的下划线。然后给滤镜一个 id ,通过 filter: url(‘#svg-underline’)在 CSS 中引用它。

滤镜的优点不需要借助 text-shadow 添加了透明间隙。这意味着可以在任何背景上避开下行字母,包括渐变及图片背景。这种方法只适用于单行文本,需要注意这一点。

以下是在 Chrome 和 Firefox 中的效果:

在 IE、Edge 和 Safari 上的浏览器支持有问题。很难在 CSS 中测试 SVG 滤镜的支持情况。可以使用 filter 的 @supports 属性,但是只能检测引用是否可用,而不能检测滤镜本身。我最终的方法是使用一些浏览器嗅探检测,所以也要注意这一点。

优点位于文本基线以下

可以避开下行字母

允许改变颜色、粗细及样式

适用于任意背景

缺点不允许换行

在 IE、Edge 及 Safari 中无效,但是你可以使用 text-decoration 。Safari 中的下划线看起来很棒。

Underline.js (Canvas)

Underline.js 很迷人。我觉得最印象深刻的是 Wenting Zhang 使用了 JavaScript 实现以及对细节的关注。如果你还没有看过 Underline.js 的 tech demo ,一定要停下来看一看。有一个关于它 工作原理 的 9 分钟的视频,但是我可以简单说一下:它是通过 元素添加下划线。这是一种新方法,效果非常好。

尽管 Underline.js 有一个引人注目的名字,但只是一个技术演示。这意味着在修改完善之前还不能用在任何项目中。

这种方法作为概念证明有必要提出来。 可以创建漂亮、可交互的下划线,但是需要写一些 JavaScript 才能正常工作。

text-decoration-* properties

还记得“稍后做详细介绍”这句话吗?现在就讲到这里了。

text-decoration 自身可以表现的更好,但是必须添加一些实验性的属性定制它的外观:text-decoration-color

text-decoration-skip

text-decoration-style

不要高兴的太早,因为有浏览器兼容的问题。

text-decoration-color

text-decoration-color 允许你改变下划线的颜色。这一属性比预期的浏览器支持要好——它可以在 Firefox 以及 Safari (需加前缀)中工作。需要注意的是:如果没有清除下行字母,Safari 中的下划线会位于文本之上。

Firefox:

Safari:

text-decoration-skip

text-decoration-skip 设置文本下划线是否避开下行字母。

这是一个非标准属性,只在 Safari 中正常工作,所以要加 -webkit- 前缀。Safari 默认使用该属性,所以即使没有设置,下划线也会避开下行字母。

如果你正在使用 Normalize.css ,需要知道当前版本为了浏览器之间的一致性而禁用了该属性。如果你想要这个优秀的下划线样式,你需要自己设置一下。

text-decoration-style

text-decoration-style 提供了和 border-style 一样的线条样式,但是也增加了 wavy 波浪线样式。

以下是你可以使用的不同属性值:dashed

dotted

double

solid

wavy

现在, text-decoration-style 只在 Firefox 上有效,以下是截图:

眼熟吗?

还缺少什么?

text-decoration-* 属性比其它添加下划线的 CSS 属性要方便。但是如果我们回顾一下之前的需求,这个属性不能改变下划线的粗细及位置。

研究了一下之后,我发现了下面两个属性:text-underline-width

text-underline-position

这些属性好像在 CSS 早期的草案中就被提出来了,但是因为缺乏兴趣而没有实施。嘿,不要怪我!

总结

那么添加下划线最好的方法是什么?

对于字号小的文本,我推荐使用 text-decoration 并且乐观地使用 text-decoration-skip 。这种样式在大多数浏览器中看上去有些乏味,但是因为下划线样式一直如此,所以用户不会介意。如果你有足够的耐心,所有的下划线在以后看上去会很棒,而你不需要修改任何东西。

对于正文部分,可以使用 background-image 方法。这种方法看上去很棒,而且也有相应的 Sass mixins 。如果下划线很细或者与文本的颜色不一样,可以省略 text-shadow 属性。

对于单行文本,使用 border-bottom 以及你希望配合使用的其它属性。

如果想要在渐变或者图片背景上避开下行字母,尝试使用 SVG 滤镜。或者避免使用下划线。

将来,当浏览器的支持性更好,答案一定是 text-decoration-* 属性。

html5添加下划线虚线,web中添加下划线的方法及优缺点相关推荐

  1. R语言ggplot2在可视化图像中添加横线并在横线中添加文本、为横线中添加的文本添加文本框、自定义文本框的填充色(background color for a text annotation)

    R语言ggplot2在可视化图像中添加横线并在横线中添加文本.为横线中添加的文本添加文本框.自定义文本框的填充色(background color for a text annotation) 目录

  2. .pages怎么在windows上打开?Windows下打开在Mac中编辑的.pages文件方法

    .pages怎么在windows上打开?Windows下打开在Mac中编辑的.pages文件方法 1.最简单的方法是修改后缀名为.zip然后解压,解压后就可以看到一张图片,这个就是文档内容了. 2.更 ...

  3. itext 在已知页码的情况下,往pdf中添加图片,实测有效,下面贴出代码

    最近项目中非要在已经生成的pdf中添加二维码,网上搜索一把,终于找到一个合适点的,不过这个不灵活,不过却能解决我的问题,我就想在第一页某个位置插入一张图片而已,就这么简单,只要不覆盖原来pdf中的内容 ...

  4. access数据库中怎么添加计算机,向access2007数据库中添加一个或多个记录

    时 间:2008-10-22 13:27:07 作 者: 摘 要:向Access2007数据库中添加一个或多个记录 正 文: 本文介绍如何向 Microsoft Office Access 2007 ...

  5. html怎么添加艺术字,怎样在PPT中添加艺术字?

    回答: 很多初学Word办公软件的朋友有时候会问,如何在Word里面,在插入的图片上面怎么写字. 这个其实就是一个特别好实现的操作,今天给大家分享三种Word图片上添加文字,在Word中在图片上输入/ ...

  6. java添加时间,如何通过Java中的addHours()方法添加时间

    我试图让这个飞机项目工作,我不能为我的生活弄清楚如何在"public void addHours()"中添加时间,或者如果我甚至做了前面的正确!任何帮助都会很棒! 问题有待回答: ...

  7. linux添加一块硬盘分区,centos6中添加一块新的硬盘并分区的方法介绍

    centos6中是如何添加硬盘和分区的呢?接下来的文章中小编将会带来详细的操作方法介绍,想知道的朋友可以阅读本文了解一下. 具体要求如下: 1.添加一块新的硬盘,大小1G 2.分五个区,每个大小100 ...

  8. 如何在html添加css样式表,网页中添加CSS样式表的四种方式

    本文向大家描述一下网页中添加CSS样式表的四种方式,首先让我们来看一下CSS样式表文件的优势,主要体现在两个方面,请看下文详细介绍. CSS样式表文件的优势表现在两个方面: ***,简化了网页的格式代 ...

  9. wps启用编辑按钮在哪里_如何在wps工具栏中添加按钮 如何在Excel中添加删除命令按钮...

    延伸:如何在Excel中添加删除命令按钮 描述:在Excel 2003中,很多常用的命令按钮都放置在工具栏中,用户可以很方便地进行操作.添加命令主要是通过拖动的方式完成的,其具体的操作如下:骤一,在视 ...

最新文章

  1. MMSE(Minimum Mean Square Error)
  2. php 缓存模块,PHP缓存之模块缓存(APC)_PHP教程
  3. Python编程比较好的机构怎么选择
  4. CVPR 2020 | CentripetalNet:目标检测新网络,COCO 48 % AP超现所有Anchor-free网络
  5. [云炬创业基础笔记] 第四章测试2
  6. php时间到期提醒功能,php还剩多长时间过期函数
  7. hbuild json红叉_MUI+Hbuilder之踩坑(三)
  8. poj 1719 Shooting Contest 二分匹配
  9. RISC-V MCU 自动浇花装置设计
  10. java 泛型 参数传递子类_超类的Java泛型,但并非所有子类都想定义类型参数
  11. 如何设置微信公众号多条被关注自动回复个性语
  12. python父亲节礼物送什么_父亲节送什么礼物好
  13. SuperMap 地图
  14. 项目产品化的版本管控实践方案
  15. 京东商城主图、细节图、视频以及评论图分类下载方法
  16. 嵌入式实时操作系统的基本概念
  17. 小红书变现方式分别有哪些?分享5种变现方式,让你轻松赚米
  18. 2022年中国科学技术大学计算机考研复试是什么时候呢
  19. 虚拟主服务器是什么原因,什么是虚拟主机?
  20. 8102年倒计时,9102年放假时间表已出!

热门文章

  1. 怎么把ppt翻译成英文?这几个方法教会你
  2. FTP配置文件说明大全
  3. [时间投资法]第一章-为什么高效管理时间这样难
  4. 新小区没有光纤入户,我却提前享受到了百兆网络
  5. 苹果发布 iOS 16 公开测试版,一起来看看这几项新功能
  6. Android进阶之路 - 深入浅出字体、字体库
  7. 思路与心态是SEO最重要的事情
  8. LaTeX中设置字体颜色的三种方式
  9. Baymax (Android版的Siri)之百度语音识别SDK调用
  10. Golang地图的一些见解