圣杯、双飞翼布局的多种实现方式

圣杯布局(Holy Grail Layout)和双飞翼布局(Double Flying Wings Layout)是两种经典的三栏布局方式,它们都实现了中间内容优先渲染、左右侧栏宽度固定、中间栏宽度自适应的效果。尽管它们在视觉效果上非常相似,但它们的实现方式和内部原理有显著的区别。本文将详细探讨这两种布局的区别,并通过多种方式(Flexbox、浮动、Grid)分别实现它们。


1. 圣杯布局与双飞翼布局的区别

1.1 实现方式

  • 圣杯布局

    • 使用Flexbox或浮动布局,通过order属性或负边距调整左右侧栏的位置。

    • 中间内容、左侧栏、右侧栏通常放在同一个父容器中。

  • 双飞翼布局

    • 通过负边距和相对定位实现布局。

    • 中间内容单独放在一个容器中,左右侧栏放在中间内容之后。

1.2 核心特点

  • 圣杯布局

    • 代码简洁,易于理解和维护。

    • 使用Flexbox时,布局更加灵活。

  • 双飞翼布局

    • 通过负边距实现布局,兼容性较好。

    • 适合需要更复杂布局的场景。

1.3 适用场景

  • 圣杯布局 :简单三栏布局,适合快速实现。

  • 双飞翼布局 :复杂三栏布局,适合需要更精细控制的场景。


2. 多种实现方式

2.1 使用Flexbox实现圣杯布局

HTML结构

1
2
3
4
5
6
7
8
9
<div class="container">
<header>Header</header>
<div class="main-content">
<main>Main Content</main>
<nav>Left Sidebar</nav>
<aside>Right Sidebar</aside>
</div>
<footer>Footer</footer>
</div>

CSS代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
.container {
display: flex;
flex-direction: column;
min-height: 100vh;
}

header, footer {
flex: 0 0 auto;
background-color: #ccc;
padding: 10px;
}

.main-content {
display: flex;
flex: 1;
}

main {
flex: 1;
background-color: #f9f9f9;
padding: 10px;
}

nav, aside {
flex: 0 0 200px;
background-color: #ddd;
padding: 10px;
}

nav {
order: -1;
}

2.2 使用浮动实现圣杯布局

HTML结构

1
2
3
4
5
6
7
8
9
<div class="container">
<header>Header</header>
<div class="main-content">
<main>Main Content</main>
<nav>Left Sidebar</nav>
<aside>Right Sidebar</aside>
</div>
<footer>Footer</footer>
</div>

CSS代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
.container {
min-height: 100vh;
}

header, footer {
background-color: #ccc;
padding: 10px;
}

.main-content {
overflow: hidden;
}

main {
float: left;
width: 100%;
background-color: #f9f9f9;
padding: 10px;
margin: 0 -200px;
}

nav, aside {
float: left;
width: 200px;
background-color: #ddd;
padding: 10px;
}

nav {
margin-left: -100%;
}

aside {
margin-left: -200px;
}

2.3 使用Grid实现圣杯布局

HTML结构

1
2
3
4
5
6
7
8
9
<div class="container">
<header>Header</header>
<div class="main-content">
<main>Main Content</main>
<nav>Left Sidebar</nav>
<aside>Right Sidebar</aside>
</div>
<footer>Footer</footer>
</div>

CSS代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
  

.container {
display: grid;
grid-template-rows: auto 1fr auto;
min-height: 100vh;
}

header, footer {
background-color: #ccc;
padding: 10px;
}

.main-content {
display: grid;
grid-template-columns: 200px 1fr 200px;
}

main {
background-color: #f9f9f9;
padding: 10px;
}

nav, aside {
background-color: #ddd;
padding: 10px;
}

2.4 使用Flexbox实现双飞翼布局

HTML结构

1
2
3
4
5
6
7
8
9
<div class="container">
<header>Header</header>
<div class="main-content">
<main>Main Content</main>
</div>
<nav>Left Sidebar</nav>
<aside>Right Sidebar</aside>
<footer>Footer</footer>
</div>

CSS代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
.container {
display: flex;
flex-direction: column;
min-height: 100vh;
}

header, footer {
flex: 0 0 auto;
background-color: #ccc;
padding: 10px;
}

.main-content {
flex: 1;
display: flex;
}

main {
flex: 1;
background-color: #f9f9f9;
padding: 10px;
margin: 0 200px;
}

nav, aside {
flex: 0 0 200px;
background-color: #ddd;
padding: 10px;
}

nav {
margin-left: -100%;
}

aside {
margin-left: -200px;
}

2.5 使用浮动实现双飞翼布局

HTML结构

1
2
3
4
5
6
7
8
9
<div class="container">
<header>Header</header>
<div class="main-content">
<main>Main Content</main>
<nav>Left Sidebar</nav>
<aside>Right Sidebar</aside>
</div>
<footer>Footer</footer>
</div>

CSS代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
    
.container {
min-height: 100vh;
}

header, footer {
background-color: #ccc;
}

.main-content {
float: left;
width: 100%;
}

main {
background-color: #f9f9f9;
margin: 0 200px;
}

nav, aside {
float: left;
width: 200px;
background-color: #ddd;
}

nav {
margin-left: -100%;
}

aside {
margin-left: -200px;
}