圣杯布局和双飞翼布局

article/2025/9/27 16:49:49

双飞翼布局与圣杯布局

圣杯布局和双飞翼布局是前端工程师需要日常掌握的重要布局方式。两者的功能相同,都是为了实现一个两侧宽度固定,中间宽度自适应的三栏布局。

特点:

  1. 两侧宽度固定,中间宽度自适应(三栏布局)
  2. 中间部分在DOM结构上有限,以便先行渲染
  3. 允许三列中的任意一列成为最高列
  4. 只需要使用一个额外的div标签

圣杯布局:
DOM结构:

<div class="header"></div>
<div class="container"><div class="center"></div><div class="left"></div><div class="right"></div>
</div>
<div class="footer"></div>

首先定义出整个布局的DOM结构,主体部分是由container包裹的center,left,right三列,其中center定义在最前面。

CSS代码:
假设左侧的固定宽度为200px,右侧的固定宽度为150px,则首先在container上设置:

#container {padding-left: 200px;padding-right: 200px;
}

为左右两列预留出相应的空间,得到如下示意图:

image

随后分别为三列设置宽度与浮动,同时对footer设置清除浮动:

#container .column {float: left;
}#center {width: 100%;
}#left {width: 200px; 
}#right {width: 150px; 
}#footer {clear: both;
}

得到如下效果:

image

根据浮动的特性,由于center的宽度为100%,即占据了第一行的所有空间,所以leftright被“挤”到了第二行。

接下来的工作是将left放置到之前预留出的位置上,这里使用负外边距(nagetive margin)

#left {width: 200px; margin-left: -100%;
}

得到:

image

随后还需要使用定位(position)方法:

#left {width: 200px; margin-left: -100%;position: relative;right: 200px;
}

这里使用position: relativeright: 200pxleft的位置在原有位置基础上左移200px,以完成left的放置:

image

接下来放置right,只需添加一条声明即可:

#right {width: 150px; margin-right: -150px; 
}

得到最终的效果图:

image

最后,为了保证布局效果的正常显示,我们要给页面设置一个最小宽度。由于两侧都有固定宽度,而left使用了position: relative,所以就意味着在center开始的区域,还存在着一个left的宽度。所以页面的最小宽度应该设置为200+150+200=550px

body {min-width: 550px;
}

圣杯布局代码如下:

<!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"><title>Document</title><style>body {min-width: 550px;}#container {padding-left: 200px;padding-right: 150px;}#container .column {float: left;}#center {width: 100%;background: cadetblue;}#left {width: 200px;margin-left: -100%;position: relative;right: 200px;background-color: coral;}#right {width: 150px;margin-right: -150px;background-color: skyblue;}#footer {clear: both;height: 100px;background-color: beige;}#header {height: 100px;background-color: brown;}</style>
</head><body><div id="header">header</div><div id="container"><div id="center" class="column">center</div><div id="left" class="column">This is the main content.Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreetdolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipitlobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velitesse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odiodignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla.Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreetdolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipitlobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velitesse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odiodignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla.</div><div id="right" class="column">This is the right sidebar.Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreetdolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipitlobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velitesse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odiodignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla.</div></div><div id="footer">footer</div>
</body></html>

双飞翼布局
DOM结构

<body><div id="header"></div><div id="container" class="column"><div id="center"></div></div><div id="left" class="column"></div><div id="right" class="column"></div><div id="footer"></div>
<body>

双飞翼布局的DOM结构与圣杯布局的区别是container仅包裹住center,另外将.column类从center移至container

CSS:
按照与圣杯布局相同的思路,首先设置各列的宽度与浮动,并且为左右两列预留出空间,以及为footer设置浮动清除:

    .column {float: left;}#container {width: 100%;}#center {margin-left: 200px;margin-right: 150px;background: cadetblue;}#left {width: 200px;background-color: coral;}#right {width: 150px;background-color: skyblue;}#footer {clear: both;background-color: beige;}#header {background-color: brown;}

得到如下效果图:

image

left放置到预留位置:

#left {width: 200px; margin-left: -100%;
}

得到:

image

right放置到预留位置:

#right {width: 150px; margin-left: -150px;
}

得到

image

最后计算最小页面宽度:由于双飞翼布局没有用到position:relative进行定位,所以最小页面宽度应该为200+150=350px但是当页面宽度缩小到350px附近时,会挤占中间栏的宽度,使得其内容被右侧栏覆盖,如下所示:

image

因此在设置最小页面宽度时,应该适当增加一些宽度以供中间栏使用(假设为150px),则有:

body {min-width: 500px;
}

双飞翼布局代码如下所示:

<!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"><title>Document</title><style>body {min-width: 500px;}.column {float: left;}#container {width: 100%;}#center {margin-left: 200px;margin-right: 150px;background: cadetblue;}#left {width: 200px;margin-left: -100%;background-color: coral;}#right {width: 150px;margin-left: -150px;background-color: skyblue;}#footer {clear: both;background-color: beige;}#header {background-color: brown;}</style>
</head><body><div id="header">header</div><div id="container" class="column"><div id="center">This is the main content.Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreetdolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipitlobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velitesse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odiodignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla.Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreetdolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipitlobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velitesse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odiodignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla.</div></div><div id="left" class="column">This is the left sidebar.Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet doloremagna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortisnisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit essemolestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim quiblandit praesent luptatum zzril delenit augue duis dolore te feugait nulla.</div><div id="right" class="column">This is the right sidebar.Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet doloremagna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortisnisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit essemolestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim quiblandit praesent luptatum zzril delenit augue duis dolore te feugait nulla.</div><div id="footer">footer</div>
</body></html>

对比圣杯布局和双飞翼布局

  • 圣杯布局结构上更加自然和直观,在平时的开发中更容易形成这样的布局结构;
  • 双飞翼布局由于不使用定位,所以更加简洁,允许页面的最小宽度小于圣杯布局。

http://chatgpt.dhexx.cn/article/CZayrnVv.shtml

相关文章

圣杯布局和双飞翼布局详解

圣杯布局 刚学圣杯双飞翼布局&#xff0c;有点蒙&#xff0c;特写下来加深印象 首先要明确 圣杯布局和双飞翼布局 要解决的问题是什么&#xff1f; 要解决的就是让浏览器先加载最总要的那部分给客户看&#xff0c;我们做前端开发的时候要切合实际场景开发&#xff0c;合理布局…

实现双飞翼布局

说到圣杯布局和双飞翼布局&#xff0c;始终都是面试的高频考点&#xff0c;问题方式也大同小异&#xff0c;比如&#xff0c;实现一个左右固定&#xff0c;中间自适应的布局&#xff1b;实现一个中间部分优先加载的布局…… 现如今&#xff0c;很多web端的应用&#xff0c;他们…

CSS经典布局--圣杯布局和双飞翼布局

圣杯布局与双飞翼布局&#xff0c;都是属于三列布局的经典布局。 双飞翼布局是圣杯布局的优化版&#xff0c;由淘宝UED提出&#xff1b; 它们的效果图类似&#xff0c;但是实现方法不同。 文章目录 一、圣杯布局和双飞翼布局的常规方法1.圣杯 position 解决&#xff08;不推荐&…

前端页面布局之双飞翼布局

1.双飞翼布局说明 双飞翼布局分为 左&#xff0c;中&#xff0c;右三个部分。 左右宽度固定&#xff0c;中间部分自适应 2.双飞翼布局实例 2.1 双飞翼布局float实现 三个部分通过按顺序向左浮动实现。 <!DOCTYPE html> <html lang"en"><head>…

圣杯式布局和双飞翼布局的区别

圣杯布局和双飞翼布局的共同点&#xff1a; 三列布局&#xff0c;两边定宽&#xff0c;中间自适应布局&#xff0c;要注意的是中间栏(重要的东西)要在放在文档流前面以优先渲染。 1、圣杯式布局定义&#xff1a; 圣杯布局是两边固定宽度&#xff0c;中间自适应的三栏布局&…

圣杯布局和双飞翼布局的区别

相同点和不同点 两者的功能相同&#xff0c;都是为了实现一个两侧宽度固定&#xff0c;中间宽度自适应的三栏布局&#xff0c;并且中间部分在HTML代码中要写在前边&#xff0c;这样它就会被优先加载渲染。 主要的不同之处就是在解决中间部分被挡住的问题时&#xff0c;采取的…

双飞翼布局与圣杯布局完全解读

一、两种布局的目的 使得左右两边的宽度不随着浏览器窗口的变化而变化&#xff0c;是固定的&#xff0c;只有中间的部分才可以随着窗口变化而变化。 二、两种布局的要点 经典圣杯布局通过父亲padding给左右俩腾位置从而不会遮住middle内容&#xff0c;而双飞翼是通过设置margin…

双飞翼布局和圣杯布局

双飞翼布局和圣杯布局是前端工程师需要日常掌握的重要布局方式。两者的功能相同&#xff0c;都是为了实现一个两侧宽度固定&#xff0c;中间宽度自适应的三栏布局。&#xff08;中间先加载渲染&#xff09; 双飞翼的布局与实现原理&#xff08;推荐使用双飞翼布局&#xff09;…

圣杯布局与双飞翼布局

圣杯布局 圣杯布局是三列布局&#xff0c;中间宽度自适应&#xff0c;两边定宽&#xff0c;这样做的优势是重要的东西放在文档流前面可以优先渲染。也就是在html文档中&#xff0c;中间的部分要写在左右布局之前。 当然&#xff0c;这种布局是面向PC端的&#xff0c;移动端由于…

双飞翼布局(css)

1. DOM结构 <div class"head"></div><div class"container column"><div class"center"></div></div><div class"left column"></div><div class"right column"><…

经典布局-双飞翼

文章目录 一、双飞翼布局1. 具体实现 一、双飞翼布局 产生的背景&#xff1a; 针对圣杯布局的缺点&#xff0c;淘宝的工程署们提出了双飞翼布局&#xff0c;原理&#xff1a;在中间区域加一层dom节点&#xff0c;然后添加左右margin&#xff0c;实现三栏布局。 1. 具体实现 代…

双飞翼布局详解

作用&#xff1a; 圣杯布局和双飞翼布局解决的问题是相同的&#xff0c;就是两边顶宽&#xff0c;中间自适应的三栏布局&#xff0c;中间栏要在放在文档流前面以优先渲染。 原理&#xff1a; 双飞翼布局为了让中间div内容不被遮挡&#xff0c;直接在中间div内部创建子div用于…

圣杯布局、双飞翼布局具体实现原理和实现方法

为啥写这篇文章 网上关于这两种布局的文章大多数都只是给了代码实现&#xff0c;而没有说出其中关键性代码的作用和原理。 布局实现的目的 1.三列布局&#xff0c;两端固定宽度(其实可以不用固定宽度&#xff09;&#xff0c;中间栏自适应。 2.中间栏优先渲染。 3.任意栏高度…

实现双飞翼布局(圣杯布局)的三种方式

双飞翼布局 一、实现效果二、使用弹性盒模型display:flex实现三、使用calc属性实现四、使用绝对定位实现 一、实现效果 为了实现一个两侧宽度固定&#xff0c;中间宽度自适应的三栏布局&#xff0c;效果如图所示&#xff1a; 二、使用弹性盒模型display:flex实现 静态页面思…

主流布局--双飞翼布局

主流布局–双飞翼布局 什么是双飞翼布局&#xff1f; 双飞翼布局最早是淘宝团队提出的&#xff0c;是针对圣杯局部优化的解决方案。主要是优化了圣杯布局中开启定位的问题。 HTML <div class"parent"><div class"center"><div class"…

css经典布局——双飞翼布局

圣杯布局的出现是来自由 Matthew Levine 在 2006 年写的一篇文章 《In Search of the Holy Grail》&#xff0c;在国内最早是淘宝UED的工程师&#xff08;玉伯大大&#xff09;对圣杯布局改进并传播开来&#xff0c;在中国的叫法是双飞翼布局 。 圣杯布局和双飞翼布局达…

vs code全局搜索内容不全的问题

vscode有时全局搜索内容明显不对&#xff0c;可能是搜索时使用了.ignore文件导致忽略了其中的内容&#xff0c;打开vscode的设置&#xff0c;搜索search&#xff0c;找到Search: Use Ignore Files&#xff0c;取消掉勾选&#xff0c;然后就可以搜索到所有的内容了

linux全局搜索

find / -name git 转载于:https://www.cnblogs.com/hd92/p/11138033.html

android全局搜索

如果想在同一个工程里面找就需要用到全局搜索