1. 程式人生 > >CSS基礎 —— 惡補zoom:1的原理和應用

CSS基礎 —— 惡補zoom:1的原理和應用

zoom的作用是設定或檢索物件的縮放比例

設定body的zoom屬性,可以實現網頁縮小為原來的一半。

body {
  zoom: 0.5
}

設定zoom:1可以在低版本IE下觸發IE瀏覽器的haslayout,用於清除浮動,解決margin導致的重疊等問題

通常,當浮動子元素導致父元素高度塌陷的時候,只要給父元素加上overflow: hidden;來解決(觸發BFC),但是對於IE不行,需要觸發其hasLayout屬性才可以。

zoom:1就是IE專用來觸發haslayout屬性的。hasLayout是IE特有的一個屬性。很多的IE下的css bug都與其息息相關。在IE中,一個元素要麼自己對自身的內容進行計算大小和組織,要麼依賴於父元素來計算尺寸和組織內容。當一個元素的hasLayout屬性值為true時,它負責對自己和可能的子孫元素進行尺寸計算和定位。

hasLayout對於內聯元素也可以有效果,當內聯元素的hasLayout為true的時候,可以給這個內聯元素設定高度和寬度並得到期望的效果。

通常,在給低版本(IE6、7)的IE做相容的時候會用到zoom:1。

例如,清除浮動的時候,為了防止低版本的IE瀏覽器不支援after選擇器或者某些屬性,在最後加上zoom:1來清除浮動。

.clearfix::after {
  content: ".";
  clear: both;
  display: block;
  visibility: hidden;
  overflow: hidden;
  height: 0;
  *zoom: 1;
}

例如,實現inline-block的相容。在IE6、IE7下,只有設定在預設顯示方式為inline的元素上才會生效。前面說過,當內聯元素的hasLayout為true的時候,可以給這個內聯元素設定高度和寬度並得到期望的效果,所以這樣做可以達到相容inline-block的效果。

{ display: inline-block; *display: inline; *zoom: 1; }

這裡還要補充一點,為什麼*display:inline;*zoom:1;前面有*,*放在css屬性前面,表示這個屬性僅僅應用到Internet Explorer 7 以及以下版本因為Internet Explorer 版本 7 以及以下承認非字母數字(除了下劃線)字首的屬性。所以這裡,IE7以上的版本作用的是display: inline-block;而在IE7及以下的版本中作用的是display:inline;zoom:1。

參考: