很多人css數(shù)值(百分比|負(fù)值)基準(zhǔn)分不清翠肘,今天給你講講

今天為什么要給大家講解這個(gè)東西呢,因?yàn)閏ss這部分辫秧,尤其是數(shù)值這部分感覺非常簡(jiǎn)單束倍,但是尤其是簡(jiǎn)單的,卻很多人根本就沒有弄懂。所以今天就來講一下css的數(shù)值問題吧绪妹。大家還是好好聽一下吧甥桂。

width height 百分比

當(dāng)元素的height、width設(shè)置為百分比時(shí)邮旷,分別基于包含它的塊級(jí)對(duì)象的高度黄选、寬度。這個(gè)是常規(guī)百分比的含義婶肩。

<div class="container">
  <div class="inner">注意這里</div>
  <div class="divider">我是分割線</div>
</div>

.container{
  width: 500px;
  height: 300px;
  border: 1px solid grey;
}

.inner{
  background: lightblue;
  text-align: center;
  width: 50%;
  height: 50%;
}
.divider{
  border-top: 1px solid lightblue;
  text-align: center;
}

margin 百分比

假設(shè)一個(gè)塊級(jí)容器办陷,寬 500px,高 300px律歼,塊級(jí)子元素定義 margin:10% 5%;民镜,你覺得 margin 的 top, right, bottom, left 計(jì)算值最終是多少?

我們來實(shí)際看一下

<div class="container">
  <div class="inner">注意這里</div>
  <div class="divider">我是分割線</div>
</div>

.container{
  width: 500px;
  height: 300px;
  border: 1px solid grey;
}

.inner{
  margin: 10% 10%;
  background: lightblue;
  text -align: center;
}
.divider{
  border-top: 1px solid lightblue;
  text-align: center;
}

結(jié)果出來了险毁,50px 50px 50px 50px制圈,并不是50px 30px 50px 30px

為什么

CSS權(quán)威指南中的解釋:

我們認(rèn)為,正常流中的大多數(shù)元素都會(huì)足夠高以包含其后代元素(包括外邊距)畔况,如果一個(gè)元素的上下外邊距是父元素的height的百分?jǐn)?shù)鲸鹦,就可能導(dǎo)致一個(gè)無限循環(huán),父元素的height會(huì)增加跷跪,以適應(yīng)后代元素上下外邊距的增加亥鬓,而相應(yīng)的,上下外邊距因?yàn)楦冈豩eight的增加也會(huì)增加域庇。

margin 的百分比值參照其包含塊的寬度進(jìn)行計(jì)算。

當(dāng)書寫模式變成縱向的時(shí)候覆积,其參照將會(huì)變成包含塊的高度听皿。我們改變一下上面例子中的 CSS 書寫模式:

.container{
  width: 500px;
  height: 300px;
  border: 1px solid grey;
  writing-mode: vertical-lr;
}

這時(shí)的結(jié)果為:30px 30px 30px 30px

也就是說書寫模式影響 margin 百分比的參照對(duì)象

padding 百分比

同上 ?

舉個(gè)例子看看效果宽档。注意尉姨,這是縱向排列的例子。

注意這里

我是分割線

同上一個(gè)例子相比吗冤, 左側(cè)元素占位區(qū)域并沒有擴(kuò)大又厉,僅僅是由于margin 改為padding 導(dǎo)致背景區(qū)域擴(kuò)大而已。

因此椎瘟,padding的百分比不是相對(duì)于自身覆致,而是當(dāng)書寫模式為默認(rèn)橫向排列時(shí),相對(duì)最近父元素的寬度肺蔚,書寫模式為writing-mode: vertical-lr; 縱向排列時(shí)煌妈,百分比相對(duì)于父元素高度

width、padding 聯(lián)合百分比

單用一個(gè)很簡(jiǎn)單,但如果聯(lián)合璧诵,可能就會(huì)有問題了汰蜘。這里我不禁要問一句:

兄弟,你聽過盒模型么之宿?

  • W3C的標(biāo)準(zhǔn)盒模型 box-sizing: content-box族操,默認(rèn)屬性 設(shè)置的width或height是對(duì) 實(shí)際內(nèi)容(content)的width或height進(jìn)行設(shè)置,內(nèi)容周圍的border和padding另外設(shè)置
  • 怪異盒模型 box-sizing: border-box 設(shè)置的width或height是對(duì) 實(shí)際內(nèi)容(content)+內(nèi)邊距(padding)+邊框(border)之和

現(xiàn)在比被,我們來看個(gè)栗子色难,其中內(nèi)部元素width設(shè)為100%padding設(shè)為10%

<div class="container">
  <div class="inner"><div class="text">注意這里</div></div>
  <div class="divider">我是分割線</div>
</div>

.container{
  width: 500px;
  height: 300px;
  border: 1px solid grey;
}
.inner{
  background: lightblue;
  text-align: center;
  width: 100%;
  padding: 10% 10%;
  box-sizing: content-box; // 補(bǔ)上這里是因?yàn)橛行┉h(huán)境默認(rèn)不是標(biāo)準(zhǔn)盒模型
}
.divider{
  border-top: 1px solid lightblue;
  text-align: center;
}
.text{
  background: yellow;
}

在標(biāo)準(zhǔn)盒模型下姐赡,width: 100%; padding: 10% 10%; 會(huì)導(dǎo)致內(nèi)部元素溢出莱预,如果遇到這種情況,一般都會(huì)使用怪異盒模型项滑,即設(shè)置box-sizing: border-box依沮,這時(shí)候width的值是會(huì)包含padding的距離的。你可以自己打開控制臺(tái)試試枪狂,這里就不舉例了危喉。

top、left州疾、right辜限、bottom 百分比

還是看圖說話

<div class="container">
  <div class="inner"></div>
</div>

.container{
  width: 500px;
  height: 300px;
  border: 1px solid grey;
  position: relative;
}

.inner{
  width: 200px;
  height: 100px;
  background: lightblue;
  top:10%;
  left: 10%;
  position: absolute;
}

可以很明顯的看出,left相對(duì)于父元素寬度严蓖,top相對(duì)于父元素高度薄嫡。同理可推出right相對(duì)于父元素寬度,bottom相對(duì)于父元素高度颗胡。

translate百分比

在translate 函數(shù)當(dāng)中使用百分比是以該元素自身的寬高作為基準(zhǔn)毫深。

當(dāng)子元素的width和height未知時(shí),無法通過設(shè)置margin-left:-width/2和margin-top:-height/2來實(shí)現(xiàn)毒姨,這時(shí)候可以設(shè)置子元素的transform: translate(-50%,-50%)哑蔫。

<div class="container">
  <div class="inner"></div>
</div>
復(fù)制代碼
.container{
  width: 500px;
  height: 300px;
  border: 1px solid grey;
  position: relative;
}

.inner{
  width: 50%;
  height: 50%;
  background: lightblue;
  position: absolute;
  left: 50%;
  top: 50%;
  transform: translate(-50%,-50%);
}

translate 屬性和絕對(duì)定位、相對(duì)定位屬性加上 top弧呐、left 數(shù)值都可以使元素產(chǎn)生位移闸迷,但存在細(xì)微差別,表現(xiàn)在offsetLeft 和 offsetTop 屬性俘枫。

使用絕對(duì)定位腥沽、相對(duì)定位屬性加上 top、left 崩哩,會(huì)影響offsetTop和 offsetLeft 的值巡球;

使用 translate 的offsetTop和 offsetLeft 與沒有產(chǎn)生位移的元素沒有區(qū)別言沐,即無論translate 的值為多少,offsetTop和 offsetLeft 的值都是固定不變的酣栈。

margin為負(fù)值

  1. margin-left,margin-right為負(fù)值
  • 元素本身沒有寬度险胰,會(huì)增加元素寬度
<div class="container">
  <div class="inner">里層的元素設(shè)置了margin-right:-100px</div>
</div>
.container{
  width: 500px;
  height: 200px;
  border: 1px solid grey;
  margin-left: 100px;
}

.inner{
  height: 100px;
  background: lightblue;
  margin-left: -100px;
}

里層的元素設(shè)置了margin-left:-100px

  • 元素本身有寬度,會(huì)產(chǎn)生位移 補(bǔ)充inner元素寬度屬性
.inner{
  height: 100px;
  background: lightblue;
  margin-left: -100px;
  width: 100%;
}

里層的元素設(shè)置了margin-left:-100px

  1. margin-top為負(fù)值矿筝,不管是否設(shè)置高度起便,都不會(huì)增加高度,而是會(huì)產(chǎn)生向上的位移
.inner{
  height: 100px;
  background: lightblue;
  margin-left: -100px;
  width: 100%;
}

里層的元素設(shè)置了margin-top:-100px

  1. margin-bottom為負(fù)值的時(shí)候不會(huì)位移,而是會(huì)減少自身供css讀取的高度.
<div class="container">
  <div class="inner">里層的元素設(shè)置了margin-bottom:-100px</div>
  <div>這里是下一個(gè)元素</div>
</div>

.inner{
  height: 150px; // 此處height變?yōu)?50px
  background: lightblue;
  margin-bottom: -100px;
  width: 100%;
}

里層的元素設(shè)置了margin-bottom:-100px

這里是下一個(gè)元素

那么窖维,你覺得負(fù)值改為負(fù)百分比又是什么情況呢榆综?歡迎留言

padding 為負(fù)值

很遺憾,padding不允許指定為負(fù)铸史,指定了也無效~

更多優(yōu)質(zhì)文章請(qǐng)關(guān)注我的知乎:打造小白進(jìn)階web前端高級(jí)工程師資料庫鼻疮,看完學(xué)的更加快,知識(shí)更牢固琳轿。你值得擁有(持續(xù)更新)~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末判沟,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子崭篡,更是在濱河造成了極大的恐慌挪哄,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,539評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件琉闪,死亡現(xiàn)場(chǎng)離奇詭異迹炼,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)颠毙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門斯入,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蛀蜜,你說我怎么就攤上這事咱扣。” “怎么了涵防?”我有些...
    開封第一講書人閱讀 165,871評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長沪铭。 經(jīng)常有香客問我壮池,道長,這世上最難降的妖魔是什么杀怠? 我笑而不...
    開封第一講書人閱讀 58,963評(píng)論 1 295
  • 正文 為了忘掉前任椰憋,我火速辦了婚禮,結(jié)果婚禮上赔退,老公的妹妹穿的比我還像新娘橙依。我一直安慰自己证舟,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,984評(píng)論 6 393
  • 文/花漫 我一把揭開白布窗骑。 她就那樣靜靜地躺著女责,像睡著了一般。 火紅的嫁衣襯著肌膚如雪创译。 梳的紋絲不亂的頭發(fā)上抵知,一...
    開封第一講書人閱讀 51,763評(píng)論 1 307
  • 那天,我揣著相機(jī)與錄音软族,去河邊找鬼刷喜。 笑死,一個(gè)胖子當(dāng)著我的面吹牛立砸,可吹牛的內(nèi)容都是我干的掖疮。 我是一名探鬼主播,決...
    沈念sama閱讀 40,468評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼颗祝,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼浊闪!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起吐葵,我...
    開封第一講書人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤规揪,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后温峭,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體猛铅,經(jīng)...
    沈念sama閱讀 45,850評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,002評(píng)論 3 338
  • 正文 我和宋清朗相戀三年凤藏,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了奸忽。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,144評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡揖庄,死狀恐怖栗菜,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蹄梢,我是刑警寧澤疙筹,帶...
    沈念sama閱讀 35,823評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站禁炒,受9級(jí)特大地震影響而咆,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜幕袱,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,483評(píng)論 3 331
  • 文/蒙蒙 一暴备、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧们豌,春花似錦涯捻、人聲如沸浅妆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽凌外。三九已至,卻和暖如春混弥,著一層夾襖步出監(jiān)牢的瞬間趴乡,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評(píng)論 1 272
  • 我被黑心中介騙來泰國打工蝗拿, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留晾捏,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,415評(píng)論 3 373
  • 正文 我出身青樓哀托,卻偏偏與公主長得像惦辛,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子仓手,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,092評(píng)論 2 355