核心常用图片格式有 4 种,各有适配场景,优先级从高到低为:WebP > JPG > PNG > SVG
CSS 盒子模型是浏览器渲染元素的基础,每个元素都被视为一个“盒子”,由内到外分为 4 部分,核心分为两种模式:
HTML5 新增 <video> 和 <audio> 标签,无需依赖插件即可播放音视频,核心用法如下:
<video
src="video.mp4" <!-- 视频地址 -->
controls <!-- 显示默认播放控件(播放/暂停、音量等) -->
autoplay <!-- 自动播放(需配合muted静音,否则多数浏览器禁止) -->
muted <!-- 静音播放 -->
loop <!-- 循环播放 -->
poster="poster.jpg" <!-- 视频加载前显示的封面图 -->
width="600" <!-- 视频宽度 -->
preload="auto" <!-- 预加载策略(auto:自动预加载;none:不预加载) -->
>
您的浏览器不支持video标签,请升级浏览器 <!-- 降级提示 -->
</video><audio
src="audio.mp3"
controls
autoplay
muted
loop
>
您的浏览器不支持audio标签,请升级浏览器
</audio>注意:autoplay 属性在 Chrome、Safari 等浏览器中,需配合 muted 才能生效,避免自动播放打扰用户。
HTML5 核心新增内容分 5 大类,重点解决旧版 HTML 功能缺失、兼容性差的问题:
CSS3 核心新增特性围绕“样式增强、布局灵活、交互丰富”展开,分 6 大类:
CSS 动画分“过渡动画(transition)”和“关键帧动画(animation)”,核心属性如下:
transform:2D/3D 变换(translate:平移;scale:缩放;rotate:旋转;skew:倾斜),不影响其他元素布局。
浮动(float)会导致父元素高度坍塌,需通过清除浮动解决,常用 5 种方法及优劣如下:
方法 | 实现代码 | 优点 | 缺点 |
|---|---|---|---|
额外标签法 | 父元素末尾加 | 简单易懂,兼容性好 | 增加无意义标签,语义化差,代码冗余 |
父元素 overflow:hidden | .parent { overflow: hidden; } | 代码简洁,无额外标签 | 会隐藏父元素超出部分的内容,不适合有定位元素的场景 |
父元素伪元素清除(推荐) | .parent::after { content: ""; display: block; clear: both; height: 0; visibility: hidden; } | 语义化好,无额外标签,兼容性强 | 代码稍多(可封装为公共类) |
父元素浮动 | .parent { float: left; } | 简单,无额外代码 | 会导致父元素自身浮动,影响外层布局,连锁问题多 |
父元素设置 BFC | .parent { overflow: auto; / display: flow-root; } | 无副作用,布局稳定 | display: flow-root 兼容性稍差(IE 不支持) |
推荐优先使用「伪元素清除法」或「BFC 清除法」,兼顾兼容性和无副作用。
CSS 定位(position)有 5 个属性值,核心区别在于“定位基准”和“是否脱离文档流”:
属性值 | 定位基准 | 是否脱离文档流 | 核心特点/使用场景 |
|---|---|---|---|
static(默认) | 无定位基准 | 否 | 正常文档流布局,top/right/bottom/left、z-index 无效;用于取消定位 |
relative(相对定位) | 自身原来的位置 | 否 | 不脱离文档流,保留自身占位;用于微调元素位置、作为绝对定位的父容器 |
absolute(绝对定位) | 最近的已定位(非 static)父元素,无则相对于视口 | 是 | 脱离文档流,不保留占位;用于弹窗、悬浮元素、精准定位 |
fixed(固定定位) | 浏览器视口 | 是 | 脱离文档流,不随页面滚动;用于导航栏、回到顶部按钮、悬浮广告 |
sticky(粘性定位) | 滚动到指定阈值前相对父元素,之后相对视口 | 否(滚动前)/ 是(滚动后) | 结合 relative 和 fixed 特性;用于滚动吸顶导航、列表标题吸顶 |
注意:absolute/fixed/sticky 需配合 top/right/bottom/left 定位,否则效果等同于 static。
分“水平居中”“垂直居中”“水平垂直居中”三类场景,按兼容性和简洁度排序推荐:
两者是 box-sizing 的两个值,核心区别在于“width/height 是否包含 padding 和 border”:
属性值 | width/height 包含范围 | 盒子实际宽度 | 特点/使用场景 |
|---|---|---|---|
content-box(默认) | 仅包含 content(内容区) | width + padding-left/right + border-left/right | padding 和 border 会撑大盒子,布局易出错;适合简单场景 |
border-box(推荐) | content + padding + border | 等于设置的 width(固定) | padding 和 border 不会撑大盒子,布局可控;适合复杂布局、响应式开发 |
推荐全局设置:* { box-sizing: border-box; },避免布局计算误差。
除上述通用方案外,补充 6 种垂直居中方案,适配不同场景:
核心是“相对于视口居中”,常用 4 种方案,按推荐度排序:
注意:需给 body 设置 min-height: 100vh,确保占满视口高度。
Chrome 默认最小字体为 12px,小于 12px 会自动放大为 12px,可通过 3 种方案突破限制:
推荐使用 scale 方案,无兼容性问题,不影响布局。
仅文本相关、字体相关属性可继承,布局属性不可继承:
不可继承属性:width、height、margin、padding、border、background、position、float 等。
规则:权重叠加计算(如#id .class div 权重=100+10+1=111);权重相同则后定义的选择器生效;继承的样式权重最低。
核心优化思路:“减小体积、减少请求、延迟加载、优化加载策略”,具体方案如下:
特点:不独占一行,宽高由内容决定,不能设置 width/height,margin/padding 仅水平方向生效。
常见:<span>、<a>、<i>、<em>、<strong>、<label>、<img>(inline-block)、<input>(inline-block)。
特点:独占一行,宽高可设置,margin/padding 水平垂直都生效,默认宽度为父元素 100%。
常见:<div>、<p>、<h1-h6>、<ul>、<ol>、<li>、<form>、<header>、<footer>、<section>。
特点:不独占一行,可设置 width/height,margin/padding 全生效(结合行内和块级优点),常见:<img>、<input>、<button>、<select>。
转换:通过 display: inline/block/inline-block 可互相转换。
浏览器渲染模式由 DOCTYPE 声明决定,核心影响 CSS 盒子模型、布局兼容性:
模式 | 触发条件 | 渲染规则 | 特点 |
|---|---|---|---|
标准模式(Standards Mode) | 页面开头有正确的 DOCTYPE 声明(如 ) | 遵循 W3C 标准渲染,box-sizing 默认 content-box | 布局规范,兼容性好,所有现代浏览器默认优先 |
怪异模式(Quirks Mode) | 无 DOCTYPE 声明,或 DOCTYPE 声明错误/不完整 | 模拟 IE6/7 渲染方式,box-sizing 默认 border-box,布局有兼容性问题 | 布局混乱,易出现兼容性 bug,需避免 |
结论:必须在 HTML 文件开头添加 <!DOCTYPE html>,强制浏览器进入标准模式。
核心区别:margin 是“盒子外部间距”(与其他盒子的距离),padding 是“盒子内部间距”(内容与边框的距离),使用场景划分:
原则:“外间距用 margin,内间距用 padding”,避免混用导致布局混乱。
Flex 布局核心分“容器属性”(父元素)和“项目属性”(子元素),容器需先设置 display: flex/inline-flex:
分“表单元素禁用”和“普通元素禁用”,核心方案如下:
适用于 <button>、<input>、<select>、<textarea> 等:
<button disabled>禁用按钮</button>
<input type="text" disabled value="禁用输入框">
<select disabled>
<option>禁用下拉框</option>
</select>特点:禁用后不可点击/输入,样式默认变灰,表单提交时不会携带该元素值。
需通过 CSS+JS 实现,禁止点击和交互:
.disabled {
pointer-events: none; /* 禁止鼠标事件(点击、hover等) */
cursor: not-allowed; /* 鼠标变为禁止样式 */
opacity: 0.6; /* 透明度降低,提示禁用 */
user-select: none; /* 禁止选中文字 */
}<div class="disabled">禁用的div</div>
<a href="#" class="disabled">禁用的链接</a>注意:pointer-events: none 会禁止所有鼠标事件,若需保留部分交互,需配合 JS 阻止事件冒泡。
Flex(弹性盒子)布局核心是“通过容器和项目的属性,控制项目在主轴和交叉轴上的排列、缩放、对齐”,原理如下:
核心优势:无需浮动、定位,即可快速实现元素居中、自适应、均匀分布等布局,兼容性覆盖所有现代浏览器。
px 和 rem 都是 CSS 长度单位,核心区别在于“是否跟随根元素字体大小变化”:
单位 | 定义 | 是否自适应 | 使用场景 | 优缺点 |
|---|---|---|---|---|
px | 像素,固定长度单位,1px=屏幕 1 个物理像素 | 否(固定大小) | 固定尺寸元素(如边框、图标大小、按钮固定宽高) | 优点:精准可控;缺点:不支持响应式,不同屏幕尺寸下显示效果不一致 |
rem | 相对单位,1rem=根元素(html)的 font-size 大小 | 是(跟随根元素字体大小变化) | 响应式布局(如文字大小、容器宽高、间距) | 优点:适配不同屏幕,响应式友好;缺点:需设置根元素 font-size,计算稍复杂 |
移动端常用方案:html { font-size: 100px; }(1rem=100px),配合媒体查询动态调整根元素 font-size。
网页三层结构是前端开发的核心规范,分别负责“结构、样式、行为”,相互分离、各司其职:
分离优势:代码易维护、可复用,便于多人协作,提升开发效率。
媒体查询(Media Query)是 CSS3 核心特性,用于“根据设备特性(屏幕尺寸、分辨率、设备类型)动态切换样式”,实现响应式布局。
/* 语法结构 */
@media 媒体类型 and (媒体特性) {
/* 满足条件时生效的CSS样式 */
选择器 {
属性: 值;
}
}/* 桌面端默认样式(屏幕>1200px) */
.container { width: 1200px; margin: 0 auto; }
/* 平板端(768px<屏幕≤1200px) */
@media screen and (max-width: 1200px) {
.container { width: 90%; }
}
/* 移动端(屏幕≤768px) */
@media screen and (max-width: 768px) {
.container { width: 100%; padding: 0 10px; }
}注意:需配合 <meta name="viewport" content="width=device-width, initial-scale=1.0">,确保媒体查询在移动端生效。
rem 作为响应式单位虽常用,但存在 3 个核心缺点:
替代方案:移动端可用 vw/vh 单位,无需设置根元素 font-size,更适配响应式。
像素比例(devicePixelRatio,dpr)是“设备物理像素与逻辑像素的比值”(如高清屏 dpr=2,1 逻辑像素=2 物理像素),移动端配置核心是“让页面在不同 dpr 设备上显示清晰”,方案如下:
通过 meta 标签设置 viewport,适配 dpr:
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no">根据 dpr 加载不同尺寸图片,避免图片模糊:
<img src="img@1x.jpg"
srcset="img@1x.jpg 1x, img@2x.jpg 2x, img@3x.jpg 3x"
alt="高清图">srcset 属性按 dpr 匹配图片:dpr=1 加载 @1x 图,dpr=2 加载 @2x 图,dpr=3 加载 @3x 图,保证图片清晰。
dpr>1 时,1px 边框会显示为 2px(模糊),需通过 transform 缩放实现高清 1px 边框:
/* 高清1px下边框 */
.border-bottom {
position: relative;
}
.border-bottom::after {
content: "";
position: absolute;
bottom: 0;
left: 0;
width: 100%;
height: 1px;
background: #eee;
transform: scaleY(0.5); /* dpr=2时缩放0.5,等价1px物理像素 */
transform-origin: bottom center;
}通过 JS 获取 dpr,动态设置 viewport 缩放比,适配更精准:
// 获取设备dpr
const dpr = window.devicePixelRatio || 1;
// 设置viewport缩放比为1/dpr
const meta = document.createElement('meta');
meta.name = 'viewport';
meta.content = `width=device-width, initial-scale=${1/dpr}, maximum-scale=${1/dpr}, minimum-scale=${1/dpr}, user-scalable=no`;
document.head.appendChild(meta);核心适配“浏览器差异(IE/Chrome/Safari)”和“设备差异”,常用处理方案如下,覆盖 HTML、CSS、JS 全场景:
引入 autoprefixer(自动添加 CSS 前缀)、postcss(CSS 兼容性处理)、babel-polyfill(补充 ES6+API),减少手动兼容成本。
按“兼容性优先级 + 简洁度”排序,分 4 类核心方案,覆盖所有场景(行内/块级/任意元素):
3 种常用方案,按推荐度、兼容性排序,覆盖面试高频考点:
DOCTYPE(文档类型声明)是 HTML 文件开头的必选指令,核心作用的是“指定 HTML 版本、触发浏览器渲染模式、保证布局兼容性”,具体如下:
注意:DOCTYPE 声明必须放在 HTML 文件第一行,无任何前置空格、注释或标签,否则会失效,浏览器可能进入怪异模式。
浏览器内核(又称渲染引擎)负责解析 HTML/CSS、渲染页面、处理布局,是浏览器的核心组件,常见内核及对应浏览器如下(按市场占有率排序):
内核名称 | 所属厂商 | 对应浏览器 | 核心特点 |
|---|---|---|---|
Blink( blink ) | Google + Opera | Chrome、Opera、新版 Edge、360 极速浏览器、QQ 浏览器 | 渲染速度快,支持 HTML5/CSS3 新特性多,基于 WebKit 分支开发,兼容性好 |
WebKit | Apple | Safari、老版 Edge、iOS 自带浏览器、macOS 自带浏览器 | 渲染流畅,对移动端适配友好,兼容性稳定,开源 |
Gecko | Mozilla | Firefox(火狐) | 开源,扩展性强,对 W3C 标准支持度极高,安全性好 |
Trident(三叉戟) | Microsoft | IE 浏览器(IE6-IE11)、老版 Edge(EdgeHTML 是其分支) | 兼容性差,对新特性支持滞后,已被微软淘汰,仅用于旧系统兼容 |
Presto( presto ) | Opera | 旧版 Opera(12 及以下版本) | 渲染速度极快,已停止维护,被 Blink 内核替代 |
补充:前端开发需重点适配 Blink、WebKit、Gecko 内核,Trident 内核仅需兼容 IE11(旧项目)。
两者均用于引入 CSS 文件,但本质、加载机制、兼容性差异较大,核心区别如下(面试高频考点):
对比维度 | link | @import |
|---|---|---|
本质 | HTML 标签,不属于 CSS 语法范畴 | CSS 语法规则,只能在 CSS 文件/Style 标签中使用 |
加载顺序 | 与 HTML 文档同步加载,不阻塞 HTML 解析(仅 CSSOM 构建阻塞页面渲染) | 需等待父 CSS 文件加载、解析完成后,才会加载导入的 CSS 文件,存在加载阻塞 |
兼容性 | 所有浏览器都支持(包括 IE6+) | IE8 及以下浏览器不支持,兼容性较差 |
功能范围 | 除引入 CSS 外,还可引入图标(rel="icon")、预加载(rel="preload")、DNS 预解析(rel="dns-prefetch")、引入 RSS 等 | 仅能引入 CSS 文件,无其他扩展功能 |
DOM 操作 | 可通过 JS 动态创建 link 标签,实现 CSS 的动态加载(如切换主题) | 属于 CSS 语法,无法通过 JS 动态操作(DOM 无法识别 @import 规则) |
嵌套支持 | 支持嵌套引入(link 引入的 CSS 中可再用 @import),但不推荐(影响加载性能) | IE6-7 不支持 @import 嵌套,其他浏览器支持有限 |
结论:优先使用 link 标签引入 CSS,兼容性好、加载性能优、功能全面;@import 仅用于特殊场景(如 CSS 模块化嵌套),需注意兼容性。
BFC(Block Formatting Context,块级格式上下文)是一个独立的渲染区域,内部元素的布局不受外部元素影响,外部元素也不受内部元素影响,核心作用是“解决浮动塌陷、margin 重叠、元素被浮动覆盖”问题。
注意:触发 BFC 时优先选择 overflow: auto(无副作用)或 display: flow-root(专门触发 BFC,无副作用),避免使用 overflow: hidden(会隐藏超出内容)。
核心原理:利用 CSS 边框的“梯形特性”——当元素宽高为 0 时,边框会呈现梯形,将其中 3 个边框设为透明,仅保留 1 个边框作为三角形,常用 2 种方案(面试必背):
核心:宽高设为 0,3 个边框透明,1 个边框设为目标颜色,调整边框宽度控制三角形大小。
/* 向下的三角形(箭头朝下,核心示例) */
.triangle-down {
width: 0;
height: 0;
/* 左右边框透明,下边框为目标颜色 */
border-left: 50px solid transparent; /* 左侧边框宽度=三角形底边长的一半 */
border-right: 50px solid transparent; /* 右侧边框宽度=三角形底边长的一半 */
border-bottom: 50px solid #ff0000; /* 下边框=三角形高度+颜色 */
border-top: 0; /* 清除上边框,可选 */
}方向调整(举一反三): - 向上三角形:border-bottom 透明,保留 border-top(border-top: 50px solid #ff0000;) - 向左三角形:border-right 透明,保留 border-left(border-left: 50px solid #ff0000;) - 向右三角形:border-left 透明,保留 border-right(border-right: 50px solid #ff0000;)
核心:通过两个嵌套的三角形叠加,外层三角形为边框颜色,内层三角形为主体颜色,微调位置露出边框。
/* 带白色边框的红色向下三角形 */
.triangle-border {
position: relative;
width: 0;
height: 0;
/* 外层三角形(边框颜色,稍大) */
border-left: 50px solid transparent;
border-right: 50px solid transparent;
border-bottom: 50px solid #ff0000; /* 主体颜色 */
}
.triangle-border::after {
content: "";
position: absolute;
top: 1px; /* 向上微调1px,露出外层边框 */
left: -49px; /* 向左微调1px,对齐外层 */
width: 0;
height: 0;
/* 内层三角形(背景颜色,稍小) */
border-left: 49px solid transparent;
border-right: 49px solid transparent;
border-bottom: 49px solid #fff; /* 边框颜色(与父容器背景一致) */
}补充:三角形大小由边框宽度决定,边框宽度越大,三角形越大;颜色可自由调整,适配不同场景。
viewport(视口)是“浏览器显示页面内容的区域”,核心作用是“适配移动端设备”,解决移动端页面“缩放异常、布局错乱、显示模糊”问题,通过 meta 标签配置(移动端开发必写)。
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no">注意:若不设置 viewport 标签,移动端浏览器会默认使用“980px 宽的视口”渲染页面,导致页面布局错乱,因此移动端开发必须添加 viewport 配置。
苹果设备(iPhone/iPad)因「视网膜屏(dpr>1)」「Safari 默认样式」「视口适配差异」,常出现“设置的像素宽度显示不足、内容被截断或留白异常”,核心原因是「物理像素与逻辑像素不匹配」「Safari 默认边距/缩放干扰」,针对性解决方案如下:
苹果设备 dpr 多为 2(普通视网膜屏)或 3(Pro 系列),仅设置 width=device-width 不够,需通过 JS 动态调整 viewport 缩放比,让逻辑像素与物理像素对齐:
// 苹果设备适配核心代码(兼容所有dpr)
const dpr = window.devicePixelRatio || 1;
const meta = document.createElement('meta');
meta.name = 'viewport';
// 关键:缩放比=1/dpr,保证1逻辑像素=1物理像素,避免宽度显示不足
meta.content = `width=device-width, initial-scale=${1/dpr}, maximum-scale=${1/dpr}, minimum-scale=${1/dpr}, user-scalable=no`;
// 优先替换现有viewport,避免重复
const existingMeta = document.querySelector('meta[name="viewport"]');
if (existingMeta) {
document.head.replaceChild(meta, existingMeta);
} else {
document.head.appendChild(meta);
}补充:苹果 Safari 对 initial-scale=1.0 的解析更严格,动态设置 1/dpr 缩放比,可解决“设置 width=375px(iPhone SE 逻辑宽)但显示仍不足”的问题。
苹果 Safari 默认给 body 添加 8px 边距,且有“滚动回弹”“默认字体大小”等特性,会导致设置的宽度被压缩,需全局重置样式:
/* 苹果设备专属样式重置(全局生效) */
* {
margin: 0;
padding: 0;
box-sizing: border-box; /* 避免padding撑大宽度 */
}
body {
margin: 0 !important; /* 清除Safari默认8px边距 */
-webkit-font-smoothing: antialiased; /* 优化苹果字体显示 */
-webkit-text-size-adjust: 100%; /* 禁止苹果自动调整字体大小 */
}
/* 禁止Safari滚动回弹(可选,避免布局偏移) */
html, body {
overflow-x: hidden;
-webkit-overflow-scrolling: touch;
}苹果设备不同机型逻辑宽度不同(如 iPhone 14 为 390px,iPhone SE 为 375px),固定 px 宽度易出现“小屏显示不足、大屏留白”,优先用响应式单位:
// JS动态设置根元素font-size(适配苹果不同机型) ``function setRem() { `` const clientWidth = document.documentElement.clientWidth;`` // 苹果设备逻辑宽度区间:320px(旧iPhone)~ 428px(iPhone 15 Pro Max)`` const baseSize = Math.min(clientWidth, 428) / 7.5; // 7.5为设计稿750px的缩放系数`` document.documentElement.style.fontSize = baseSize + 'px';``} ``setRem(); ``window.addEventListener('resize', setRem);/* 示例:苹果设备375px屏,200px宽度=53.33vw(200/375*100) */ ``.container { `` width: 53.33vw; /* 等价375px屏的200px,自动适配不同苹果机型 */`` max-width: 428px; /* 限制最大宽度,避免大屏过宽 */`` margin: 0 auto;``}苹果设备横屏时,Safari 会保留底部工具栏,导致实际可用宽度小于设备逻辑宽度,需额外适配:
/* 横屏适配:苹果设备横屏时增加内边距,避免内容被工具栏遮挡 */
@media screen and (orientation: landscape) and (-webkit-min-device-pixel-ratio: 2) {
body {
padding-bottom: 44px !important; /* 适配苹果底部工具栏高度 */
}
.container {
width: 95vw !important; /* 预留工具栏空间,避免宽度不足 */
}
}核心总结:苹果设备宽度显示不足,本质是「dpr 适配不当 +Safari 默认样式干扰」,优先通过“动态 viewport+ 响应式单位 + 样式重置”解决,无需额外修改固定像素逻辑,兼顾兼容性与显示效果。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。