10.浮動、定位

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

1、文檔流指的是元素在排列布局中所占用的位置,具體的說是將窗體自上而下分為一行行,并在每行中按從左到右的順序排放元素。
每個非浮動的塊級元素都獨(dú)占一行,若設(shè)置了浮動,它就會按照設(shè)置的規(guī)則浮動在行的一端,如果當(dāng)前行放置不下,則另起新行再浮動。內(nèi)聯(lián)元素不會獨(dú)占一行。
2、有三種方法可以讓元素脫離文檔流,分別是浮動:float,絕對定位:position:absolute,固定定位:position:fixed。
3、拓展:文檔流和文本流的區(qū)別
①文檔流是相對于盒模型的概念,而文本流是相對于段落文字的概念。
②元素浮動之后,會脫離文檔流,它后面的塊級元素感知不到浮動元素的存在,就會無視它原來占據(jù)的區(qū)域,直接在它上面布局。
但是文字卻會認(rèn)同浮動元素所占據(jù)的區(qū)域,圍繞它布局,所以浮動元素沒有脫離文本流。
③如果使用絕對定位之后,元素既會脫離文檔流,也會脫離文本流。那么后面元素的文本就不會在認(rèn)同它占據(jù)的區(qū)域,會直接在它上面布局,就不會環(huán)繞。
例如:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<title>Examples</title>
<meta name="description" content="">
<meta name="keywords" content="">
<link href="" rel="stylesheet">
<style>
    .box1{
        height: 100px;
        width: 100px;
        background:red;
        float: left;
    }
    .ct{
        height: 200px;
        width:200px;
        background:#ccc;
        margin-top: 40px
    }
    .box2{
        height: 100px;
        width: 100px;
        background:blue;
        position: absolute;
    }
    .footer{
        position: fixed;
        bottom: 10px;
        left: 10px;
        height: 100px;
        width: 200px;
        background:yellow;
    }
</style>
</head>
<body>
    <div class="ct">
        <div class="box1"></div>
        <p>
            比如網(wǎng)頁的div標(biāo)簽它默認(rèn)占用的寬度位置是一整行
            ,p標(biāo)簽?zāi)J(rèn)占用寬度也是一整行,因為div標(biāo)簽和p標(biāo)
            簽是塊狀對象。 網(wǎng)頁中大部分對象默認(rèn)是占用文檔流,
            也有一些對象是不占文檔流的,
        </p>
    </div>

    <div class="ct">
        <div class="box2"></div>
        <p>
            比如網(wǎng)頁的div標(biāo)簽它默認(rèn)占用的寬度位置是一整行
            ,p標(biāo)簽?zāi)J(rèn)占用寬度也是一整行,
            因為div標(biāo)簽和p標(biāo)簽是塊狀對象。 網(wǎng)頁中大部分對象默
            認(rèn)是占用文檔流,也有一些對象是不占文檔流的,
        </p>
    </div>

    <div class="footer">jirengu</div>
</body>
</html>
Paste_Image.png

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

答:有四種定位方式。分別是:靜態(tài)定位、相對定位、絕對定位和固定定位。對應(yīng)position屬性有四個值:static、relative、absolute、fixed,默認(rèn)值為static。
除了static以外,其他的定位方式都可以設(shè)定“top、right、bottom、left”屬性,指明元素相對于另一個元素所移動的位置。

1.在靜態(tài)定位的情況下,每個元素處在常規(guī)文檔流中。塊級元素會在頁面中自上而下地堆疊起來,行內(nèi)元素會相互并列,直到空間不足以并列的情況下才會折到下一行顯示。
2.相對定位的盒子的位置常以標(biāo)準(zhǔn)流的排版方式為基礎(chǔ),然后使盒子相對于它在原本的標(biāo)準(zhǔn)位置偏移指定的距離。相對定位的盒子仍在標(biāo)準(zhǔn)流中,它后面的盒子仍以標(biāo)準(zhǔn)流方式對待它。使用relative,即相對定位,除了將position屬性設(shè)置為relative之外,還需要指定一定的偏移量,水平方向通過left或者right屬性來指定,豎直方向通過top和bottom來指定。
3.絕對定位會把元素徹底從文檔流中拿出來,不占據(jù)它原本該占據(jù)的位置。它需要參考它的定位上下文來移動位置。絕對定位元素的任何祖先元素都可以成為它的定位上下文,只需要把相應(yīng)祖先元素的position設(shè)為relative即可。 如果沒有相對定位的祖先元素可以參考,則以默認(rèn)的定位上下文body作為參照,相對于它進(jìn)行定位。
4.固定定位也是完全移出文檔流,但它的定位上下文是視口(瀏覽器窗口或手持設(shè)備的屏幕),它的特點是不會隨頁面滾動而滾動。最常見的情況是用它創(chuàng)建不隨頁面滾動而移動的導(dǎo)航元素。(乍一看很像絕對定位,但它不隨著頁面滾動而移動,絕對定位會移動)
示意圖可以參考 CSS中的絕對定位與相對定位

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

  • absolute偏移參考點是static定位以外最近的一個祖先(父)元素,如果沒有則相對于原始的容器body。
  • relative偏移參考點是自己在文檔流中原來的位置。
  • fixed偏移參考點是瀏覽器窗口。
    參考:關(guān)于CSS定位中的位置

四、z-index 有什么作用? 如何使用?

1、z-index的作用:頁面顯示的是一個二維平面,用x軸和y軸來表示位置屬性。為了表示三維立體的概念比如顯示元素的上下層的疊加順序,所以引入了z-index屬性來表示z軸的區(qū)別。比如說頁面的x軸向右,y軸向下那么z軸就是垂直于xy平面里。
表示一個元素在疊加順序上的上下立體關(guān)系。
2、使用:z-index值較大的元素將疊加在z-index值較小的元素之上。對于未指定此屬性的定位對象,z-index 值為正數(shù)的對象會在其之上,而 z-index 值為負(fù)數(shù)的對象在其之下。
參考z-index

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<title>Examples</title>
<meta name="description" content="">
<meta name="keywords" content="">
<link href="" rel="stylesheet">
<style>
    .container{
        height: 127px;
        width: 300px;
        background:#ccc;
        position: relative;
    }
    .container .box{
        height: 100px;
        width: 100px;
        background:red;
        position: inherit;
    }
    .container .box:nth-child(1){
        background:red;
        z-index: 1;
    }
    .container .box:nth-child(2){
        background:yellow;
        z-index: -1;
    }
</style>
</head>
<body>
    <div class="container">3
        <div class="box">1</div>
        <div class="box">2</div>
    </div>
</body>
</html>
Paste_Image.png

使用z-index要注意下面幾點:
1、只對定位元素有效。
z-index屬性適用于定位元素(position屬性值為 relative 或 absolute 或 fixed的元素),用來確定定位元素在垂直于頁面方向(稱為Z軸)上的層疊順序,也就是說如果元素沒有設(shè)置定位,對其設(shè)置的z-index是無效的。
2、相同z-index誰上誰下
①如果兩個元素都沒有定位或者兩個都是定位元素且z-index相同發(fā)生位置重合現(xiàn)象,那么按文檔流順序,后面的覆蓋前面的。
②如果兩個元素都沒有設(shè)置z-index(使用默認(rèn)值,默認(rèn)不設(shè)置z-index時值是0),一個定位一個沒有定位,那么定位元素覆蓋未定位元素。
3、父子關(guān)系處理
①如果定位父元素z-index設(shè)置值除了默認(rèn)值外,那么定位子元素?zé)o論是否設(shè)置z-index或設(shè)置多少值,z-index都會不起作用,定位子元素都會在定位父元素上面。
②如果父元素z-index未定位或者使用默認(rèn)值,那么定位子元素設(shè)置z-index會起作用,子元素可以在父元素的下面或下面。
4、兄弟之間子元素
①如果定位兄弟元素的z-index生效,那么它們的子元素覆蓋關(guān)系由父元素層級決定,不管它們子元素z-index的各自大小。
參考:z-index應(yīng)用總結(jié)

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

  • 用position:relative使元素偏移時,它自身位置并未改變,仍然處在文檔流的原始位置,偏移的元素不會對下面元素位置產(chǎn)生影響,只是該元素自己相對于原來位置偏移。
  • 設(shè)負(fù)margin的時候,偏移的元素自身位置改變,不再占據(jù)初始空間,還會對其他元素位置產(chǎn)生影響。
  • 設(shè)置margin的時候是相鄰元素之間的偏移,相對于相鄰元素的border,否則設(shè)置的margin將無效。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<title>Examples</title>
<meta name="description" content="">
<meta name="keywords" content="">
<link href="" rel="stylesheet">
<style type="text/css">
    body{
        margin:0px;
        padding: 0px;
    }
    .container{
        display: inline-block;
        height: 300px;
        width: 200px;
        border: 1px solid;
    }
    .box{
        height: 100px;
        width: 100px;
        border: 1px solid;
    }
    .container .box:nth-child(1){
        background:red;
    }
    .container .box:nth-child(2){
        background:blue;
    }
    .container .box:nth-child(3){
        background:yellow;
    }
    .margin{
        margin-top: -30px;
        margin-left:30px; 
    }
    .relative{
        position: relative;
        left: 30px;
        top: -30px;
    }
</style>
</head>
<body>
    <div class="container">
        <div class="box">1</div>
        <div class="box normal">這是正常的box</div>
        <div class="box">2</div>
    </div>

     <div class="container">
        <div class="box">1</div>
        <div class="box margin">這是負(fù)margin的box</div>
        <div class="box">2</div>
    </div>

     <div class="container">
        <div class="box">1</div>
        <div class="box relative">這是relative的box</div>
        <div class="box">2</div>
    </div>
</body>
</html>

Paste_Image.png

可以看出,設(shè)置負(fù)margin時,元素的原來的空間被1占據(jù),元素好像沒有偏移,而container整體向下偏移,而且container內(nèi)部的底部出現(xiàn)了空白。
這里還有些模糊,搞不清楚?

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

1、可以使用absolute和負(fù)margin實現(xiàn)。
首先在父元素上設(shè)置定位,提供一個坐標(biāo)的參考點,然后對元素設(shè)置position:absolute;top:50%;left:50%;,此時元素的左上角在正中心的位置,再設(shè)置負(fù)margin偏移該元素寬高的一半margin-left:-a;(a為該元素寬高的一半)

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<title>Examples</title>
<meta name="description" content="">
<meta name="keywords" content="">
<link href="" rel="stylesheet">
<style>
    body{
        margin:0px;
        padding: 0px;
    }
    .container{
        position: absolute;
        top: 0px;
        bottom: 0px;
        left: 0px;
        right: 0px;
        background:#ccc;
    }
    /*這樣設(shè)置容器等于body,相對于頁面*/
    .box{
        position: absolute;
        top: 50%;  
        left: 50%;
        /*box左上角的位置偏移到父元素寬度和高度的一半,也就是父元素的正中心*/
        margin-left: -50px;
        margin-top: -50px;
        /*box偏移本身寬高的一半,也就是整個都在頁面正中心*/
        height: 100px;
        width: 100px;
        background:red;
    }
</style>
</head>
<body>
    <div class="container">
        <div class="box"></div>
    </div>
</body>
</html>
Paste_Image.png

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

1、浮動元素的特征:
①浮動的框可以向左或向右移動,直到它的外邊緣碰到包含框或另一個浮動框的邊框為止。浮動框脫離了文檔流,所以文檔流中的塊框表現(xiàn)得就像浮動框不存在一樣。
②浮動元素如果沒有設(shè)置寬高,會自動“收縮”,那它的寬高就是自身的內(nèi)容。
③無論什么元素設(shè)置浮動后都會變成塊級元素。
④浮動元素對于其他浮動元素,先浮動的元素不會被后浮動的元素超過,浮動元素不會彼此重疊。
⑤浮動元素對于文字,則是“可見”的,會把文字給“頂開”,形成文字包圍浮動元素。
⑥當(dāng)行框沒有足夠空間,浮動元素會被擠到新的一行
⑦浮動重疊規(guī)則:
行內(nèi)框與浮動元素重疊時,其邊框、背景、內(nèi)容均位于浮動元素之上;塊框與浮動元素重疊時,其邊框、背景在浮動元素之下,而內(nèi)容不在浮動元素之下顯示。參考:浮動元素

2、對其他浮動元素、普通元素、文字的影響
①對其它浮動元素的影響:后面的浮動元素會會跟隨其浮動,直到遇到前面浮動元素的邊框。如果父容器放不下,它會自動下移到新的一行。

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<title>Examples</title>
<meta name="description" content="">
<meta name="keywords" content="">
<link href="" rel="stylesheet">
<style>
    .container{
        width:250px;
        height:300px;
        border:1px solid;
    }
    .box{
        height:100px;
        width:100px;
        border:1px solid;
    }
    .container .box:nth-child(1){
        background:red;
        float:right;
    }
    .container .box:nth-child(2){
        background:blue;
        float:right;
    }
    .container .box:nth-child(3){
        background:green;
        float:right;
    }
    .container .box:nth-child(4){
        background:yellow;
    }
</style>
</head>
<body>
    <div class="container">
        <div class="box">1</div>
        <div class="box">2</div>
        <div class="box">3</div>
        <div class="box">4</div>
    </div>
</body>
</html>
Paste_Image.png

②對普通元素的影響:同級關(guān)系的普通塊級元素會忽略浮動元素的存在,占據(jù)它的位置;父子級關(guān)系的子元素浮動的話,父容器的高度會塌陷。

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<title>Examples</title>
<meta name="description" content="">
<meta name="keywords" content="">
<link href="" rel="stylesheet">
<style>
    .box{
        height: 100px;
        width: 100px;
        border: 1px solid;
    }
    .container{
        border: 1px solid red;
        width: 300px;
    }
    .box1{
        background:red;
        float: left;
    }
    .box2{
        background:blue;
        width: 200px;
    }
    .container .box:nth-child(1){
        background:gray;
        /*float: left;*/
    }
    .container .box:nth-child(2){
        background:yellow;
        float: left;
    }
</style>
</head>
<body>
    <div class="box box1">1</div>
    <div class="box box2">2</div>
    <div class="container">
        <div class="box">3</div>
        <div class="box">4</div>
    </div>
</body>
</html>

Paste_Image.png

說明:父容器塌陷的原因是子元素浮動后就是脫離文檔流,然后不占據(jù)原來空間,所以父容器的高度會收縮。

** ③對文字的影響**:浮動元素脫離了文檔流,塊級元素感知不到浮動元素的存在,但浮動元素對塊級元素里的文字產(chǎn)生影響,文字會環(huán)繞著浮動元素布局。

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<title>Examples</title>
<meta name="description" content="">
<meta name="keywords" content="">
<link href="" rel="stylesheet">
<style>
    .container{
        height: 300px;
        width: 300px;
        border: 1px solid;
    }
    .box{
        height: 100px;
        width: 100px;
        border: 1px solid;
        background:blue;
        float: left;
    }
    p{
        border: 1px solid red;
    }
</style>
</head>
<body>
  <div class="container">
        <div class="box"></div>
        <p>這樣會得到我們希望的效果。不幸的是,
下一個元素會受到這個浮動元素的影響。
為了解決這個問題,有些人選擇對布局中的所有東西進(jìn)行浮動
,然后使用適當(dāng)?shù)挠幸饬x的元素(常常是站點的頁腳)
對這些浮動進(jìn)行清理。這有助于減少或消除不必要的標(biāo)記。
        </p>
    </div>
</body>
</html>
Paste_Image.png

八、清除浮動指什么? 如何清除浮動?

1、清除浮動是指清除浮動帶來的影響。主要有對上級元素和同級元素的影響。對上級元素的影響比如浮動元素不會撐起父元素的高度,影響與父元素的同級元素。對同級元素的影響比如同級元素會占據(jù)浮動元素原來的空間,而我們需要這個空間不被占用。
2、另外的說法,在非IE瀏覽器下,當(dāng)容器的高度為auto,且容器的內(nèi)容中有浮動的元素,在這種情況下,容器的高度不能自動伸長以適應(yīng)內(nèi)容的高度,使得內(nèi)容溢出到容器外面而影響(甚至破壞)布局的現(xiàn)象。這個現(xiàn)象叫浮動溢出,為了防止這個現(xiàn)象的出現(xiàn)而進(jìn)行的CSS處理,就叫CSS清除浮動。
3、注意:清除浮動是針對元素本身的,只能對自己有效果,不能夠影響到別的元素

4、 清除浮動常用的方法:
①使用clear屬性
clear 屬性規(guī)定元素的哪一側(cè)不允許其他浮動元素

Paste_Image.png

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<title>Examples</title>
<meta name="description" content="">
<meta name="keywords" content="">
<link href="" rel="stylesheet">
<style>
    .container{
        border: 1px solid;
        width: 400px;
    }
    .box{
        height: 100px;
        width: 100px;
        border: 1px solid;
    }
    .container .box:nth-child(1){
        background:red;
        float: left;
    }
    .container .box:nth-child(2){
        background:blue;
        clear:left;
    }
    .ct{
        border: 1px solid;
        width: 400px;
    }
    .ct .box:nth-child(1){
        background:yellow;
        float:right;
    }
    .ct .box:nth-child(2){
        background:gray;
        float: right;
        clear: right;
    }
    .clearfix{
        clear: both;
    }
</style>
</head>
<body>
   <div class="container">
        <div class="box">1</div>
        <div class="box">2</div>
    </div> 
    <div class="ct">
        <div class="box">1</div>
        <div class="box">2</div>
        <div class="clearfix"></div>
    </div> 
</body>
</html>

Paste_Image.png

②使用偽元素(其實本質(zhì)上就是用clear)
給浮動元素的容器添加一個clearfix的class,然后給這個class添加一個:after偽元素實現(xiàn)元素末尾添加一個看不見的塊元素(Block element)清理浮動.
Paste_Image.png

③父級div定義 overflow:hidden
對父級CSS選擇器加overflow:hidden樣式,可以清除父級內(nèi)使用float產(chǎn)生浮動。
overflow:hidden 的意思是超出的部分要裁切隱藏掉,那么如果 float 的元素不占普通流位置,普通流的包含塊要根據(jù)內(nèi)容高度裁切隱藏,如果高度是默認(rèn)值auto,那么不計算其內(nèi)浮動元素高度就裁切,就有可能會裁掉float,這是違反布局常識的。
所以如果沒有明確設(shè)定容器高情況下,它要計算內(nèi)容全部高度才能確定在什么位置hidden,浮動的高度就要被計算進(jìn)去,順帶達(dá)成了清理浮動的目標(biāo)。
Paste_Image.png

參考:
清除浮動
BFC
深入理解BFC和Margin Collapse


最后編輯于
?著作權(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)容

  • 學(xué)習(xí)建議 定位、浮動是 CSS 核心知識點,必須熟練掌握。 1.文檔流的概念指什么?有哪種方式可以讓元素脫離文檔流...
    饑人谷_任磊閱讀 1,158評論 0 3
  • 1.浮動元素有什么特征?對父容器、其他浮動元素、普通元素、文字分別有什么影響? 設(shè)置浮動,可以讓元素脫離普通流,使...
    upup_dayday閱讀 360評論 0 0
  • 問答 1.浮動元素有什么特征?對父容器、其他浮動元素、普通元素、文字分別有什么影響? 浮動元素的特征:文字環(huán)繞浮動...
    liushaung閱讀 449評論 0 3
  • 課程目標(biāo) 掌握定位的幾種方式 掌握浮動的原理及應(yīng)用 理解文檔流的概念 使用定位、浮動實現(xiàn)常見布局 學(xué)習(xí)建議 定位、...
    Timmmmmmm閱讀 360評論 0 0
  • 浮動元素有什么特征?對父容器、其他浮動元素、普通元素、文字分別有什么影響?一個元素應(yīng)沿其容器的左側(cè)或右側(cè)放置,允許...
    _小黑閱讀 286評論 0 0

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