移动端适配方案

随着5G的大规模普及,移动设备能帮助我们更快更方便的解决更多的问题。顺应时代潮流,更多的项目也不可避免的遇到移动端适配的问题。我将工作中用到的几种适配和其使用场景总结了下来,希望能对你选择移动端适配方案时有所帮助。

  • 媒体查询

    某PHP项目就是用的媒体查询方式来适配移动端。因为是先确定的PC端并内容基本保持一致,只是在布局方面有一定的区别。所以可以用媒体查询限定当是宽度在800px下的移动设备时显示什么样的布局。

@media mediatype and|not|only (media feature){
      css-code;
}
//用@media做标识符号
//mediatype 媒体类型,值可选all print scree
//关键字 and not only
//media feature 媒体特性,必须有小括号包含
  • 中间件判断当前设备类型

    在做官网时,因为PC端和移动端的布局等有很大区别,通过 媒体查询简单修改布局的方式不能较好满足设计稿的需要,所以采取了通过中间件判断当前设备类型并分配路由的方式。

function isMoible(UA) {
  return !!/(Android|webOS|iPhone|iPod|tablet|BlackBerry|Mobile)/i.test(UA)
}
export function deviceType(UA) {
  if (isMoible(UA)) {
    return {
      type: 'mobile',
    }
  } else {
    return {
      type: 'pc',
    }
  }
}

import { deviceType } from '~/util/deviceType'
// 获取到设备类型后处理逻辑
export default function (context) {
  context.userAgent = process.server
    ? context.req?.headers['user-agent']
    : navigator.userAgent
  // 添加属性保存返回的匹配信息
  context.deviceType = deviceType(context.userAgent)
  const isMobile = context.route.name?.includes('mobile')
  if (isMobile ^ (context.deviceType.type === 'mobile')) {
    if (context.deviceType.type === 'pc') {
      context.redirect('/home')
    } else {
      context.redirect('/mobile/home')
    }
  }
}
  • rem

    也可以在入口文件将屏幕宽度的10分之一作为了1rem的基准值。这样我们可以结合rem将显示器的宽度调整为和设计稿对应的宽度,很方便的进行布局。

    var REM;
    REM = document.documentElement.clientWidth
    $("html").css("font-size", REM / 10 + "px")
  • flexible + postcss-px2rem

    postcss-pxtorem将项目中的px单位转换为rem单位,lib-flexible是设置rem基准值。和组件库vant比较适配。

npm install postcss postcss-pxtorem --save-dev
  postcss: {
    plugins: {
      'postcss-pxtorem': {
        rootValue: 37.5,  // 设计图的宽度/10
        propList: ['*'],
        mediaQuery: false,
        exclude: 'ignore',
      }
    }
// 插件。插件会自动将px转换为rem,对照设计稿的px写样式即可。
export default defineNuxtPlugin(() => {
  if (process.client) {
    (function flexible(window, document) {
      const docEl = document.documentElement
      const dpr = window.devicePixelRatio || 1
 
      // adjust body font size
      function setBodyFontSize() {
        if (document.body)
          document.body.style.fontSize = `${12 * dpr}px`
 
        else
          document.addEventListener('DOMContentLoaded', setBodyFontSize)
      }
      setBodyFontSize()
 
      // set 1rem = viewWidth / 10
      function setRemUnit() {
        const rem = docEl.clientWidth / 10
        docEl.style.fontSize = `${rem}px`
      }
 
      setRemUnit()
 
      // reset rem unit on page resize
      window.addEventListener('resize', setRemUnit)
      window.addEventListener('pageshow', (e) => {
        if (e.persisted)
          setRemUnit()
      })
 
      // detect 0.5px supports
      if (dpr >= 2) {
        const fakeBody = document.createElement('body')
        const testElement = document.createElement('div')
        testElement.style.border = '.5px solid transparent'
        fakeBody.appendChild(testElement)
        docEl.appendChild(fakeBody)
        if (testElement.offsetHeight === 1)
          docEl.classList.add('hairlines')
 
        docEl.removeChild(fakeBody)
      }
    }(window, document))
  }
})

完结撒花✿✿ヽ(°▽°)ノ✿

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值