移动端适配总结

1. 视口标签

html 复制代码
<meta name="viewport" content="width=device-width, initial-scale=1.0">

移动端页面宽度根据设备宽度来走

2. 物理像素(设备像素)和逻辑像素(CSS像素)

设计师设计稿是按照物理像素 设计的。手机分辨率

前端开发是按照CSS像素开发代码的。

设备像素比(DPR)=物理像素/CSS像素

手机高清屏的出现,需要2倍或3倍图。

  • iPhone 4 开始使用 Retina 屏幕:1 个 CSS 像素 = 2×2 个物理像素(即 dpr = 2)。
  • 如果用 1 倍图(100×100),在 2 倍屏上会被拉伸到 200×200 物理像素 → 模糊!
  • 用 2 倍图(200×200),正好填满 200×200 物理像素 → 清晰锐利。

设计稿和开发的关系(以375为例)

角色 操作
UI设计师 在Sketch/Figma中设置画布宽度为375pt(逻辑尺寸),但导出图片时,按2倍(750px宽)导出
前端开发者 写CSS时仍按375px宽度布局,引用图片时,用img标签或background-image,不写宽高或写逻辑尺寸(浏览器自动格局dpr选择合适图片,或通过JS/媒体查询适配)

3.移动端适配方案

3.1 响应式

一套代码通过响应式方案完成PC、平板、手机端的适配。

代表:vivo官网,华为官网

媒体查询

css 复制代码
/* 默认:移动端样式 */
.container {
  width: 100%;
  padding: 10px;
}

/* 平板及以上 */
@media (min-width: 768px) and (max-width: 1024px) {
  .container {
    width: 750px;
    margin: 0 auto;
  }
}

/* 桌面端 */
@media (min-width: 1024px) {
  .container {
    width: 1000px;
  }
}

/* 大屏 */
@media (min-width: 1440px) {
  .container {
    width: 1200px;
  }
}

3.2 单位适配

PC和平板通过响应式适配。

单独制作手机端页面,通过rem/vw单位完成页面适配。

代表:淘宝手机端、B站手机端、京东手机端

插件转换:编写代码时都用px,编写完后,通过插件编译后转换为vw。

vue: postcss-px-to-viewport

弹性布局

弹性布局:flex布局(一维,主要用于一行布局时)

css 复制代码
.container{
    display: flex;
    flex-direction: row;      /*定义主轴方向,默认row, row-reverse/column/column-reverse*/
    justify-content: center;  /*控制项目在主轴上的对齐方式: flex-start(默认)flex-end center space-between space-around space-evenly*/
    align-items: stretch;     /*控制项目在交叉轴上的对齐方式:stretch(默认)flex-start flex-end center baseline*/
    height: 300px;            /* 容器必须有高度,否则交叉轴无空间 */
    flex-wrap: wrap;          /* 项目溢出时换行 */

    /*align-content:换行后,控制多根轴线的对齐方式,单根轴线时无效*/
} 
.container item{
	flex: 1 1 0; /*flex-grow: 1; flex-shrink: 1; flex-basis: 0px;*/
}

Grid布局(二维,同时控制行和列,用于多行多列布局)

css 复制代码
.container {
     display: grid;
     grid-template-columns: 100px 200px auto; /* 3列:固定+固定+剩余 */
     grid-template-rows: 50px 100px;           /* 2行 */
     gap: 16px; /* 行列间距 */
     justify-items: center; /* 所有项目水平居中 */
 	 align-items: start;    /* 所有项目顶部对齐 */
}

fr:分数单位(推荐!),表示剩余空间的比例
/* 4列,每列 1fr */
grid-template-columns: repeat(4, 1fr);

/* 响应式:小屏1列,中屏2列,大屏4列 */
@media (min-width: 768px) {
 .container { grid-template-columns: repeat(2, 1fr); }
}
@media (min-width: 1024px) {
 .container { grid-template-columns: repeat(4, 1fr); }
}

/* 每列最小 200px,最大为 1fr(自适应)
auto-fit:自动填充尽可能多的列 
minmax(200px, 1fr):每列至少 200px,多余空间均分*/
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));

图片响应式

html 复制代码
<picture>
	<source srcset="image-large.jpg" media="(min-width: 800px)">
	<source srcset="image-medium.jpg" media="(min-width: 400px)">
	<img src="image-small.jpg" alt="responsive image">
</picture>
相关推荐
LYFlied2 小时前
CSR与SSR:前端渲染方式详解
前端·性能优化·ssr·csr·首屏渲染·前端页面渲染
天天扭码2 小时前
京东前端开发实习生 一面
前端·网络协议·面试
董世昌412 小时前
JavaScript 变量声明终极指南:var/let/const 深度解析(2025 版)
java·服务器·前端
sorryhc2 小时前
Vite开发环境按需编译是怎么实现的?
前端·javascript·vite
nnnnna3 小时前
props 、emits 、组件上的v-model(详细版)
前端·javascript
三年三月3 小时前
Tailwind CSS 入门介绍
前端
余生H3 小时前
前端技术新闻(WTN-1):React.js & Next.js 爆出 CVSS 10.0 级严重漏洞,历史风险回顾与代码级深度分析
前端·javascript·react.js
1024肥宅3 小时前
JavaScript 原生方法实现:数学与数字处理全解析
前端·javascript·ecmascript 6
烟袅3 小时前
深入理解 JavaScript 内存机制与闭包原理
前端·javascript