做网页的时候,你有没有遇到过这样的情况:在电脑上看起来好好的页面,一拿到手机上就乱了套?按钮错位、文字太小、图片变形……这些问题,在移动端开发中太常见了。尤其当你用 ref="/tag/137/" style="color:#479099;font-weight:bold;">JavaScript 动态操作页面时,稍不注意就会让用户体验大打折扣。
为什么移动端适配这么重要
现在的手机屏幕五花八门,从 iPhone SE 到各种安卓全面屏,分辨率、像素密度、屏幕宽度都不一样。如果你的代码只按一种尺寸写死,那在别的设备上大概率会出问题。比如你用 window.innerWidth 获取屏幕宽度,但在某些安卓机上,这个值可能因为缩放而和实际视觉效果不符。
利用 viewport 控制布局宽度
在 HTML 的 <head> 里加上这行 meta 标签,是第一步:
<meta name="viewport" content="width=device-width, initial-scale=1.0">
它告诉浏览器:别自己瞎缩放,就按设备的实际宽度来显示。不然你的 JS 拿到的尺寸可能是被缩放过后的,计算起来全是坑。
动态设置根字体大小(rem 适配)
很多团队用 rem 做弹性布局,原理是根据屏幕宽度动态调整 html 元素的字体大小。JavaScript 可以这样写:
function setRootFontSize() {
const designWidth = 375; // 设计稿宽度
const rootWidth = document.documentElement.clientWidth;
const fontSize = rootWidth * 100 / designWidth;
document.documentElement.style.fontSize = fontSize + 'px';
}
// 页面加载或横竖屏切换时执行
window.addEventListener('resize', setRootFontSize);
setRootFontSize();
这样一来,你在 CSS 里用 1rem 就等于设计稿里的 100px,写样式时直接按比例换算就行。
处理点击延迟与触摸事件
在移动端,click 事件有大约 300ms 的延迟,用户会觉得“卡”。可以用 touch 事件来优化:
let isTouchMove = false;
element.addEventListener('touchstart', () => {
isTouchMove = false;
});
element.addEventListener('touchmove', () => {
isTouchMove = true;
});
element.addEventListener('touchend', (e) => {
if (!isTouchMove) {
// 触发点击逻辑
handleClick(e);
}
});
这样能立刻响应轻触操作,提升交互流畅感。
识别设备类型,差异化处理
有时候你想在安卓和 iOS 上表现不同,比如调用不同的弹窗方式。可以通过 user agent 简单判断:
function isIOS() {
return /iPad|iPhone|iPod/.test(navigator.userAgent);
}
function isAndroid() {
return /Android/.test(navigator.userAgent);
}
if (isIOS()) {
// 处理苹果特有的问题
}
虽然不推荐过度依赖 UA,但在一些边界场景下还挺管用。
避免固定像素值,多用相对单位
写 JS 时别动不动就写 width = 300 这种固定值。换成百分比或者基于 rem 的计算更稳妥。比如:
const box = document.getElementById('content-box');
const parentWidth = box.parentElement.clientWidth;
box.style.height = parentWidth * 0.6 + 'px'; // 高度为父元素宽度的 60%
这样不管屏幕多宽,元素比例都能保持一致。
横竖屏切换记得重新计算
用户转个手机,页面布局就得跟着变。除了监听 resize,还可以检测 orientationchange:
window.addEventListener('orientationchange', () => {
setTimeout(setRootFontSize, 100); // 延迟执行确保尺寸已更新
});
有些机型切换方向后尺寸变化不会立刻反映,加个延时更保险。
移动端适配不是一次性任务,而是贯穿开发全过程的习惯。从每一行 JS 开始,多想一步“在手机上会怎样”,就能少踩很多坑。