整合營銷服務(wù)商

          電腦端+手機端+微信端=數(shù)據(jù)同步管理

          免費咨詢熱線:

          用CSS實現(xiàn)居中的七種方法

          信IDWEB_wysj(點擊關(guān)注) ◎ ◎ ◎ ◎ ◎◎◎◎◎一┳═┻︻▄

          (頁底留言開放,歡迎來吐槽)

          ● ● ●

          在網(wǎng)頁上使 HTML 元素居中看似一件很簡單的事情. 至少在某些情況下是這樣的,但是復(fù)雜的布局往往使一些解決方案不能很好的發(fā)揮作用。

          在網(wǎng)頁布局中元素水平居中比元素垂直居中要簡單不少,同時實現(xiàn)水平居中和垂直居中往往是最難的。現(xiàn)在是響應(yīng)式設(shè)計的時代,我們很難確切的知道元素的準(zhǔn)確高度和寬度,所以一些方案不大適用。據(jù)我所知, 在CSS中至少有六種實現(xiàn)居中的方法。我將使用下面的HTML結(jié)構(gòu)從簡單到復(fù)雜開始講解:

          1

          2

          3

          <divclass="center">

          <imgsrc="jimmy-choo-shoe.jpg"alt>

          </div>

          鞋子圖片會改變,但是他們都會保持500pxX500px的大小。 HSL colors 用于使背景顏色保持一致。

          使用text-align水平居中

          有時顯而易見的方案是最佳的選擇:

          1

          2

          3

          4

          5

          6

          7

          8

          div.center{

          text-align: center;

          background: hsl(0, 100%, 97%);

          }

          div.centerimg

          {

          width: 33%; height: auto;

          }

          這種方案沒有使圖片垂直居中:你需要給<div> 添加 padding 或者給內(nèi)容添加 margin-top和 margin-bottom使容器與內(nèi)容之間有一定的距離。

          使用 margin: auto 居中

          這種方式實現(xiàn)水平居中和上面使用text-align的方法有相同局限性。

          1

          2

          3

          4

          5

          6

          7

          8

          9

          div.center{

          background: hsl(60, 100%, 97%);

          }

          div.centerimg {

          display: block;

          width: 33%;

          height: auto;

          margin: 0auto;

          }

          注意: 必須使用display: block使 margin: 0 auto對img元素生效。

          使用table-cell居中

          使用 display: table-cell, 而不是使用table標(biāo)簽; 可以實現(xiàn)水平居中和垂直居中,但是這種方法需要添加額外的元素作為外部容器。

          1

          2

          3

          4

          5

          <divclass="center-aligned">

          <divclass="center-core">

          <imgsrc="jimmy-choo-shoe.jpg">

          </div>

          </div>

          CSS:

          1

          2

          3

          4

          5

          6

          7

          8

          9

          10

          11

          12

          13

          .center-aligned {

          display: table;

          background: hsl(120, 100%, 97%);

          width: 100%;

          }

          .center-core {

          display: table-cell;

          text-align: center;

          vertical-align: middle;

          }

          .center-core img {

          width: 33%;

          height: auto;}

          注意:為了使div 不折疊必須加上 width: 100%,外部容器元素也需要加上一定高度使得內(nèi)容垂直居中。給html和body設(shè)置高度后,也可以使元素在body垂直居中。此方法在IE8+瀏覽器上生效。

          使用absolute定位居中

          這種 方案 有非常好的跨瀏覽器支持。有一個缺點就是必須顯式聲明外部容器元素的height:

          .absolute-aligned { position: relative; min-height: 500px; background: hsl(200, 100%, 97%);

          }

          .absolute-aligned img { width: 50%; min-width: 200px; height: auto; overflow: auto; margin: auto; position: absolute; top: 0; left: 0; bottom: 0; right: 0;

          }

          Stephen在他的 博客 中演示了這種方案的幾種變化。

          使用translate居中

          Chris Coiyer 提出了一個使用 CSS transforms 的新方案。 同樣支持水平居中和垂直居中:

          1

          2

          3

          4

          5

          6

          7

          8

          9

          10

          11

          .center{

          background: hsl(180, 100%, 97%);

          position: relative;

          min-height: 500px;

          }

          .centerimg {

          position: absolute;

          top: 50%; left: 50%;

          transform: translate(-50%, -50%);

          width: 30%; height: auto;

          }

          但是有以下幾種缺點:

          • CSS transform 在部分就瀏覽器上需要使用 前綴。

          • 不支持 IE9 以下的瀏覽器。

          • 外部容器需要設(shè)置height (或者用其他方式設(shè)置),因為不能獲取 絕對定位 的內(nèi)容的高度。

          • 如果內(nèi)容包含文字,現(xiàn)在的瀏覽器合成技術(shù)會使文字模糊不清。

          使用Flexbox居中

          當(dāng)新舊語法差異和瀏覽器前綴消失時,這種方法會成為主流的居中方案。

          1

          2

          3

          4

          5

          6

          7

          8

          9

          .center{

          background: hsl(240, 100%, 97%);

          display: flex;

          justify-content: center;

          align-items: center;

          }

          .centerimg {

          width: 30%; height: auto;

          }

          在很多方面 flexbox 是一種簡單的方案, 但是它有新舊兩種語法以及早期版本的IE缺乏支持 (盡管可以使用 display: table-cell作為降級方案)。

          現(xiàn)在規(guī)范已經(jīng)最終確定,現(xiàn)代瀏覽器也大都支持,我寫了一篇詳細(xì)的教程 教程。

          使用calc居中

          在某些情況下比flexbox更全面:

          1

          2

          3

          4

          5

          6

          7

          8

          9

          10

          11

          12

          .center{

          background: hsl(300, 100%, 97%);

          min-height: 600px;

          position: relative;

          }

          .centerimg {

          width: 40%;

          height: auto;

          position: absolute;

          top: calc(50%- 20%);

          left: calc(50%- 20%);

          }

          很簡單,calc 允許你基于當(dāng)前的頁面布局計算尺寸。在上面的簡單計算中, 50% 是容器元素的中心點,但是如果只設(shè)置50%會使圖片的左上角對齊div的中心位置。 我們需要把圖片向左和向上各移動圖片寬高的一半。計算公式為:

          1

          2

          top: calc(50%- (40%/ 2));

          left: calc(50%- (40%/ 2));

          在現(xiàn)在的瀏覽其中你會發(fā)現(xiàn),這種方法更適用于當(dāng)內(nèi)容的寬高為固定尺寸:

          1

          2

          3

          4

          5

          6

          .centerimg {

          width: 500px; height: 500px;

          position: absolute;

          top: calc(50%- (300px/ 2));

          left: calc(50%- (300px2));

          }

          我在 這篇文章 中詳細(xì)講解了calc。

          這種方案和flex一樣有許多相同的缺點: 雖然在現(xiàn)代瀏覽器中有良好的支持,但是在較早的版本中仍然需要瀏覽器前綴,并且不支持IE8。

          1

          2

          3

          4

          5

          6

          .centerimg {

          width: 40%; height: auto;

          position: absolute;

          top: calc(50%- 20%);

          left: calc(50%- 20%);

          }

          當(dāng)然還有 其他更多的方案。理解這七種方案之后,web開發(fā)人員在面對元素居中的時候會有更多的選擇。

          干貨!免費領(lǐng)取騰訊高級講師網(wǎng)頁設(shè)計教程


          點我領(lǐng)取

          點擊下方“閱讀原文”結(jié)交更多有才華的設(shè)計師!

          ↓↓↓

          者|顏海鏡

          編輯|覃云

          出處丨前端之巔

          本文已獲作者授權(quán),轉(zhuǎn)載來源:

          https://segmentfault.com/a/1190000016389031

          劃重點,這是一道面試必考題,很多面試官都喜歡問這個問題,我就被問過好幾次了。



          要實現(xiàn)上圖的效果看似很簡單,實則暗藏玄機,本文總結(jié)了一下 CSS 實現(xiàn)水平垂直居中的方式大概有下面這些,本文將逐一介紹一下,我將本文整理成了一個 github 倉庫在:https://github.com/yanhaijing/vertical-center

          歡迎大家 star。

          僅居中元素定寬高適用:

          • absolute + 負(fù) margin
          • absolute + margin auto
          • absolute + calc

          居中元素不定寬高:

          • absolute + transform
          • lineheight
          • writing-mode
          • table
          • css-table
          • flex
          • grid

          1.absolute + 負(fù) margin

          為了實現(xiàn)上面的效果先來做些準(zhǔn)備工作,假設(shè) HTML 代碼如下,總共兩個元素,父元素和子元素:

          <div class="wp">
           <div class="box size">123123</div>
          </div>
          

          wp 是父元素的類名,box 是子元素的類名,因為有定寬和不定寬的區(qū)別,size 用來表示指定寬度,下面是所有效果都要用到的公共代碼,主要是設(shè)置顏色和寬高。

          注意:后面不在重復(fù)這段公共代碼,只會給出相應(yīng)提示。

          /* 公共代碼 */
          .wp {
           border: 1px solid red;
           width: 300px;
           height: 300px;
          }
          .box {
           background: green; 
          }
          .box.size{
           width: 100px;
           height: 100px;
          }
          /* 公共代碼 */
          

          絕對定位的百分比是相對于父元素的寬高,通過這個特性可以讓子元素的居中顯示,但絕對定位是基于子元素的左上角,期望的效果是子元素的中心居中顯示。

          為了修正這個問題,可以借助外邊距的負(fù)值,負(fù)的外邊距可以讓元素向相反方向定位,通過指定子元素的外邊距為子元素寬度一半的負(fù)值,就可以讓子元素居中了,css 代碼如下。

          /* 此處引用上面的公共代碼 */
          /* 此處引用上面的公共代碼 */
          /* 定位代碼 */
          .wp {
           position: relative;
          }
          .box {
           position: absolute;;
           top: 50%;
           left: 50%;
           margin-left: -50px;
           margin-top: -50px;
          }
          

          這是我比較常用的方式,這種方式比較好理解,兼容性也很好,缺點是需要知道子元素的寬高。

          點擊查看完整 DEMO:

          http://yanhaijing.com/vertical-center/absolute1.html

          2.absolute + margin auto

          這種方式也要求居中元素的寬高必須固定,HTML 代碼如下:

          <div class="wp">
           <div class="box size">123123</div>
          </div>
          

          這種方式通過設(shè)置各個方向的距離都是 0,此時再講 margin 設(shè)為 auto,就可以在各個方向上居中了。

          /* 此處引用上面的公共代碼 */
          /* 此處引用上面的公共代碼 */
          /* 定位代碼 */
          .wp {
           position: relative;
          }
          .box {
           position: absolute;;
           top: 0;
           left: 0;
           right: 0;
           bottom: 0;
           margin: auto;
          }
          

          這種方法兼容性也很好,缺點是需要知道子元素的寬高。

          點擊查看完整 DEMO:

          http://yanhaijing.com/vertical-center/absolute2.html

          3.absolute + calc

          這種方式也要求居中元素的寬高必須固定,所以我們?yōu)?box 增加 size 類,HTML 代碼如下:

          <div class="wp">
           <div class="box size">123123</div>
          </div>
          

          感謝 css3 帶來了計算屬性,既然 top 的百分比是基于元素的左上角,那么在減去寬度的一半就好了,代碼如下

          /* 此處引用上面的公共代碼 */
          /* 此處引用上面的公共代碼 */
          /* 定位代碼 */
          .wp {
           position: relative;
          }
          .box {
           position: absolute;;
           top: calc(50% - 50px);
           left: calc(50% - 50px);
          }
          

          這種方法兼容性依賴 calc 的兼容性,缺點是需要知道子元素的寬高。

          點擊查看完整 DEMO:

          http://yanhaijing.com/vertical-center/absolute3.html

          4.absolute + transform

          還是絕對定位,但這個方法不需要子元素固定寬高,所以不再需要 size 類了,HTML 代碼如下:

          <div class="wp">
           <div class="box">123123</div>
          </div>
          

          修復(fù)絕對定位的問題,還可以使用 css3 新增的 transform,transform 的 translate 屬性也可以設(shè)置百分比,其是相對于自身的寬和高,所以可以講 translate 設(shè)置為 -50%,就可以做到居中了,代碼如下:

          /* 此處引用上面的公共代碼 */
          /* 此處引用上面的公共代碼 */
          /* 定位代碼 */
          .wp {
           position: relative;
          }
          .box {
           position: absolute;
           top: 50%;
           left: 50%;
           transform: translate(-50%, -50%);
          }
          

          這種方法兼容性依賴 translate2d 的兼容性。

          點擊查看完整 DEMO:

          http://yanhaijing.com/vertical-center/absolute4.html

          5.lineheight

          利用行內(nèi)元素居中屬性也可以做到水平垂直居中,HTML 代碼如下:

          <div class="wp">
           <div class="box">123123</div>
          </div>
          

          把 box 設(shè)置為行內(nèi)元素,通過 text-align 就可以做到水平居中,但很多同學(xué)可能不知道通過通過 vertical-align 也可以在垂直方向做到居中,代碼如下:

          /* 此處引用上面的公共代碼 */
          /* 此處引用上面的公共代碼 */
          /* 定位代碼 */
          .wp {
           line-height: 300px;
           text-align: center;
           font-size: 0px;
          }
          .box {
           font-size: 16px;
           display: inline-block;
           vertical-align: middle;
           line-height: initial;
           text-align: left; /* 修正文字 */
          }
          

          這種方法需要在子元素中將文字顯示重置為想要的效果。

          點擊查看完整 DEMO:

          http://yanhaijing.com/vertical-center/lineheight.html

          6.writing-mode

          很多同學(xué)一定和我一樣不知道 writing-mode 屬性,感謝 @張鑫旭老師的反饋,簡單來說 writing-mode 可以改變文字的顯示方向,比如可以通過 writing-mode 讓文字的顯示變?yōu)榇怪狈较颉?/p>

          <div class="div1">水平方向</div>
          <div class="div2">垂直方向</div>
          .div2 {
           writing-mode: vertical-lr;
          }
          

          顯示效果如下:

          水平方向
          垂
          直
          方
          向
          

          更神奇的是所有水平方向上的 css 屬性,都會變?yōu)榇怪狈较蛏系膶傩裕热?text-align,通過 writing-mode 和 text-align 就可以做到水平和垂直方向的居中了,只不過要稍微麻煩一點:

          <div class="wp">
           <div class="wp-inner">
           <div class="box">123123</div>
           </div>
          </div>
          /* 此處引用上面的公共代碼 */
          /* 此處引用上面的公共代碼 */
          /* 定位代碼 */
          .wp {
           writing-mode: vertical-lr;
           text-align: center;
          }
          .wp-inner {
           writing-mode: horizontal-tb;
           display: inline-block;
           text-align: center;
           width: 100%;
          }
          .box {
           display: inline-block;
           margin: auto;
           text-align: left;
          }
          

          這種方法實現(xiàn)起來和理解起來都稍微有些復(fù)雜。

          點擊查看完整 DEMO:

          http://yanhaijing.com/vertical-center/writing-mode.html

          7.table

          曾經(jīng) table 被用來做頁面布局,現(xiàn)在沒人這么做了,但 table 也能夠?qū)崿F(xiàn)水平垂直居中,但是會增加很多冗余代碼:

          <table>
           <tbody>
           <tr>
           <td class="wp">
           <div class="box">123123</div>
           </td>
           </tr>
           </tbody>
          </table>
          

          tabel 單元格中的內(nèi)容天然就是垂直居中的,只要添加一個水平居中屬性就好了。

          .wp {
           text-align: center;
          }
          .box {
           display: inline-block;
          }
          

          這種方法就是代碼太冗余,而且也不是 table 的正確用法。

          點擊查看完整 DEMO:

          http://yanhaijing.com/vertical-center/table.html

          8.css-table

          css 新增的 table 屬性,可以讓我們把普通元素,變?yōu)?table 元素的現(xiàn)實效果,通過這個特性也可以實現(xiàn)水平垂直居中。

          <div class="wp">
           <div class="box">123123</div>
          </div>
          

          下面通過 css 屬性,可以讓 div 顯示的和 table 一樣:

          .wp {
           display: table-cell;
           text-align: center;
           vertical-align: middle;
          }
          .box {
           display: inline-block;
          }
          

          這種方法和 table 一樣的原理,但卻沒有那么多冗余代碼,兼容性也還不錯。

          點擊查看完整 DEMO:

          http://yanhaijing.com/vertical-center/css-table.html

          9.flex

          flex 作為現(xiàn)代的布局方案,顛覆了過去的經(jīng)驗,只需幾行代碼就可以優(yōu)雅的做到水平垂直居中。

          <div class="wp">
           <div class="box">123123</div>
          </div>
          .wp {
           display: flex;
           justify-content: center;
           align-items: center;
          }
          

          目前在移動端已經(jīng)完全可以使用 flex 了,PC 端需要看自己業(yè)務(wù)的兼容性情況。

          點擊查看完整 DEMO:

          http://yanhaijing.com/vertical-center/flex.html

          10.grid

          感謝 @一絲姐 反饋的這個方案,css 新出的網(wǎng)格布局,由于兼容性不太好,一直沒太關(guān)注,通過 grid 也可以實現(xiàn)水平垂直居中。

          <div class="wp">
           <div class="box">123123</div>
          </div>
          .wp {
           display: grid;
          }
          .box {
           align-self: center;
           justify-self: center;
          }
          

          代碼量也很少,但兼容性不如 flex,不推薦使用。

          點擊查看完整 DEMO:

          http://yanhaijing.com/vertical-center/grid.html

          總結(jié)

          下面對比下各個方式的優(yōu)缺點,肯定又雙叒叕該有同學(xué)說回字的寫法了,簡單總結(jié)下:

          • PC 端有兼容性要求,寬高固定,推薦 absolute + 負(fù) margin
          • PC 端有兼容要求,寬高不固定,推薦 css-table
          • PC 端無兼容性要求,推薦 flex
          • 移動端推薦使用 flex

          小貼士:關(guān)于 flex 的兼容性決方案,請看這里:

          https://yanhaijing.com/css/2016/08/21/flex-practice-on-mobile/


          最近發(fā)現(xiàn)很多同學(xué)都對 css 不夠重視,這其實是不正確的,比如下面的這么簡單的問題都有那么多同學(xué)不會,我也是很無語:

          <div class="red blue">123</div>
          <div class="blue red">123</div>
          .red {
           color: red
          }
          .blue {
           color: blue
          }
          

          問兩個 div 的顏色分別是什么,竟然只有 40% 的同學(xué)能夠答對,這 40% 中還有很多同學(xué)不知道為什么,希望這些同學(xué)好好補習(xí)下 CSS 基礎(chǔ)。

          素分類

          在講解CSS布局之前,我們需要提前知道一些知識,在CSS中,html中的標(biāo)簽元素大體被分為三種不同的類型:

          塊狀元素、內(nèi)聯(lián)元素(又叫行內(nèi)元素)和內(nèi)聯(lián)塊狀元素。

          常用的內(nèi)聯(lián)元素有:

          <a>、<span>、<br/>、<sub>、<sup>、<label>、<b>、<i>、<u>、<del>

          常用的塊狀元素有:

          <div>、<p>、<h1>...<h6>、<ol>、<ul>、<li>、<dl>、<dt>、<dl>、<table>、<marquee>、<form>、<pre>

          常用的內(nèi)聯(lián)塊狀元素(又叫行內(nèi)塊元素)有:

          <img>、<input>

          內(nèi)聯(lián)元素(行內(nèi))

          在html中,<span>、<a>、<label>、<input>、 <img>、 <strong> 和<em>就是典型的內(nèi)聯(lián)元素(行內(nèi)元素)(inline)元素。

          當(dāng)然塊狀元素也可以通過代碼display:inline將元素設(shè)置為內(nèi)聯(lián)元素。如下代碼就是將塊狀元素div轉(zhuǎn)換為內(nèi)聯(lián)元素,從頁使用div元素具有內(nèi)聯(lián)元素特點。

          div{display:inline}

          內(nèi)聯(lián)元素(行內(nèi))特點:

          1、和其他元素都在一行上;

          2、元素的高度、寬度、行高及頂部和底部邊距不可設(shè)置;(padding可以設(shè)置)

          3、元素的寬度就是它包含的文字或圖片的寬度,不可改變。

          塊級元素

          什么是塊級元素?在html中<div>、<p>、<h1>、<form>、<ul> 和 <li>就是塊級元素。

          設(shè)置display:block就是將元素顯示為塊級元素。如下代碼就是將內(nèi)聯(lián)元素a轉(zhuǎn)換為塊狀元素,從而使a元素具有塊狀元素特點。

          a{display:block;}

          塊級元素特點:

          1、每個塊級元素都從新的一行開始,并且其后的元素也另起一行。(真霸道,一個塊級元素獨占一行)

          2、元素的高度、寬度、行高以及頂和底邊距都可設(shè)置。

          3、元素寬度在不設(shè)置的情況下,是它本身父容器的100%(和父元素的寬度一致),除非設(shè)定一個寬度。

          內(nèi)聯(lián)塊狀元素(行內(nèi)塊)

          內(nèi)聯(lián)塊狀元素(inline-block)就是同時具備內(nèi)聯(lián)元素、塊狀元素的特點,

          代碼display:inline-block就是將元素設(shè)置為內(nèi)聯(lián)塊狀元素。(css2.1新增),<img>、<input>標(biāo)簽就是這種內(nèi)聯(lián)塊狀標(biāo)簽。

          inline-block元素特點:

          1、和其他元素都在一行上;

          2、元素的高度、寬度、行高以及頂和底邊距都可設(shè)置。

          提示:下一小節(jié)是用視頻動畫來講解css中的盒模型。

          塊元素盡量采用div嵌套, 行內(nèi)元素盡量采用span嵌套

          顯示模式的轉(zhuǎn)換

          塊級、行內(nèi) 、行內(nèi)塊元素三者是可以相互轉(zhuǎn)換的。

          display 顯示 的意思

          block 塊

          inline 行內(nèi)


          塊級 → 行內(nèi)元素 display: inline;

          <style>
          div{
              width:100px;
              height:100px;
              background-color:#036;
              display:inline;
          }
          </style>

          行內(nèi)元素 → 塊級元素 display: block;

          <style>
          a{
              width:100px;
              height:100px;
              background-color:#960;
              display:block
          }
          </style>

          行內(nèi)和塊級 → 行內(nèi)塊 display:inline-block;

          span{
              width:100px;
              height:100px;
              background-color:#960;
              didplay:inline-block;
          }

          水平居中設(shè)置-行內(nèi)元素

          如果被設(shè)置元素為文本、圖片等行內(nèi)元素時,水平居中是通過給父元素設(shè)置text-align:center來實現(xiàn)的。如下代碼:

          html代碼:

          <body>
          <div class="txtCenter">我是文本,哈哈,我想要在父容器中水平居中顯示。</div>
          <div class="imgCenter"><img src="http://img.mukewang.com/52da54ed0001ecfa04120172.jpg" /></div>
          </body>

          css代碼:

          <style>
          div.txtCenter{
          text-align:center;
          }
          div.imgCenter{
          text-align:center;
          }
          </style>

          水平居中設(shè)置-定寬塊狀元素

          當(dāng)被設(shè)置元素為塊狀元素時用text-align:center就不起作用了,這時也分兩種情況:定寬塊狀元素和不定寬塊狀元素。

          滿足定寬和塊狀兩個條件的元素是可以通過設(shè)置"左右margin"值為"auto"來實現(xiàn)居中的。我們來看個例子就是設(shè)置div這個塊狀元素水平居中:

          第一種方法

          html代碼:

          <body>
          <div>我是定寬塊狀元素,哈哈,我要水平居中顯示。</div>
          </body>

          css代碼:

          <style>
          div{
          border:1px solid red;/*為了顯示居中效果明顯為 div 設(shè)置了邊框*/
          width:500px;/*定寬*/
          margin:20px auto;/* margin-left 與 margin-right 設(shè)置為 auto */
          }
          </style>

          也可以寫成:

          margin-left:auto;
          margin-right:auto;

          注意:元素的"上下margin"是可以隨意設(shè)置的。這種水平居中的方法兩個2個條件缺一不可

          第二種方法

          html代碼:

          <body>
          <div>我是定寬塊狀元素,哈哈,我要水平居中顯示。</div>
          </body>

          css代碼:

          <style>
          div{
          border:1px solid red;/*為了顯示居中效果明顯為 div 設(shè)置了邊框*/
          width:500px;/*定寬*/
          position:absoute;
          left:50px;
          margin-left:-25px;
          }
          </style>

          水平居中設(shè)置-不定寬塊狀元素

          在實際工作中我們會遇到需要為"不定寬度的塊狀元素"設(shè)置居中,比如網(wǎng)頁上的分頁導(dǎo)航,因為分頁的數(shù)量是不確定的,所以我們不能通過設(shè)置寬度來限制它的彈性。

          不定寬度的塊狀元素有三種方法居中(這三種方法目前使用的都比多):

          加入table標(biāo)簽

          設(shè)置display;inline方法

          設(shè)置position:relative和left:50%;

          (1)第一種方法:

          第一步:為需要設(shè)置的居中的元素外面加入一個table標(biāo)簽(包括<tbody>、<tr>、<td>)。

          第二步:為這個table設(shè)置"左右margin auto"(這個和定寬塊狀元素的方法一樣)。舉例如下:

          html代碼:

          <div>
          <table>
          <tbody>
          <tr><td>
          <ul>
          <li><a href="#">1</a></li>
          <li><a href="#">2</a></li>
          <li><a href="#">3</a></li>
          </ul>
          </td></tr>
          </tbody>
          </table>
          </div>

          css代碼:

          <style>
          table{
          margin:0 auto;
          }
          ul{list-style:none;margin:0;padding:0;}
          li{float:left;display:inline;margin-right:8px;}
          </style>

          (2)第二種方法:

          改變塊級元素的dispaly為inline類型,然后使用text-align:center來實現(xiàn)居中效果。如下例子:

          html代碼:

          <body>
          <div class="container">
          <ul>
          <li><a href="#">1</a></li>
          <li><a href="#">2</a></li>
          <li><a href="#">3</a></li>
          </ul>
          </div>
          </body>

          css代碼:

          <style>
          .container{
          text-align:center;
          }
          .container ul{
          list-style:none;
          margin:0;
          padding:0;
          display:inline;
          }
          .container li{
          margin-right:8px;
          display:inline;
          }
          </style>

          這種方法相比第一種方法的優(yōu)勢是不用增加無語義標(biāo)簽,簡化了標(biāo)簽的嵌套深度,

          但也存在著一些問題:它將塊狀元素的display類型改為inline,變成了行內(nèi)元素,所以少了一些功能,比如設(shè)定長度值。

          (2)第三種方法:

          通過給父元素設(shè)置float,然后給父元素設(shè)置position:relative和left:50%,子元素設(shè)置position:relative和left:-50%來實現(xiàn)水平居中

          代碼如下:

          <body>
          <div class="container">
          <ul>
          <li><a href="#">1</a></li>
          <li><a href="#">2</a></li>
          <li><a href="#">3</a></li>
          </ul>
          </div>
          </body>

          css代碼:

          <style>
          .container{
          float:left;
          position:relative;
          left:50%
          }
          .container ul{
          list-style:none;
          margin:0;
          padding:0;
          position:relative;
          left:-50%;
          }
          .container li{float:left;display:inline;margin-right:8px;}
          </style>

          這種方法可以保留塊狀元素仍以display:block的形式顯示,優(yōu)點不添加無語議表標(biāo)簽,不增加嵌套深度,

          但它的缺點是設(shè)置了position:relative,帶來了一定的副作用。

          這三種方法使用得都非常廣泛,各有優(yōu)缺點,具體選用哪種方法,可以視具體情況而定。

          隱性改變display類型

          有一個有趣的現(xiàn)象就是當(dāng)為元素(不論之前是什么類型元素,display:none除外)設(shè)置以下2個句之一:

          position:absolute

          float:left或float:right

          元素會自動變?yōu)橐詃isplay:inline-block的方式顯示,當(dāng)然就可以設(shè)置元素的width和height了且默認(rèn)寬度不占滿父元素。

          如下面的代碼,小伙伴們都知道a標(biāo)簽是行內(nèi)元素,所以設(shè)置它的width是沒有效果的,但是設(shè)置為position:absolute以后,就可以了。

          <div class="container">
          <a href="#" title="">進入課程請單擊這里</a>
          </div>

          css代碼

          <style>
          .container a{
          position:absolute;
          width:200px;
          background:#ccc;
          }
          </style>

          如何讓一段文字水平居中且垂直居中

          <div>水平垂直居中</div>
          div{
          width:200px;height:200px; /*設(shè)置div的大小*/
          border:1px solid green; /*邊框*/
          text-align: center; /*文字水平居中對齊*/
          line-height: 200px; /*設(shè)置文字行距等于div的高度*/
          overflow:hidden;
          }

          text-align 和margin auto 區(qū)別

          text-align 可以讓塊級元素里面的文字內(nèi)容居中對齊.

          文字內(nèi)容 == (圖片 input 行內(nèi)元素 行內(nèi)塊元素)

          但是對于里面的塊級元素?zé)o效

          讓一個塊級元素居中對齊 : margin:0 auto;

          【實例】

          <!DOCTYPE html>
          <html lang="en">
          <head>
          <meta charset="UTF-8" />
          <title>趙麗穎的圖片</title>
          <style type="text/css">
          body{
          text-align:center; /* 所有的元素居中 */
          }
          div{ /*塊元素的居中方法*/
          width:600px;
          margin:30px auto;
          }
          .img1{ /*行內(nèi)塊元素的居中方法 */
          display:block;
          width:600px;
          margin:30px auto;
          }
          .img2{ /*行內(nèi)塊元素的居中方法 */
          position:relative;
          left:50%;
          margin-left:-300px;
          }
          .form1 input{
          width:200px; /*塊容器包裹下的行內(nèi)塊元素居中方法*/
          margin:10px auto;
          }
          .img3{ /*塊容器包裹下的行內(nèi)塊元素居中方法*/
          text-align:center;
          }
          </style>
          </head>
          <body>
          <div><img src="../../photo/趙麗穎.jpeg" /></div>
          <img class="img1" src="../../photo/趙麗穎.jpeg" />
          <img class="img2" src="../../photo/趙麗穎.jpeg" />
          <div class="form1">
          <form action="" method="get" accept-charset="utf-8">
          <label>電子郵箱: <input type="text" name="email" value="" placeholder="請輸入電子郵箱"/></label><br/>
          <label>密碼: <input type="password" name="password"/></label><br/>
          <label for="address">地址</label>
          <input type="text" name="address" id="address" placeholder="請輸入地址" />
          </form>
          </div>
          
          <div class="img3">
          <img src="../../photo/趙麗穎.jpeg" />
          </div>
          
          </body>
          </html>

          CSS布局水平居中實戰(zhàn)

          方法一:margin + width

          <!Doctype html>
          <html>
          <head>
          <meta http-equiv="Content-Type" content="text/html; charset=GBK" />
          <title>css布局水平居中margin + width</title>
          <style type="text/css">
          * {
          margin: 0;
          padding: 0;
          }
          .box {
          width: 100px;
          margin: 0 auto;
          background: red;
          }
          </style>
          </head>
          <body>
          <div class="box">Demo</div>
          </body>
          </html>

          說明:這個水平居中方法, 我們最熟悉了, 也是最常用的, width可以固定px也可以使用百分比

          方法二:table + margin

          <!Doctype html>
          <html>
          <head>
          <meta http-equiv="Content-Type" content="text/html; charset=GBK" />
          <title>css布局水平居中table + margin</title>
          <style type="text/css">
          * {
          margin: 0;
          padding: 0;
          }
          .box {
          display: table;
          margin: 0 auto;
          background: red;
          }
          </style>
          </head>
          <body>
          <div class="box">Demo</div>
          </body>
          </html>

          說明:display: table在表現(xiàn)上類似block元素,但是寬度為內(nèi)容寬。無需設(shè)置父元素樣式 (支持 IE 8 及其以上版本) 兼容 IE 8 一下版本需要調(diào)整為<table>

          方法三:inline-block + text-align

          <!Doctype html>
          <html>
          <head>
          <meta http-equiv="Content-Type" content="text/html; charset=GBK" />
          <title>css布局水平居中inline-block + text-align</title>
          <style type="text/css">
          * {
          margin: 0;
          padding: 0;
          }
          .content {
          text-align: center;
          }
          .box {
          display: inline-block;
          background: red;
          }
          </style>
          </head>
          <body>
          <div class="content">
          <div class="box">Demo</div>
          </div>
          </body>
          </html>

          說明:兼容性佳(甚至可以兼容 IE 6 和 IE 7)

          方法四:absolute + margin-left

          <!Doctype html>
          <html>
          <head>
          <meta http-equiv="Content-Type" content="text/html; charset=GBK" />
          <title>css布局水平居中absolute + margin-left</title>
          <style type="text/css">
          * {
          margin: 0;
          padding: 0;
          }
          .content {
          position: relative;
          }
          .box {
          position: absolute;
          left: 50%;
          width: 100px;
          margin-left: -50px;
          background: red;
          }
          </style>
          </head>
          <body>
          <div class="content">
          <div class="box">Demo</div>
          </div>
          </body>
          </html>

          說明:寬度固定相比于使用transform, 有兼容性更好

          方法五:absolute + transform

          <!Doctype html>
          <html>
          <head>
          <meta http-equiv="Content-Type" content="text/html; charset=GBK" />
          <title>css布局水平居中absolute + transform</title>
          <style type="text/css">
          * {
          margin: 0;
          padding: 0;
          }
          .content {
          position: relative;
          }
          .box {
          position: absolute;
          left: 50%;
          transform: translateX(-50%);
          background: red;
          }
          </style>
          </head>
          <body>
          <div class="content">
          <div class="box">Demo</div>
          </div>
          </body>
          </html>

          說明:絕對定位脫離文檔流, 不會對后續(xù)元素的布局造成影響。transform為 CSS3 屬性, 有兼容性問題

          方法六:flex + justify-content


          主站蜘蛛池模板: 视频在线一区二区| 午夜在线视频一区二区三区| 亚洲成AV人片一区二区密柚| 色狠狠一区二区三区香蕉| 国产一区二区草草影院| 国产一区二区三区91| 一区二区免费电影| 国产内射在线激情一区| 色噜噜狠狠一区二区| 丰满岳乱妇一区二区三区| 韩国理伦片一区二区三区在线播放| 亚洲一区二区三区国产精品| 精品一区二区ww| 国产日韩精品视频一区二区三区| 亚洲日韩精品一区二区三区无码| 日本精品一区二区三区在线视频| 无码精品不卡一区二区三区| 精品少妇ay一区二区三区 | 国产精品日韩一区二区三区| 日本视频一区在线观看免费 | 国产乱码伦精品一区二区三区麻豆| 国内精品视频一区二区八戒| 中文字幕乱码一区久久麻豆樱花 | 少妇一晚三次一区二区三区| 亚洲av成人一区二区三区| 亚洲综合一区二区精品导航| 精品国产日产一区二区三区| 国模无码一区二区三区不卡| 99久久精品费精品国产一区二区| 一区二区和激情视频| 国产一区二区三区小说| 夜夜精品视频一区二区| 精品国产日韩一区三区| 鲁大师成人一区二区三区| 亚洲欧洲一区二区三区| 激情一区二区三区| 99精品一区二区三区| 久久精品国内一区二区三区| 美女免费视频一区二区三区| AV怡红院一区二区三区| 无码人妻精品一区二区三区久久 |