vertical-align

目錄

vertical-align
一、vertical-align基本:
二、vertical使用環(huán)境:
三、vertical-align ,line-height,幽靈空白點(diǎn) 導(dǎo)致神秘高度的問(wèn)題:
1. 解釋莫名高度出現(xiàn)的原因
2、調(diào)整div框框比圖片 大的問(wèn)題:
3、內(nèi)聯(lián)導(dǎo)致margin-top:-1000px失效的問(wèn)題
四、vertical-align的線性屬性
1、inline-block和baselineicon 簡(jiǎn)化開(kāi)發(fā)
2、top/bottom
3、middle近似居中
五、文本屬性/上下標(biāo)text-top:盒子頂部和父級(jí)內(nèi)容區(qū)域的頂部對(duì)齊上下標(biāo)類(lèi)屬性值
六 、彈出框

vertical-aligncss中最難的一部分,需要和內(nèi)聯(lián)盒子模型,不同屬性 以及不同屬性在table-cell inline-block共同左右下才有的效果,最后的表現(xiàn)形式和x line-height font-size font-family ' 幽靈空白點(diǎn)'都有密不可分的關(guān)系

一、vertical-align基本:

當(dāng)我們?cè)O(shè)置了line-heightfont-size的時(shí)候,往往發(fā)現(xiàn)元素比我們的line-height高,為什么了?這個(gè)就是由vertical-align導(dǎo)致的;

vertical-align的值有以下幾種:

  • 線類(lèi):baseline top middle bottom
  • 文本類(lèi): text-top text-bottom
  • 上下標(biāo)類(lèi):sub, super
  • 數(shù)值百分比類(lèi):20px 2em 20%

上邊三種我們常見(jiàn),但是數(shù)值和百分比功能強(qiáng)大,他兼容性比較好,然后不同的字體base-line能達(dá)到的效果并不一致,所以用數(shù)值比較直接一點(diǎn),也能夠自由的調(diào)整、精確控制,當(dāng)vertical-align:0的時(shí)候表示的是baseline 然后在這個(gè)基礎(chǔ)上上移一個(gè)像素或者是下移一個(gè)像素。

  • 百分比是相對(duì)于line-height
  • 但是我們還是建議直接用px,因?yàn)楫?dāng)我們具體寫(xiě)的時(shí)候,行高一般都已經(jīng)確定了,很少會(huì)改變行高的,所以這個(gè)高度百分比意義不大,還需要計(jì)算,不如直接用vertical-align:1px;這種語(yǔ)法

二、vertical使用環(huán)境:

只能作用在display的計(jì)算值為inline、inline-block、inline-tabletable-cel

并不是我們?cè)O(shè)置了display或者是默認(rèn)的行內(nèi)元素就沒(méi)問(wèn)題了,狠毒css屬性會(huì)在背后默默的改變display的屬性,像float,position:absolute

當(dāng)display:table-cell的時(shí)候,vertical-align這個(gè)語(yǔ)句是需要作用在自己身上,才能讓兒子居中的,其他的都是作用在兒子身上的

其他vertical-align不起作用的情況:

1、父元素的行高不夠

<style>
        .point03 .box1 {
            height: 128px;
            background: gray;
        }
        .point03 .content1 {
            vertical-align: middle;
            height: 50px
        }
    </style>
    <div class="point03 box">
        <div class="box1">
              <img src="./img/test.png" alt="" class="content1">
        </div>
    </div>



image-[圖片上傳中...(image-20180513095533920.png-94192b-1526198485931-0)] .png

效果如圖,并沒(méi)有垂直居中,那是因?yàn)橛撵`空白節(jié)點(diǎn)不夠大,加一行代碼就好了

 .point03 .box1 {
            height: 128px;
            background: gray;
        }

2、作用在table-cell的字節(jié)點(diǎn)上的效果

<style>
        .point03 .box1 {
            height: 128px;
            background: gray;
            display: table-cell
        }
        .point03 .content1 {
            vertical-align: middle;
            height: 50px
        }
        .point03 .box2 {
            height: 128px;
            background: #ccc;
            display: table-cell;
            vertical-align: middle;
        }
        .point03 .content2 {
            height: 50px
        }
    </style>
    <div class="point03 box">
        <div class="box1">
            box01
              <img src="./img/test.png" alt="" class="content1">
        </div>

        <div class="box2">
            box02
            <img src="./img/test.png" alt="" class="content2">
        </div>
       
    
    </div>

如下圖可見(jiàn),verticalalign作用在img上的時(shí)候并沒(méi)有居中,只有在display:table-cell的元素上的時(shí)候才能夠居中

image-.

雖然就效果而言,table-cell元素設(shè)置了vertical-align垂直對(duì)齊的是子元素,但是他作用的并不是子元素而是table-cell元素自己,就算table-cell元素的子元素是一個(gè)塊級(jí)元素的,也一樣可以讓其有個(gè)字垂直對(duì)齊的表現(xiàn)

三、vertical-align ,line-height,幽靈空白點(diǎn) 導(dǎo)致神秘高度的問(wèn)題:

1. 解釋莫名高度出現(xiàn)的原因

<style>
    .point04 .box1 {
        line-height: 64px;
        font-size: 20px;
    }

    .point04 .content1 {
        font-size: 32px;
    }
</style>
<div class="point04 box">
    <div class="box1">
        x
        <span  class="content1"> 文本x</span>
    </div>
</div>


image-20180513101050169.png

解釋:如上,我們?cè)O(shè)置了line-height:64px得到的高度卻是68這四個(gè)像素來(lái)自于哪里呢?來(lái)自于文本前邊的幽靈空白節(jié)點(diǎn),這里我們用span前邊的x表示空白節(jié)點(diǎn),因?yàn)? span前邊的空白節(jié)點(diǎn)的font-size是繼承的(這里我寫(xiě)在box下模擬繼承)font-size不一樣導(dǎo)致了基線位置不一樣,font-size越大,基線越靠下,文本的基線就比前邊的x的基線靠下,這樣差開(kāi)的基線使兩個(gè)字不在同一水平上,導(dǎo)致高度比line-height要高

解決方法:兩種方式

  1. 改變對(duì)齊方式,.point04 .content1 { font-size: 32px; vertical-align:top;}上對(duì)齊就好了
  2. 讓幽靈空白點(diǎn)的字體大小和span里額一樣大,也就是.point04 .box1 { line-height: 64px; font-size: 32px; }

2、調(diào)整div框框比圖片 大的問(wèn)題:

<style>
    .point04{margin: 100px;}
    .point04 .box1 {
       width: 300px;
       text-align: center;
        border: 1px solid #ccc;
    }

    .point04 .content1 {
        height: 70px;
    }
</style>
<div class="point04 box">
    <div class="box1">
        x
        <img src="./img/test02.jpeg" class="content1"/> 
    </div>
</div>


image-20180513102808480.png

解釋 如圖,高度77px 因?yàn)榍斑厁所代表的幽靈空白點(diǎn)導(dǎo)致,所以會(huì)大于圖片的70px的高度,其實(shí)這個(gè)效果的出現(xiàn)是line-height vertical-alien 幽靈空白點(diǎn)共同作用產(chǎn)生的,

解決方法: 四種方式:

  1. 圖片塊狀,這樣同時(shí)干掉了line-height vertical-align 還有幽靈空白點(diǎn)
  2. line-height足夠小,半間距小到x的下邊緣位置靠上就好了,這樣就沒(méi)有下邊的半間距撐開(kāi)了。讓line-height:0
  3. Font-size足夠小 ,同時(shí)line-height:150%/1.5之類(lèi)的。
  4. 圖片設(shè)置其他的vertical-align的屬性值,top,middle,bottom都可以

3、內(nèi)聯(lián)導(dǎo)致margin-top:-1000px失效的問(wèn)題

<style>
    
    .point04 .box1 {
        border: 1px solid #ccc;
    }

    .point04 .content1 {
        margin-top:-1000px;
        height: 70px;
    }
</style>
<div class="point04 box">
    <div class="box1">
        x
        <img src="./img/test02.jpeg" class="content1"/> 
    </div>
</div>
image-20180513104321052.png

如圖,本來(lái)設(shè)置了margin-top:-1000px;我們期望的是吳彥祖能夠飛掉,消失在框框中,但是,圖中我們看到,并沒(méi),原理和上邊講的高度變高是一樣的,css世界中,非主動(dòng)觸發(fā)位移的內(nèi)聯(lián)元素是不可能跑到計(jì)算容器外邊的

  1. 幽靈空白點(diǎn)無(wú)法主動(dòng)設(shè)置到inline的外邊
  2. 幽靈空白點(diǎn)的下邊和圖片是需要對(duì)齊的

所以圖片無(wú)法跑到box的外邊了

四、vertical-align的線性屬性

1、inline-block和baseline

一開(kāi)始我們知道線性屬性有:baseline top middle bottom

Inline 的vertical-align的baseline就是x的下邊緣

如果是inline-block元素,里邊沒(méi)有內(nèi)聯(lián)元素,或者overflow不是visible,baseline就是margin的底邊緣

否則就是元素里左后銀行內(nèi)聯(lián)元素的基線

<style>
    .point05 {
        margin: 100px;
    }

    .point05 .box1 {
       display: inline-block;
       width: 150px;height: 150px;
       border: 1px solid #cad5ec;
       background: #f0f3f9;
    }

   
</style>
<div class="point05 box">
    <span class="box1">
       
    </span>
    <span class="box1">x-baseline</span>
</div>

image-20180513124328048.png

效果如圖,沒(méi)有文字的時(shí)候,基線就是容器的下邊緣,也就是下邊框下邊的文字。如果里邊有文字的時(shí)候也就有了行內(nèi)元素,第二個(gè)框就是這些字符的基線,我們看到第一個(gè)框的下邊緣和第二個(gè)框的x的下邊緣對(duì)齊了。

如果line-height:0

image-20180513124328048.png

line-height為0 字符占據(jù)的高度也是另,高度的起始位置就成了中心位置,這樣文字就有一半到了外邊

icon 簡(jiǎn)化開(kāi)發(fā)

<style>
    .point05.box1 {
      line-height: 20px;
    }
    .point05 .icon{
        display: inline-block;
        width: 20px;height: 20px;
        white-space: nowrap;/*不換行*/
        letter-spacing: -1em;/*所有的里邊的子都在一塊兒顯示*/
        text-indent: -99em;/*首行縮進(jìn)的看不見(jiàn)了*/
    }
    .icon::before{content: "\3000"}


    .icon_delete{
        background: url(./img/delete@2x.png) no-repeat center;
    }

   
</style>
<div class="point05 box1">
    <span class="icon icon_delete">刪除</span>delete
</div>
image-20180513130948836.png

注意:

  • 圖的高度和當(dāng)前的行高都是20px;(不是由圖片說(shuō)了算,而是css決定了多么高)
  • 圖標(biāo)標(biāo)簽里永遠(yuǎn)有字符:(before的作用就是如此)
  • 圖標(biāo)不適用overflow:hidden是為了保證里邊的字符基線,同時(shí)還要讓里邊的字符不可見(jiàn)
  • box外邊的容器需要時(shí)inline-block,然后就是找基線的問(wèn)題了

如下,不同的字體大小都沒(méi)有問(wèn)題

<Style>
 .point05 .larger {
            font-size: 20px;
        }
</Style>
  <div class="point05 box1">
        <h4> 標(biāo)簽內(nèi)沒(méi)有文字
        </h4>
        <p class="">
            x
            <span class="icon icon_delete"> </span> x刪除
        </p>
        <h4>標(biāo)簽有文字</h4>
        <p class="">
            <span class="icon icon_delete "> 刪除 </span> x刪除
        </p>
        <h4>large</h4>
        <p class="larger">
            <i class="icon icon_delete "> 刪除 </i> x刪除</p>
        <p>
            <i class="icon icon_delete "> </i> x刪除
        </p>

    </div>
image-20180513150029646.png

2、top/bottom

top垂直上邊對(duì)齊

  • 內(nèi)聯(lián)元素,元素底部和當(dāng)前行框盒子的頂部對(duì)齊
  • Table-cell 元素底padding邊緣和表哥行的頂部對(duì)齊

如果是內(nèi)聯(lián)元素,則和這一行位置最高的內(nèi)聯(lián)元素頂部對(duì)齊

如果是table-cell 腦補(bǔ)成tdtr的上邊緣對(duì)齊

這里的邊緣指的是行框盒子,而不是塊狀容器的上下邊緣

3、middle近似居中

  • 內(nèi)聯(lián)元素,元素垂直中心點(diǎn)和行框盒子基線往上1/2 x-height處對(duì)齊
  • Table-cell 單元格填充盒子相對(duì)于外面的表格行居中

關(guān)鍵是第一點(diǎn),盒子的基線就是x的下邊緣,x-height就是x的高度,所以middle的點(diǎn)就是x的交叉點(diǎn),但是一般來(lái)說(shuō),x的交叉點(diǎn)因字體的原因會(huì)略微靠下,一般來(lái)說(shuō)也就是一兩個(gè)像素的問(wèn)題,font-size越大越明顯

解決:如果要實(shí)現(xiàn)真正意義上的垂直居中,通常是font-size:0將x變成一個(gè)看不見(jiàn)的點(diǎn),這樣就可以實(shí)際上的居中了

五、文本屬性/上下標(biāo)

text-top:盒子頂部和父級(jí)內(nèi)容區(qū)域的頂部對(duì)齊

內(nèi)容區(qū)域:可以看成是firefox /ie瀏覽器文本選中當(dāng)前元素font-sizefont-family下應(yīng)由區(qū)域的大小

實(shí)用性不強(qiáng),因?yàn)椋?/p>

  • 場(chǎng)景比較缺乏,當(dāng)前css以精致布局為主流,對(duì)齊文本場(chǎng)景比舊時(shí)代少很多
  • 文本類(lèi)垂直對(duì)齊理解成本高,不如直接用vertical-align或者是relative等
  • 內(nèi)容區(qū)域不直觀,容易改變

上下標(biāo)類(lèi)屬性值

subsuper兩個(gè) ,b的圈在小編,表示下標(biāo),p在上邊,標(biāo)上上標(biāo)

vertical-align:super:提高盒子的基線到父級(jí)合適的上標(biāo)基線位置

。。。合適的位置,這個(gè)語(yǔ)義這么不明確,怎么玩。。。

注意的是,vertical-align不會(huì)改變font-size的大小,但是可以實(shí)用<sup></sup>這一類(lèi)的標(biāo)簽

六 、彈出框

 <style>
        .point06.container{
            position: fixed;
            top: 0;right: 0;bottom: 0;left: 0px;
            background: rgba(0,0,0,.5);
            text-align: center;
            font-size:0;
            white-space: nowrap;
            overflow: auto;
        }
        .point06.container::after{
            content: "";
            display: inline-block;
            height: 100%;
            vertical-align: middle;
        }
        .dialog{
            display: inline-block;
            vertical-align: middle;
            background: white;
            text-align: left;
            font-size: 14px;
            white-space: nowrap;
        }
        .content {
            width: 240px;
            height: 120px;
            padding: 20px;
        }

    </style>
    <div class="point06 container">
        <div class="dialog">
            <div class="content">test</div>
        </div>
    </div>
image-20180513155305937.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 參考文章:深入了解CSS的line-height屬性Vertical-Align: 你需要知道的所有事【譯】Ver...
    若邪Y閱讀 3,561評(píng)論 1 6
  • 一早被現(xiàn)實(shí)攪擾,大城市小城市,終于還是到了選擇這個(gè)生存問(wèn)題的時(shí)刻嗎?刷微博看到的每一張嘻笑臉孔,每一條精心編織的段...
    一天到晚吟唱的魚(yú)閱讀 173評(píng)論 0 0
  • (看圖作詩(shī))。 秋風(fēng)瑟瑟云低沉,涼風(fēng)撩起無(wú)盡愁。 佇立江邊凝遙望,白鷺飛過(guò)無(wú)佳音。 山水相映輕舟過(guò),一片鄉(xiāng)愁千縷思...
    情愛(ài)千秋閱讀 502評(píng)論 8 17
  • 生活其實(shí)很簡(jiǎn)單 每天睜開(kāi)眼就是全新的開(kāi)始 走過(guò)的地方,看到的美麗的不知名的花兒 滿(mǎn)心歡喜的把他們收入相機(jī),收入眼底...
    文若男閱讀 517評(píng)論 7 11

友情鏈接更多精彩內(nèi)容