根据屏幕尺寸条件加载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样式,未经过任何处理:

相关推荐
前端小趴菜0530 分钟前
React-React.memo-props比较机制
前端·javascript·react.js
摸鱼仙人~2 小时前
styled-components:现代React样式解决方案
前端·react.js·前端框架
sasaraku.2 小时前
serviceWorker缓存资源
前端
RadiumAg3 小时前
记一道有趣的面试题
前端·javascript
yangzhi_emo3 小时前
ES6笔记2
开发语言·前端·javascript
yanlele3 小时前
我用爬虫抓取了 25 年 5 月掘金热门面试文章
前端·javascript·面试
中微子5 小时前
React状态管理最佳实践
前端
烛阴5 小时前
void 0 的奥秘:解锁 JavaScript 中 undefined 的正确打开方式
前端·javascript
中微子5 小时前
JavaScript 事件与 React 合成事件完全指南:从入门到精通
前端
Hexene...5 小时前
【前端Vue】如何实现echarts图表根据父元素宽度自适应大小
前端·vue.js·echarts