CSS中的line-height行高屬性的使用技巧小結(jié)

CSS中的line-hight屬性是用來控制文本行之間的空隙的。它一般情況下沒有單位的設定(如:line-height:1.4;)所以這是一個按字體尺寸的比例來計算。這對印刷版來說是一個很重要的屬性。線條過低就會擠在一起,線條過高就會相距甚遠,這兩種情況都會降低可讀性。不過你可能已經(jīng)知道了這一點。
本文中,我們將把注意力放在一些設計上。如果你知道(或可以計算出)的line-height的精確值,你可以做一些奇妙的東西!
每行文本設置不同顏色
很遺憾這里沒有::nth-line(),我們直接使用<span>是不可靠的,因為會有很多不同的事情導致文本在不同的地方被打亂。
盡管是非標準的,但這里還有一種用法就是使用一個元素的背景作為文字的背景。
- .text {
- -webkit-background-clip: text;
- -webkit-text-fill-color: transparent;
- }
而這里還有另一個絕招,你可以用linear-gradient()來讓顏色排列在一起就不會褪變成另一個顏色。它只是會突然的結(jié)束然后開始另一個。比方說我們知道line-height是22px,我們可以制作一個像這樣的階梯色。
- .text {
- background-image: linear-gradient(
- to bottombottom,
- #9588DD,
- #9588DD 22px,
- #DD88C8 22px,
- #DD88C8 44px,
- #D3DD88 44px,
- #D3DD88 66px,
- #88B0DD 66px,
- #88B0DD);
- }
結(jié)合著兩種技巧
在不支持文本背景剪裁的瀏覽器里,比如Firefox,你會得到一個文本后面的實心背景顏色塊。也許這很酷你會喜歡它。但也可能你只是想要得到那樣的文本顏色。在這種情況下,你可以使用@support去單獨的支持它。
此外,當你需要在各處使用line-height,把他設置成變量或許會更好。我將在這里使用SCSS,或許有一天在CSS中也可以使用變量。所以改變之后,他依舊被渲染,看起來它一直保持工作。
- $lh: 1.4em;
- body {
- font-size: 1em;
- line-height: $lh;
- }
- @supports (-webkit-background-clip: text) {
- p {
- -webkit-background-clip: text;
- -webkit-text-fill-color: transparent;
- background-image: linear-gradient(
- to bottombottom,
- #9588DD,
- #9588DD $lh,
- #DD88C8 $lh,
- #DD88C8 $lh*2,
- #D3DD88 $lh*2,
- #D3DD88 $lh*3,
- #88B0DD $lh*3,
- #88B0DD);
- }
- }
在元素的頂部使用這種方式是最容易的。下面是一個例子,重點是前幾行被改變。
- .text {
- -webkit-background-clip: text;
- -webkit-text-fill-color: transparent;
- background-image: linear-gradient(
- to bottombottom,
- rgba(white, 0.8),
- rgba(white, 0.8) $lh,
- rgba(white, 0.6) $lh,
- rgba(white, 0.6) $lh*2,
- rgba(white, 0.4) $lh*2,
- rgba(white, 0.4) $lh*3,
- rgba(white, 0.2) $lh*3,
- rgba(white, 0.2));
- }
如果我們試圖在任意數(shù)量的文本上對最后幾行進行定位,這將變得更加困難。在這種情況下,我們需要讓第一個顏色帶從頂部開始向下漸變。幸運的是我們可以用calc()做到這一點。
- .text {
- -webkit-background-clip: text;
- -webkit-text-fill-color: transparent;
- background-image: linear-gradient(
- to bottombottom,
- rgba(white, 0.8),
- rgba(white, 0.8) calc(100% - 66px),
- rgba(white, 0.6) calc(100% - 66px),
- rgba(white, 0.6) calc(100% - 44px),
- rgba(white, 0.4) calc(100% - 44px),
- rgba(white, 0.4) calc(100% - 22px),
- rgba(white, 0.2) calc(100% - 22px),
- rgba(white, 0.2));
- background-position: bottombottom center;
- }
還有其他方法也可以做到這樣的效果,比如覆蓋偽元素梯度(用pointer-events: none;所以它并不惱人)。
文字之間的行線
使用一個和我們上面使用的相類似的solid-color-stops的技術,我們可以建立一個1px的線在已知的line-height上重復。最簡單的方法是使用repeating-linear-gradient()來確保其他元素可以正常使用(比如說padding也是基于line-height的)。
- .parent {
- padding: $lh*2;
- background: #082838;
- background-image: repeating-linear-gradient(
- to bottombottom,
- rgba(white, 0) 0,
- rgba(white, 0) $lh/1em*16px-1,
- rgba(white, 0.1) $lh/1em*16px-1,
- rgba(white, 0.1) $lh/1em*16px
- );
- }
為了得到用1px的線,我們需要知道line-height的像素值是多少,然后用這個值在減去1px。我們的目標是正好在line-height的高度上進行梯度的重復,來讓這個空間的最后一個像素是一條線。因為我們已經(jīng)不是body字體大小的1em,而是16px了。而且line-height的設置用的是em的單位。所以我們可以通過1em劃分要刪除的單元,然后復制成16px并在需要的時候減1.
每一行圖片的位置
如果你知道精確地line-height,你還可以做的另一家事情是用background-size在縱軸上去匹配它。然后你把他垂直重復,他將會在每一行有一個圖片的隊列。
- .text
- background-image: url(image.svg);
- background-size: $lh $lh;
- background-repeat: repeat-y;
- padding-left: $lh*2;
- }
line-height 屬性的繼承問題
曾出現(xiàn)這樣一個問題:
- <style type="text/css">
- p {
- line-height:17px;
- }
- </style>
- <div class="mdse-detail">
- <p>
- <strong style="font-size:30px">
- 品牌:XZX<br />
- 市場價:145元<br />
- 顏色:黑色<br />
- 面料:棉<br />
- 尺碼:S M L<br />
- 衣長:S 89 M 90 L 91<br />
- 肩寬:S 35 M 36 L 37<br />
- 胸圍:S 88 M 92 L 96<br />
- 下擺:S 104 M 108 L 112<br />
- 袖長:S 17 M 17.5 L18<br />
- 由于測量方法不同,誤差在2CM左右!
- </strong>
- </p>
- </div>
你會發(fā)現(xiàn)上面例子的文字會重疊在一起!這是什么原因呢?
由于.detail-content 中的 p 元素繼承了默認設置的全局樣式 line-height:17px,而自定義區(qū)塊又是由商家自定義,其內(nèi)字體被設置為了 font-size:30px;(可能為任意值),根據(jù) Inline formatting model,得知該文字的 line-box 高為 17px,多出的字體部分上下溢出,所以會出現(xiàn)字體重疊的現(xiàn)象。
那這個問題如何解決呢?
解決方案:我們給 .mdse-detail 下的 p 元素設定樣式屬性 line-height:1.4。
為什么解決方案里的 1.4 不帶單位?
元素的 line-height 屬性值會繼承父元素(或祖先元素)的 line-height 屬性值,如果屬性值有單位,則繼承的值是換算后具體的 px 值而非原始的值(比如:em、%),而如果屬性值沒有單位,則瀏覽器會繼承數(shù)值(無單位),然后根據(jù)該元素的 font-size 值重新解析得到新的 line-height 值。這個和 table 的 tr 設置 display 屬性有一點點類似(tr.style.display = ”;,IE 顯示 block,而 Firefox 等標準瀏覽器顯示 table-row)。
還有另外一個相對低效的方法,但也不失為一個快捷的解決方案:
- .mdse-detail p * {
- line-height:140%;
- }
相關文章
- line-height對于頁面中字體的行距等排版方面的效果至關重要,這里為大家整理了CSS中的line-height行高屬性學習教程,包括line-height的各種取值設定等方面,需要的朋友可以參2016-06-06
- 下面小編就為大家?guī)硪黄钊肜斫釩SS height屬性設置元素的高度。小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-05-13
- 這篇文章主要介紹了CSS中行高line-height屬性的一些使用技巧,包括為每行文本指定不同顏色和文本中間添加線時用到的一些操作方法,需要的朋友可以參考下2015-08-21
- 本文介紹下,css中的line-height屬性的用法,通過實例學習css line-height屬性的具體用法,感興趣的朋友參考下2014-08-02
- 本文介紹下css中的line-height屬性的用法,通過實例學習css line-height屬性的具體用法,感興趣的朋友參考下2014-08-02
- 大家都知道Calc方法有個很大的好處就是用在流體布局上,可以通過calc()計算得到元素的寬度,本文通過一個例子給大家詳細介紹,需要的朋友參考下吧2021-06-03