CSS 中的定位(position)

經典的定位屬性。

static

瀏覽器預設的定位方式,該放在哪就放在哪:

1
2
3
<div class="box">box1</div>
<div class="box">box2</div>
<div class="box">box3</div>
1
2
3
4
5
6
.box {
width: 100px;
height: 100px;
margin: 10px 0;
background: orange;
}

結果:

static

relative

根據原本(static)的位置來做偏移,要注意的是不會影響到旁邊的元素。

HTML:

1
2
3
<div class="box">box1</div>
<div class="box">box2</div>
<div class="box">box3</div>

CSS:

1
2
3
4
5
6
7
8
9
10
11
.box {
width: 100px;
height: 100px;
margin: 10px 0;
background: orange;
}
.box:nth-child(2) {
position: relative;
left: 120px;
top: 50px;
}

結果:

relative

absolute

針對某個參考點來定位。就像 relative 是針對原本(static)的位置來定位一樣,absoulte 是讓你可以自己指定要參考點。

至於參考點的機制是:往上找不是 static 的元素,如果都找不到就把「視窗(viewport)」當參考點。

備註:要注意旁邊的元素會自動遞補空間。

下面讓 box-innerbox:nth-child(2) 來做定位:

1
2
3
4
5
6
7
8
9
<div class="box">box1</div>
<div class="box">
box-2
<div class="box-inner">X</div>
</div>
<div class="box">box3</div>
<div class="box">box4</div>
<div class="box">box5</div>
<div class="box">box6</div>

CSS:

1
2
3
4
5
6
7
8
9
.box:nth-child(2) {
position: relative;
}
.box-inner {
position: absolute;
top: 0;
right: 0;
background: red;
}

結果:

absolute-01

如果沒有設定參考點的話就會定位到視窗(viewport):

1
2
3
4
5
6
.box-inner {
position: absolute;
top: 0;
right: 0;
background: red;
}

結果:

absolute-02

備註:如果你不信的話,試著把 <html><body> 都設成固定寬高,就會發現元素的位置隨著不會改變,這就證明參考點不是它們。

fixed

根據視窗(viewport)的位置來定位,特性是不管怎麼捲動都會在原本的位置。

備註:要注意旁邊的元素會自動遞補空間。

1
2
3
4
5
6
<div class="box">box1</div>
<div class="box">box2</div>
<div class="box">box3</div>
<div class="box">box4</div>
<div class="box">box5</div>
<div class="box">box6</div>

CSS:

1
2
3
4
5
6
7
8
.box:nth-child(2) {
position: fixed;
width: 100px;
height: 100px;
right: 100px;
bottom: 100px;
background-color: red;
}

結果:

fixed

sticky

在碰到 top 的點之前是 static,碰到之後就黏住(很像 fixed 的感覺):

備註:此處的參考點是視窗(viewport)

CSS:

1
2
3
4
5
.box:nth-child(2) {
position: sticky;
top: 10px;
background-color: red;
}

結果:

sticky

z-index

用來設定圖層的位置,舉例來說:

1
2
3
4
5
6
7
8
<body>
<div class="box">box1</div>
<div class="box">box2</div>
<div class="box">box3</div>
<div class="box">box4</div>
<div class="box">box5</div>
<div class="box">box6</div>
</body>

CSS:

1
2
3
4
5
6
7
8
9
10
11
12
13
.box {
background: orange;
width: 300px;
height: 200px;
margin: 10px 0px;
font-size: 2em;
text-align: center;
position: relative;
}
.box:nth-child(2) {
top: -100px;
background-color: red;
}

結果:

z-index-01

CSS:

1
2
3
4
5
6
7
8
9
10
11
12
13
.box {
background: orange;
width: 300px;
height: 200px;
margin: 10px 0px;
font-size: 2em;
text-align: center;
position: relative;
}
.box:nth-child(2) {
top: 100px;
background-color: red;
}

結果:

z-index-02

同樣都是覆蓋,但在後面的會蓋掉前面的,如果不想被蓋呢?加上 z-index

CSS:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
.box {
background: orange;
width: 300px;
height: 200px;
margin: 10px 0px;
font-size: 2em;
text-align: center;
position: relative;
}
.box:nth-child(2) {
top: 100px;
background-color: red;
z-index: 1;
}

結果:

z-index-03

CSS 中的 display 屬性 CSS pseudo-element
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×