网络宝典
第二套高阶模板 · 更大气的阅读体验

JavaScript移动端适配实战入门

发布时间:2025-12-21 10:30:31 阅读:4 次

做网页的时候,你有没有遇到过这样的情况:在电脑上看起来好好的页面,一拿到手机上就乱了套?按钮错位、文字太小、图片变形……这些问题,在移动端开发中太常见了。尤其当你用 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 开始,多想一步“在手机上会怎样”,就能少踩很多坑。