看到你特别强调了“不同的手机”,这和适配“手机、平板、电脑”确实有点不一样。手机端的适配,核心矛盾不是屏幕大小,而是屏幕比例和分辨率碎片化严重。
最成熟的方案是:“rem/vw动态适配 + Flexbox/Grid弹性布局 + 移动优先的媒体查询”。这比直接套用电脑端的响应式框架(如Bootstrap)要实用得多。
我帮你拆解成3个层级,从“能用”到“完美”,你可以按需选择:
1. 核心地基:动态字体大小(解决“碎片化”难题)
不同手机宽度从320px到428px不等,如果都用px,大屏手机字太小,小屏手机字太大。
成熟做法:用vw(视口宽度单位) 做基础字体,配合rem。
-
在
index.html的<head>里加一段动态计算根字体大小的JS(这是阿里、腾讯等大厂的通用方案):
<script>// 以设计稿375px为基准,1rem = 100px,方便计算function setRem() {const docEl = document.documentElement;const width = docEl.clientWidth;// 限制最大宽度,避免在平板上显示过大const maxWidth = 750;const base = Math.min(width, maxWidth) / 375 * 100;docEl.style.fontSize = base + 'px';}setRem();window.addEventListener('resize', setRem);
</script>
-
写样式时,所有尺寸都用
rem:
/* 设计稿上20px,写0.2rem */
.box {width: 3.45rem; /* 345px / 100 */font-size: 0.16rem; /* 16px */padding: 0.15rem;
}
2. 布局骨架:弹性盒子(解决“排列”难题)
手机端坚决不用固定宽度,全部用Flexbox做自适应。
-
等比列:用
flex: 1让子元素平分剩余空间。 -
换行:用
flex-wrap: wrap让内容自动折行。
/* 经典的导航栏,左右两端对齐 */
.nav {display: flex;justify-content: space-between;align-items: center;padding: 0 0.16rem;
}/* 商品列表,自动换行 */
.product-list {display: flex;flex-wrap: wrap;justify-content: space-between;
}
.product-item {width: 48%; /* 留一点间距,一行2个 */margin-bottom: 0.1rem;
}
3. 细节补丁:针对“刘海屏”和“极端比例”做微调
现在全面屏、折叠屏很多,需要处理安全区域。
-
适配刘海/挖孔屏:利用
env(safe-area-inset-*),让内容不被遮挡。
body {padding-top: env(safe-area-inset-top);padding-left: env(safe-area-inset-left);padding-right: env(safe-area-inset-right);
}
-
针对特定比例微调(比如iPhone SE和iPhone 14 Pro Max宽高比差异大):
/* 极窄屏(宽度<350px)时,把字号缩小 */
@media (max-width: 350px) {html { font-size: 85px !important; } /* 配合前面的JS动态rem */
}
/* 超宽屏(比如折叠屏展开)时,限制最大宽度 */
@media (min-width: 600px) {.container { max-width: 420px; margin: 0 auto; }
}
你的项目适合哪种“深度”?
-
如果你的页面主要是“列表/卡片/图文”:只用上述的“rem + Flexbox”就足够了,根本不需要媒体查询,代码非常干净。
-
如果你的页面有“左右分栏”或“复杂表格”:那就在上述基础上,加两三个媒体查询断点(比如
max-width: 480px时堆叠,min-width: 600px时并排)。
想进阶?推荐搭配这个工具
如果你觉得手写rem换算麻烦,可以试试 postcss-pxtorem 这个工具。你写CSS时直接写px,它会自动帮你编译成rem。配合Vite或Webpack,开发体验非常丝滑。
总结一句话:
不要用Bootstrap那种“大而全”的栅格系统做手机站(太笨重)。“JS动态设置rem基准 + Flexbox布局 + 必要的安全区域处理” 是目前各大主流App内嵌页、移动端H5最成熟的标配方案。
如果你的页面涉及到“横屏/竖屏”切换,或者有复杂的表格需要适配,可以告诉我,我再给你对应的专项方案。😊