现在用手机浏览网页的人越来越多,各种手机屏幕尺寸也各不相同。作为前端开发者,让网页在不同尺寸的手机上正常显示是个必须解决的问题。下面介绍四种常用的移动端适配方案,每种方法都有自己的优缺点,适合不同的使用场景。
这种方法最简单直接。按照设计稿标准(比如750px宽度)完成页面开发后,在head标签里添加viewport设置:
<meta name="viewport" content="width=750, initial-scale=0.5">
上面例子是针对750px设计稿适配375px屏幕。initial-scale的计算公式是:屏幕逻辑像素宽度 ÷ 设计稿宽度。
为了适配各种屏幕,需要用JavaScript动态设置:
<script>
function setViewport() {
const designWidth = 750; // 设计稿宽度
const scale = window.screen.width / designWidth;
const content = `width=${designWidth}, initial-scale=${scale}`;
let metaViewport = document.querySelector('meta[name="viewport"]');
if (!metaViewport) {
metaViewport = document.createElement('meta');
metaViewport.name = 'viewport';
document.head.appendChild(metaViewport);
}
metaViewport.content = content;
}
setViewport();
window.addEventListener('orientationchange', setViewport); // 处理屏幕旋转
</script>
优点:
开发简单快速
页面整体自动缩放
缺点:
所有元素都会缩放,无法控制个别元素不缩放
边框等细节在大屏上可能显得过粗,小屏上过细
rem是相对单位,1rem等于html根元素的字体大小。通过调整根元素字体大小,就能控制整个页面的缩放比例。
HTML中设置根元素字体大小:
<script>
const DESIGN_WIDTH = 750; // 设计稿宽度
function setRootFontSize() {
const fontSize = (100 * window.screen.width) / DESIGN_WIDTH;
document.documentElement.style.fontSize = fontSize + 'px';
}
window.addEventListener('resize', setRootFontSize);
setRootFontSize();
</script>
css中使用rem单位:
<style>
.box {
width: 4.25rem; /* 设计稿425px ÷ 100 */
height: 10rem; /* 设计稿1000px ÷ 100 */
font-size: 0.2rem; /* 设计稿20px ÷ 100 */
border: 1px solid #ccc; /* 不需要缩放的用px */
}
</style>
如果使用Sass,可以写个转换函数:
@function px2rem($px) {
@return $px * 1rem / 100;
}
.header {
font-size: px2rem(28);
}
还可以配合媒体查询,不用JavaScript:
<style>
@media screen and (min-width: 320px) {
html { font-size: 50px; }
}
@media screen and (min-width: 500px) {
html { font-size: 75px; }
}
@media screen and (min-width: 800px) {
html { font-size: 100px; }
}
.title {
height: 1rem;
font-size: 0.5rem;
line-height: 1rem;
}
</style>
优点:
灵活,可以控制哪些元素缩放,哪些不缩放
换算相对简单,有现成的插件工具
缺点:
需要JavaScript配合
原理相对复杂
vw表示视口宽度的1%,vh表示视口高度的1%。需要缩放的元素用vw/vh单位,不需要缩放的继续用px。
假设设计稿宽度750px,一个按钮在设计稿上标注为:
宽度:120px
文字大小:28px
高度:48px
边框:1px(不缩放)
转换计算:
宽度:120 ÷ 750 × 100 = 16vw
文字大小:28 ÷ 750 × 100 = 3.73vw
高度:48 ÷ 750 × 100 = 6.4vw
<style>
.button {
width: 16vw;
font-size: 3.73vw;
line-height: 6.4vw;
border: 1px solid #000; /* 边框不缩放 */
text-align: center;
}
</style>
可以用calc计算,更清晰:
<style>
.button {
width: calc(100vw * 120 / 750);
font-size: calc(100vw * 28 / 750);
line-height: calc(100vw * 48 / 750);
border: 1px solid #000;
}
</style>
或者用CSS变量:
<style>
:root {
--ratio: calc(100vw / 750);
}
.button {
width: calc(120 * var(--ratio));
font-size: calc(28 * var(--ratio));
line-height: calc(48 * var(--ratio));
}
</style>
Sass写法:
@function px2vw($px) {
@return $px * 100vw / 750;
}
.button {
width: px2vw(120);
font-size: px2vw(28);
line-height: px2vw(48);
}
优点:
不需要JavaScript
适配原理简单
灵活控制缩放
缺点:
手动计算比较麻烦
兼容性需要注意(CSS变量在IE不支持)
有些场景不需要整体缩放,只需要合理的布局排列。这时候用Flex布局最合适。
<meta name="viewport" content="width=device-width, initial-scale=1">
<style>
.container {
display: flex;
flex-wrap: wrap;
justify-content: space-between;
}
.item {
flex: 0 0 48%; /* 每行显示2个,中间有间距 */
margin-bottom: 10px;
}
@media screen and (min-width: 768px) {
.item {
flex: 0 0 32%; /* 大屏每行显示3个 */
}
}
</style>
适用场景:
内容列表、卡片布局
不需要严格等比缩放的页面
希望在不同屏幕上有不同排列方式的布局
什么时候需要等比缩放?
栅格化布局:页面元素位置和大小需要严格按比例变化
头屏大图:需要保持宽高比例,避免变形
整体性强的页面:所有元素都需要按屏幕尺寸调整
什么时候用Flex布局就够了?
内容列表页:只需要合理排列,不需要严格缩放
工具类应用:功能为主,样式为辅
后台管理系统:主要在电脑端使用,移动端次要
特殊场景:高度适配
有些场景需要高度也要适配,比如电视大屏、全屏展示页面:
<style>
.fullscreen-section {
width: 100vw;
height: 100vh; /* 撑满整个屏幕 */
display: flex;
align-items: center;
justify-content: center;
}
.content {
width: 80vw;
height: 80vh;
background: #f5f5f5;
}
</style>
如果你开发微信小程序或使用uniapp,直接在750px设计稿下使用rpx单位即可:
/* 设计稿上10px,代码就写10rpx */
.element {
width: 10rpx;
height: 20rpx;
font-size: 14rpx;
}
简单项目:用viewport缩放,快速上手
复杂项目:用rem或vw方案,更灵活控制
内容型页面:用Flex布局,注重排列而非缩放
小程序:直接用rpx单位
选择哪种方法要根据项目需求来定。小型活动页用viewport缩放就够了,大型应用建议用rem或vw方案。关键是多实践,找到最适合自己项目的适配方案。
本文内容仅供个人学习/研究/参考使用,不构成任何决策建议或专业指导。分享/转载时请标明原文来源,同时请勿将内容用于商业售卖、虚假宣传等非学习用途哦~感谢您的理解与支持!
在全面屏的 iPhone X 上,不需要而外的代码,Safari 可以非常完美的展示现有的网站。整个网站的内容都会自动地展示在一个“安全区域”内,并不会被四周的圆角或者“小刘海”遮挡住。
像素 :像素是屏幕显示最小的单位。设备像素 :设备像素又称物理像素(physical pixel),设备能控制显示的最小单位,我们可以把这些像素看作成显示器上一个个的点。 iPhone5 的物理像素是 640 X 1136
关于移动端适配的技术方案主要有以下四种:(1)通过媒体查询的方式即CSS3的meida queries(2)以天猫首页为代表的 flex 弹性布局(3)以淘宝首页为代表的 rem+viewport缩放(4)rem 方式
判断是否是IPhoneX手机;增加fix-iphonex-bottom样式,如果想更改IPhoneX底部34像素的背景颜色怎么办呢?增加iphone-footer-bg样式
网站适配的终端可以用js或媒体查询的方式获取,分配对应的样式。布局上采用相对单位,百分比和flex的弹性方式。对移动端的特殊性进行适配,如1px问题,默认样式等。
em与rem之间的区别:共同点:它们都是像素单位,它们都是相对单位。不同点:em大小是基于父元素的字体大小,rem大小是基于根元素(html)的字体的大小
为了提高代码的兼容性,我们有时需要判断当前系统的平台,然后做一些适配。比如,我们在使用 StatusBar 做导航栏的时候,在 iOS 平台下根视图的位置默认情况下是占据状态栏的位置的,我们通常希望状态栏下面能显示一个导航栏
本文的目标是通过下文介绍的适配方案,使用vue或react开发移动端及H5的时候,不需要再关心移动设备的大小,只需要按照固定设计稿的px值布局,提升开发效率。
首先是名词介绍:像素:Pixel,就是物理像素:也就是设备像素,逻辑像素:(css像素)单位为 px设备像素比:devicePixelRatio,(在高倍屏会出现1px变大的问题)。css单位em:相对于当前对象内文本的字体尺寸
内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!