CSS之——浮動、定位

1. 文檔流的概念指什么?有哪種方式可以讓元素脫離文檔流?

  • 元素自上而下排列,將窗體自上而下分成一行行, 并在每行中按從左至右的順序排放元素,即為文檔流。
  • 脫離文檔流的方法有兩種:定位和浮動。

2. 有幾種定位方式,分別是如何實現(xiàn)定位的,使用場景如何?

CSS 有三種定位機制:普通流、浮動和定位

  • 普通流:正常情況下,所有元素都在普通流中定位。塊級框從上到下一個接一個地排列。行內(nèi)框在一行中水平布置??梢允褂盟絻?nèi)邊距、邊框和外邊距調(diào)整它們的間距。但是,垂直內(nèi)邊距、邊框和外邊距不影響行內(nèi)框的高度。行內(nèi)框的最高位和最低位的差就是行高,行高即為行框高。
  • 定位:position屬性。
屬性值 描述
static 元素框正常生成。塊級元素生成一個矩形框,作為文檔流的一部分,行內(nèi)元素則會創(chuàng)建一個或多個行框,置于其父元素中。
relative 元素框偏移某個距離。元素仍保持其未定位前的形狀,它原本所占的空間仍保留。
absolute 元素框從文檔流完全刪除,并相對于其包含塊定位。包含塊可能是文檔中的另一個元素或者是初始包含塊。元素原先在正常文檔流中所占的空間會關(guān)閉,就好像元素原來不存在一樣。元素定位后生成一個塊級框,而不論原來它在正常流中生成何種類型的框。
fixed 元素框的表現(xiàn)類似于將 position 設(shè)置為 absolute,不過其包含塊是視窗本身。

demo

  • position: static;
    position: static;

    可以看出,static屬性值是正常的普通流布局,塊級元素從上到下,從左到右依次顯示。
  • position: relative;

position: relative;

可以看出,當position屬性值設(shè)置為relative時,可以對元素的位置定位,left: 200px; bottom: 80px;使元素向右移動200像素;向上移動80像素;而box2原有位置占用空間仍然保留,不影響其他元素布局。

補充:關(guān)于left,bottom設(shè)置問題:
左上角為(0,0)原點,向右向下為正方向的一個坐標系,如圖:

設(shè)置距離

  • position: absolute;
    ① 父元素不是定位元素:


    position: absolute

    ② 父元素是定位元素:

父元素是定位元素

可以看出,由兩幅圖可以看出position: absolute;的用法,即將元素脫離文檔流,然后相對于父元素進行定位,前提是父元素是定位元素,如果父元素不是定位元素,那么就按照嵌套關(guān)系逐級向上尋找,直到根節(jié)點(視窗)進行定位。
PS: 父元素的position屬性值為:absolute,relative,fixed才能定位,static不可以。

  • position: fixed;

position: fixed;

如圖所示,fixed屬性值相對于瀏覽器視窗進行定位,而無論進度條拖到什么位置,box2元素始終相對于視窗固定。


3. absolute, relative, fixed偏移的參考點分別是什么?

fixed是相對于視窗定位。
relative是根據(jù)本身原位置定位。
absolute是根據(jù)根節(jié)點或者有position屬性的父元素定位。
偏移的參考原點是父元素或者視窗的最左上角。
左上角為(0,0)原點,向右向下為正方向的一個坐標系,如圖:


設(shè)置距離

4. z-index 有什么作用? 如何使用?

  • z-index是設(shè)置元素的堆疊順序的屬性。擁有更高堆疊順序的元素總是會處于堆疊順序較低的元素的前面;
  • 元素可擁有負的 z-index 屬性值;
  • z-index屬性僅在定位元素上奏效;
  • 如果為正數(shù),則離用戶更近,為負數(shù)則表示離用戶更遠。
    demo:
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title></title>
    <style type="text/css" media="screen">
      img {
        position: absolute;  /* 設(shè)置定位屬性,從而觸發(fā)z-index屬性 */
        z-index: -1;         /* 設(shè)置z軸為-1,元素顯示在下面 */
      }
    </style>
  </head>
  <body>
    <div class="cat-1">
      ![圖片](http://upload-images.jianshu.io/upload_images/2404178-739887a92b9f7482.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
      <h1>任務(wù)10的大標題</h1>
      <h2>任務(wù)10 阿拉路,阿拉啦,我在東北玩泥巴</h2>
      <h2>任務(wù)10 阿拉路,阿拉啦,我在東北玩泥巴</h2>
      <h2>任務(wù)10 阿拉路,阿拉啦,我在東北玩泥巴</h2>
      <h2>任務(wù)10 阿拉路,阿拉啦,我在東北玩泥巴</h2>
      <h2>任務(wù)10 阿拉路,阿拉啦,我在東北玩泥巴</h2>
    </div>
    </div>
  </body>
</html>

效果圖:

z-index: -1

如圖所示,圖片元素position為absolute,所以從文檔流脫離,此時h1和h2向上流動占用圖片原位置,然后設(shè)置z-index為-1,使圖片位于元素下面。
如果將z-index改為1,則:

img {
        position: absolute;
        z-index: 1;
      }
z-index: 1

5. position:relative和負margin都可以使元素位置發(fā)生偏移?二者有什么區(qū)別?

  • 而給margin設(shè)置負值,不但改變了元素本身,還改變了周圍其他元素的布。
margin: -10px;
  • position: relative;是單獨對元素本身進行渲染,不影響其他元素的布局;
Paste_Image.png

6. 如何讓一個固定寬高的元素在頁面上垂直水平居中?

可以利用position: absolute;將元素脫離文本流,然后設(shè)置left: 50%; top: 50%;從而使元素的左上角點位于頁面中點,最后通過調(diào)節(jié)元素的margin值(左上各負一半)將元素居中。

元素垂直水平居中

可以看出,這種方法確實可以將元素放置于父元素的中心,而如果不設(shè)置margin,繼續(xù)調(diào)節(jié)left和top值可不可以呢?為此做如下改動:

.container1 .box:nth-child(1) {
  width: 80px;
  height: 80px;
  background: rgba(0,255,0,0.3);
  position: absolute;
  left: 50%;
  top: 50%;
  left: -40px;    /* 會覆蓋上面屬性 */
  top: -40px;
}

錯誤演示圖

事實證明!是不可以疊加效果的,元素是一次性渲染成最終結(jié)果,而不是先定位一次再定位下一次,只有覆蓋沒有疊加,這是CSS樣式表語言的特性。


7. 浮動元素有什么特征?對其他浮動元素、普通元素、文字分別有什么影響?

在 CSS 中,我們通過 float 屬性實現(xiàn)元素的浮動。

  • 浮動元素脫離文檔流,原位置不繼續(xù)占用空間;
  • 浮動的框可以向左或向右移動,直到它的外邊緣碰到包含框或另一個浮動框的邊框為止;
  • 浮動元素表現(xiàn)類似于有不同的z-index值,即“浮”在頁面,使得其他塊框元素不受其影響。
  • 雖然塊框不受其影響,但是浮動框旁邊的行框被縮短,從而給浮動框留出空間,行框圍繞浮動框,造成文字環(huán)繞浮動元素顯示。
    具體如下

float: right;

如圖所示,box2向右浮動,box3向上填補位置;

float: left;

如圖,float:left;將box2元素向左浮動,而此時box3向上占據(jù)位置,所以重疊,由于box2脫離文檔流,z-index值高,所以在box3的上面顯示。

float: left;

如圖所示,將三個box元素均設(shè)置為float: left;按照渲染順序依次排列。

文字避讓

如圖可以看出,box2向右浮動,而box3向上占據(jù)位置,顯然,從圖中的透明重疊部分可以看出,box3塊框無影響,而box3里面的段落內(nèi)容則避讓box2布局,這就是浮動元素改變行框的現(xiàn)象。


8. 清除浮動指什么? 如何清除浮動?

  • 清除浮動指通過clear屬性將之前浮動元素的影響消除。
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title></title>
    <style type="text/css" media="screen">
      .container {
        width: 280px;
        height: 280px;
        border: 1px solid;
        margin: 0 auto;
      }
      .box {
        width: 80px;
        height: 80px;
      }
      .box1 {
        background: rgba(255, 255, 0, 0.7);
        border: 1px solid;
        float: right;
      }
      .box2 {
        background: rgba(0, 255, 255, 0.7);
        border: 1px solid;
        margin: 20px;
        float: right;
      }
      .box3 {
        background: rgba(255, 0, 255, 0.7);
        border: 1px solid;
        /*clear: both;*/
      }
    </style>
  </head>
  <body>
    <div class="container">
      <div class="box1 box">1</div>
      <div class="box2 box">2</div>
      <div class="box3 box">3</div>
    </div>
  </body>
</html>

效果圖

未使用clear屬性

如圖所示,當我未使用clear屬性時,box1和box2均向右浮動,而box3受到兩個浮動元素的影響,向上占據(jù)位置。

  • 如果對box3使用clear: both屬性,那么得到的效果是:

clear: both;

可以看出,box3使用clear: both;時,位置相對于box2未發(fā)生改變;

  • 如果對浮動元素box2用clear屬性,即:
.box2 {
        background: rgba(0, 255, 255, 0.7);
        border: 1px solid;
        /*margin: 20px;*/
        clear: both;
        float: right;
      }

則效果為:

clear-box2

可以看出,box2相對box1的位置未改變,只是box2本身向右浮動,而box3由于也使用了clear: both;,所以位置未發(fā)生改變。

  • 再來試試clear的另外兩個值left和right:
.box1 {
        background: rgba(255, 255, 0, 0.7);
        border: 1px solid;
        float: right;
      }
      .box2 {
        background: rgba(0, 255, 255, 0.7);
        border: 1px solid;
        clear: right;
        float: right;
      }
      .box3 {
        background: rgba(255, 0, 255, 0.7);
        border: 1px solid;
        float: right;
        clear: left;
      }
      .box4 {
        background: rgba(238, 217, 255, 0.7);
        border: 1px solid;
        clear: both;
      }

clear: left(right);

如圖,我們?yōu)樵靥砑右粋€box4,box4處于最后位置,并且clear: both;,所以選box4為參考;當對box2使用clear: right;時,元素不受box1的影響,而當我對box3使用clear: left;時,元素受到浮動影響;
所以可以看出
clear的left和right只對上一個浮動元素的方向有效,即浮動元素在左,用left值,反之用right。

綜上所述

  1. clear屬性用于清除浮動,浮動元素在左用left,在右用right,both屬性皆生效;
  2. 布局中,分大小區(qū)塊,使用float屬性和clear屬性情況各有不同,各大區(qū)塊使用clear可以更好地區(qū)分。
  3. 浮動元素存在margin,并且無法合并,但無法撐開父元素;
  4. 無論元素未使用定位和浮動前是什么元素,定位或者浮動后,都會按塊級元素處理。

本文版權(quán)歸本人和饑人谷所有,轉(zhuǎn)載請注明來源,謝謝

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

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

  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標簽?zāi)J的外補...
    _Yfling閱讀 14,149評論 1 92
  • 文檔流的概念指什么?有哪種方式可以讓元素脫離文檔流? 文檔流就是瀏覽器在頁面上擺放HTML元素所用的方法。瀏覽器從...
    coolheadedY閱讀 659評論 0 0
  • relative:生成相對定位的元素,通過top,bottom,left,right的位置相對于其正常位置進行定位...
    zx9426閱讀 1,075評論 0 2
  • 一、文檔流的概念指什么?有哪些方式可以讓元素脫離文檔流? 文檔里指元素在文檔中的位置由元素在html里的位置決定,...
    dengpan閱讀 590評論 0 3
  • 浮動元素有什么特征?對父容器、其他浮動元素、普通元素、文字分別有什么影響? 特征: 浮動元素會脫離正常的文檔流,元...
    饑人谷_哈嚕嚕閱讀 971評論 0 0

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