aurora blog
  • JS

    • 基本汇总
    • Date时间
    • Array方法
    • String 方法
    • Object方法
    • RegExp正则
    • Es6 新特性等
    • Event-Loop
    • Http and Https
    • for in和for of区别
    • Web Worker
    • Promise && async
    • 堆内存 & 栈内存
    • JS设计模式探索
    • npm & yarn
    • Fetch和Axios的区别
    • 学习及面试问题整理
    • URL 输入到页面加载过程
    • 跨域&nginx本地项目代理
  • FE框架

    • react

      • 基本用法
      • react生命周期
      • hooks 16.8版本后
      • Route原理
      • Redux源码解析
      • React16 Fiber
      • React-VirtualDOM
      • React事件委托机制
      • React性能优化
      • 状态管理方案对比
      • React 18新特性
    • vue

      • vue 基本用法
      • vue 生命周期
      • VirtualDOM
      • vue 事件委托
      • vue 架构
      • vue 状态管理
      • 问题等
    • React-Native

      • React-Native 基本用法
    • 微前端

      • 遇到的问题
    • 鸿蒙 harmony

      • harmony 基础
  • 构建工具

    • webpack

      • Webpack配置详解
      • Webpack的使用
      • Babel-polyfill
      • webpack面试题
    • vite

      • vite配置详解
      • vite面试题
    • rollup

      • Rollup配置详解
      • rollup面试题
    • 构建工具对比
  • 性能优化

    • 性能优化策略
    • 缓存策略
    • 性能优化面试题
  • 浏览器

    • 浏览器渲染原理
    • 浏览器缓存机制
    • 浏览器面试题
  • 工程化

    • 代码规范
    • 工程化面试题
  • 前端安全

    • XSS 攻击与防护
    • CSRF 攻击与防护
    • 前端安全面试题
  • 移动端开发

    • 移动端适配
    • 移动端开发面试题
  • 前端监控

    • 错误监控
    • 性能监控
    • 前端监控面试题
  • Typescript

    • Typescript详解
  • Servers

    • Nodejs
    • Nginx
  • Git命令

    • git常用规范
  • 数据库

    • mongodb
    • mongodb
  • Other

    • Jenkins自动化部署

移动端开发面试题

  • 移动端适配
    • 移动端适配方案有哪些?
    • rem 适配的原理?
    • vw/vh 适配的原理?
    • 1px 问题是什么?如何解决?
  • 触摸事件
    • 移动端触摸事件有哪些?
    • 如何实现滑动操作?
    • 如何禁止滚动穿透?
  • 性能优化
    • 移动端性能优化方法?
    • 如何优化移动端滚动性能?
  • 兼容性
    • 移动端浏览器兼容性如何处理?
    • iOS 和 Android 的差异?
  • 调试
    • 如何调试移动端页面?
    • vConsole 如何使用?
  • 最佳实践
    • 移动端开发注意事项?
    • 移动端适配最佳实践?

移动端适配

移动端适配方案有哪些?

方案:

  1. rem 适配:动态设置根元素字体大小
  2. vw/vh 适配:使用视口单位
  3. 媒体查询:响应式设计
  4. flexible.js:已废弃

rem 适配的原理?

原理:

  • 根据屏幕宽度动态设置根元素字体大小
  • 使用 rem 单位
  • 1rem = 根元素字体大小

实现:

function setRem() {
  const width = document.documentElement.clientWidth;
  const rem = width / 10; // 375px 设计稿,1rem = 37.5px
  document.documentElement.style.fontSize = rem + 'px';
}

vw/vh 适配的原理?

原理:

  • 使用视口单位
  • 1vw = 视口宽度的 1%
  • 1vh = 视口高度的 1%

使用:

/* 设计稿 375px,元素宽度 100px */
.element {
  width: 26.67vw; /* 100 / 375 * 100 */
}

1px 问题是什么?如何解决?

问题:

  • 高分辨率屏幕(DPR > 1)
  • 1px CSS = 多个物理像素
  • 导致边框变粗

解决方案:

  1. transform scale:缩放边框
  2. viewport 缩放:整体缩放
  3. border-image:使用图片
  4. box-shadow:使用阴影
/* transform scale */
.border::after {
  content: '';
  position: absolute;
  width: 100%;
  height: 1px;
  background: #000;
  transform: scaleY(0.5);
}

触摸事件

移动端触摸事件有哪些?

事件:

  • touchstart:触摸开始
  • touchmove:触摸移动
  • touchend:触摸结束
  • touchcancel:触摸取消

如何实现滑动操作?

实现:

let startX, startY;

element.addEventListener('touchstart', (e) => {
  startX = e.touches[0].clientX;
  startY = e.touches[0].clientY;
});

element.addEventListener('touchend', (e) => {
  const endX = e.changedTouches[0].clientX;
  const endY = e.changedTouches[0].clientY;
  
  const deltaX = endX - startX;
  const deltaY = endY - startY;
  
  // 判断滑动方向
});

如何禁止滚动穿透?

方法:

function preventScroll(e) {
  e.preventDefault();
}

// 打开弹窗时
document.body.style.overflow = 'hidden';
document.body.addEventListener('touchmove', preventScroll, { passive: false });

性能优化

移动端性能优化方法?

方法:

  1. 减少重排重绘
  2. 使用 transform 代替 top/left
  3. 图片优化(WebP、懒加载)
  4. 代码分割
  5. 减少 DOM 操作
  6. 使用 will-change

如何优化移动端滚动性能?

优化:

  1. 使用 -webkit-overflow-scrolling: touch
  2. 减少滚动时的 DOM 操作
  3. 使用虚拟滚动
  4. 节流滚动事件
.scroll-container {
  -webkit-overflow-scrolling: touch;
  overflow-y: auto;
}

兼容性

移动端浏览器兼容性如何处理?

方法:

  1. Autoprefixer:自动添加前缀
  2. Polyfill:填充缺失功能
  3. 特性检测:检测浏览器支持
  4. 降级方案:提供替代方案

iOS 和 Android 的差异?

差异:

  • 滚动:iOS 有弹性滚动
  • 输入框:iOS 会自动缩放
  • 安全区域:iPhone X+ 有安全区域
  • 字体:iOS 和 Android 字体渲染不同

处理:

/* iOS 安全区域 */
.safe-area {
  padding-bottom: env(safe-area-inset-bottom);
}

/* 禁止 iOS 自动缩放 */
input {
  font-size: 16px; /* 16px 以上不会缩放 */
}

调试

如何调试移动端页面?

方法:

  1. Chrome DevTools:设备模拟器
  2. 真机调试:USB 连接调试
  3. vConsole:移动端控制台
  4. Charles/Fiddler:抓包工具

vConsole 如何使用?

<script src="https://cdn.jsdelivr.net/npm/vconsole/dist/vconsole.min.js"></script>
<script>
  const vConsole = new VConsole();
</script>

最佳实践

移动端开发注意事项?

注意:

  1. 设置正确的 viewport
  2. 处理 1px 问题
  3. 优化触摸体验
  4. 处理安全区域
  5. 性能优化
  6. 兼容性处理

移动端适配最佳实践?

实践:

  1. 选择合适的适配方案(rem 或 vw/vh)
  2. 使用 postcss 插件自动转换
  3. 处理 1px 问题
  4. 优化触摸体验
  5. 性能优化
最近更新:: 2025/11/20 14:50
Contributors: liyulai
Prev
移动端适配