關(guān)于CSS一些細(xì)節(jié)問(wèn)題

2018-06-19 18:44 更新
      本文是2016年的最后一篇文章,主要是將一些CSS細(xì)節(jié)問(wèn)題整理一下。

  • background-position取值為百分比的計(jì)算方式
  • margin相鄰折疊問(wèn)題
  • positionabsoluterelative定位top、left、right、bottom問(wèn)題
  • 覆蓋樣式問(wèn)題

1、background-position取值為百分比的計(jì)算方式

background-position屬性相信你用的不少,可是當(dāng)取值為百分比時(shí),你是否認(rèn)為它是相對(duì)于背景圖片的尺寸來(lái)計(jì)算(我之前也是這種想法,但看了大漠老師的《你真的了解background-position》后,才知大錯(cuò)特錯(cuò))

來(lái)看看下面的代碼:

.box {   

  width:400px;   

  height:400px;   

  background-color:black;   

  background-image:url(mm.jpg);   /* 圖片原尺寸150 * 225 */

  background-repeat:no-repeat;   

  background-position:50% 50%;  

}

相信background-position: 50% 50%你用的不少,這是讓背景圖片居中,相當(dāng)于center center

效果如下:


如果50%是按照?qǐng)D片的尺寸(150 * 225)來(lái)計(jì)算的,那么其值轉(zhuǎn)換為像素值應(yīng)該是75px 112.5px,你覺(jué)得背景圖片能在400 * 400的塊里居中嗎?答案很明顯,是否定的,那是如何計(jì)算的呢?

其實(shí)官方說(shuō)法是這樣的:

當(dāng)背景圖片尺寸(background-size)不做任何的重置(也就是100% 100%)時(shí),水平百分比的值等于容器寬度百分比值減去背景圖片寬度百分比值。垂直百分比的值等于容器高度百分比值減去背景圖片高度百分比值。

水平位置: (400 - 150) * 50% = 125px

垂直位置: (400 - 225) * 50% = 87.5px


2、margin相鄰折疊問(wèn)題

在開(kāi)發(fā)中,我們偶爾會(huì)遇到明明兩個(gè)div都設(shè)置了margin,可是它們之間的距離就是不等于兩個(gè)div的margin之間的和,這是為什么呢?其實(shí)是因?yàn)樵谀承┣闆r下,兩個(gè)或多個(gè)塊元素的相鄰邊界(其間沒(méi)有任何非空內(nèi)容、padding、邊框)會(huì)發(fā)生合并成單一邊界,也就是標(biāo)題說(shuō)的折疊。

先來(lái)看看兄弟塊級(jí)元素的折疊,如下圖所示:


還要注意的是,父元素與其子元素之間也會(huì)發(fā)生折疊:


2個(gè)或多個(gè)塊級(jí)相鄰元素的外邊距(margin)的折疊規(guī)則:
  • 外邊距都為正值時(shí),取最大值
  • 不全是正值時(shí),則用正值減去(所有值的絕對(duì)值中)最大值
  • 全為負(fù)值時(shí),則取最小值

不發(fā)生折疊情況:
  • 水平(左右)外邊距不會(huì)折疊
  • 浮動(dòng)元素的外邊距不會(huì)折疊,并且浮動(dòng)元素與它的子元素之間也不會(huì)發(fā)生折疊
  • 設(shè)置了overflow且值不為visible的塊級(jí)元素與它的子元素之間的外邊距也不會(huì)被折疊
  • 絕對(duì)定位(position:absolute;)元素的margin不與任何margin發(fā)生折疊,并且與它的子元素之間的margin也不會(huì)發(fā)生折疊

解決折疊的方法:
  • 外層元素用padding替代margin
  • 外層元素設(shè)置overflow:hidden
  • 內(nèi)層元素加padding:1或者border
  • 內(nèi)層元素加浮動(dòng)(float)或設(shè)為(display:inline-block
  • 內(nèi)層元素使用絕對(duì)定位(position:absolute;

3、position的absolute和relative定位top、left、right、bottom問(wèn)題

絕對(duì)定位position:absolute)的top、left、right、bottom是相對(duì)于其具有相對(duì)定位屬性(position不為static)的父元素(不一定是其直接父元素,有可能是祖先元素)。

如果兩者(top、bottom)同時(shí)存在時(shí),只有top起作用;如果兩者(left、right)同時(shí)存在時(shí),只有left起作用。

相對(duì)定位position:relative)元素會(huì)保留原來(lái)占有的位置,其后面的元素按原來(lái)文檔流仍然保持原來(lái)的位置
  • top的值表示對(duì)象相對(duì)原位置向下偏移的距離
  • bottom的值表示對(duì)象相對(duì)原位置向上偏移的距離
  • left的值表示對(duì)象相對(duì)原位置向右偏移的距離
  • right的值表示對(duì)象相對(duì)原位置向左偏移的距離
如果兩者(top、bottom)同時(shí)存在時(shí),只有top起作用;如果兩者(left、right)同時(shí)存在時(shí),只有left起作用。

看一個(gè)例子:

<style>

.prev{   

  width:100px;    

  height:100px;   

  position:relative;   

  background:blue;   

  top:20px;   

}   

.next{   

  width:100px;   

  height:100px;   

  background:red;   

}   

.fl{   

  float:left;   

  margin:20px;   

}

</style>


<div class="fl">   

  <div class="prev" style="position:static"></div>   

  <div class="next"></div>   

</div>   

<div class="fl">   

  <div class="prev"></div>   

  <div class="next"></div>   

</div>

從上面的代碼和效果圖,你可以看出,設(shè)置了position:relative的元素設(shè)置了top:20px,雖然(相對(duì)其原位置)向下移動(dòng)了20px,可是并不會(huì)影響其后面的元素。

4、覆蓋樣式問(wèn)題

比如我們有一個(gè)公共文件,其下有一個(gè)公共樣式:

.box {

  color: red;

}


有些時(shí)候,我們需要覆蓋這個(gè)樣式,比如將紅色改為綠色。由于是公共元素,我們不能直接修改,但方法還是有多種:

/*第一種*/

.parent .box {

  color: green;

}

/*第二種*/

.box {

  color: green !important;

}

上面這些是我們常用的,但還有一個(gè)小技巧,是我們平常不太注意的,可以如下設(shè)置:

.box.box {

  color: green;

}


今天就介紹這么多,如有錯(cuò)誤,歡迎指正!

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)