成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

如何只用CSS做到完全居中

開發(fā) 前端
我們都知道 margin:0 auto; 的樣式能讓元素水平居中,而 margin: auto; 卻不能做到垂直居中……直到現(xiàn)在。

我們都知道 margin:0 auto; 的樣式能讓元素水平居中,而 margin: auto; 卻不能做到垂直居中……直到現(xiàn)在。但是,請注意!想讓元素絕對居中,只需要聲明元素高度,并且附加以下樣式,就可以做到:

  1. .Absolute-Center { 
  2.   marginauto
  3.   positionabsolute
  4.   top: 0; left: 0; bottom: 0; right: 0

我并不是***個(gè)發(fā)現(xiàn)這種方法的人(不過我還是敢把它叫做“完全居中”),它有可能是種非常普遍的技巧。但大多數(shù)介紹垂直居中的文章中并沒有提到過這種方法。如果不是瀏覽這篇文章的評論,我甚至根本就不會發(fā)現(xiàn)這個(gè)辦法。

上面那篇文章的評論欄中,Simon提供了一個(gè)jsFiddle的鏈接,其他的方法相比之下就相形見絀了。(Priit也在評論欄中提到了同樣的方法)。深入研究了一番之后,我又用某些關(guān)鍵詞找到了記載這種方法的三個(gè)網(wǎng)站:站點(diǎn)一、站點(diǎn)二、站點(diǎn)三。

以前從未用過這種方法的我想試試,看看這種”完全居中”的方法到底有多么神奇。 好處:

  • 跨瀏覽器,兼容性好(無需hack,可兼顧IE8~IE10)
  • 無特殊標(biāo)記,樣式更精簡
  • 自適應(yīng)布局,可以使用百分比和***最小高寬等樣式
  • 居中時(shí)不考慮元素的padding值(也不需要使用box-sizing樣式)
  • 布局塊可以自由調(diào)節(jié)大小
  • img的圖像也可以使用

同時(shí)注意:

  • 必須聲明元素高度
  • 推薦設(shè)置overflow:auto;樣式避免元素溢出,顯示不正常的問題
  • 這種方法在Windows Phone上不起作用

瀏覽器支持:Chrome、Firefox、Safari、Mobile Safari、IE8-10。 “完全居中”經(jīng)測試可以***地應(yīng)用在***版本的Chrome、Firefox、Safari、Mobile Safari中,甚至也可以運(yùn)行在IE8~IE10上

對照表

“完全居中”并不是本篇文章中唯一的選項(xiàng)。要做到垂直居中,還存在著其他方法,各有各的長處。采取什么樣的方法,取決于你所支持的瀏覽器,以及現(xiàn)有標(biāo)簽的結(jié)構(gòu)。下面這張對照表能夠幫你選出***你需要的方法。

所用樣式

支持的瀏覽器

是否 響應(yīng)式

內(nèi)容溢出后的樣式

resize:both

高度可變

主要缺陷

Absolute

現(xiàn)代瀏覽器&IE8+

會導(dǎo)致容器溢出

是*

‘可變高度’的特性不能跨瀏覽器

負(fù)margin值

所有

帶滾動條

大小改變后不再居中

不具有響應(yīng)式特性,margin值必須經(jīng)過手工計(jì)算

Transform

現(xiàn)代瀏覽器&IE9+

會導(dǎo)致容器溢出

妨礙渲染

Table-Cell

現(xiàn)代瀏覽器&IE8+

撐開容器

會加上多余的標(biāo)記

Inline-Block

現(xiàn)代瀏覽器&IE8+&IE7*

撐開容器

需要使用容器包裹和hack式的樣式

Flexbox

現(xiàn)代瀏覽器&IE10+

會導(dǎo)致容器溢出

需要使用容器包裹和廠商前綴(vendor prefix)

說明

在研究了規(guī)范和文檔后,我總結(jié)出了“完全居中”的工作原理:

  1. 在普通文檔流里,margin: auto; 的意思是設(shè)置元素的margin-top和margin-bottom為0。W3.org  If ‘margin-top’, or ‘margin-bottom’ are ‘auto’, their used value is 0.
  2.  設(shè)置了position: absolute; 的元素會變成塊元素,并脫離普通文檔流。而文檔的其余部分照常渲染,元素像是不在原來的位置一樣。 Developer.mozilla.org …an element that is positioned absolutely is taken out of the flow and thus takes up no space
  3. 設(shè)置了top: 0; left: 0; bottom: 0; right: 0; 樣式的塊元素會讓瀏覽器為它包裹一層新的盒子,因此這個(gè)元素會填滿它相對父元素的內(nèi)部空間,這個(gè)相對父元素可以是是body標(biāo)簽,或者是一個(gè)設(shè)置了 position: relative; 樣式的容器。 Developer.mozilla.org  For absolutely positioned elements, the top, right, bottom, and left properties specify offsets from the edge of the element’s containing block (what the element is positioned relative to).
  4.  給元素設(shè)置了寬高以后,瀏覽器會阻止元素填滿所有的空間,根據(jù)margin: auto; 的要求,重新計(jì)算,并包裹一層新的盒子。 Developer.mozilla.org 。The margin of the [absolutely positioned] element is then positioned inside these offsets.
  5. 既然塊元素是絕對定位的,又脫離了普通文檔流,因此瀏覽器在包裹盒子之前會給margin-top和margin-bottom設(shè)置一個(gè)相等的值。 W3.org If none of the three [top, bottom, height] are ‘auto’: If both ‘margin-top’ and ‘margin-bottom’ are ‘auto’, solve the equation under the extra constraint that the two margins get equal values.?AKA: center the block vertically

使用“完全居中”,有意遵照了標(biāo)準(zhǔn)margin: auto; 樣式渲染的規(guī)定,所以應(yīng)當(dāng)在與標(biāo)準(zhǔn)兼容的各種瀏覽器中起作用。

#p#

對齊

容器內(nèi)對齊

使用“完全居中”,就可以在一個(gè)設(shè)置了position: relative的容器中做到完全居中元素了!

  1. .Center-Container { 
  2.   positionrelative
  3.   
  4. .Absolute-Center { 
  5.   width50%
  6.   height50%
  7.   overflowauto
  8.   marginauto
  9.   positionabsolute
  10.   top: 0; left: 0; bottom: 0; right: 0

 

接下來的示例會假設(shè)已經(jīng)包含了以下樣式,并且以逐步添加樣式的方式提供不同的特性。

在可視區(qū)域內(nèi)居中

想要使內(nèi)容區(qū)在可視區(qū)域內(nèi)居中么?設(shè)置position: fixed樣式,并設(shè)置一個(gè)較高的z-index值,就可以做到。

  1. .Absolute-Center.is-Fixed { 
  2.   positionfixed
  3.   z-index999

 

移動版Safari的說明:如果外面沒有一層設(shè)置position: relative的容器,內(nèi)容區(qū)會以整個(gè)文檔的高度的中心點(diǎn)為基準(zhǔn)居中,而不是以可視區(qū)域的高度中心點(diǎn)為基準(zhǔn)居中。

偏移值

如果需要添加固定的標(biāo)題,或者其他帶偏移樣式的元素,可以直接把類似top: 70px; 的樣式寫進(jìn)內(nèi)容區(qū)域的樣式中。一旦聲明了margin: auto; 的樣式,內(nèi)容塊的top left bottom right的屬性值也會同時(shí)計(jì)算進(jìn)去。

如果想讓內(nèi)容塊在貼近側(cè)邊的過程中保持水平居中,可以使用right: 0; left: auto; 讓內(nèi)容貼在右側(cè),或者使用left: 0; right: auto; 使內(nèi)容貼在左側(cè)。

  1. .Absolute-Center.is-Fixed { 
  2.   positionfixed
  3.   z-index999

 帶響應(yīng)式

使用absolute的***好處就是可以***地使用帶百分比的寬高樣式!就算是min-width/max-width或者min-height/max-height也能夠有如預(yù)期般的表現(xiàn)。

再進(jìn)一步加上padding樣式的話,absolute式的完全居中也絲毫不會破壞!

  1. .Absolute-Center.is-Responsive { 
  2.   width60%
  3.   height60%
  4.   min-width200px
  5.   max-width400px
  6.   padding40px

#p#

帶溢出內(nèi)容

內(nèi)容區(qū)高度大于可視區(qū)域或者一個(gè)position: relative的容器,其內(nèi)容可能會溢出容器,或被容器截?cái)唷V灰獌?nèi)容區(qū)域沒有超出容器(沒有給內(nèi)容容器預(yù)留padding的話,可以設(shè)置max-height: 100%;的樣式),那么容器內(nèi)就會產(chǎn)生滾動條。

  1. .Absolute-Center.is-Overflow { 
  2.   overflowauto

 大小可調(diào)整

使用其他樣式,或者使用JavaScript調(diào)整內(nèi)容區(qū)的大小,也是不用手動重新計(jì)算的!如果設(shè)置了resize的樣式,甚至可以讓用戶自行調(diào)節(jié)內(nèi)容區(qū)域的大小。 “完全居中”法,無論內(nèi)容區(qū)怎么改變大小,都會保持居中。

設(shè)置了min-/max- 開頭的屬性可以限制區(qū)塊的大小而不用擔(dān)心撐開容器。

  1. .Absolute-Center.is-Resizable { 
  2.   min-width20%
  3.   max-width80%
  4.   min-height20%
  5.   max-height80%
  6.   resize: both
  7.   overflowauto

如果不設(shè)置resize: both的樣式,可以設(shè)置transition樣式平滑地在大小間切換。一定要記得設(shè)置overflow: auto樣式,因?yàn)楦淖兇笮『蟮娜萜鞲邔捄苡锌赡軙∮趦?nèi)容的高寬。 “完全居中”法是唯一一種能支持使用resize: both樣式的方法。

使用注意:

  • 需要設(shè)置max-width/max-height給內(nèi)容區(qū)域留足夠的空間,不然就有可能使容器溢出。
  • resize屬性不支持移動版瀏覽器和IE8-10,如果用戶體驗(yàn)很重要的話,請確保用戶可以有其他替代方法來改變大小。
  • 同時(shí)使用resize樣式和transition會使用戶在開始改變大小時(shí)產(chǎn)生等于transition效果時(shí)間等長的延時(shí)。

圖像

圖像也同樣有效!提供相應(yīng)的class,并指定樣式 height: auto; ,就得到了一張隨著容器改變大小的響應(yīng)式圖片。

請注意,height: auto; 樣式雖然對圖片有效,如果沒有用到了后面介紹的‘可變高技巧’,則會導(dǎo)致普通內(nèi)容區(qū)域伸長以適應(yīng)容器長度。

瀏覽器很有可能是根據(jù)渲染結(jié)果填充了圖像高度值,所以在測試過的瀏覽器中,margin: auto; 樣式就像是聲明了固定的高度值一般正常工作。

HTML:

  1. <img src="http://placekitten.com/g/500/200" alt="" />

CSS:

  1. .Absolute-Center.is-Image { 
  2.   heightauto
  3.   
  4. .Absolute-Center.is-Image img { 
  5.   width100%
  6.   heightauto
  7.  
  8.   

#p#

可變高度

“完全居中”法的確需要聲明容器高度,但是高度受max-height樣式的影響,也可以是百分比。這非常適合響應(yīng)式的方案,只需要設(shè)置好帶溢出內(nèi)容就行。

另一種替代方案是設(shè)置display: table樣式居中,,不管內(nèi)容的長度。這種方法會在一些瀏覽器中產(chǎn)生問題(主要是IE和Firefox)。我在ELL Creative的朋友Kalley寫了一個(gè)基于Modernizr 的測試,可以用來檢查瀏覽器是否支持這種居中方案。現(xiàn)在這種方法可以做到漸進(jìn)增強(qiáng)。

注意要點(diǎn): 這種方法會破壞瀏覽器兼容性,如果Modernizr測試不能滿足你的需求,你可能需要考慮其他的實(shí)現(xiàn)方案。

  • 與大小可調(diào)整技術(shù)是不兼容的
  • Firefox/IE8中使用display: table,內(nèi)容區(qū)在垂直方向靠上,水平方向仍然居中。
  • IE9/10中使用display: table,內(nèi)容區(qū)會跑到左上角。
  • 移動版Safari中內(nèi)容區(qū)是水平對齊的,但是如果使用了百分比的寬度,水平方向上會稍稍偏離中心。

Javascript:

  1. /* Modernizr Test for Variable Height Content */ 
  2. Modernizr.testStyles('#modernizr { display: table; height: 50px; width: 50px; margin: auto; position: absolute; top: 0; left: 0; bottom: 0; right: 0; }'function(elem, rule) { 
  3.   Modernizr.addTest('absolutecentercontent', Math.round(window.innerHeight / 2 - 25) === elem.offsetTop); 
  4. }); 

CSS:

  1. .absolutecentercontent .Absolute-Center.is-Variable { 
  2.   display: table; 
  3.   heightauto

其他方法

“完全居中”法是解決居中問題的好方法,同時(shí)也有許多可以滿足不同需求的其他方法。最常見的,推薦的方法有負(fù)margin值、transform 法、table-cell法、inline-block法、以及現(xiàn)在出現(xiàn)的Flexbox法,這些方法其他文章都有深入介紹,所以這里只會稍稍提及。

 

負(fù)margin值

這或許是最常用的方法。如果知道了各個(gè)元素的大小,設(shè)置等于寬高一半大小的負(fù)margin值(如果沒有使用box-sizing: border-box樣式,還需要加上padding值),再配合top: 50%; left: 50%;樣式就會使塊元素居中。

需要注意的是,這是按照預(yù)想情況也能在工作在IE6-7下的唯一方法。

  1. .is-Negative { 
  2.         width300px
  3.         height200px
  4.         padding20px
  5.         positionabsolute
  6.         top: 50%; left: 50%
  7.         margin-left-170px/* (width + padding)/2 */ 
  8.         margin-top-120px/* (height + padding)/2 */ 

好處:

  • 瀏覽器兼容性非常好,甚至支持IE6-7
  • 需要的編碼量很少

同時(shí)注意:

  • 這是個(gè)非響應(yīng)式的方法,不能使用百分比的大小,也不能設(shè)置min-/max-的***值最小值。
  • 內(nèi)容可能會超出容器
  • 需要為padding預(yù)留空間,或者需要使用box-sizing: border-box樣式。
  • #p#

transform法

和“完全居中”法的好處一樣,簡單有效,同時(shí)支持可變高度。為內(nèi)容指定帶有廠商前綴的transform: translate(-50%,-50%)和top: 50%; left: 50%;樣式就可以讓內(nèi)容塊居中。

  1. .is-Transformed { 
  2.   width50%
  3.   marginauto
  4.   positionabsolute
  5.   top: 50%; left: 50%
  6.   -webkit-transform: translate(-50%,-50%); 
  7.       -ms-transform: translate(-50%,-50%); 
  8.           transform: translate(-50%,-50%); 

好處:

  • 內(nèi)容高度可變
  • 代碼量小

同時(shí)注意:

  • 不支持IE8
  • 需要寫廠商前綴
  • 會和其他transform樣式有沖突
  • 某些情況下的邊緣和字體渲染會有問題

table-cell法

這種可能是***的方法,因?yàn)楦叨瓤梢噪S內(nèi)容改變,瀏覽器支持也不差。主要缺陷是會產(chǎn)生額外的標(biāo)簽,每一個(gè)需要居中的元素需要三個(gè)額外的HTML標(biāo)簽。

HTML:

  1. <div class="Center-Container is-Table"> 
  2.   <div class="Table-Cell"> 
  3.     <div class="Center-Block"> 
  4.     <!-- CONTENT --> 
  5.     </div> 
  6.   </div> 
  7. </div> 

CSS:

  1. .Center-Container.is-Table { display: table; } 
  2. .is-Table .Table-Cell { 
  3.   displaytable-cell
  4.   vertical-alignmiddle
  5. .is-Table .Center-Block { 
  6.   width50%
  7.   margin0 auto

好處:

  • 內(nèi)容高度可變
  • 內(nèi)容溢出則能自動撐開父元素高度
  • 瀏覽器兼容性好

同時(shí)注意:

  • 需要額外的HTML標(biāo)簽

inline-block法

迫切需要的方法:inline-block法居中。基本方法是使用 display: inline-blockvertical-align: middle樣式和偽元素讓內(nèi)容塊在容器中居中。我的實(shí)現(xiàn)用到了幾個(gè)在其他地方見不到的新技巧解決了一些問題。

內(nèi)容區(qū)聲明的寬度不能大于容器的100% 減去0.25em的寬度。就像一段帶有長文本的區(qū)域。不然,內(nèi)容區(qū)域會被推到頂端,這就是使用:after偽類的原因。使用:before偽類則會讓元素有100%的大小!

如果內(nèi)容塊需要盡可能大地占用水平空間,可以為大容器加上max-width: 99%;樣式,或者考慮瀏覽器和容器寬度的情況下使用max-width: calc(100% – 0.25em) 樣式。

這種方法和table-cell的大多數(shù)好處相同,不過最初我放棄了這個(gè)方法,因?yàn)樗袷莌ack。不管這一點(diǎn)的話,瀏覽器支持很不錯(cuò),而且也被證實(shí)是很流行的方法。

HTML:

  1. <div class="Center-Container is-Inline"> 
  2.   <div class="Center-Block"> 
  3.     <!-- CONTENT --> 
  4.   </div> 
  5. </div> 

CSS

  1. .Center-Container.is-Inline { 
  2.   text-aligncenter
  3.   overflowauto
  4.   
  5. .Center-Container.is-Inline:after, 
  6. .is-Inline .Center-Block { 
  7.   display: inline-block
  8.   vertical-alignmiddle
  9.   
  10. .Center-Container.is-Inline:after { 
  11.   content''
  12.   height100%
  13.   margin-left-0.25em/* To offset spacing. May vary by font */ 
  14.   
  15. .is-Inline .Center-Block { 
  16.   max-width99%/* Prevents issues with long content causes the content block to be pushed to the top */ 
  17.   /* max-width: calc(100% - 0.25em) /* Only for IE9+ */ 

好處:

  • 內(nèi)容高度可變
  • 內(nèi)容溢出則能自動撐開父元素高度
  • 瀏覽器兼容性好,甚至可以調(diào)整支持IE7

同時(shí)注意:

  • 需要額外容器
  • 依賴于margin-left: -0.25em的樣式,做到水平居中,需要為不同的字體大小作調(diào)整
  • 內(nèi)容區(qū)聲明的寬度不能大于容器的100% 減去0.25em的寬度

 #p#

Flexbox法

CSS未來發(fā)展的方向就是采用Flexbox這種設(shè)計(jì),解決像垂直居中這種共同的問題。請注意,F(xiàn)lexbox有不止一種辦法居中,他也可以用來分欄,并解決奇奇怪怪的布局問題。

  1. .Center-Container.is-Flexbox { 
  2.   display: -webkit-box; 
  3.   display: -moz-box; 
  4.   display: -ms-flexbox; 
  5.   display: -webkit-flex; 
  6.   display: flex; 
  7.   -webkit-box-align: center
  8.      -moz-box-align: center
  9.      -ms-flex-align: center
  10.   -webkit-align-items: center
  11.           align-items: center
  12.   -webkit-box-pack: center
  13.      -moz-box-pack: center
  14.      -ms-flex-pack: center
  15.   -webkit-justify-contentcenter
  16.           justify-contentcenter

好處:

  • 內(nèi)容可以是任意高寬,溢出也能表現(xiàn)良好
  • 可以用于各種高級布局技巧

同時(shí)注意: 不支持IE8-9

  • 需要在body上寫樣式,或者需要額外容器
  • 需要各種廠商前綴兼容現(xiàn)代瀏覽器
  • 可能有潛在的性能問題

***的建議

各項(xiàng)技術(shù)都有各自的好處,采取什么樣的方法,取決于你所支持的瀏覽器,以及現(xiàn)有標(biāo)簽的結(jié)構(gòu)。請使用上面提供對照表幫你選出***你需要的方法。

“完全居中”法簡單方便,迅速及時(shí)。以前使用負(fù)Margin值的地方,都可以使用Absolute居中。無需繁瑣的數(shù)學(xué)計(jì)算,無需額外標(biāo)簽,而且可以隨時(shí)改變大小。

如果網(wǎng)站需要可變高度的內(nèi)容,而且同時(shí)照顧到瀏覽器兼容性的話,可以嘗試table-cell和inline-block技術(shù),如果想嘗試新鮮事物的話,可以使用Flexbox,并享受這種高級技術(shù)帶來的好處。

 

 

責(zé)任編輯:陳四芳 來源: 伯樂在線
相關(guān)推薦

2022-05-06 09:00:56

CSS元素Flex

2009-11-20 11:37:11

Oracle完全卸載

2017-08-17 12:03:58

前端CSS加載

2013-05-14 10:54:57

jQuery網(wǎng)站開發(fā)

2019-08-01 14:00:21

2021-01-25 18:19:02

自動駕駛數(shù)據(jù)人工智能

2010-09-01 10:49:57

CSS水平居中垂直居中

2010-09-10 09:31:08

CSSDIV

2023-07-17 09:19:20

CSSCSS 漸變

2017-08-18 13:30:01

前端CSS布局奇技

2021-05-06 07:26:55

CSS 文字動畫技巧

2023-03-16 10:20:55

CSS選擇器

2013-01-30 15:59:29

adobeCSS3HTML5

2010-08-16 16:49:30

DIV CSS居中

2010-08-31 15:07:45

CSS居中

2010-09-09 10:23:23

DIVCSS垂直居中

2022-12-20 15:17:29

CSS開發(fā)

2021-06-15 10:22:37

AI 數(shù)據(jù)人工智能

2011-11-09 15:49:52

API

2010-08-24 13:25:16

DIV+CSS
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 日本中文字幕日韩精品免费 | www.av7788.com | 欧美成人自拍 | 久久久久无码国产精品一区 | 国产一区二区精品 | 国产2区 | 亚洲精品中文在线 | 91精品国产92| 亚洲成人精品一区 | 日韩在线精品视频 | 国产黄视频在线播放 | 久久精品免费看 | 成人在线小视频 | 亚洲精品乱码久久久久久按摩观 | 日韩视频一区在线观看 | 国产精品久久国产精品99 | 国产精品91久久久久久 | 国产精品精品视频一区二区三区 | 手机看黄av免费网址 | 久久久久久久综合色一本 | 少妇一区二区三区 | 亚洲视频中文 | 国产亚洲精品精品国产亚洲综合 | 一区二区三区av | 国产福利91精品一区二区三区 | 最新中文字幕在线播放 | 国产综合视频 | 91麻豆精品国产91久久久久久久久 | 免费午夜视频在线观看 | 日本精品网站 | 欧美一级欧美三级在线观看 | 欧美精品区 | 国产精品日韩欧美一区二区三区 | 中文字幕亚洲精品 | 色综合一区二区 | 国产精品日韩欧美一区二区三区 | 中文字幕在线观看视频一区 | 99成人免费视频 | 亚洲视频1区| 亚洲国产精品一区二区第一页 | 欧美日韩国产一区 |