1. 程式人生 > 實用技巧 >web十四講,CSS定位

web十四講,CSS定位

CSS定位

  • 定位允許定義元素框相對於其正常位置或父元素、另一個元素甚至是瀏覽器本身來重新定義應該出現的位置。
  • CSS為定位和浮動提供了一些屬性,利用這些屬性,可以建立列式佈局,將佈局的一部分與另一部分重疊,還可以完成多年來通常需要使用多個表格才能完成的任務。

一切皆是框

  • div、h1或p元素常常被稱為塊級元素。這意味著這些元素顯示為一塊內容,即“塊框”。
  • 與之相反,span和strong等元素稱為“行內元素”,這是因為它們的內容顯示在行內,即“行內框”。

CSS定位機制

  • 普通流
  • 浮動
  • 絕對定位
  • 除非專門指定,否則所有框都在普通流中定位。即普通流中的元素位置由元素在(X)HTML中的位置決定。
  • 塊級框從上到下依次排列,框之間的垂直距離是由框的垂直外邊距計算得來。
  • 行內框在一行中水平佈置。可以使用水平內邊距、邊框和外邊距來調整它們的間距。但是,垂直內邊距、邊框和外邊距不影響行內框的高度。
  • 由一行形成的水平框稱為行框(Line Box),行框的高度總是足以容納它包含的所有行內框。不過,設定行高可以增加這個框的高度。

CSS position屬性

  • static靜態定位:元素框正常生成,預設值。塊級元素生成一個矩形框,作為文件流的一部分,行內元素則會建立一個或多個行框,置於其父元素中。
  • relative相對定位:元素框偏移某個距離。元素仍保持其未定位前的形狀,它原本所佔的空間仍保留。
  • abslute絕對定位:元素框從文件流完全刪除,並相對於其包含塊定位。包含塊可能是文件中的另一個元素或是初始包含塊。元素原先在正常文件流中所佔的空間會關閉,就好像元素不存在一樣。元素定位後生成一個塊級框,而不論原來它在正常流中所生成何種型別的框
  • fixed固定定位:元素框的表現類似於將position設定為absolute,不過其包含塊是視窗本身。

CSS定位屬性

屬性 描述
position 把元素放置到一個靜態的、相對的、絕對的或固定的位置中。
top 定義元素的上外邊距邊界與其包含塊上邊界之間的偏移。
right 定義元素的右外邊距邊界與其包含塊右邊界之間的偏移。
bottom 定義元素的下外邊距邊界與其包含塊下邊界之間的偏移。
left 定義元素的左外邊距邊界與其包含塊左邊界之間的偏移。
overflow 設定當元素的內容溢位其區域時發生的事情。
clip 設定元素的形狀。元素被剪入這個形狀之中,然後顯示出來。
vertical-align 設定元素的垂直對齊方式。
z-index 設定元素的堆疊順序。

CSS相對定位

  • 設定為相對定位的元素框會偏移某個距離。元素仍然保持其未定位前的形狀,它原本所佔的空間仍保留。

  • 注意,在使用相對定位時,無論是否進行移動,元素仍然佔據原來的空間。因此,移動元素會導致它覆蓋其它框。

  • 例如:若將top設定為20px,那麼框將在原位置頂部下20畫素的地方。若left設定為30畫素,那麼會在元素左邊建立30畫素的空間,也就是將元素向右移動。

    #box_relative{
        position:relative;
        left:30px;
        top:20px;
    }
    

  • 案例:

    <!DOCTYPE html>
    <html lang="en">
    
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <style type="text/css">
            h2.pos_left {
                position: relative;
                left: -20px
            }
    
            h2.pos_right {
                position: relative;
                left: 20px
            }
        </style>
        <title>Document</title>
    </head>
    
    <body>
        <h2>這是位於正常位置的標題</h2>
        <h2 class="pos_left">這個標題相對於其正常位置向左移動</h2>
        <h2 class="pos_right">這個標題相對於其正常位置向右移動</h2>
        <p>相對定位會按照元素的原始位置對該元素進行移動。</p>
        <p>樣式 "left:-20px" 從元素的原始左側位置減去 20 畫素。</p>
        <p>樣式 "left:20px" 向元素的原始左側位置增加 20 畫素。</p>
    </body>
    
    </html>
    

CSS絕對定位

  • 設定為絕對定位的元素框從文件流完全刪除,並相對於其包含塊定位,包含塊可能是文件中的另一個元素或是初始包含塊。

  • 元素原先在正常文件流中所佔的空間會關閉,就好像該元素原來不存在一樣。元素定位後生成一個塊級框,而不論它在正常流中生成何種型別的框。

  • 普通流中其它元素的佈局就像絕對定位的元素不存在一樣。

  • 絕對定位的元素其位置相對於最近的已定位祖先元素,若元素沒有已定位的祖先元素,那麼它的位置相對於最初的包含塊。

  • 根據使用者代理的不同,最初的包含塊可能是畫布或HTML元素。

  • 提示:因為絕對定位的框與文件流無關,所以它們可以覆蓋頁面上的其它元素。可以通過設定z-index屬性來控制這些框的堆放次序。

  • 案例:

    <!DOCTYPE html>
    <html lang="en">
    
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <style type="text/css">
            h2.pos_abs {
                position: absolute;
                left: 100px;
                top: 150px
            }
        </style>
        <title>Document</title>
    </head>
    
    <body>
        <h2 class="pos_abs">這是帶有絕對定位的標題</h2>
        <p>通過絕對定位,元素可以放置到頁面上的任何位置。下面的標題距離頁面左側 100px,距離頁面頂部 150px。</p>
    </body>
    
    </html>
    

CSS浮動

  • 浮動的框可以向左或向右移動,直到它的外邊緣碰到包含框或另一個浮動框的邊框為止。

  • 由於浮動框不在文件的普通流中,所以文件的普通流中的塊框表現得就像浮動框不存在一樣。

    • 案例1:當把框1向右浮動時,它脫離文件流並且向右移動,直到它的右邊緣碰到包含框的右邊緣。

  • 案例2:當框1向左浮動時,它脫離文件流並且向左移動,直到它的左邊緣碰到包含框的左邊緣。因為它不再處於文件流中,所以它不佔據空間,實際上覆蓋了框2,使框2從檢視中消失。

  • 案例3:若把所有三個框都向左浮動,那麼框1向左浮動直到碰到包含框,另外2個框向左浮動直到碰到前一個浮動框。

  • 案例4:若包含框太窄,無法容納水平排列的三個浮動元素,那麼其它浮動塊向下移動,直到有足夠的空間。若浮動元素的高度不同,那麼當它們向下移動時可能被其它浮動元素“卡住”。

  • 通過float屬性實現元素的浮動。

    • CSS中,任何元素都可以浮動。浮動元素會生成一個塊級框,而不論它本身是何種元素。
  • CSS float屬性。

    • 如果浮動為非替換元素,則要指定一個明確的寬度;否則它們會盡可能地窄。

    • 假如在一行之上只有極少的空間可供浮動,那麼這個元素會跳到下一行,直到某一行擁有足夠的空間為止。

    • 可能的值:

      • left:元素向左浮動。
      • right:元素向右浮動。
      • none:預設值。元素不浮動,並會顯示在文字中出現的位置。
      • inherit:從父元素繼承float屬性值。
    • 案例:

      <!DOCTYPE html>
      <html lang="en">
      
      <head>
          <meta charset="UTF-8">
          <meta name="viewport" content="width=device-width, initial-scale=1.0">
          <meta http-equiv="X-UA-Compatible" content="ie=edge">
          <style type="text/css">
              img {
                  float: right
              }
          </style>
          <title>float 屬性的簡單應用</title>
      </head>
      
      <body>
          <p>在下面的段落中,我們添加了一個樣式為 <b>float:right</b> 的影象。結果是這個影象會浮動到段落的右側。</p>
          <p>
              <img src="eg_cute.gif" />
              This is some text. This is some text. This is some text.
              This is some text. This is some text. This is some text.
              This is some text. This is some text. This is some text.
              This is some text. This is some text. This is some text.
              This is some text. This is some text. This is some text.
              This is some text. This is some text. This is some text.
              This is some text. This is some text. This is some text.
              This is some text. This is some text. This is some text.
              This is some text. This is some text. This is some text.
              This is some text. This is some text. This is some text.
          </p>
      </body>
      
      </html>
      

行距和清理(clear)

  • 浮動框旁邊的行距被縮短,從而給浮動框流出空間,行框圍繞浮動框。因此,建立浮動框可以使文字圍繞影象。

  • 清理(clear)

    • 想要阻止行框圍繞浮動框,需要對該框應用clear屬性。

    • clear屬性的值可以是left、right、both或none,它表示框的哪些邊旁邊不能有浮動框。它讓周圍的元素為浮動框流出空間。

    • 可能的值:

      • none:預設值,兩側允許浮動。
      • left:左側不能浮動。
      • right:右側不能浮動。
      • both:兩側都不能浮動。
      • inherib:從父元素繼承clear屬性值。
    • 案例:

      <!DOCTYPE html>
      <html lang="en">
      
      <head>
          <meta charset="UTF-8">
          <meta name="viewport" content="width=device-width, initial-scale=1.0">
          <meta http-equiv="X-UA-Compatible" content="ie=edge">
          <style type="text/css">
              .img1 {
                  float: left;
                  clear: right;
                  ;
              }
      
              .img2 {
                  float: left;
                  clear: left;
              }
          </style>
          <title>Document</title>
      </head>
      
      <body>
          <img class="img1" src="eg_smile.gif" />
          <img class="img2" src="eg_smile.gif" />
      </body>
      
      </html>
      

說明:本來2個蘋果都是浮動框,請注意看蘋果1的clear屬性值是right,表明右邊不能浮動;蘋果2的clear屬性值也是right,表明它右側不能浮動左側可以浮動,最後結果會兩個蘋果並排;再將蘋果2的clear數值改為left表明左側不能浮動,那麼結果就成了上下排列。這些細節和想象中不一樣,實際需要多多練習。