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

相关推荐
曹牧28 分钟前
C#:空合并运算符
java·前端·数据库
小羊没烦恼!1 小时前
铁道部新客票系统设计(二)
开发语言·前端·数据库·python·oracle·c#·php
燕落南枝3 小时前
CSS 学习:类型选择器与 AI 注释实战
css·人工智能·学习
智能直播4 小时前
RK3518:1.5G 内存 + 8G 存储,如何跑起硬件编解码、Web、AI 识别、绿幕特效
前端·人工智能·5g
掘金酱5 小时前
【10.24 特别活动】AI 时代,程序员的新饭碗在哪里?
前端·人工智能·后端
excel5 小时前
多进程环境下使用 PM2 部署 Socket.IO:需要注意什么
前端
IT_陈寒5 小时前
Redis的原子性竟然失效了?记一次分布式锁翻车实录
前端·人工智能·后端
时间的情敌7 小时前
《回顾 2018 前端:Vue2 成熟期,Webpack4 发布,PWA 大火》
前端
Java后端的Ai之路7 小时前
前端技术Vue-09-webpack-vuejs-实战
前端·vue.js·webpack
LMT流氓兔8 小时前
第五单元——第4课:给工具参数加校验
java·前端·算法·ai·langchain