CSS屬性:定位屬性(圖文詳解)

来源:https://www.cnblogs.com/smyhvae/archive/2018/01/16/8296748.html
-Advertisement-
Play Games

CSS的定位屬性有三種,分別是絕對定位、相對定位、固定定位。 ...


本文最初發表於博客園,併在GitHub上持續更新前端的系列文章。歡迎在GitHub上關註我,一起入門和進階前端。

以下是正文。

CSS的定位屬性有三種,分別是絕對定位、相對定位、固定定位。

    position: absolute;  <!-- 絕對定位 -->

    position: relative;  <!-- 相對定位 -->

    position: fixed;     <!-- 固定定位 -->

下麵逐一介紹。

相對定位

相對定位:讓元素相對於自己原來的位置,進行位置調整(可用於盒子的位置微調)。

我們之前學習的背景屬性中,是通過如下格式:

    background-position:向右偏移量 向下偏移量;

但這回的定位屬性,是通過如下格式:

    position: relative;
    left: 50px;
    top: 50px;

相對定位的舉例:

<!doctype html>
<html lang="en">
 <head>
  <meta charset="UTF-8">
  <meta name="Generator" content="EditPlus®">
  <meta name="Author" content="">
  <meta name="Keywords" content="">
  <meta name="Description" content="">
  <title>Document</title>

    <style type="text/css">

        body{
            margin: 0px;
        }

        .div1{
            width: 200px;
            height: 200px;
            border: 1px solid red;
        }

        .div2{
            position: relative;/*相對定位:相對於自己原來的位置*/
            left: 50px;/*橫坐標:正值表示向右偏移,負值表示向左偏移*/
            top: 50px;/*縱坐標:正值表示向下偏移,負值表示向上偏移*/

            width: 200px;
            height: 200px;
            border: 1px solid red;
        }
    </style>
 </head>

 <body>

    <div class="div1">有生之年</div>
    <div class="div2">狹路相逢</div>

 </body>

</html>

效果:

相對定位不脫標

相對定位:不脫標,老家留坑,別人不會把它的位置擠走

也就是說,相對定位的真實位置還在老家,只不過影子出去了,可以到處飄。

相對定位的用途

相對定位有坑,所以如果需要做一般不用於做“壓蓋”效果(把一個div放到另一個div之上)。頁面中,效果極小。就兩個作用:

  • (1)微調元素
  • (2)做絕對定位的參考,子絕父相

相對定位的定位值

  • left:盒子右移

  • right:盒子左移

  • top:盒子下移

  • bottom:盒子上移

PS:負數表示相反的方向。

↘:

    position: relative;
    left: 40px;
    top: 10px;

↙:

    position: relative;
    right: 100px;
    top: 100px;

↖:

    position: relative;
    right: 100px;
    bottom: 100px;

↗:

    position: relative;
    left: 200px;
    bottom: 200px;

如果要描述上面這張圖的方向,我們可以首先可以這樣描述:

    position: relative;
    left: 200px;
    top: 100px;

因為left: 200px等價於right: -200px,所以這張圖其實有四種寫法。

絕對定位

絕對定位:定義橫縱坐標。原點在父容器的左上角或左下角。橫坐標用left表示,縱坐標用top或者bottom表示。

格式舉例如下:

    position: absolute;  /*絕對定位*/
    left: 10px;  /*橫坐標*/
    top/bottom: 20px;  /*縱坐標*/

絕對定位脫標

絕對定位的盒子脫離了標準文檔流。

所以,所有的標準文檔流的性質,絕對定位之後都不遵守了。

絕對定位之後,標簽就不區分所謂的行內元素、塊級元素了,不需要display:block就可以設置寬、高了。

絕對定位的參考點(重要)

(1)如果用top描述,那麼參考點就是頁面的左上角,而不是瀏覽器的左上角:

(2)如果用bottom描述,那麼參考點就是瀏覽器首屏視窗尺寸(好好理解“首屏”二字),對應的頁面的左下角:

為了理解“首屏”二字的含義,我們來看一下動態圖:

問題:

答案:

用bottom的定位的時候,參考的是瀏覽器首屏大小對應的頁面左下角。

以盒子為參考點

一個絕對定位的元素,如果父輩元素中也出現了已定位(無論是絕對定位、相對定位,還是固定定位)的元素,那麼將以父輩這個元素,為參考點。

如下:(子絕父相)

以下幾點需要註意。

(1) 要聽最近的已經定位的祖先元素的,不一定是父親,可能是爺爺:

        <div class="box1">        相對定位
            <div class="box2">    沒有定位
                <p></p>           絕對定位,將以box1為參考,因為box2沒有定位,box1就是最近的父輩元素
            </div>
        </div>

再比如:

        <div class="box1">        相對定位
            <div class="box2">    相對定位
                <p></p>           絕對定位,將以box2為參考,因為box2是自己最近的父輩元素
            </div>
        </div>

(2)不一定是相對定位,任何定位,都可以作為兒子的參考點:

子絕父絕、子絕父相、子絕父固,都是可以給兒子定位的。但是在工程上,如果子絕、父絕,沒有一個盒子在標準流裡面了,所以頁面就不穩固,沒有任何實戰用途。

工程應用:

子絕父相”有意義:這樣可以保證父親沒有脫標,兒子脫標在父親的範圍裡面移動。於是,工程上經常這樣做:

父親浮動,設置相對定位(零偏移),然後讓兒子絕對定位一定的距離。

(3)絕對定位的兒子,無視參考的那個盒子的padding:

下圖中,綠色部分是父親div的padding,藍色部分p是div的內容區域。此時,如果div相對定位,p絕對定位,那麼,
p將無視父親的padding,在border內側為參考點,進行定位:

工程應用:

絕對定位非常適合用來做“壓蓋”效果。我們來舉個lagou.com上的例子。

現在有如下兩張圖片素材:

要求作出如下效果:

代碼實現如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style type="text/css">
        .box{
            margin: 100px;
            width: 308px;
            height: 307px;
            border: 1px solid #FF7E00;
            position: relative;  /*子絕父相*/

        }
        .box .image img{
            width: 308px;
            height: 196px;
        }
        .box .dtc{
            display: block;  /*轉為塊級元素,才能設置span的寬高*/
            width: 52px;
            height: 28px;
            background-image: url(http://img.smyhvae.com/20180116_1115.png);
            background-position: -108px 0px; /*這裡用到了精靈圖*/
            position: absolute;  /*採用絕對定位的方式,將精靈圖蓋在最上層*/
            top: -9px;
            left: 13px;
        }
        .box h4{
            background-color: black;
            color: white;
            width:308px;
            height: 40px;
            line-height: 40px;
            position: absolute;
            top: 156px;
        }
    </style>
</head>
<body>
    <div class="box">
        <span class="dtc"></span>
        <div class="image">
            <img src="http://img.smyhvae.com/20180116_1116.jpg" alt="">
        </div>
        <h4>廣東深圳寶安區建安一路海雅繽紛城4樓</h3>
    </div>
</body>
</html>

代碼解釋如下:

  • 為了顯示“多套餐”那個小圖,我們需要用到精靈圖。

  • “多套餐”下方黑色背景的文字都是通過“子絕父相”的方式的蓋在大海報image的上方的。

代碼的效果如下:

讓絕對定位中的盒子居中

我們知道,如果想讓一個標準流中的盒子居中(水平方向看),可以將其設置margin: 0 auto屬性。

可如果盒子是絕對定位的,此時已經脫標了,如果還想讓其居中,可以這樣做:

<div>
    width: 600px;
    height: 60px;
    position: absolute;  絕對定位的盒子
    left: 50%;           首先,讓左邊線居中
    top: 0;
    margin-left: -300px;  然後,向左移動寬度(600px)的一半
</div>

如上方代碼所示,我們先讓這個寬度為600px的盒子,左邊線居中,然後向左移動寬度(600px)的一半,就達到效果了。

我們可以總結成一個公式:

left:50%; margin-left:負的寬度的一半

固定定位

固定定位:就是相對瀏覽器視窗進行定位。無論頁面如何滾動,這個盒子顯示的位置不變。

備註:IE6不相容。

用途1:網頁右下角的“返回到頂部”

比如我們經常看到的網頁右下角顯示的“返回到頂部”,就可以固定定位。

    <style type="text/css">
        .backtop{
            position: fixed;
            bottom: 100px;
            right: 30px;
            width: 60px;
            height: 60px;
            background-color: gray;
            text-align: center;
            line-height:30px;
            color:white;
            text-decoration: none;   /*去掉超鏈接的下劃線*/
        }
    </style>

用途2:頂部導航條

我們經常能看到固定在網頁頂端的導航條,可以用固定定位來做。

需要註意的是,假設頂部導航條的高度是60px,那麼,為了防止其他的內容被導航條覆蓋,我們要給body標簽設置60px的padding-top。

頂部導航條的實現如下:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
    <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
    <title>Document</title>
    <style type="text/css">
        *{
            margin: 0;
            padding: 0;
        }
body{
            /*為什麼要寫這個?*/
            /*不希望我們的頁面被nav擋住*/
            padding-top: 60px;
            /*IE6不相容固定定位,所以這個padding沒有什麼用,就去掉就行了*/
            _padding-top:0;
        }
        .nav{
            position: fixed;
            top: 0;
            left: 0;
            width: 100%;
            height: 60px;
            background-color: #333;
            z-index: 99999999;
        }
        .inner_c{
            width: 1000px;
            height: 60px;
            margin: 0 auto;

        }
        .inner_c ul{
            list-style: none;
        }
        .inner_c ul li{
            float: left;
            width: 100px;
            height: 60px;
            text-align: center;
            line-height: 60px;
        }
        .inner_c ul li a{
            display: block;
            width: 100px;
            height: 60px;
            color:white;
            text-decoration: none;
        }
        .inner_c ul li a:hover{
            background-color: gold;
        }
        p{
            font-size: 30px;
        }
        .btn{
            display: block;
            width: 120px;
            height: 30px;
            background-color: orange;
            position: relative;
            top: 2px;
            left: 1px;
        }
    </style>
</head>
<body>
    <div class="nav">
        <div class="inner_c">
            <ul>
                <li><a href="#">網頁欄目</a></li>
                <li><a href="#">網頁欄目</a></li>
                <li><a href="#">網頁欄目</a></li>
                <li><a href="#">網頁欄目</a></li>
                <li><a href="#">網頁欄目</a></li>
                <li><a href="#">網頁欄目</a></li>
                <li><a href="#">網頁欄目</a></li>
                <li><a href="#">網頁欄目</a></li>
                <li><a href="#">網頁欄目</a></li>
                <li><a href="#">網頁欄目</a></li>
            </ul>
        </div>
    </div>
</body>
</html>

5、z-index屬性:

z-index屬性:表示誰壓著誰。數值大的壓蓋住數值小的。

有如下特性:

(1)屬性值大的位於上層,屬性值小的位於下層。

(2)z-index值沒有單位,就是一個正整數。預設的z-index值是0。

(3)如果大家都沒有z-index值,或者z-index值一樣,那麼在HTML代碼里寫在後面,誰就在上面能壓住別人。定位了的元素,永遠能夠壓住沒有定位的元素。

(4)只有定位了的元素,才能有z-index值。也就是說,不管相對定位、絕對定位、固定定位,都可以使用z-index值。而浮動的元素不能用

(5)從父現象:父親慫了,兒子再牛逼也沒用。意思是,如果父親1比父親2大,那麼,即使兒子1比兒子2小,兒子1也能在最上層。

針對(1)(2)(3)條,舉例如下:

這是預設情況下的例子:(div2在上層,div1在下層)

現在加一個z-index屬性,要求效果如下:

第五條分析:

z-index屬性的應用還是很廣泛的。當好幾個已定位的標簽出現覆蓋的現象時,我們可以用這個z-index屬性決定,誰處於最上方。

我的公眾號

想學習代碼之外的軟技能?不妨關註我的微信公眾號:生命團隊(id:vitateam)。

掃一掃,你將發現另一個全新的世界,而這將是一場美麗的意外:


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 閱讀本書主要目的: 自從學會CSS以來,雖然熟練掌握了其使用方法和技巧,但對其底層的原理和實現並不清晰,閱讀本書想進一步系統化的學習和深入研究其本質,對這門前端基礎語言從熟練使用到真正理解。 第1章 CSS和文檔 1.1 WEB的衰落(為了表現增加很多標記元素如font等,這些阻礙了頁面的結構化) ...
  • 眾所周知,文本溢出顯示省略號用CSS就可以: 單行文本: 多行文本: 如果想中間顯示省略號呢?? 現在需求是,一段文本很長,但最後有一個關鍵詞很重要,而且改關鍵詞有括弧括起來的,需要顯示出來,所以如果文本過長,不單隻做省略號處理,還要把括弧裡面的內容顯示出來。 上面的代碼意思是:如果文本長度大於13 ...
  • 三種密碼強度的正則表達式: 較弱:全是數字或全是字母 6-16個字元:/^[0-9]{6,16}$|^[a-zA-Z]{6,16}$/; 中級:數字、26個英文字母 6-16個字元: /^[A-Za-z0-9]{6,16}$/; 較高:由數字、26個英文字母或者下劃線組成的字元串 6-16個字元: ...
  • 1、概述 簡單值(基本類型)通過值複製的方式來賦值/傳遞。 複合值(對象)通過引用複製的方式來賦值/傳遞。 結合記憶體示意圖,理解會更深刻。 簡單類型的值在常量池只有一份,變數a和變數b都是常量池中2的一個副本。 變數c和變數d都是指向堆中的一個數組對象。 ...
  • <! TOC "作用域與閉包" "什麼是作用域" "編譯器" "理解作用域" "嵌套的作用域" "詞法作用域" "詞法分析時" "欺騙詞法作用域" "函數與塊作用域" "函數中的作用域" "隱藏標識符於普通作用域" "函數作為作用域" "塊作為作用域" "提升" "先有雞還是先有蛋?" "編譯器再次 ...
  • 本文詳細介紹了table-layout的屬性值、定義和用法、固定表格佈局、自動表格佈局等……希望可以幫到你喲! ...
  • 需求:用的heightcharts插件,點擊曲線圖想獲得所點擊點的返回值,如圖 問題代碼: (function chart_line(){ var data={"title":["01","02","03","04","05","06","07","08","09","10","11","12"], ...
  • 2.this的綁定規則 1.預設綁定 在代碼中,foo()函數不帶任何修飾的引用進行調用的,那麼只能使用預設綁定。 2.隱式綁定 調用位置使用obj上下文來引用函數foo2,故可以說函數被調用時obj對象“擁有”或“包含”該函數foo2()。那麼foo2函數被調用時,確實加上了對obj的引用。當函數 ...
一周排行
    -Advertisement-
    Play Games
  • GoF之工廠模式 @目錄GoF之工廠模式每博一文案1. 簡單說明“23種設計模式”1.2 介紹工廠模式的三種形態1.3 簡單工廠模式(靜態工廠模式)1.3.1 簡單工廠模式的優缺點:1.4 工廠方法模式1.4.1 工廠方法模式的優缺點:1.5 抽象工廠模式1.6 抽象工廠模式的優缺點:2. 總結:3 ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 本章將和大家分享ES的數據同步方案和ES集群相關知識。廢話不多說,下麵我們直接進入主題。 一、ES數據同步 1、數據同步問題 Elasticsearch中的酒店數據來自於mysql資料庫,因此mysql數據發生改變時,Elasticsearch也必須跟著改變,這個就是Elasticsearch與my ...
  • 引言 在我們之前的文章中介紹過使用Bogus生成模擬測試數據,今天來講解一下功能更加強大自動生成測試數據的工具的庫"AutoFixture"。 什麼是AutoFixture? AutoFixture 是一個針對 .NET 的開源庫,旨在最大程度地減少單元測試中的“安排(Arrange)”階段,以提高 ...
  • 經過前面幾個部分學習,相信學過的同學已經能夠掌握 .NET Emit 這種中間語言,並能使得它來編寫一些應用,以提高程式的性能。隨著 IL 指令篇的結束,本系列也已經接近尾聲,在這接近結束的最後,會提供幾個可供直接使用的示例,以供大伙分析或使用在項目中。 ...
  • 當從不同來源導入Excel數據時,可能存在重覆的記錄。為了確保數據的準確性,通常需要刪除這些重覆的行。手動查找並刪除可能會非常耗費時間,而通過編程腳本則可以實現在短時間內處理大量數據。本文將提供一個使用C# 快速查找並刪除Excel重覆項的免費解決方案。 以下是實現步驟: 1. 首先安裝免費.NET ...
  • C++ 異常處理 C++ 異常處理機制允許程式在運行時處理錯誤或意外情況。它提供了捕獲和處理錯誤的一種結構化方式,使程式更加健壯和可靠。 異常處理的基本概念: 異常: 程式在運行時發生的錯誤或意外情況。 拋出異常: 使用 throw 關鍵字將異常傳遞給調用堆棧。 捕獲異常: 使用 try-catch ...
  • 優秀且經驗豐富的Java開發人員的特征之一是對API的廣泛瞭解,包括JDK和第三方庫。 我花了很多時間來學習API,尤其是在閱讀了Effective Java 3rd Edition之後 ,Joshua Bloch建議在Java 3rd Edition中使用現有的API進行開發,而不是為常見的東西編 ...
  • 框架 · 使用laravel框架,原因:tp的框架路由和orm沒有laravel好用 · 使用強制路由,方便介面多時,分多版本,分文件夾等操作 介面 · 介面開發註意欄位類型,欄位是int,查詢成功失敗都要返回int(對接java等強類型語言方便) · 查詢介面用GET、其他用POST 代碼 · 所 ...
  • 正文 下午找企業的人去鎮上做貸後。 車上聽同事跟那個司機對罵,火星子都快出來了。司機跟那同事更熟一些,連我在內一共就三個人,同事那一手指桑罵槐給我都聽愣了。司機也是老社會人了,馬上聽出來了,為那個無辜的企業經辦人辯護,實際上是為自己辯護。 “這個事情你不能怪企業。”“但他們總不能讓銀行的人全權負責, ...