Skip to content

前端多端适配初识

我们的项目做成了一个PWA应用,并适配了移动端和电脑端,这里我们说说我们适配的方式

这里我们主要使用了两种方法

两套资源

对于一些不方便使用css适配的页面,我们通过检测用户的登录端的类型判断应该给他渲染什么页面,这里我们说说我们判断的方式,由于我们加入了服务端渲染,服务端渲染的时候,并没有浏览器的navigator,所以这里写了两种判断方式

export function isPC (ua) {
  if (typeof navigator !== 'undefined') {
    return isClientPC()
  } else {
    return isServerPC(ua)
  }
}

export function isClientPC () {
  var flag = true
  var Agents = [
    'Android',
    'iPhone',
    'SymbianOS',
    'Windows Phone',
    'iPad',
    'iPod'
  ]

  if (typeof navigator !== 'undefined') {
    var userAgentInfo = navigator.userAgent
    for (var v = 0; v < Agents.length; v++) {
      if (userAgentInfo.includes(Agents[v])) {
        flag = false
        break
      }
    }
  }

  return flag
}

export function isServerPC (ua) {
  var flag = true
  var Agents = [
    'Android',
    'iPhone',
    'SymbianOS',
    'Windows Phone',
    'iPad',
    'iPod'
  ]
  for (var v = 0; v < Agents.length; v++) {
    if (ua.includes(Agents[v])) {
      flag = false
      break
    }
  }
  return flag
}

这样,通过调用isPC我们就可以判断用户属于手机端还是电脑端,给用户渲染相应的资源

首先我们有两个entry,这里主要说说客户端的使用

entry-client.js

import { createApp } from './main'
import { isPC } from './utils/utils'

const { app, router } = createApp()

router.isPC = isPC()

router.onReady(() => {
  app.$mount('#app')
})

if ('serviceWorker' in navigator) {
  window.addEventListener('load', () => {
    navigator.serviceWorker.register('/serviceWorker.js').then(registration => {
      console.log('SW registered: ', registration)
    }).catch(registrationError => {
      console.log('SW registration failed: ', registrationError)
    })
  })
}

我们运行时就根据是server端还是client端来选择entry文件,我们client端的entry把isPC加到router中,所以我们可以在router.js中直接使用,如下,判断是否时pc端来选择对应的资源

{
    path: '/questionnaire',
    name: 'questionnaire',
    component: Questionaire,
    meta: { requiresAuth: true },
    beforeEnter: (to, from, next) => {
      if (!router.isPC) {
        next()
      } else {
        next('/questionnairePC')
      }
    }
},

css适配

css适配比较简单就是通过css的media来进行适配,写多套css

我们主要用到了3种尺寸,把对应尺寸的css写在对应的地方就行了

@media (min-width 1200px)
  ...
@media (min-width 576px) and (max-width 1200px)
  ...
@media (max-width 576px)
  ...