根据屏幕尺寸条件加载CSS样式

同一套代码逻辑,渲染不同的样式到Web端H5端

举个🌰

如图所示,当我们的屏幕尺寸小于等于768px 时,我们希望内容是响应式变化的,也就是使用vw 为基本单位进行页面渲染;当屏幕尺寸大于768px 时,我们则认为网页在Web端进行渲染,希望使用px为基本单位进行渲染。

效果展示

如何处理

以下例子为基于Vue Cli 生成的Vue项目。

对于H5,我们可以使用postcss 及其插件postcss-px-to-viewport,来进行移动端布局。

1. 安装postcss-px-to-viewport

shell 复制代码
npm install postcss-px-to-viewport -D

2. 根目录创建postcss.config.js文件

json 复制代码
module.exports = {
  plugins: {
    'postcss-px-to-viewport': {
      unitToConvert: 'px', // 需要转换的单位
      viewportWidth: 750, // 设计稿的视口宽度
      unitPrecision: 9, // 单位转换后保留的精度
      propList: ['*'], // 能转换的vw属性列表
      viewportUnit: 'vw', // 希望使用的视口单位
      fontViewportUnit: 'vw', // 字体使用的视口单位
      selectorBlackList: [], // 需要忽略的css选择器
      minPixelValue: 1, // 设置最小的转换数值,如果为1,只有大于1的值才会被转换
      mediaQuery: false, // 媒体查询中是否需要转换单位
      replace: true, // 是否直接更换属性值
      exclude: [/node_modules/, /web.scss/], // web不进行样式转换
      landscape: false
    }
  }
}

这里的关键一步为exclude: [/node_modules/, /web.scss/],我们把web的样式给排除了,从而做到样式的条件配置。

3. 配置vue.config.js

javascript 复制代码
const postcssPxToViewport = require('postcss-px-to-viewport')
const postcssConfig = require('./postcss.config.js')

module.exports = {
  css: {
    loaderOptions: {
      postcss: {
        plugins: [
          postcssPxToViewport(postcssConfig.plugins['postcss-px-to-viewport'])
        ]
      }
    }
  }
}

4. 创建一个文件夹,放置CSS文件

text 复制代码
├── styles
|  ├── h5.scss // h5对应的样式
|  └── web.scss // web对应的样式

h5样式:

scss 复制代码
.page {
  display: flex;
  min-height: 100vh;
  flex-direction: column;
  .header {
    color: #fff;
    height: 244px;
    background-color: #376ece;
    .title {
      margin-top: 36px;
      font-size: 36px;
      line-height: 36px;
      font-weight: 500;
    }
    .sub-title {
      margin-top: 20px;
      font-size: 28px;
      line-height: 28px;
      font-weight: 400;
    }
  }
  .contract-text {
    flex: 1;
    background-color: #fff;
  }
}

web样式

scss 复制代码
.page {
  display: flex;
  min-height: 100vh;
  flex-direction: column;
  .header {
    color: #fff;
    height: 244px;
    background-color: green;
    .title {
      margin-top: 36px;
      font-size: 36px;
      line-height: 36px;
      font-weight: 500;
    }
    .sub-title {
      margin-top: 20px;
      font-size: 28px;
      line-height: 28px;
      font-weight: 400;
    }
  }
  .contract-text {
    flex: 1;
    background-color: #fff;
  }
}

5. 在组件中条件加载对应的CSS文件

scss 复制代码
@import url("~styles/h5.scss") screen and (max-width:768px);
@import url("~styles/web.scss") screen and (min-width:769px);

这样书写之后,实际上会在header中创建两个style标签:

其中第一个为H5 对应的样式,经过了postcss处理:

第二个则为web样式,未经过任何处理:

相关推荐
海的诗篇_4 分钟前
前端开发面试题总结-JavaScript篇(一)
开发语言·前端·javascript·学习·面试
江城开朗的豌豆14 分钟前
eval:JavaScript里的双刃剑,用好了封神,用不好封号!
前端·javascript·面试
Forever Nore20 分钟前
前端技能包
前端
江城开朗的豌豆38 分钟前
JavaScript篇:前端定时器黑科技:不用setInterval照样玩转循环任务
前端·javascript·面试
书中自有妍如玉43 分钟前
.net 使用MQTT订阅消息
java·前端·.net
江城开朗的豌豆1 小时前
JavaScript篇:自定义事件:让你的代码学会'打小报告'
前端·javascript·面试
ai产品老杨2 小时前
减少交通拥堵、提高效率、改善交通安全的智慧交通开源了。
前端·vue.js·算法·ecmascript·音视频
lexiangqicheng2 小时前
JS-- for...in和for...of
开发语言·前端·javascript
粥里有勺糖2 小时前
视野修炼-技术周刊第122期 | 发光图片制作
前端·javascript·github
Carlos_sam3 小时前
OpenLayers:封装Tooltip
前端·javascript