CSS中的line-height行高属性的使用技巧小结

所属分类: 网页制作 / CSS 阅读数: 1207
收藏 0 赞 0 分享

CSS中的line-hight属性是用来控制文本行之间的空隙的。它一般情况下没有单位的设定(如:line-height:1.4;)所以这是一个按字体尺寸的比例来计算。这对印刷版来说是一个很重要的属性。线条过低就会挤在一起,线条过高就会相距甚远,这两种情况都会降低可读性。不过你可能已经知道了这一点。

本文中,我们将把注意力放在一些设计上。如果你知道(或可以计算出)的line-height的精确值,你可以做一些奇妙的东西!

每行文本设置不同颜色

很遗憾这里没有::nth-line(),我们直接使用<span>是不可靠的,因为会有很多不同的事情导致文本在不同的地方被打乱。

尽管是非标准的,但这里还有一种用法就是使用一个元素的背景作为文字的背景。

C/C++ Code复制内容到剪贴板
  1. .text {   
  2.   -webkit-background-clip: text;   
  3.   -webkit-text-fill-color: transparent;   
  4. }  

而这里还有另一个绝招,你可以用linear-gradient()来让颜色排列在一起就不会褪变成另一个颜色。它只是会突然的结束然后开始另一个。比方说我们知道line-height是22px,我们可以制作一个像这样的阶梯色。

CSS Code复制内容到剪贴板
  1. .text {   
  2.   background-image: linear-gradient(   
  3.     to bottombottom,   
  4.     #9588DD,   
  5.     #9588DD 22px,   
  6.     #DD88C8 22px,   
  7.     #DD88C8 44px,   
  8.     #D3DD88 44px,   
  9.     #D3DD88 66px,   
  10.     #88B0DD 66px,   
  11.     #88B0DD);   
  12. }  

201622114240684.png (1182×202)

结合着两种技巧
201622114304277.png (1196×234)

在不支持文本背景剪裁的浏览器里,比如Firefox,你会得到一个文本后面的实心背景颜色块。也许这很酷你会喜欢它。但也可能你只是想要得到那样的文本颜色。在这种情况下,你可以使用@support去单独的支持它。

此外,当你需要在各处使用line-height,把他设置成变量或许会更好。我将在这里使用SCSS,或许有一天在CSS中也可以使用变量。所以改变之后,他依旧被渲染,看起来它一直保持工作。

CSS Code复制内容到剪贴板
  1. $lh: 1.4em;   
  2. body {   
  3.   font-size: 1em;   
  4.   line-height: $lh;   
  5. }   
  6. @supports (-webkit-background-clip: text) {   
  7.   p {   
  8.     -webkit-background-clip: text;   
  9.     -webkit-text-fill-colortransparent;   
  10.     background-image: linear-gradient(   
  11.       to bottombottom,   
  12.       #9588DD,   
  13.       #9588DD $lh,   
  14.       #DD88C8 $lh,   
  15.       #DD88C8 $lh*2,   
  16.       #D3DD88 $lh*2,   
  17.       #D3DD88 $lh*3,   
  18.       #88B0DD $lh*3,   
  19.       #88B0DD);   
  20.   }   
  21. }  

在元素的顶部使用这种方式是最容易的。下面是一个例子,重点是前几行被改变。

CSS Code复制内容到剪贴板
  1. .text {   
  2.   -webkit-background-clip: text;   
  3.   -webkit-text-fill-colortransparent;   
  4.   background-image: linear-gradient(   
  5.     to bottombottom,   
  6.     rgba(white, 0.8),   
  7.     rgba(white, 0.8) $lh,   
  8.     rgba(white, 0.6) $lh,   
  9.     rgba(white, 0.6) $lh*2,   
  10.     rgba(white, 0.4) $lh*2,   
  11.     rgba(white, 0.4) $lh*3,   
  12.     rgba(white, 0.2) $lh*3,   
  13.     rgba(white, 0.2));   
  14. }  

201622114322267.png (1326×460)

如果我们试图在任意数量的文本上对最后几行进行定位,这将变得更加困难。在这种情况下,我们需要让第一个颜色带从顶部开始向下渐变。幸运的是我们可以用calc()做到这一点。

CSS Code复制内容到剪贴板
  1. .text {   
  2.   -webkit-background-clip: text;   
  3.   -webkit-text-fill-colortransparent;   
  4.   background-image: linear-gradient(   
  5.     to bottombottom,   
  6.     rgba(white, 0.8),   
  7.     rgba(white, 0.8) calc(100% - 66px),   
  8.     rgba(white, 0.6) calc(100% - 66px),   
  9.     rgba(white, 0.6) calc(100% - 44px),   
  10.     rgba(white, 0.4) calc(100% - 44px),   
  11.     rgba(white, 0.4) calc(100% - 22px),   
  12.     rgba(white, 0.2) calc(100% - 22px),   
  13.     rgba(white, 0.2));   
  14.   background-positionbottombottom center;   
  15. }  

201622114340782.png (1004×450)

还有其他方法也可以做到这样的效果,比如覆盖伪元素梯度(用pointer-events: none;所以它并不恼人)。

文字之间的行线

使用一个和我们上面使用的相类似的solid-color-stops的技术,我们可以建立一个1px的线在已知的line-height上重复。最简单的方法是使用repeating-linear-gradient()来确保其他元素可以正常使用(比如说padding也是基于line-height的)。

CSS Code复制内容到剪贴板
  1. .parent {   
  2.   padding: $lh*2;   
  3.   background#082838;   
  4.   background-image: repeating-linear-gradient(   
  5.     to bottombottom,   
  6.     rgba(white, 0)   0,   
  7.     rgba(white, 0)   $lh/1em*16px-1,   
  8.     rgba(white, 0.1) $lh/1em*16px-1,   
  9.     rgba(white, 0.1) $lh/1em*16px  
  10.   );   
  11. }  

为了得到用1px的线,我们需要知道line-height的像素值是多少,然后用这个值在减去1px。我们的目标是正好在line-height的高度上进行梯度的重复,来让这个空间的最后一个像素是一条线。因为我们已经不是body字体大小的1em,而是16px了。而且line-height的设置用的是em的单位。所以我们可以通过1em划分要删除的单元,然后复制成16px并在需要的时候减1.
201622114401042.png (1052×402)

每一行图片的位置

如果你知道精确地line-height,你还可以做的另一家事情是用background-size在纵轴上去匹配它。然后你把他垂直重复,他将会在每一行有一个图片的队列。

CSS Code复制内容到剪贴板
  1. .text   
  2.   background-imageurl(image.svg);   
  3.   background-size: $lh $lh;   
  4.   background-repeatrepeat-y;   
  5.   padding-left: $lh*2;   
  6. }  

201622114420813.png (1272×362)


line-height 属性的继承问题
曾出现这样一个问题:

CSS Code复制内容到剪贴板
  1. <style type="text/css">   
  2. p {   
  3.     line-height:17px;   
  4. }   
  5. </style>   
  6.   
  7. <div class="mdse-detail">   
  8.     <p>   
  9.         <strong style="font-size:30px">   
  10.             品牌:XZX<br />   
  11.             市场价:145元<br />   
  12.             颜色:黑色<br />   
  13.             面料:棉<br />   
  14.             尺码:S  M  L<br />   
  15.             衣长:S 89  M 90   L 91<br />   
  16.             肩宽:S 35  M 36   L 37<br />   
  17.             胸围:S 88  M 92   L 96<br />   
  18.             下摆:S 104 M 108  L 112<br />   
  19.             袖长:S 17  M 17.5 L18<br />   
  20.             由于测量方法不同,误差在2CM左右!   
  21.         </strong>   
  22.     </p>   
  23. </div>  

你会发现上面例子的文字会重叠在一起!这是什么原因呢?
由于.detail-content 中的 p 元素继承了默认设置的全局样式 line-height:17px,而自定义区块又是由商家自定义,其内字体被设置为了 font-size:30px;(可能为任意值),根据 Inline formatting model,得知该文字的 line-box 高为 17px,多出的字体部分上下溢出,所以会出现字体重叠的现象。
那这个问题如何解决呢?
解决方案:我们给 .mdse-detail 下的 p 元素设定样式属性 line-height:1.4。
为什么解决方案里的 1.4 不带单位?
元素的 line-height 属性值会继承父元素(或祖先元素)的 line-height 属性值,如果属性值有单位,则继承的值是换算后具体的 px 值而非原始的值(比如:em、%),而如果属性值没有单位,则浏览器会继承数值(无单位),然后根据该元素的 font-size 值重新解析得到新的 line-height 值。这个和 table 的 tr 设置 display 属性有一点点类似(tr.style.display = ”;,IE 显示 block,而 Firefox 等标准浏览器显示 table-row)。
还有另外一个相对低效的方法,但也不失为一个快捷的解决方案:

CSS Code复制内容到剪贴板
  1. .mdse-detail p * {   
  2.     line-height:140%;   
  3. }  
更多精彩内容其他人还在看

Opera中国的WEB标准课程

网页制作Webjx文章简介:在这篇文章里,我要向大家介绍我和其他很多人花费数月时间开发的一个课程——Web标准课程,该课程旨在向大家提供Web设计和开发的坚实基础,无论读者是谁,此教程完全免费、可访问,并且不需要预备知识。当然,我主要还
收藏 0 赞 0 分享

CSS样式表渐进增强的基本概念

网页制作Webjx文章简介:如果你挠着头想弄清楚优雅降级和渐进增强的区别,我告诉你,这是视角问题。优雅降级和渐进增强都考虑网站在各种设备的各种浏览器上如何良好运转。两者区别的关键在于它们各自关注的焦点,以及这种关注对工作流程的影响
收藏 0 赞 0 分享

简单介绍Web Developer插件制作网页

网页制作Webjx文章简介:Firefox浏览器是一个良好支持W3C标准的开放源代码的浏览器,拥有Linux/Windows/Mac版本。因为Firefox浏览器良好支持W3C标准,所以使用Firefox来调试网页是非常好的。 Firefox浏览器是
收藏 0 赞 0 分享

CSS布局带来的巨大影响:CSS display属性值

网页制作Webjx文章简介:网页元素应用上那些与表格相关的display属性值后,能够模仿出与表格相同的特性。我将会在该文中给大家演示这种方法给CSS布局带来的巨大影响。 应原书编辑要求,先在文章顶部给出链接:《Everything You
收藏 0 赞 0 分享

用div css模拟表格对角线

这只是探讨一种CSS模拟表格对角线的用法,实际在工作中可能觉得这样做有点小题大作,这不是本主题讨论的重点。如果对此深以为然的朋友,请一笑过之 首先声明: 这只是探讨一种CSS模拟表格对角线的
收藏 0 赞 0 分享

IE Firefox在css中的差别 (部分)

1、单位问题 问题:任何距离的数值ie可以不加单位,ff必须要求写单位(0除外) 解决:写全单位如padding:0px; 2、水平居中 问题:div里的内容,ie默认为center,而ff默认left 解决:mairgin:0px auto; 3、高度问题
收藏 0 赞 0 分享

不用js可以实现信息提示效果

[code] <style> body { font:verdena; font-size:14px; color:#000 } h1{ font:verdena; font-size:22px; color:#000 } h2{ font:verdena;
收藏 0 赞 0 分享

CSS解决未知高度的垂直水平居中自适应问题

今天有人问起,晚上试着写出来,供参考; 以下代码兼容主流浏览器IE6、IE7、Firefox、Opera。 从最简单的开始………… 一、如何让一个DIV水平居中? 这个简单不作过多说明! [code] <st
收藏 0 赞 0 分享

CSS cursor 属性 -- 鼠标指针样式效果

取值: [ [<uri> ,]* [ auto | crosshair | default | pointer | move | e-resize | ne-resize | nw-resize | n-resize | se-resize | sw-resize |
收藏 0 赞 0 分享

css 简单区别ie6,ie7,firefox的写法

同一样式里可以这样 [code] margin:17px; FF +margin:17px; IE6 IE7 _margin:17px; IE6 [/code] 按这个顺序,刚好区分开三个浏览器
收藏 0 赞 0 分享
查看更多