許多方法可以將HTML元素與CSS對齊,但是一起使用或單獨使用它們并不是那么容易。開發人員所面臨的困難之一就是試圖將元素集中在頁面中間。
因此,在本文中,我將展示一些最常用的方法,即通過使用不同的CSS屬性在水平和垂直方向上居中圖像。
讓我們開始使用3個不同的CSS屬性將圖像水平居中。
使圖像水平居中的第一種方法是使用text-align屬性。但是,僅當圖像位于塊級容器(例如<div>)內時,此方法才有效:
使圖像居中的另一種方法是使用margin:auto屬性(用于左邊距和右邊距)。但是,單獨使用margin:Auto將不適用于圖像。如果需要使用margin:auto,則還必須使用2個其他屬性。
margin-auto屬性對內聯級別的元素沒有任何影響。由于<img>標簽是一個內聯元素,因此我們需要先將其轉換為塊級元素:
其次,我們還需要定義寬度。因此,左右邊緣可以占用其余的空白空間并自動對齊,可以這樣解決問題(除非我們給出100%的寬度):
將圖像水平居中的第三種方法是使用display:flex。同樣,我們對容器使用text-align屬性,它也會使用display:flex。但是,僅使用display:flex是不夠的。容器還必須具有一個稱為justify-content的附加屬性。
justify-content屬性與display:flex一起使用,我們可以使用它水平放置圖像的中心。最后,圖像的寬度必須小于容器的寬度,否則,它會占用100%的空間,然后我們就無法對其進行集中化。
1、Display: Flex
對于垂直對齊,使用display:flex確實很有幫助。考慮到我們的容器的高度為800px,但圖像的高度僅為500px:
現在,在這種情況下,向容器中添加一行代碼(align-items:center)就可以了:
如果將align-items屬性與display:flex一起使用,就會將元素垂直放置。
2、位置:絕對和變換屬性
垂直對齊的另一種方法是一起使用position和transform屬性。這個有點復雜,所以讓我們一步一步地做。
步驟1:定義絕對位置
首先,我們將圖像的定位行為從靜態更改為絕對:
同樣,它應該位于相對放置的容器內,因此我們添加一個位置:相對于其容器的div。
步驟2:定義頂部和左側屬性
其次,我們定義圖像的頂部和左側屬性,并設置為50%。這會將圖像的起點(左上角)移到容器的中心:
步驟3:定義變換屬性
在第二步的時候已經將圖像的一部分移出容器。因此,我們需要將其取回內部。在圖像上定義轉換屬性,并在其X和Y軸上添加負50%可以達到目的:
還可以使用其他方法進行水平和垂直居中,我這里只嘗試了最常用的方法。希望這篇文章可以幫助你了解如何在頁面中心對齊圖像。
天我們來聊一聊CSS文本兩端對齊。
事情的起因是這樣的,在Review一位同事做的頁面時,發現好幾處字符之間寫了很多空格,于是問他為什么這么做,他說設計要求這幾個文本的呈現寬度必須一致,但它們的字符個數又不同,所以就在字符數少的文本中添加空格從而達到文本兩端對齊(字符均勻分布)的效果,于是我對他表示了侮辱性的贊美。
用添加空格符的方式實現文本兩端對齊,除了不夠優雅,容易被羞辱之外,還有其他三個問題:
1. 不同的瀏覽器,不同的移動設備,對空格符的展示寬度是有細微差別的,一個空格看不出影響,但是多個空格就無法保證一致了,很有可能出現沒對齊或者折行的情況。
2. 任何頁面都避免不了修改,如果文本需要更換,并且更換后字數發生變化,這將意味著之前的空格數量需要重新調整,非常不利于維護。
3. 某些頁面上的文本,用戶可能會去復制,但復制下來后發現含有很多空格符,仍需要二次編輯。
因此在日常開發中要避免使用空格符來實現兩端對齊,而應該使用標準的CSS文本對齊屬性來解決。
這個屬性大家經常用到的值有三個:
left:左對齊
right:右對齊
center:居中對齊
它還有一個屬性值:justify,表示文本兩端對齊,也就是讓文本在固定寬度內平均分布,使兩邊不會出現空白。那么用這個屬性是否就能很好的實現文本兩端對齊呢?
通過測試發現,單行文本通過text-align:justify; 并不能實現兩端對齊,為什么會出現這個情況?我們需要先了解一點點排版知識。
傳統書刊的排版印刷對于整個自然段通常采用兩端對齊的方式,這樣就保證了排版的美觀和良好的閱讀體驗。但是自然段的最后一行文字是左對齊的,因為最后一行文本意味著段落的結束,沒有必要繼續兩端對齊了。
細心的朋友應該已經猜到了,在我們測試中,文本只有一行,意味著它也是最后一行,而CSS的文本對齊方式也遵循最后一行文本默認左對齊的原則,因此不能實現兩端對齊。
好在CSS為我們提供了另外一個屬性:text-align-last,這個屬性用來額外設置段落最后一行文本的對齊方式,因此對于單行文本,我們只需要設置:text-align-last: justify;就可以了,親測有效。
TIPS:單行文本要想實現文本兩端對齊,除了上面說的方式,一定別忘了這個文本需要一個確定的寬度,不設置寬度,文本也就不存在兩端。因此這個單行文本不能是行內布局,而應該是塊級或者是行內塊級布局。
好景不長,用上面的方式實現了文本兩端對齊后,發現它只是在PC上有效,但是在IOS的系統瀏覽器里毫無效果,最后發現在IOS上不支持text-align-last這個屬性,因此這個方式并不穩妥。
那么如何解決IOS的兼容問題呢?
著手點只有一個,那就是如何保證單行文本對于CSS來說并不是最后一行?這句話看似很奇怪,其實解決辦法很簡單,只需要給這個單行文本添加一個偽元素after即可。
someClass: after { content: “”}
由于添加了偽元素,單行文本不再是最后一行,偽元素才是, 同時偽元素的內容為空字符串,并不會對顯示造成影響,因此完美解決了這個問題。
注意:偽元素after不僅要設置content,還要添加 width:100%; 和 display:inline-block; 這是因為:如果不設置寬度,偽元素內容并不會成為第二行,如果display設置成block,又造成了偽元素變成了另一個塊級元素,所以要設置為inline-block。
最終的代碼:
someClass {text-align:justify; width:300px;}
someClass: after { content: “”; width:100%; display:inline-block;}
先,我們來學習CSS設置文本的對齊方式。
通過CSS,可以設置文本的水平和垂直對齊方式。(有案例的效果演示)
文本水平對齊,我們前面的課程曾經接觸過——使用 text-align 這個樣式屬性來實現。它的屬性值有三個:left,right,center,分別表示文本水平居左,居右,居中。
我們來舉個例子。
在 005 目錄下創建 alignment-spacing.html 文件,構建基礎代碼,添加一個 h1 元素和三個 p 元素,分別填入一些文本。
<h1>浠浠呀老師,學前端的大專生就業難嗎?</h1>
<p>
no, 不難,只要你能力過關、項目經驗過關、人品過關,企業就會錄用你。
</p>
<p>
你可以在面試的時候,著重介紹一下你的開發能力、技術能力以及你對技術理解,讓別人挑不出毛病,那學歷這塊是可以自動忽略的。
</p>
<p>
我在面試別人的時候也是這樣,如果這個人的技術能力和過往經驗真的征服了我,我不是很在他乎他的學歷。
</p>
我們可以給三個段落文本,設置不同的水平對齊方式,給三個 p 元素定義 class 屬性,值分別為 a,b,c。
在這個目錄下再創建一個 mystyle-2.css 文件,定義 p.a (讀作p點a) 選擇器,聲明樣式 text-align: left (不要讀冒號)。定義 p.b 選擇器,聲明樣式 text-align: center。定義 p.c 選擇器,聲明樣式 text-align: right。
p.a {
text-align: left;
}
p.b {
text-align: center;
}
p.c {
text-align: right;
}
在瀏覽器中預覽效果,三個段落分別左、中、右對齊了。
當 text-align 屬性被設置為 justify [?d??st?fa?]時,每一行都被拉長,使每一行都有相等的寬度,而且左右邊界是對齊的,就像雜志和報紙排版一樣。
注釋掉全部樣式,定義 p 選擇器,聲明樣式 text-align: justify。
我們看,貌似沒有什么效果。
為了演示,給第一個段落添加單詞 no, (讀作no 英文的逗號) 。再給 p 元素聲明一個樣式 width: 200px。
再看效果,三個段落的兩側都是對齊的。
假如注釋掉這個樣式,
很明顯,右側不再對齊顯示了。
除了水平對齊,還可以設置文本的垂直對齊。通過聲明 vertical-align 屬性來實現。值有五個:
baseline,基線對齊。
text-top,文本頂部對齊。
text-bottom,文本底部對齊。
sub,下角標對齊。
super,上角標對齊。
在 html 文件中添加一個 h1 元素,5個 p 元素。填入一些文本。在每個段首添加一個 img 元素,引入本地的一個小圖片,圖片的寬高都為 9px。給每個圖片元素定義 class 屬性,值分別為 a,b,c,d,e。
在樣式表中,定義 img.a 選擇器,聲明樣式 vertical-align: baseline。
baseline 是如何對齊的呢?看效果,在垂直方向好像是居中對齊。
實際上,baseline 是基于四線三格倒數第二行對齊的。對于英文文本才有意義。
比如,將 1 修改為 fight 1。
基線在這,文本中的圖片就基于它來對齊。
再定義 img.b,img.c,img.d,img.e 四個選擇器,給他們都聲明 vertical-align 屬性,值分別為 text-top,text-bottom,sub,super 。
看看效果,圖片垂直方向上,已經相對于文本頂部、底部、上角標、下角標的位置對齊了。
接下來,我們學習如何設置文本的間距。
通過 CSS,可以實現文本縮進、文字或字母間距、行高、單詞間距和處理空白。(有案例的效果演示)
聊起文本縮進,你還記得以前是如何實現自然段首行縮進的嗎?可以發彈幕告訴大家!
通過聲明 CSS 的 text-indent 屬性也可以實現。使?長度值或百分?來設置?本縮進。
長度值可以使?絕對單位或相對單位。絕對單位就是 px,比如縮進 50px;相對單位最常用的是 em,縮進的寬度為字符寬度的倍數,一般設置為 2em,就是空兩格。
字符寬度——如果是中文方塊字,也可以稱為字體大小,它是通過 font-size 屬性來設置的,這個屬性在后面 CSS 字體課程中會詳細介紹。
百分?縮進寬度,是根據?元素的寬度計算得到。這個很少使用。
給 p 元素聲明 text-indent 屬性,值為 2em。
仔細觀察,每個自然段縮進貌似不是2個字的寬度,這是為什么呢?
你應該想到了,把 text-align: justify 注釋一下,就是我們要的效果了。
letter-spacing 屬性用于指定中文文字或英文字母之間的空隙。
在樣式中,定義 h1 選擇器,聲明樣式 letter-spacing: 5px。
這樣,標題文字間就有了 5px 的空隙。
line-height 屬性用于指定行與行之間的高度,也就是行高。屬性值常用的有三個:
第一,normal,也是默認值,瀏覽器會根據字符大小自動設置一個行高。
第二,一個數字,比如 1.5。此數字與當前的字符大小相乘計算得到。推薦使用。
第三,絕對值,比如 20px,-5px。設置固定的行間距。
在沒有設置 line-height 屬性時,我們看到每一行的間距是這樣的。
回到樣式代碼,給 p 元素聲明樣式 line-height: normal。
我們看到效果沒有變化。
修改 line-height 屬性值為 1。
再來看,每個段落的行間距消失了。
再次修改 line-height 為 10px,行與行之間疊加到了一起。
是不是和你理解的行高不一樣呢?看來,我們得需要仔細研究一下:行高到底是如何計算的。
這是兩行中文和英文混合的文本。
在文字頂端畫一條線,取名叫頂線。在文字底端畫一條線,取名叫底線。在文字中間畫一條線,取名叫中線,再畫一條英文的基線。上一行文字的底線,到下一行文字的頂線,他們之間的空隙稱為行距。
實際上,line-height 設置的行高值,是兩行基線的距離。
這里你可能會問,基線不是英文文本才有的嗎?其實,不管文本里有沒有英文,基線都是一直存在的。
了解了這個原理,你就能理解 line-height: 1,為啥沒有行距了。因為 1 乘以文字的高度,結果還是文字的高度。而文字的高度,恰好等于兩行基線之間的距離,所以行距為 0。
word-spacing 屬性用于指定文本中單詞的間距,只對英文有效。
給 p 元素再聲明一個 word-spacing: 20px 樣式。
我們看,單詞 no 和 fight 后面就有了 20個像素的間距。
white-space 屬性指定了如何處理元素內部的空白。有一個常用的值,nowrap,不管包含文本的元素寬度是多少,文本都不會換行,直到遇見 <br> 標簽為止。
給 p 元素再聲明一個 white-space: nowrap 樣式。
此時,每個段落都在一行顯示了。雖然我們給 p 元素聲明了 width: 200px,他也會視而不見,繼續倔強的在一行顯示。
文章配套視頻鏈接:https://www.bilibili.com/video/BV1oU4y1278g?p=63
*請認真填寫需求信息,我們會在24小時內與您取得聯系。