關於兩欄式的一些小分享

Share This Post

在兩欄式版面,設定margin-left:-100%的用途

實作

  1. 建立一份index.html 以及 index.css
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><meta name="viewport" content="width=device-width, initial-scale=1.0"/><link href="index.css" rel="stylesheet"/><title>首頁</title></head><body></body></html>

index.css

* {
  margin: 0;
  padding: 0;
  box-sizing: border-box;
}
  1. 基本佈局

index.html

<div class ="container"><div class="middle">Middle</div><div class="left">Left</div><div class="right">Right</div></div>
  • 首先設置左右兩個div寬度以及container容器的左右那邊距分別為left、right盒子的寬度,這是兩個盒子的佈局位置。

index.css

//窗口小于一定值时布局会混乱,因此加一个最小宽度
//阈值 = 左width x 2 + 右widthbody{
  min-width: 700px; 
}
.container{
  padding: 0300px0200px;
}
.middle{
  width: 100%;
  height: 200px;
  background: #ccc;
}
.left{
  width: 200px;
  height: 200px;
  background: green;
}
.right{
  width: 300px;
  height: 200px;
  background: orange;
}

做完成果如下:

  1. 添加浮動

左浮動:

.middle,.left,.right{
  float: left
}

可以看到黃色的部分網上移動了

  1. left right盒子移動
  • 負margin
    • 讓left與right爬升至第一行
  • 負margin的眾多表現行為之中,這裡只討論脫離了文檔的浮動元素的情況。
  • 設置了之後,我們可以知道這三個盒子都脫離了html的文檔,要讓綠色的left往上爬,需要使用到負margin,這個負margin是多少呢?取決於兩個條件:
    • 元素的寬度
    • 元素與上一個元素之間的空白空間
    • 我們對當前的佈局做一下修改,將right盒子註釋,middle盒子修改為如下寬度:
.middle{
  width: calc(100% - 166px)
}
  • 現在middle與left之間就有了166px的空白空間。

設置 margin-left: -10px,會發現left盒子仍在當前行高移動,只不過向左侧移動了10px,接下来设置margin-left: -34px,此时left盒子已经成功上升到第一行了。

  • margin-left: -10px;
  • margin-left: -34px;

然而这是为什么呢?

  • html元素=margin + border + padding + content,那佈局是根據每個div的屬性來決定的,對於設置了浮動的鄉林元素而言,他們脫離了正常的html,當對一個元素設置負margin時,按照第一條規則來看,元素對應的div變小了,負margin多少,就縮小多少。
  • 在這個範例中我們設置了margin-left:-34px,本質上div的寬度較之前減少了34px的寬度,實踐上的佈局寬度變為200-34=166px,而166px正是他上一行相鄰元素的空白寬度,因此left的盒子就會流到這個為他量身定做的位置,即:left填補了這一塊空白空間。

經過一小部分得獎解,大家應該可以明白其中的關鍵原理,那麼我們先將上面的改動還原回去,繼續往下製作。

那麼可以思考一下,left的盒子與上一行相鄰元素有沒有空白區域,應該沒有!所以想要讓left往上流的話,可以使用margin設置為-200px,他就會上升到第一行的末端。

margin設置為-200px

margin-left: -200px;

執行結果如下:

接下來讓left盒子移動到最左側,根據上圖來直接移動,x 的像素即可,x的寬度是100%,即他們共同的父元素的寬度,left須設置margin-left:-100%

到这里先停一下,處理一下right div,使用margin-left: -300px即可

.right{
    margin-left: -300px
}

結果如下,可以看到全部的div都變成同一層了。

  1. 佈局

此時的left與right分別在container的左右兩端(注意,這邊是內側),因此我們要讓他們最終分布在container的為側,即左右padding,這兩個距離多少我們是知道的,就是我們的左右div,使用絕對定位即可達成。

.left{
    position: relative;
    left: -200px
}
.right{
    position: relative;
    right: -300px;
}

整格頁面就被填滿了。

實作完成!!!!

完整程式碼:

index.html:

<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><meta name="viewport" content="width=device-width, initial-scale=1.0"/><link href="index.css" rel="stylesheet"/><title>首頁</title></head><body><div class="container"><div class="middle">Middle</div><div class="left">Left</div><div class="right">Right</div></div></body></html>

index.css:

* {
  margin: 0;
  padding: 0;
  box-sizing: border-box;
}

body {
  min-width: 700px;
}
.container {
  padding: 0300px0200px;
}
.middle {
  width: 100%;
  height: 200px;
  background: #ccc;
}
.left {
  width: 200px;
  height: 200px;
  background: green;
  margin-left: -100%;
  position: relative;
  left: -200px;
}
.right {
  width: 300px;
  height: 200px;
  background: orange;
  margin-left: -300px;
  position: relative;
  right: -300px;
}

.middle,
.left,
.right {
  float: left;
}

訂閱研究文章

Get updates and learn from the best

More To Explore

Scroll to Top

hurry up !

軟體工程師培訓

限時免費報名中

藉由與「真實世界軟體專案」相同的技術、工具與開發流程,化簡成與商業機密無關、門檻較低更容易上手的「模擬專案」,讓你有機會在職場前輩的陪伴下,完成真槍實彈的練習,動手解決真實的問題,快速累積個人的經驗與作品,而不只是「學習技術」而已。