PC端网页随屏幕大小自适应

使用 postcss-px-to-viewport 适配

  1. 安装插件 postcss-px-to-viewport
npm install postcss-px-to-viewport --save-dev
  1. 配置postcss-px-to-viewport
    • 使用 postcss.config.js单独文件进行配置
      • 新建postcss.config.js
      • 写入配置
module.exports = {
  plugins: {
    "postcss-px-to-viewport": {
      unitToConvert: "px", // 默认值`px`,需要转换的单位
      viewportWidth: 1920, // 视窗的宽度,对应设计稿宽度
      // viewportHeight: 667, // 视窗的高度, 根据375设备的宽度来指定,一般是667,也可不配置
      unitPrecision: 6, // 指定`px`转换为视窗单位值的小数位数
      propList: ["*"], // 转化为vw的属性列表  propList: ["*","!letter-spacing"],这表示:所有css属性的属性的单位都进行转化,除了letter-spacing的
      viewportUnit: "vw", // 指定需要转换成视窗单位
      fontViewportUnit: "vw", // 字体使用的视窗单位
      selectorBlaskList: [".ignore-"], // 指定不需要转换为视窗单位的类 selectorBlackList: ['wrap'],它表示形如wrap,my-wrap,wrapper这样的类名的单位,都不会被转换
      mediaQuery: false, // 允许在媒体查询中转换`px`
      minPixelValue: 1, // 小于或等于`1px`时不转换为视窗单位
      replace: true, // 是否直接更换属性值而不添加备用属性
      landscape: false, // 是否处理横屏情况 是否添加根据landscapeWidth生成的媒体查询条件 @media (orientation: landscape)
      // exclude: [/node_modules/], // 忽略某些文件夹下的文件或特定文件 用正则做目录名匹配
      // landscapeUnit: "vw", // 横屏时使用的单位
      // landscapeWidth: 1134 // 横屏时使用的视窗宽度
    },
  },
};
  • 在vue.config.js中进行配置
css: {
    extract: IS_PROD, //  是否使用css分离插件 ExtractTextPlugin,是否将组件中的 CSS 提取至一个独立的 CSS 文件中 (而不是动态注入到 JavaScript 中的 inline 代码)。
    requireModuleExtension: true, // 启用 CSS modules for all css / pre-processor files.
    sourceMap: false,
    loaderOptions: {
      postcss: {
        plugins: [
          require("postcss-px-to-viewport")({
            unitToConvert: "px", // 默认值`px`,需要转换的单位
            viewportWidth: 1920, // 视窗的宽度,对应设计稿宽度
            // viewportHeight: 667, // 视窗的高度, 根据375设备的宽度来指定,一般是667,也可不配置
            unitPrecision: 6, // 指定`px`转换为视窗单位值的小数位数
            propList: ["*"], // 转化为vw的属性列表  propList: ["*","!letter-spacing"],这表示:所有css属性的属性的单位都进行转化,除了letter-spacing的
            viewportUnit: "vw", // 指定需要转换成视窗单位
            fontViewportUnit: "vw", // 字体使用的视窗单位
            selectorBlaskList: [".ignore-"], // 指定不需要转换为视窗单位的类 selectorBlackList: ['wrap'],它表示形如wrap,my-wrap,wrapper这样的类名的单位,都不会被转换
            mediaQuery: false, // 允许在媒体查询中转换`px`
            minPixelValue: 1, // 小于或等于`1px`时不转换为视窗单位
            replace: true, // 是否直接更换属性值而不添加备用属性
            landscape: false, // 是否处理横屏情况 是否添加根据landscapeWidth生成的媒体查询条件 @media (orientation: landscape)
            // exclude: [/node_modules/], // 忽略某些文件夹下的文件或特定文件 用正则做目录名匹配
            // landscapeUnit: "vw", // 横屏时使用的单位
            // landscapeWidth: 1134 // 横屏时使用的视窗宽度
          })
        ]
      },
      scss: {
        // 向全局sass样式传入共享的全局变量,注入 `sass` 的 `mixin` `variables` 到全局,
        // 详情: https://cli.vuejs.org/guide/css.html#passing-options-to-pre-processor-loaders
        //  sass 版本 9 中使用 additionalData ,版本 8 中使用 prependData
        prependData: `
          @import "@assets/css/mixin.scss";
          @import "@assets/css/variables.scss";
          `
      }
    }
  },

vue2项目中使用 mixin配合sacle缩放实现自适应

  1. css样式文件
#app{
  width: 100%;
  height: 100%;
  position: relative;
  overflow-x: hidden;
  #index{
    position: absolute;
    width: 1920px; // 设计稿的宽度
    min-height: 100%;
    top: 0;
    left: 0;
    transform-origin: 0 0;
  }
}
  1. mixinDraw.js 文件
/* 屏幕适配 mixin 函数 */

// * 设计稿尺寸(px)
const baseWidth = 1920

export default {
  data() {
    return {
      // * 定时函数
      drawTiming: null
    }
  },
  mounted () {
    // 加载后先计算一遍缩放比例
    this.calcRate()
    // 生成一个监听器:窗口发生变化从新计算计算一遍缩放比例
    window.addEventListener('resize', this.resize)
  },
  beforeDestroy () {
    window.removeEventListener('resize', this.resize)
  },
  methods: {
    calcRate () {
      // 拿到整个页面元素
      const appRef = this.$refs.zoom
      // 如果没有值就结束
      if (!appRef) return
      // 当前宽高比
      const currentRate = parseFloat((window.innerWidth / baseWidth).toFixed(5))
      if (appRef) {
          appRef.style.transform = `scale(${currentRate}, ${currentRate})`
      }
    },
    resize () {
      // 先清除计时器
      clearTimeout(this.drawTiming)
      // 开启计时器
      this.drawTiming = setTimeout(() => {
        this.calcRate()
      }, 200)
    }
  },
}
  1. vue文件中使用
<template>
  <div ref="zoom" id="index">
  	
  </div>
</template>  
<script>
  import $ from '~/utils/tool'
  import mixinDraw from '@/utils/mixinDraw'

  export default {
    name: 'Index',
    data() {
      return {}
    },
    mixins:[mixinDraw],
}
posted @ 2022-04-17 14:09  shine_lovely  阅读(2632)  评论(0编辑  收藏  举报