web布局
1、基础知识
1.1 em和rem区别
像素(px)是基于显示器分辨率的单位,em是基于文本本身的字体尺寸,pt则是固定单位。
1.1.1 em
em 作为 font-size 的单位时,其代表父元素的字体大小;em作为其他属性单位时,代表自身字体大小。
px(像素)与em之间的换算关系主要取决于浏览器的默认字体大小。在未经调整的浏览器中,默认字体大小通常是16px,因此1em等于16px。
基于这个默认设置,px到em的换算公式可以简化为:em值 = px值 ÷ 16。
例如,12px等于0.75em,10px等于0.625em。
因为em代表父元素字体大小,改动父元素的字体大小,子元素会等比例变化,多层嵌套的父子元素em与px之间计算比较复杂,让人诟病。

em做弹性布局的缺点还在于牵一发而动全身,一旦某个节点的字体大小发生变化,那么其后代元素都得重新计算。
1.1.2 rem
rem (root em)是一个相对单位,类似于em,em是父元素字体大,rem是相对于html元素的字体大小,整个页面只有一个html,很好控制整个页面元素大小。比如,根元素(html)设置font-size=12px; 非根元素设置width:2rem; 则换成px表示就是24px。
html { font-size: 12px; }
优势:父元素文字大小可能不一致, 但是整个页面只有一个html,可以很好来控制整个页面的元素大小。
注:rem 作用于非根元素时,是相对于根元素的字体大小;rem作用于根元素字体大小时,相对于其初始字体大小。

百分比布局和flex布局都没有解决两个问题
- 页面中的文字不能随着屏幕变化而变化
- 百分比布局和flex布局主要针对宽度布局,高度一致被忽视
采用 rem 布局,可以让屏幕发生变化时,元素的高度和宽度以及文字大小等能够等比例缩放。
rem布局的本质是等比缩放,一般是基于宽度。
rem是弹性布局的一种实现方式,弹性布局强调等比缩放,100%还原;响应式布局强调不同屏幕要有不同的显示,比如媒体查询;
一般内容型的网站,都不太适合使用rem,因为大屏用户可以自己选择是要更大字体,还是要更多内容,一旦使用了rem,就剥夺了用户的自由;
一些偏向app类的,图标类的,图片类的,比如淘宝,活动页面,比较适合使用rem,因为调大字体时并不会调大图标的大小。
1.2 dpr
📋 物理像素
屏幕实际拥有的像素点,是硬件层面的最小显示单元。例如,一个分辨率为 1920x1080 的屏幕,水平方向有 1920 个物理像素,垂直方向有 1080 个物理像素。
注意,我们通常所说的显示器分辨率,其实是指桌面设定的分辨率,而不是显示器的物理分辨率。只有在桌面分辨率与物理分辨率一致的情况下,显示效果最佳。
📋 CSS像素
是Web编程中使用的逻辑单位,指的是CSS中使用的逻辑像素或虚拟像素。
浏览器内的一切长度都是以 CSS 像素为单位的,CSS 像素的单位是 px。在CSS规范中,长度单位可以分为两类,绝对(absolute)单位以及相对(relative)单位。
px是一个相对单位,相对的是设备物理像素(Device Pixel),pt 在 css 单位中属于真正的绝对单位,1pt = 1/72(inch),inch 及英寸,而1英寸等于2.54厘米。
CSS像素的大小在不同的设备和环境下可以变化,主要体现在以下几个方面:
- 相对性:在同一设备上,CSS像素的大小可以根据屏幕分辨率的变化而变化。例如,当用户缩放页面时,CSS像素所代表的物理尺寸会相应调整。
- 跨设备一致性:在不同设备之间,CSS像素的大小也可以变化。高DPR(Device Pixel Ratio)的设备上,一个CSS像素可能对应多个设备像素,从而在不同设备上保持视觉一致性12。
📋 设备独立像素
DPR 全称 Device Pixel Ratio(设备像素比),是前端开发中描述屏幕像素映射关系的核心参数,直接决定了高分辨率设备的内容显示清晰度。
基础定义与计算公式
- 核心定义:设备物理像素与逻辑像素(CSS像素)的比值,用来表示1个CSS像素会被映射到多少个屏幕实际发光点上。
- 计算公式:
DPR = 物理像素 / 逻辑像素 - 获取方式:在浏览器中可通过
window.devicePixelRatio直接读取当前设备的DPR数值
设备独立像素(Device Independent Pixel, 简称DIP/DP)是前端移动端适配体系的核心基准单位,专门用来解决不同分辨率设备上页面显示尺寸不一致的问题。这是一种和设备硬件物理像素解耦的虚拟像素单位,由设备厂商统一定义,用来保证不同尺寸、不同分辨率的设备上,相同数量的设备独立像素对应的物理视觉尺寸基本一致。
核心作用:
- ✅ 建立统一适配基准:让开发者不需要针对每一款不同分辨率的设备单独调整布局,一套适配规则就能覆盖绝大多数机型。
- ✅ 保证视觉一致性:同样是375px宽度的移动端页面,在小屏手机和大屏平板上的实际视觉宽度比例基本统一,不会出现小屏内容挤成一团、大屏内容松散空旷的问题。
- ✅ 屏蔽硬件差异:彻底隔离不同设备的物理像素差异,开发者只需要关注逻辑层面的布局尺寸,不需要关心底层屏幕的硬件参数
基础换算公式:1个设备独立像素 = DPR × 1个物理像素
我们日常写CSS时使用的px单位,本质上就是设备独立像素,浏览器会自动根据当前设备的DPR,把CSS像素映射到对应的物理像素上,完成最终的屏幕渲染。
为什么会出现设备独立像素这种虚拟像素单位概念呢?
假设,我有一个iPhone12 和 iPhone13,尺寸都是5.4,iphone12的分辨率是1040*960, iphone13的分辨率是2080×1170,那么,ihpone12有1170个物理像素,iphone有2532个物理像素。
如果按照真实物理像素进行布局,以12为例,那么到13上,又会出现一半的空白,为了避免这种情况的出现,出现了虚拟像素单位,我们统一12和13的虚拟像素都是1040个,只是在12上,1个虚拟像素被换算成1个物理像素,在13上,1个虚拟像素,被换算成2个物理像素。
设备独立像素的应用场景和特点包括:
- 跨平台一致性:无论是在高DPR的设备还是低DPR的设备上,设备独立像素都能保证内容的视觉一致性。浏览器会根据设备的DPR将CSS像素转换为相应的设备像素进行显示。
- 逻辑度量:设备独立像素是一种逻辑度量单位,用于软件开发中,确保在不同设备上都能达到预期的视觉效果。它不依赖于具体的物理设备特性,而是通过程序控制使用
📋 DPR
设备像素比 (Device Pixel Ratio,简称 DPR) 指的是物理像素和设备独立像素的比率。它描述了在设备屏幕上的一个 CSS 像素代表多少个实际的物理像素。
window.devicePixelRatio = 物理像素/ 设备独立像素,在js中通过 window.devicePixelRatio 获取。
根据换算关系可推出:CSS像素 =设备独立像素 = 逻辑像素。此时CSS像素就可以看做是设备的独立像素,所以通过 devicePixelRatio,我们可以知道该设备上一个css像素代表多少个物理像素。
当设备像素比为1:1时,使用1(1×1)个设备像素显示1个CSS像素
当设备像素比为2:1时,使用4(2×2)个设备像素显示1个CSS像素
当设备像素比为3:1时,使用9(3×3)个设备像素显示1个CSS像素
DPR 的出现是为了解决高分辨率屏幕上的显示问题。在早期的低分辨率屏幕上,一个 CSS 像素对应一个物理像素 (DPR=1)。随着高分屏 (例如 Retina 屏幕) 的普及,为了保持网页内容的清晰度,需要在一个 CSS 像素内渲染更多的物理像素。例如,一个 DPR 为 2 的屏幕,一个 CSS 像素对应 2x2 个物理像素;一个 DPR 为 3 的屏幕,一个 CSS 像素对应 3x3 个物理像素。
在css中我们一般使用px作为单位,css中的像素只是一个抽象的单位,在不同的设备或不同的环境中,css中的1px所代表的设备物理像素是不同的。
现在有很多手机分辨率都非常大,比如768x1024,或者1080x1920这样,分辨率越大,css中1px代表的物理像素就会越多,devicePixelRatio的值也越大。
这很好理解,因为分辨率增大了,但屏幕尺寸并没有变大多少,必须让css中的1px代表更多的物理像素,才能让1px的东西在屏幕上的大小与那些低分辨率的设备差不多,不然就会因为太小而看不清。
例如:在iphone3上,一个css像素等于一个屏幕物理像素,从iphone4开始,分辨率提高了一倍,变成640x960,但屏幕尺寸却没变化,这就意味着同样大小的屏幕上,像素却多了一倍,这时,一个css像素是等于两个物理像素的。
还有一个因素也会引起css中px的变化,那就是用户缩放。例如,当用户把页面放大一倍,那么css中1px所代表的物理像素也会增加一倍;反之把页面缩小一倍,css中1px所代表的物理像素也会减少一倍。
比如iPhone 5使用的是Retina屏幕,设备物理像素为640 x 1136px,使用2px x 2px的设备物理像素,代表 1px x 1px 的 CSS像素,所以
DPR 的影响:
-
图片清晰度: 为了在高分屏上显示清晰的图片,需要提供更高分辨率的图片。例如,如果一个图片在 DPR 为 1 的屏幕上显示大小为 100x100 像素,那么在 DPR 为 2 的屏幕上,需要提供 200x200 像素的图片,以保证相同的显示尺寸和清晰度。
-
布局和字体大小: DPR 会影响 CSS 像素的大小,因此需要根据 DPR 进行调整,以确保布局和字体大小在不同设备上保持一致。
-
JavaScript 获取 DPR: 可以使用
window.devicePixelRatio属性获取当前设备的 DPR。
1.3 viewport
viewport的概念最早起源于桌面端的计算机图形学领域,早期就被用于桌面图形软件的界面渲染和坐标变换控制,用来定义屏幕上显示内容的可视区域范围3。
直到iPhone推出后,苹果才将这个概念引入移动前端开发,专门用来解决小屏幕设备完整显示桌面网页的适配问题,后续才逐渐形成了大家熟知的移动端三类视口体系。

桌面端浏览器的布局视口天然和浏览器窗口宽度保持一致,不需要额外设置viewport标签就能正常渲染页面,这也是很多开发者误以为viewport仅存在于移动端的核心原因。
而移动端浏览器为了兼容早期PC端旧页面,才额外引入了远大于屏幕宽度的默认布局视口,需要通过<meta name="viewport">标签手动调整,实现页面的精准适配。
布局视口、视觉视口、理想视口是移动端适配体系中的三个核心概念,共同解决早期PC页面在手机端显示错乱的问题。
三者基础定义:
- 布局视口(layout viewport):是CSS布局的计算基准,相当于开发者用来绘制页面的虚拟“画板”,移动端浏览器默认将其宽度设为980px,保证PC端的旧页面可以完整在手机内渲染,不会直接溢出屏幕。
- 视觉视口(visual viewport,也叫可视视口):是用户当前肉眼可见的网页区域,用户可以通过双指缩放操作改变视觉视口的大小,这个操作不会影响底层布局视口的尺寸,仅改变用户看到的画面范围。
- 理想viewport(ideal viewport):是设备定义的最适配浏览的视口尺寸,宽度完全等于设备屏幕的逻辑像素宽度,在这个视口下页面不需要用户手动缩放,就能获得最舒适的阅读体验
三者核心关联
- 默认状态下,布局视口宽度(980px)远大于视觉视口宽度,浏览器会自动对页面进行整体缩小,让980px的内容完整塞进手机屏幕里,这就是早期移动端页面内容看起来特别小的原因。
- 当设置标准的
<meta name="viewport" content="width=device-width, initial-scale=1.0">标签后,布局视口宽度会被强制设置为和理想视口完全相等,此时布局视口 = 视觉视口 = 设备逻辑宽度,页面实现1:1的精准适配。 - 三者满足换算公式:
当前缩放值 = 理想视口宽度 / 视觉视口宽度,用户放大页面时,视觉视口宽度会同步变小,单个CSS像素会跨越更多的物理像素
划分三类视口的目的
- 解决历史兼容问题:在移动端刚普及的阶段,大量PC端旧页面宽度都在800px以上,通过引入独立于屏幕的布局视口,让这些旧页面可以直接在手机上完整渲染,不需要立刻全部重构。
- 兼顾用户体验:视觉视口的独立设计,让用户可以自由放大页面局部内容,查看小字细节,不会干扰页面原本的CSS布局逻辑。
- 建立适配标准:理想视口的出现统一了移动端开发的基准,让开发者可以直接按照设备屏幕宽度来编写页面,彻底告别早期浏览器厂商各自为战的混乱适配状态,是现在所有响应式、REM、vw适配方案的底层基础
布局视口获取方式:document.documentElement.clientWidth / document.documentElement.clientHeight,返回纯内容区域的宽高,不包含滚动条、浏览器边框,是布局计算最可靠的取值方式。
IE8及兼容模式:在怪异模式下,布局视口信息存储在document.body.clientWidth / document.body.clientHeight中,需要额外判断文档渲染模式适配:
function getLayoutViewport() { const d = document; // 标准模式下优先取根节点属性 if (d.compatMode === "CSS1Compat") { return { width: d.documentElement.clientWidth, height: d.documentElement.clientHeight } } // 怪异模式下取body属性 return { width: d.body.clientWidth, height: d.body.clientHeight } }
通过 window.innerWidth / window.innerHeight 直接获取视觉视口的宽高数值,单位为CSS像素,用户双指缩放页面时,该数值会同步动态变化,是最常用的基础获取方式。
现代标准API方案
- Visual Viewport API:这是W3C官方推出的标准接口,通过 window.visualViewport 对象可以获取更完整的视觉视口信息,包含以下核心属性:
- visualViewport.width:视觉视口实时宽度
- visualViewport.height:视觉视口实时高度
- visualViewport.scale:当前页面的缩放比例
- visualViewport.offsetLeft:视口相对于布局视口的左偏移量
- visualViewport.offsetTop:视口相对于布局视口的上偏移量
能力检测:使用前可通过 'visualViewport' in window 判断浏览器是否支持该API,避免低版本浏览器报错,可以通过统一的兼容函数,覆盖新旧浏览器场景:
function getVisualViewport() { if ('visualViewport' in window) { return { width: window.visualViewport.width, height: window.visualViewport.height, scale: window.visualViewport.scale } } return { width: window.innerWidth, height: window.innerHeight, scale: window.visualViewport ? window.visualViewport.scale : 1 } }
理想视口是设备厂商定义的最适配网页显示的基准尺寸,宽度完全等于设备的CSS逻辑像素宽度,是移动端适配的核心基准。
通过 screen.width / screen.height 即可直接获取理想视口的宽高数值,单位为CSS像素,该数值不会随页面缩放、浏览器窗口调整而变化,是设备的固定属性。
当页面设置了标准的 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 标签后,布局视口会被强制设置为和理想视口完全相等,此时可以通过 document.documentElement.clientWidth 获取到和理想视口完全一致的数值,这种方式在现代移动端浏览器中兼容性表现极佳。
可以通过统一的兼容逻辑,覆盖绝大多数设备场景,返回精准的理想视口尺寸:
function getIdealViewport() { // 优先取设备固定的理想视口属性 let width = screen.width; let height = screen.height; // 修正横屏状态下宽高颠倒的问题 if (window.orientation === 90 || window.orientation === -90) { [width, height] = [height, width]; } return { width, height }; }
为什么需要有理想的viewport呢?
理想视口是移动端适配体系的核心基准,它的存在彻底解决了早期PC页面在小屏手机上的显示混乱问题。
📋 理想视口的设计初衷
- 统一适配基准:由设备厂商定义的标准视口尺寸,宽度完全等于设备的CSS逻辑像素宽度,让所有移动端页面都能在同一个统一基准下渲染,避免不同浏览器各自为战的适配混乱问题1。
- 原生适配体验:让网页内容天然适配屏幕宽度,用户打开页面时不需要手动缩放、拖动横向滚动条,就能直接获得文字大小适中、布局完整的舒适浏览效果2。
- 适配方案基础:是响应式设计、REM、vw等所有现代移动端适配方案的底层前提,没有理想视口作为基准,这些适配规则都无法正常生效1。
⚠️ 没有理想视口的直接后果
- 页面整体缩小:浏览器会默认使用980px的布局视口渲染页面,把PC端的宽屏页面强行压缩进手机屏幕,所有文字、图片都会变得极小,用户几乎无法直接阅读内容。
- 布局完全错乱:页面会出现大量横向滚动条,用户需要左右拖动屏幕才能看到完整内容,原本适配移动端的弹性布局、响应式断点全部失效,页面排版完全脱离设计预期。
- 适配逻辑失效:REM、vw等依赖理想视口基准的适配方案全部无法正常工作,不同设备上的页面尺寸比例完全混乱,开发者无法写出统一的适配规则,开发和维护成本会指数级上升
比如在iPhone 12上,理想视口宽度是390px,如果没有理想视口,浏览器会用980px的布局视口渲染页面,原本设计好的375px宽度的移动端页面,会被自动缩小到适配980px的尺寸,所有按钮、文字都会缩到几乎看不清,用户只能双指放大页面才能正常操作,浏览体验会完全退回到移动端刚普及的早期混乱状态。
比如一个分辨率为320x480的手机理想viewport的宽度是320px,而另一个屏幕尺寸相同但分辨率为640x960的手机的理想viewport宽度也是为320px,那为什么分辨率大的这个手机的理想宽度要跟分辨率小的那个手机的理想宽度一样呢?
这是因为,只有这样才能保证同样的网站在不同分辨率的设备上看起来都是一样或差不多的。实际上,现在市面上虽然有那么多不同种类不同品牌不同分辨率的手机,但它们的理想viewport宽度归纳起来无非也就 320、360、384、400等几种,都是非常接近的,理想宽度的相近也就意味着我们针对某个设备的理想viewport而做出的网站,在其他设备上的表现也不会相差非常多甚至是表现一样的。
那么怎么才能得到ideal viewport呢?
要得到ideal viewport就必须把默认的layout viewport的宽度设为移动设备的屏幕宽度,因为meta viewport中的width能控制layout viewport的宽度,所以我们只需要把width设为width-device这个特殊的值就行了
<meta name="viewport" content="width=device-width, maximum-scale=1.0, user-scalable=0">
注:在iphone和ipad上,无论你给viewport设的宽的是多少,如果没有指定默认的缩放值,则iphone和ipad会自动计算这个缩放值,以达到当前页面不会出现横向滚动条(或者说viewport的宽度就是屏幕的宽度)的目的。
该meta标签的作用是让当前viewport的宽度等于设备的宽度,同时不允许用户手动缩放。
如果你不这样的设定的话,那就会使用那个比屏幕宽的默认viewport(layout viewport),也就是说会出现横向滚动条。移动设备上的默认的viewport都是要大于浏览器可视区域的,这是为了能在移动设备上正常显示那些传统的为桌面浏览器设计的网站,移动设备上的浏览器都会把自己默认的viewport设为980px或1024px等。
注:在iphone和ipad上,无论是竖屏还是横屏,宽度都是竖屏时ideal viewport的宽度。
ideal viewport并没有一个固定的尺寸,不同的设备拥有有不同的ideal viewport。所有的iphone的ideal viewport宽度都是320px,无论它的屏幕宽度是320还是640,也就是说,在iphone中,css中的320px就代表iphone屏幕的宽度。但是安卓设备就比较复杂了,有320px的,有360px的,有384px的等等。
因为缩放是相对于 ideal viewport来进行缩放的,当对ideal viewport进行100%的缩放,也就是缩放值为1的时候,也会得到 ideal viewport
<meta name="viewport" content="initial-scale=1">
缩放是相对于ideal viewport来缩放的,缩放值越大,当前viewport的宽度就会越小,反之亦然。例如在iphone中,ideal viewport的宽度是320px,如果我们设置 initial-scale=2 ,此时viewport(visual viewport)的宽度会变为只有160px了,这也好理解,放大了一倍嘛,就是原来1px的东西变成2px了,但是1px变为2px并不是把原来的320px变为640px了,而是在实际宽度不变的情况下,1px变得跟原来的2px的长度一样了,所以放大2倍后原来需要320px才能填满的宽度现在只需要160px就做到了。因此,我们可以得出一个公式:
visual viewport宽度 = ideal viewport宽度 / 当前缩放值
当前缩放值 = ideal viewport宽度 / visual viewport宽度
如果width 和 initial-scale=1同时出现,那么浏览器到底该服从哪个命令呢?
当遇到这种情况时,浏览器会取它们两个中较大的那个值。例如,当width=400,ideal viewport的宽度为320时,取的是400;当width=400, ideal viewport的宽度为480时,取的是ideal viewport的宽度。(ps:在uc9浏览器中,当initial-scale=1时,无论width属性的值为多少,此时viewport的宽度永远都是ideal viewport的宽度)
把viewport宽度设为ideal viewport的宽度,既可以设置 width=device-width,也可以设置 initial-scale=1,但这两者各有一个小缺陷,就是iphone、ipad以及IE 会横竖屏不分,通通以竖屏的ideal viewport宽度为准。所以,最完美的写法应该是,两者都写上去,这样就 initial-scale=1 解决了 iphone、ipad的毛病,width=device-width则解决了IE的毛病
<meta name="viewport" content="width=device-width, initial-scale=1">
动态改变meta viewport标签
document.write('<meta name="viewport" content="width=device-width,initial-scale=1">')
或
<meta id="testViewport" name="viewport" content="width = 380"> let vp = document.getElementById('testViewport'); vp.setAttribute('content','width=480');
1.3 主流一维、二维布局方案
CSS二维布局是可同时控制行、列两个维度元素排列的布局体系,是实现复杂页面骨架的核心技术集合。
✅ 主流二维布局方案
- CSS Grid 原生网格布局:现代浏览器原生支持的标准二维布局方案,通过
display: grid启用,可同时定义行轨道和列轨道,精准控制每个元素的行列位置,是目前二维布局的首选方案1。 - 传统表格布局:早期网页实现二维排版的经典方案,通过
<table>标签的<tr>行、<td>单元格天然实现二维排列,现在仅用于表格数据展示场景,不适合普通页面布局。 - 栅格系统布局:基于12列等分规则封装的二维布局方案,底层可基于Grid或Flex实现,主流UI框架如Bootstrap、Ant Design的栅格能力都属于这类,适合快速搭建规整的响应式页面骨架。
一维布局是仅沿单条轴线(水平/垂直)控制元素排列的布局体系,是前端局部组件排版的核心方案。
✅ 主流一维布局方案
- Flex弹性布局:当前一维布局的绝对主流方案,通过
display: flex启用,可通过flex-direction指定主轴方向,搭配justify-content、align-items等属性,轻松实现元素居中、等分布局、自适应换行等效果,所有现代浏览器均已完美兼容2。 - 行内块布局:通过
display: inline-block让元素脱离块级独占一行的规则,实现多个元素横向排列,是Flex普及前的经典一维布局方案,现在仍用于简单的横向元素排列场景。 - 浮动布局:通过
float属性让元素脱离普通文档流实现横向排列,是早年多列一维布局的主流方案,现在仅用于老旧项目兼容场景,新开发项目已基本被Flex替代。
优先选择CSS Grid作为二维布局的核心方案,搭配Flex布局处理组件内的一维排列,无需嵌套多层容器就能实现复杂的二维排版,代码简洁易维护,完全适配现代工程化开发需求。
2、布局方式
前端布局是实现页面元素精准排列、适配不同屏幕的核心技术,目前主流布局可分为传统基础布局和现代高效布局两大类别,覆盖从简单居中到复杂二维排版的各类场景。
2.1 传统基础布局方案
这类布局是早期前端开发的核心方案,兼容性极强,至今仍在部分特定场景中使用
- 静态布局:所有元素使用固定像素值定义尺寸,页面不会随屏幕尺寸变化自动适配,仅适合固定分辨率的PC端页面,适配多端需要开发多个不同版本。
- 流式布局:元素宽度使用百分比作为单位,高度和文字大小保留像素值,配合
max-width/min-width控制尺寸边界,页面元素会随屏幕宽度等比例缩放,适合屏幕尺寸差异较小的移动端场景6。 - 自适应布局:将屏幕划分为多个预设的断点区间,每个区间内使用静态布局,通过媒体查询切换不同布局版本,不同断点下页面布局会发生明显变化,开发成本低于全响应式方案。
- 浮动布局:通过
float属性让元素脱离普通文档流实现横向排列,是早年多列布局的主流方案,但需要额外编写代码清除浮动带来的高度塌陷问题,现在已逐步被现代布局方案替代。 - 定位布局:通过
position属性的relative/absolute/fixed等属性,精准控制元素在页面中的位置,适合实现弹窗、悬浮按钮这类脱离常规文档流的特殊元素,不适合用于整体页面排版。
2.1.1 静态布局
核心技术为固定像素单位px,所有元素宽高、边距均使用固定像素值定义,页面不会随屏幕尺寸变化自动适配,仅适合固定分辨率的PC端页面。
2.1.2 流式布局
核心技术为百分比单位,元素宽度使用百分比定义,配合max-width/min-width控制尺寸边界,页面元素会随屏幕宽度等比例缩放,适配屏幕尺寸差异较小的移动端场景。
当浏览器的宽度或者高度发生变化时,通过百分比单位可以使得浏览器中的组件的宽和高随着浏览器的变化而变化,从而实现响应式的效果。
流式布局(Liquid Layout)就是百分比布局,也称非固定像素布局。
这种布局方式在Web前端开发的早期历史上,用来应对不同尺寸的PC屏幕(那是屏幕尺寸的差异不会太大),在当今的移动端开发也是常用布局方式,但缺点明显:
weight,width属性的百分比依托于父标签的宽高。但是,padding、border、margin等属性的情况又不一样。
属性的百分比:
- 子元素的top和bottom如果设置百分比,则相对于直接非static定位(默认定位)的父元素的高度,同样,子元素的left和right如果设置百分比,则相对于直接非static定位(默认定位的)父元素的宽度。
- 子元素的padding如果设置百分比,不论是垂直方向或者是水平方向,都相对于直接父亲元素的width,而与父元素的height无关。
- 子元素的margin如果设置成百分比,不论是垂直方向还是水平方向,都相对于直接父元素的width
- border-radius不一样,如果设置border-radius为百分比,则是相对于自身的宽度
缺点:
- 计算困难,如果我们要定义一个元素的宽度和高度,按照设计稿,必须换算成百分比单位。
- 各个属性中如果使用百分比,相对父元素的属性并不是唯一的。比如width和height相对于父元素的width和height,而margin、padding不管垂直还是水平方向都相对比父元素的宽度、border-radius则是相对于元素自身等等,造成我们使用百分比单位容易使布局问题变得复杂。
- 宽度使用百分比定义,但是高度和文字大小等大都是用px来固定,所以在大屏幕的手机下显示效果会变成有些页面元素宽度被拉的很长,但是高度、文字大小还是和原来一样(即,这些东西无法变得“流式”),显示非常不协调。
所以,不建议用%来做响应式布局!!!
由于没办法对 font-size 进行百分比设置,所以用的最多就是对图片和大块布局进行百分比设置!
2.1.3 自适应布局
核心定位:针对不同设备开发多套独立网页版本的布局方案。
核心特点:
- 后台检测设备类型(PC/平板/手机),自动调用对应版本的网页,不同设备打开的页面内容、网址都可能不同。
- 可针对不同平台定制专属排版与交互,能最大化优化单设备的用户体验。
- 缺点是需要维护多套设计和代码,开发与后续维护的工作量大,成本更高。
自适应布局是能随浏览器窗口/设备屏幕尺寸自动调整元素宽高的灵活布局形式,可让不同分辨率设备都获得良好展示效果。
📋 基础核心技术
- 百分比单位:将元素宽度从固定
px值替换为百分比,元素尺寸会跟随父容器/浏览器窗口等比例缩放,是最基础的自适应实现方式3。 - REM单位适配:参考淘宝无线适配方案,通过JS动态监听屏幕宽度,实时计算并设置根元素
html的基础字体大小,页面内所有元素使用rem定义尺寸,实现全屏幕比例自适应2。 - 视口单位
vw/vh:直接以当前可视窗口的宽高百分比作为单位,1vw等于屏幕宽度的1%,无需额外JS计算即可实现元素随窗口实时缩放。
📋 自适应布局的适用场景和维护成本:
- 特定需求:在需要确保在不同设备上提供一致用户体验的场景中,自适应布局更为适合。例如,某些应用需要在特定设备上保持一致的界面风格和功能。
- 维护成本:自适应布局需要为每种设备维护一套布局文件,随着设备种类的增加,维护成本也会相应增加。而响应式布局则通过一套代码即可适应多种设备,减少了维护工作量
1、 vw/vh
css3中引入了一个新的单位vw/vh,与视图窗口有关,vw表示相对于视图窗口的宽度,vh表示相对于视图窗口高度。 任意层级元素,在使用vw单位的情况下,1vw都等于视图宽度的百分之一。
与百分比布局很相似,但更好用。
现阶段手机端用的最多就是这个方法,能保持不同屏幕下元素显示效果一致, 也不用写多套样式。
2、 rem
rem单位是相对于字体大小的html元素,也称为根元素。 默认情况下,html元素的font-size为16px。所以此时1rem = 16px。
一般结合媒体查询实现响应式布局。
flexible.js 是 REM自适应布局 专属的核心配套技术,是手淘开发出的一个用来适配移动端的js框架。
手淘框架的核心原理就是根据制不同的width给网页中html根节点设置不同的font-size,然后所有的px都用rem来代替,这样就实现了不同大小的屏幕都适应相同的样式了。其实它就是一个终端设备适配的解决方案,也就是说它可以让你在不同的终端设备中实现页面适配。
📋 核心实现逻辑
- 动态监听屏幕尺寸变化,自动计算并设置根元素
html的font-size基准值,通常将屏幕宽度按10等份拆分,设计稿750px场景下每等份对应75px。 - 自动生成适配当前设备的
viewport标签,根据设备像素比dpr动态调整页面缩放比例,解决不同分辨率设备的显示差异问题。 - 开发者只需将设计稿中的像素尺寸除以根元素基准值,转换为
rem单位编写样式,即可实现页面全设备自动等比例适配。
2.1.4 浮动布局
核心技术为CSS float属性,让元素脱离普通文档流实现横向排列,搭配clear属性清除浮动带来的高度塌陷问题,是早年多列布局的主流实现方案
2.1.5 定位布局
核心技术为CSS position属性,通过relative/absolute/fixed等定位规则,精准控制元素在页面中的位置,适合实现弹窗、悬浮按钮这类脱离常规文档流的特殊元素。
2.2 现代高效布局方案
这类布局是当前工程化开发的首选,适配性和开发效率远高于传统方案:
- Flex弹性布局:一维布局的首选方案,可轻松实现元素的水平/垂直居中、等分布局、自适应换行等效果,代码简洁易维护,是移动端和后台系统开发中使用最频繁的布局方式。
- Grid网格布局:二维布局的终极方案,可同时控制行和列的排列规则,轻松实现复杂的多行列网格排版,适合搭建整体页面骨架、复杂卡片流等场景,是目前最强大的CSS原生布局方案。
- 响应式布局:融合流式布局和自适应布局的理念,通过媒体查询为不同分辨率设备定义专属布局,实现同一页面在PC、平板、手机端都能完美适配,Bootstrap等框架就是基于该方案实现。
2.2.1 Flex弹性布局
弹性布局强调等比缩放,100%还原。
核心定位:一维布局模型,专门用于容器内子元素的对齐、空间分配与排序。
核心特点:
- 支持元素在容器内自动伸缩,可轻松实现复杂的自适应排列,无需依赖固定像素值。
- 仅处理单方向(横向或纵向)的布局,适合局部模块的精细对齐,不负责整体页面的二维布局。
- 是现代前端实现元素自适应排列的基础技术,常和CSS Grid搭配使用。
弹性布局是一种十分方便的,只需要依赖于CSS样式的实现响应式布局的方式,也是最多用到的一种实现响应式的方法。
尤其是现在类似于某宝、某东一类的电商web站或者手机app的页面,利用弹性布局是都可以很轻松的实现的。
弹性布局在父、子元素上都有相对应的属性来规范子元素在父元素中的“弹力”:
- 在父元素上,我们经常会用到的有关弹性布局的属性主要有 flex-direction , flex-wrap , justify-content , align-items , align-content ,这几个属性分别从 主轴的方向、是否换行、项目在主轴上的对齐方式、项目在交叉轴上的对齐方式、项目在多根轴线上的对齐方式来规范了项目在父元素中的弹性。
- 在子元素上,我们经常会用到的有关弹性布局的属性主要有 order , flex-grow , flex-shrink ,flex-basis , align-self ,这几个属性分别从 项目的排序、项目放大比例、项目缩小比例、项目占据主轴空间、单个项目在交叉轴上的对齐方式来规范了项目自身的弹性
2.2.2 Grid网格布局
Flex主要用于一维布局(控制行或列),而grid主要用于二维布局(同时控制行和列)。
Grid 布局即网格布局,是CSS3新增的布局模块之一,它为开发者提供了一种二维的布局系统,能够同时处理行和列的排列与对齐,比较擅长将一个页面划分为几个主要区域,以及定义这些区域的大小、位置、层次等关系。号称是最强大的的 CSS 布局方案,是目前唯一一种 CSS 二维布局。
这种布局方式使得响应式设计和对齐更加直观和简单。
目前,所有现代浏览器都支持 CSS Grid 布局,包括 Chrome、Firefox 、Safari、Edge 等。
Grid 布局的优势:
- 灵活性:CSS Grid提供了灵活的布局方式,可以轻松应对各种复杂布局需求。
- 代码简洁:相比传统的布局方法,Grid 布局几行 CSS 就能实现复杂的布局效果,更加简洁和易于维护。
- 响应式:CSS Grid可以很好地适应不同屏幕尺寸,实现响应式布局。
- 控制力:通过简单的 CSS 属性,开发者可以精确控制元素的位置、尺寸和间距。
display: grid:网格容器是块级元素,默认独占一行,宽度撑满父容器(除非手动设置宽度);
display: inline-grid:网格容器是行内块元素,宽度由网格内容(行列总宽度)决定,可和其他行内元素并排显示
基本使用:
display: grid;
grid-template-columns: repeat(3, 1fr);
grid-template-rows: auto;
grid-gap: 10px;
属性说明:
display: grid 将容器定义为Grid布局,是块级元素,默认独占一行(inline-grid:是行内块元素)。
grid-template-columns 定义列的宽度。可以指定固定尺寸(如 100px)、相对尺寸(如 1fr,表示一分数,用于分配可用空间)或百分比。
grid-template-rows 定义行的高度。同样可以使用固定尺寸、相对尺寸或百分比。
grid-gap 设置网格间距。同时设置行和列的间隙,或者分别使用row-gap和column-gap来单独设置行和列的间隙(row-gap:仅设置行之间的间隙,column-gap:仅设置列之间的间隙)
CSS Grid 布局的一个关键优势是它的自适应能力。通过使用 fr 单位和 auto-fill、auto-fit 关键字,我们可以创建灵活的 网格布局,它们可以自动适应不同的屏幕尺寸和容器大小。
- fr单位:代表一个可用空间的分数。使用 fr 可以创建灵活的列和行,它们可以根据容器的大小自动调整
- auto-fill:无论容器大小如何,都会创建尽可能多的网格轨道。
- auto-fit:与 auto-fill 类似,但会自动收缩多余的轨道,以填充可用空间
示例2:

<div class="container">
<div class="item">Grid Item 1</div>
<div class="item">Grid Item 2</div>
<div class="item">Grid Item 3</div>
<div class="item">Grid Item 4</div>
<div class="item">Grid Item 5</div>
<div class="item">Grid Item 6</div>
</div>
.container {
display: grid;
grid-template-columns: 100px 1fr 2fr; /* 定义三列,第一列为100px,第二列和第三列按1:2的比例分配剩余空间 */
grid-template-rows: 200px 300px; /* 定义两行,高度分别为200px和300px */
grid-gap: 20px;
}
示例3:
display: grid;
grid-template-columns: repeat(3, 1fr); /* 使用 repeat 函数创建三列,每列平均分配空间 */
grid-template-rows: auto; /* 行高根据内容自动调整 */
grid-gap: 20px; /* 设置统一的间隙为20px */
网格对齐和分布:
CSS Grid 提供了多种属性来控制内容在网格项中的对齐和分布方式:
- justify-items:控制所有子元素在水平方向上的对齐方式。
- align-items:控制所有子元素在垂直方向上的对齐方式。
- justify-content:控制网格容器内所有行的对齐方式。
- align-content:控制网格容器内所有列的对齐方式
示例:
.container {
display: grid;
grid-template-columns: repeat(3, 1fr);
grid-template-rows: auto;
grid-gap: 20px;
justify-items: center; /* 水平居中所有子元素 */
align-items: start; /* 垂直方向上所有子元素顶部对齐 */
}
/* 容器内的对齐和分布 */
.container {
justify-content: space-between; /* 行之间的空间平均分布 */
align-content: space-around; /* 列之间的空间平均分布,包括边缘 */
}
高级技巧
- 网格嵌套:CSS Grid 允许在一个 Grid 容器内嵌套另一个 Grid 容器,这为复杂的布局提供了极大的灵活性。
- 网格层叠上下文:在 CSS Grid 中,Grid 容器可以创建一个新的层叠上下文,这意味着 Grid 项可以覆盖或被其他元素覆盖
- 使用媒体查询:媒体查询允许我们根据不同的屏幕尺寸或设备特性应用不同的样式规则。在 CSS Grid 中,我们可以使用媒体查询来改变网格的列数、行高、间隙等属性,以适应不同的视口大小
示例:

<div class="container">
<div class="item">Grid Item 1</div>
<div class="subgrid">
<div class="item">Subgrid Item 1</div>
<div class="item">Subgrid Item 2</div>
<div class="item">Subgrid Item 3</div>
</div>
<div class="item-overlapping">Overlapping Item</div>
</div>
.container {
display: grid;
grid-template-columns: 1fr 2fr;
gap: 10px;
width: 100%;
max-width: 800px;
position: relative;
}
.subgrid {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 5px;
padding: 20px;
background-color: #f0f0f0;
border: 1px solid #ddd;
}
.item-overlapping {
position: absolute;
top: 20px;
left: 20px;
background-color: rgba(255, 0, 0, 0.5); /* 半透明红色背景 */
padding: 10px;
color: white;
}
2.2.3 响应式布局
响应式布局强调不同屏幕要有不同的显示,比如媒体查询。
核心定位:仅用一套设计和代码,适配全设备屏幕的主流布局方案。
核心特点:
- 概念由设计师Ethan Marcotte在2010年提出,通过CSS3媒体查询、流式布局等技术实现。
- 页面会随浏览器窗口宽度实时自动调整元素尺寸与布局,无需切换不同网页版本。
- 开发维护工作量小,仅需维护一套代码,缺点是部分极端屏幕尺寸下可能出现排版混乱,很难兼顾所有设备的完美体验。
- 目前行业主流趋势是“自适应+响应式”结合,不同平台开发独立版本,每个版本内部再做响应式适配。
自适应是最早出现的,后面才有了响应式。
自适应布局的主要目的是确保网页在不同大小的设备上都能以相同的方式呈现。然而,这种布局方式在屏幕尺寸缩小到一定程度时,可能会显得过于拥挤,无法自动调整页面的布局。
响应式布局则是为了解决自适应布局的局限性而诞生的。它能够根据屏幕的尺寸变化自动调整页面的布局,使得页面在不同设备上都能以最合适的方式展示。响应式布局可以自动识别屏幕宽度,并根据宽度变化调整页面元素的位置和大小,从而提供更好的用户体验。
响应式布局提供了更灵活和适应性强的设计方案,而自适应布局则更适合在特定设备上提供一致的用户体验。

如图:响应式布局时同一个页面用不同设备(电脑、平板、手机)去访问此页面,最后看到的布局和内容都有很大不同。自适应布局时看到的页面内容和布局基本上还是一样的,就是尺寸略有不同。
响应式布局的优势:
- 灵活性:响应式布局能够根据屏幕尺寸的变化自动调整页面布局和元素大小,提供更好的用户体验。例如,当屏幕宽度减半时,图片和内容会自动调整为一行显示三个而不是六个,从而避免页面过于拥挤4。
- 兼容性:响应式设计能够兼容各种设备和屏幕尺寸,无需为每种设备开发不同的版本,简化了开发和维护工作。
- 现代标准:随着Web标准的不断发展,响应式设计已成为主流,大多数现代网站都采用响应式布局来适应不同的浏览设备。
📋 基础核心技术
- 视口设置:通过
<meta name="viewport">标签配置移动端页面缩放规则,禁止页面默认缩放,确保移动端内容按实际屏幕尺寸正常展示。 - 媒体查询
@media:响应式布局的核心规则,可根据屏幕宽度、分辨率等设备属性定义不同断点下的专属样式,是实现不同设备布局切换的关键技术1。 - 流式布局:使用百分比单位定义元素宽高,让元素尺寸跟随父容器或浏览器窗口自动等比例缩放,避免固定像素值在不同屏幕下出现溢出或留白问题3。
- 相对单位适配:使用
rem、vw/vh等相对单位替代固定px,让字体、元素尺寸随屏幕基准值动态调整,实现全页面比例自适应。

优先采用「媒体查询 + Flex + 流式布局」的组合方案,可覆盖90%以上的常规响应式场景,复杂页面骨架搭配Grid布局,能大幅减少冗余代码量。在Vue+Tailwind技术栈中,直接使用内置的sm:、md:断点前缀原子类,无需手动编写大量媒体查询样式,开发效率会显著提升
1、 媒体查询(Media Query)
响应式布局的关键技术是CSS3中的媒体查询,监测设备屏幕大小,通过css媒体查询来有针对性的更改页面的布局,可以监测屏幕方向(移动设备),设备类型等等,核心在于感知。在不同屏幕下可以显示不同版式。响应式是用于解决不用设备之间不用分辨率之间的兼容问题(一般是指PC,平板,手机等设备之间较大的分辨率差异)
响应式设计的目标是确保一个页面在所有终端上(各种尺寸的PC、手机、手表Web浏览器等等)都能显示出令人满意的效果,
因为是css3时代才有的新技术,那坑爹的IE6、7、8铁定不支持了,所以,使用媒体查询的时候要用js做一下小小的兼容。
对CSS编写者而言,在实现上不拘泥于具体手法,但通常是糅合了流式布局+弹性布局,再搭配媒体查询技术使用
以下是媒体查询结合flex弹性布局实现响应式布局:
使用rem作为元素的单位,元素的尺寸就会随着 html 中 font-size 的变化而变换。当屏幕较大时,设置 font-size 为较大值,元素就会变大;当屏幕较小时,设置 font-size 为较小值,元素就会变小。
什么是媒体查询:
- 媒体指的就是各种设备 (移动设备, PC设备)
- 查询指的是要检测属于哪种设备
- 媒体查询: 通过查询当前属于哪种设备,让网页能够在不同的设备下正常的预览
媒体查询语法:
- 用 @media开头 注意@符号
- mediatype 媒体类型
- 关键字 and not only
- media feature媒体特性必须有小括号包含
格式:
@media mediatype and|not|only (media feature) {
CSS-Code;
}
mediatype 查询类型
- all (所有的设备)
- print (打印设备)
- screen (电脑屏幕,平板电脑,智能手机)
关键字
目的将媒体类型和媒体特性链接到一块,进行设备检测
- and 可以将多个媒体特性链接到一块,相当于且
- not 排除某个媒体特性 相当于非,可以省略
- only 指定某个特定的媒体类型, 可以省略
媒体特性
每种媒体类型都具体各自不同的特性,根据不同媒体类型的媒体特性设置不同的展示风格。
用来描述设备的特点,比如宽度,高度…
注意他们要加小括号包含
- width 网页显示区域完全等于设置的宽度
- height 网页显示区域完全等于设置的高度
- max-width / max-height网页显示区域小于等于设置的宽度
- min-width / min-width 网页显示区域大于等于设置的宽度
- orientation:portrait (竖屏模式) | landscape (横屏模式)
例如:
@media screen and (min-width:1000px){ // 大于1000px,对应PC端页面
html,body{
font-size:14px;
}
}
@media screen and (max-width:1000px) and (min-width:768px){ //在小于1000px和大于768px之间,对应平板端页面
html,body{font-size:13px;}
}
@media screen and (max-width:768px){ // 小于768px,对应手机端页面
html,body{font-size:12px;}
}
以上是利用媒体查询,在不同分辨率下给 html 的 font-size 赋值。
以下是利用 js 动态计算赋值,缺点就是打开页面时候,元素大小会有一个变化过程。
优化版:
当设计师交付给前端开发一张宽度为750px的视觉稿,设计稿是基于 iPhone6 设计的,也就是宽度 750px(先不考虑dpr的问题下面会说),要求工程师工适配不同屏幕尺寸的设备。
采用等比缩放的方案:
假如设置 1rem 等于 100px( HTML font-size 为 100px),相当于 7.5rem = 100%宽度 = 设备的宽度。
由于是基于 7.5rem 开发。iPhone6 的物理像素是 375px(dpr是2.0),如果此时还想让 7.5rem 等于设备宽度,只能调整 1rem 对应 font-size 的比例, 让 1rem= 375 / 7.5=50px 就可以实现。
如果想让 iPhone5 适配只需要 1rem = (320 / 7.5) = 42.66px 就可以实现 iPhone5 的适配。
此时我们需要动态计算并设置不同尺寸 html 的 font-size 属性,让rem 方案既能实现页面级整体缩放,又能个性化控制某些元素不缩放。
// 改变窗口大小时重新设置 rem
window.onresize = function () {
setRem();
}
function setRem(isFirst) {
let clientWidth = document.documentElement.clientWidth;// 当前页面宽度
clientWidth = width > 750 ? 750 : width;// 屏幕宽度大于750,不再放大
document.documentElement.style.fontSize = clientWidth / 7.5 + 'px'; // 设置页面根节点字体大小
}
setRem();
2、 利用UI框架实现响应式布局
现在的主流UI框架都会考虑到响应式布局这个问题,比如elementUI,iview等框架提供了栅格系统,<row>搭配<col>来实现响应式布局。
3、 移动端响应式布局 viewport
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
这个写法是用户不能缩放的页面设计。因为,如果页面能缩放的话,就会影响用户的体验。其二:就是我们如果让页面缩放的话,就完全暴露了我们手机app的程序是html的架构了。
所以,我们专为移动端的设计页面的时候,就不需要用户进行缩放了
4、Columns栅格系统
Columns栅格系统是响应式网格布局的核心实现方案,属于现代前端二维布局体系的重要组成部分。
📋 核心基础定义
它是基于“行(row)+ 列(column)”的组合规则搭建的排版系统,最常用的是12列等分规则,所有列元素必须嵌套在指定容器内,通过预设的栅格类快速定义元素占比。
- 核心组成:栅格列(column)、水槽(gutter)、页面边距(margin)三部分构成
- 适配逻辑:通过媒体查询定义不同屏幕断点的列宽规则,实现不同设备下的布局自动调整
- 典型实现:Bootstrap、Ant Design等主流UI框架的栅格能力,都是基于该体系封装而来
🔍 技术底层关联
Columns栅格系统的底层技术经历了三代演进:
- 早期基于浮动布局实现多列排列,需要额外处理清除浮动的兼容逻辑
- 中期逐步迁移到Flex布局,实现更灵活的元素自适应对齐效果
- 现代版本直接基于CSS Grid原生能力,实现更复杂的二维网格排版
Columns栅格系统往往需要依赖某个UI库,如Bootstrap或者是Element UI等.
- Bootstrap来自Twitter,是一个用于快速开发 Web 应用程序和网站的前端框架。它提供了一套响应式、移动设备优先的流式网格系统,随着屏幕或视口(viewport)尺寸的改变,系统会自动将视口分为最多12列。它根据当前视口的大小添加多个媒体查询断点,可以让开发者方便的根据视口大小调整每个网格所占整体视口的宽度。
- Bootstrap(5.0)有六种默认响应尺寸:xs、sm、md、lg、xl、xxl,对应关系如下

在class加上bootstrap独有的Class前缀,就可以使用bootstrap了,当然你得先引入bootstrap的插件.示例:
<div class="col-xs-6 col-sm-3"></div>

2.3 组合方案
一个常规网页通常会同时使用 2~4种布局方式,不会单一依赖某一种方案。
如下在页面的不同区域使用不同的布局方式:

前端布局最佳方案与组合:
✅ 当下最优布局选择
现代前端开发中,Flex + Grid 组合是综合体验最好的布局方案,完全可以覆盖90%以上的业务场景:
- Flex 作为一维布局首选,负责组件内的横向/纵向排列、居中对齐、自适应换行等场景,代码简洁易维护,兼容性覆盖所有主流浏览器。
- Grid 作为二维布局首选,负责页面整体骨架搭建、复杂多行列卡片排版,无需嵌套多层容器就能实现精准的网格控制。
- 搭配 Tailwind 原子类使用时,无需手写大量自定义CSS,直接通过内置类名就能快速完成布局,开发效率提升非常明显。
2.3.1 移动Web主流布局方案
移动Web开发中,优先选择适配性强、开发效率高的组合布局方案,可覆盖绝大多数移动端场景。
✅ 首选核心布局组合
- Flex弹性布局:移动端一维布局的绝对首选,可轻松实现导航栏、按钮组等元素的居中、自适应换行,代码简洁易维护,所有现代移动端浏览器完美兼容。
- Grid网格布局:用于搭建页面整体骨架、复杂卡片流等二维排版场景,无需嵌套多层容器就能实现精准的行列控制,适配不同尺寸手机屏幕。
- 相对单位适配:优先使用
vw/vh视口单位,1vw等于屏幕宽度的1%,无需额外JS计算即可让元素随屏幕实时缩放;复杂等比适配场景可搭配rem单位,配合flexible.js实现全机型等比例适配。
⚙️ 基础适配必备技术
- 视口配置:在页面头部添加标准viewport标签,设置
width=device-width、禁止用户缩放,确保移动端页面按实际屏幕尺寸正常展示。 - 流式百分比布局:元素宽度使用百分比定义,搭配
max-width/min-width限制尺寸边界,避免元素在极端屏幕下出现溢出或过度拉伸的问题。 - 媒体查询
@media:针对不同断点的屏幕调整细节样式,实现小屏、大屏手机的差异化适配,保证不同设备下的展示效果统一。
2.3.2 PC端常用布局方式
PC端布局优先选择兼顾灵活性、兼容性和开发效率的组合方案,可覆盖绝大多数后台系统、官网、电商平台等场景。
1、现代主流布局方案
- CSS Grid 二维布局:作为页面整体骨架的核心方案,通过
display: grid快速划分头部、侧边栏、主内容区、底部的二维网格结构,无需嵌套多层容器就能实现精准的行列控制,适配不同尺寸的PC显示器1。 - Flex 弹性布局:负责组件内的局部排版,比如导航栏、按钮组、表单元素的横向/纵向排列,轻松实现元素居中、自适应分配剩余空间,是PC端局部布局的绝对主流选择1。
- 响应式媒体查询:通过
@media规则定义不同PC断点的布局样式,在1920px、1366px等常见PC分辨率下自动调整元素尺寸,避免页面在不同显示器下出现布局错乱。
2、经典业务布局结构

这四种都是PC端网页开发中高频使用的成熟布局模式,覆盖从后台系统到资讯门户的绝大多数业务场景。
📋 左右两栏布局
这是后台管理系统最常用的布局模式,将页面横向划分为两个独立区域,根据比例差异可细分为三类:
- 左窄右宽:左侧放置导航菜单,右侧承载主内容,符合用户从左到右的浏览习惯,适配导航分类清晰的后台系统场景2。
- 左宽右窄:左侧展示核心内容,右侧放置辅助导航或推荐信息,适合内容优先的资讯类页面。
- 左右均等:两侧等宽排布内容,多用于双栏对比类页面,不过会增加用户视线交叉的视觉负担,使用场景相对有限2。
现代开发中用Flex布局仅需几行代码即可实现,支持左栏定宽、右栏完全自适应剩余空间的效果。
🔍 目字型布局
属于经典的高密度信息布局,整体结构类似“目”字的分层形态:
- 页面顶部设置通栏导航,下方横向划分多列内容区,底部再设置通栏页脚,垂直方向形成多层级的信息区块。
- 核心优势是空间利用率极高,能在有限屏幕内承载海量信息,是门户网站、资讯平台的首选布局模式。
- 排版时会通过非对称网格调整不同栏目的宽度比例,避免页面显得呆板拥挤,兼顾信息密度和浏览舒适度3。
⚙️ 综合组合布局
这是灵活度最高的自定义布局方案,不局限于固定的栏式结构:
- 它会结合分栏网格、模块区块、自由排版等多种方式,根据页面内容的特性灵活调整布局形态。
- 常见于企业官网、创意营销页面,既可以保留规整的导航和内容区块,又能在重点宣传区域加入个性化的自由排版,平衡页面的秩序感和设计感。
- 底层多基于复合网格实现,结合了分栏规则和模块自定义能力,能为图片、动效元素提供更大的排布自由度3。
🃏 多列卡片布局
以等宽或规则不等宽的卡片元素为核心,沿横向自动排列成多列的流式布局:
- 卡片元素统一承载商品、资讯、功能入口等内容,自动适配容器宽度换行排列,视觉上整齐统一,信息层级清晰。
- 是电商商品列表、内容平台推荐流、后台功能入口页的主流布局,现代开发中用CSS Grid可以快速实现多列自适应卡片效果,无需复杂计算即可适配不同屏幕宽度。
⚙️ 传统兼容布局方案
针对老旧项目或需要兼容低版本浏览器的场景,可使用经典的圣杯布局、双飞翼布局,通过浮动+负边距实现三栏布局,保证中间内容优先加载,适配早期PC端的开发需求。
同时早期的DIV+CSS流式布局,通过百分比宽度配合margin: 0 auto实现内容居中,至今仍在传统企业站开发中广泛使用
3、圣杯布局与双飞翼布局
二者是CSS经典的三栏布局方案,核心目标是实现中间主内容自适应、左右侧边栏固定宽度,同时保证主内容区在HTML结构中优先加载,提升SEO效果和首屏体验。
📋 核心实现原理
两种布局都基于浮动+负边距的经典技术组合,是早期PC端页面的主流布局方案:
- 圣杯布局:外层容器通过
padding为左右侧边栏预留物理空间,主内容区设置width:100%占满容器宽度,再通过margin-left:-100%等负边距规则,将左右侧边栏拉回对应位置,最后用相对定位微调侧边栏的最终坐标。 - 双飞翼布局:在圣杯布局的基础上做了优化,给主内容区额外嵌套一层内部容器,通过内部容器的
margin属性为侧边栏预留空间,无需额外使用相对定位,代码逻辑更简洁,适配难度更低。
现代使用建议:
这两种属于传统布局方案,现在开发中更推荐使用Flex或Grid实现同类三栏效果,代码量仅为传统方案的1/3,天然支持等高布局,兼容性也覆盖所有现代浏览器,开发和维护效率更高。
具体使用参考
关于html中viewport和initial-scale以及device-width的理解
浙公网安备 33010602011771号