nuxt3和vant的移动端适配,并解决页面刷新的闪烁问题.........

前言

我是真的不想做SEO...

小菜鸟一个,文笔也差劲很,第一次通过文章的形式记录项目中碰到的一些问题,大家多担待......

目前在做的一个项目,需要做seo,nuxt就是vue一个开箱即用的ssr框架,目前nuxt3也是已经rc6了,作为勇士,我决定直接用Nuxt3,勇一下!

我知道当中肯定会碰到很多不同的...奇奇怪怪的...网上查不到的...问题,所以我想用文章的形式把我碰到的一些问题记录下来,不知道对不对,是不是最优解,但是只要能帮到大家我就很开心了,当然如果是错的,别喷我昂,还希望大家指正!如果有更好的办法,还希望大家不吝赐教

移动端适配方案

我目前在做的这个项目是一个移动端H5项目,正常的H5是全屏适配只在移动端访问的

但是我这个项目是需要移动端和PC端都可以访问,也就是相当于一套代码去适配两个端

干货-具体做法

方案1:REM布局 postcss-pxtorem

截图为VantUI提供的REM布局方案

postcss-pxtorem这个插件就是将项目中的px单位转换为rem单位

lib-flexible 是设置rem基准值
[图片上传失败...(image-c835c7-1659605478372)]

方案1.1 标准H5上的REM布局

1.安装postcss-pxtorem

npm install postcss postcss-pxtorem --save-dev

2.设置postcss-pxtorem

我们以设计图为375为例

nuxt.config.ts

import { defineNuxtConfig } from 'nuxt'

export default defineNuxtConfig({
  postcss: {
    plugins: {
      'postcss-pxtorem': {
        rootValue: 37.5,
        propList: ['*'],
        mediaQuery: false,
        exclude: 'ignore',
      },
    },
  },
})

3.使用lib-flexible

根目录创建plugins目录-->创建flexible.ts

import { defineNuxtPlugin } from '#app'

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))
  }
})

4.结尾

这个时候就会把屏幕等分切割,直接按照375px的设计图写就行,插件会自动将px转换为rem

方案1.2 pc和移动都适配的REM布局

1.安装postcss-pxtorem

npm install postcss postcss-pxtorem --save-dev

2.设置postcss-pxtorem

我们以设计图为750为例

nuxt.config.ts

import { defineNuxtConfig } from 'nuxt'

export default defineNuxtConfig({
  postcss: {
    plugins: {
      'postcss-pxtorem': {
        rootValue: 50,
        propList: ['*'],
        mediaQuery: false,
        exclude: 'ignore',
      },
    },
  },
})

亲测 rootValue是50的时候 vant适配刚刚好...

3.设置rem

根目录创建plugins目录-->创建rem.ts

import { defineNuxtPlugin } from '#app'

export default defineNuxtPlugin(() => {
  if (process.client) {
    // 屏幕适应
    (function (win, doc) {
      if (!win.addEventListener)
        return
      function setFont() {
        // var html = document.documentElement;
        // var k = 640;
        // html.style.fontSize = html.clientWidth / k * 100 + "px";
        let screenWidth = document.querySelector('html')!.offsetWidth
        const baseSz = 100
        const pageWidth = 750
        if (screenWidth > 640)
          screenWidth = 640

        let fZ = (baseSz * screenWidth) / pageWidth
        if (fZ > 85)
          fZ = 85
        document.querySelector('html')!.style.fontSize = `${fZ}px`
      }
      setFont()
      setTimeout(() => {
        setFont()
      }, 300)
      doc.addEventListener('DOMContentLoaded', setFont, false)
      win.addEventListener('resize', setFont, false)
      win.addEventListener('load', setFont, false)
    })(window, document)
  }
})

4.结尾

此时1rem =100px

方案2:VW布局 postcss-pxtovw

这个vant进阶用法中有教程...我就不班门弄斧了

页面闪烁问题

css

根目录创建assets目录-->创建css目录-->创建base.ignore.css


@import './normalize.scss';
@media (min-width: 320px) {
  html {
    font-size: 42.6667px;
  }
}

@media (min-width: 360px) {
  html {
    font-size: 48px;
  }
}

@media (min-width: 375px) {
  html {
    font-size: 50px;
  }
}

@media (min-width: 384px) {
  html {
    font-size: 51.2px;
  }
}

@media (min-width: 414px) {
  html {
    font-size: 55.2px;
  }
}

@media (min-width: 448px) {
  html {
    font-size: 59.7333px;
  }
}

@media (min-width: 480px) {
  html {
    font-size: 64px;
  }
}

@media (min-width: 512px) {
  html {
    font-size: 68.2667px;
  }
}

@media (min-width: 544px) {
  html {
    font-size: 72.5333px;
  }
}

@media (min-width: 576px) {
  html {
    font-size: 76.8px;
  }
}

@media (min-width: 608px) {
  html {
    font-size: 81.0667px;
  }

}

@media (min-width: 640px) {
  html {
    font-size: 85px;
  }
}

@media (min-width: 750px) {
  html {
    font-size: 85px;
  }
}

引入

nuxt.config.ts

import { defineNuxtConfig } from 'nuxt'

export default defineNuxtConfig({
  css: ['@/assets/css/base.ignore.css'],
  postcss: {
    plugins: {
      'tailwindcss': {},
      'postcss-pxtorem': {
        rootValue: 50,
        propList: ['*'],
        mediaQuery: false,
        exclude: 'ignore',
      },
    },
  },
})

亲测 解决!

补充说明

在使用了pxtorem这个插件以后,如果有px不想被转化为rem 可以采用exclude: 'ignore',这个配置项

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容