一种兼容性强的双飞翼布局写法
二者的来历#
圣杯布局的来历是2006年发在a list part上的这篇文章:In Search of the Holy Grail · An A List Apart Article圣杯是西方表达“渴求之物"的意思,不是一种对页面的形象表达。双飞翼据考源自淘宝UED,应该是一种页面的形象的表达。
二者的功能和区别#
圣杯布局和双飞翼布局解决的问题是一样的,就是两边定宽,中间自适应的三栏布局,中间栏要在放在文档流前面以优先渲染。圣杯布局和双飞翼布局解决问题的方案在前一半是相同的,也就是三栏全部float浮动,但左右两栏加上负margin让其跟中间栏div并排,以形成三栏布局。不同在于解决”中间栏div内容不被遮挡“问题的思路不一样:圣杯布局,为了中间div内容不被遮挡,将中间div设置了左右padding-left和padding-right后,将左右两个div用相对布局position: relative并分别配合right和left属性,以便左右两栏div移动后不遮挡中间div。双飞翼布局,为了中间div内容不被遮挡,直接在中间div内部创建子div用于放置内容,在该子div里用margin-left和margin-right为左右两栏div留出位置。多了1个div,少用大致4个css属性(圣杯布局中间divpadding-left和padding-right这2个属性,加上左右两个div用相对布局position: relative及对应的right和left共4个属性,一共6个;而双飞翼布局子div里用margin-left和margin-right共2个属性,6-2=4),个人感觉比圣杯布局思路更直接和简洁一点。
双飞翼布局的实现#
DOM文档结构如下:
<div class="bd-3-lr">
<div class="main col">
<div class="main-wrap">
<p>主内容栏自适应宽度并优先加载</p>
</div>
</div>
<div class="aside-1 col">
<p>侧边栏1固定宽度</p>
</div>
<div class="aside-2 col">
<p>侧边栏2固定宽度</p>
</div>
</div>
CSS code如下:
.bd-3-lr {
zoom: 1;
overflow: hidden;
margin: 10px 0;
}
.main {
width: 100%;
background-color: linen;
}
.main .main-wrap {
background-color: #ff80ff;
/* 使左右等高 */
padding-bottom: 10000px;
margin-bottom: -10000px;
}
.aside1,
.aside2 {
width: 200px;
background-color: #ff00ff;
/* 使左右等高 */
padding-bottom: 10000px;
margin-bottom: -10000px;
}
.col {
float: left;
}
.bd-3-lr .main-wrap {
margin: 0 210px;
/* 使左右等高 */
padding-bottom: 10000px;
margin-bottom: -10000px;
}
.bd-3-lr .aside1 {
margin-left: -100%;
}
.bd-3-lr .aside2 {
margin-left: -200px;
}
了解这种布局原理后,可以自行制作三栏的不同分布情况,示例。
示例的全部源码如下:
<!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">
<title>双飞翼布局</title>
<style>
body {
font-size: 18px;
color: linen;
background-color: #fff;
padding: 0;
margin: 0;
}
p {
margin: 0;
padding: 20px;
text-align: center;
}
.hd,
.ft {
width: 100%;
background-color: #c0c0c0;
}
.bd-lft,
.bd-rgt,
.bd-3-lr,
.bd-3-ll,
.bd-3-rr {
zoom: 1;
overflow: hidden;
margin: 10px 0;
}
.main {
width: 100%;
background-color: linen;
/* 使左右等高 */
/* padding-bottom: 10000px;
margin-bottom: -10000px; */
}
.main .main-wrap {
background-color: #ff80ff;
/* 使左右等高 */
padding-bottom: 10000px;
margin-bottom: -10000px;
}
.aside,
.aside1,
.aside2 {
width: 200px;
background-color: #ff00ff;
/* 使左右等高 */
padding-bottom: 10000px;
margin-bottom: -10000px;
}
.col {
float: left;
/* 使左右等高 */
/* padding-bottom: 20000px;
margin-bottom: -20000px; */
}
.bd-lft .main-wrap {
margin-left: 210px;
}
.bd-lft .aside {
margin-left: -100%;
}
.bd-rgt .main-wrap {
margin-right: 210px;
}
.bd-rgt .aside {
margin-left: -200px;
}
.bd-3-lr .main-wrap {
margin: 0 210px;
/* 使左右等高 */
padding-bottom: 10000px;
margin-bottom: -10000px;
}
.bd-3-lr .aside1 {
margin-left: -100%;
}
.bd-3-lr .aside2 {
margin-left: -200px;
}
.bd-3-ll .main-wrap {
margin-left: 420px;
}
.bd-3-ll .aside1 {
margin-left: -100%;
}
.bd-3-ll .aside2 {
margin-left: calc(-100% + 210px);
}
.bd-3-rr .main-wrap {
margin-right: 420px;
}
.bd-3-rr .aside1 {
margin-left: -410px;
}
.bd-3-rr .aside2 {
margin-left: -200px;
}
</style>
</head>
<body>
<div class="hd">
<p>我是头部</p>
</div>
<div class="bd-lft">
<div class="main col">
<div class="main-wrap">
<p>我是右侧自适应栏</p>
<p>我是右侧自适应栏</p>
<p>我是右侧自适应栏</p>
</div>
</div>
<div class="aside col">
<p>我是定宽左侧边栏</p>
</div>
</div>
<div class="bd-rgt">
<div class="main col">
<div class="main-wrap">
<p>我是左侧自适应栏</p>
</div>
</div>
<div class="aside col">
<p>我是定宽右侧边栏</p>
<p>我是定宽右侧边栏</p>
<p>我是定宽右侧边栏</p>
</div>
</div>
<div class="bd-3-lr">
<div class="main col">
<div class="main-wrap">
<p>我是左侧自适应栏</p>
<p>我是左侧自适应栏</p>
<p>我是左侧自适应栏</p>
</div>
</div>
<div class="aside1 col">
<p>我是定宽左侧边栏</p>
<p>我是左侧自适应栏</p>
</div>
<div class="aside2 col">
<p>我是定宽右侧边栏</p>
<p>我是左侧自适应栏</p>
<p>我是左侧自适应栏</p>
</div>
</div>
<div class="bd-3-ll">
<div class="main col">
<div class="main-wrap">
<p>我是左侧自适应栏</p>
<p>我是左侧自适应栏</p>
<p>我是左侧自适应栏</p>
</div>
</div>
<div class="aside1 col">
<p>我是定宽左侧边栏</p>
<p>我是左侧自适应栏</p>
</div>
<div class="aside2 col">
<p>我是定宽右侧边栏</p>
<p>我是左侧自适应栏</p>
</div>
</div>
<div class="bd-3-rr">
<div class="main col">
<div class="main-wrap">
<p>我是左侧自适应栏</p>
<p>我是左侧自适应栏</p>
</div>
</div>
<div class="aside1 col">
<p>我是定宽左侧边栏</p>
<p>我是左侧自适应栏</p>
</div>
<div class="aside2 col">
<p>我是定宽右侧边栏</p>
<p>我是左侧自适应栏</p>
<p>我是左侧自适应栏</p>
</div>
</div>
<div class="ft">
<p>我是尾部</p>
</div>
</body>
</html>
作者:飛華
出处:https://www.cnblogs.com/sobin/p/17440545.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
转载请注明出处!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)