移动端适配总结

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>
相关推荐
weixin_382395231 小时前
为小工厂量身打造:本地部署的物料管理系统带缺料计算
前端·制造
__zRainy__1 小时前
解决pnpm v10+不自动构建
前端·pnpm·工程化
猫猫不是喵喵.2 小时前
Vue3 Props 属性
前端·javascript·vue.js
醉城夜风~3 小时前
CSS元素显示模式(display)
前端·css
AI大模型-小华4 小时前
Codex 三方充值快速入门指南
java·前端·数据库·chatgpt·ai编程·codex·chatgpt pro
做前端的娜娜子6 小时前
同一链接实现 PC Web 与移动 H5 自适应
前端·掘金·金石计划
小帅不太帅6 小时前
架构没变、规模没变,DeepSeek V4 Flash 正式版凭什么暴涨 47 分?
前端·aigc·deepseek
jarvisuni7 小时前
DeepSeekFlash前端依旧拉垮,而且变慢了很多!
前端·javascript·算法
卷福同学8 小时前
AI编程出海第二步:验证关键词能否做站
前端·人工智能·后端