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

相关推荐
码海扬帆:前端探索之旅7 小时前
深度定制 uni-combox:新增功能详解与实战指南
前端·vue.js·uni-app
谷雨不太卷7 小时前
进程的状态码
java·前端·算法
打小就很皮...7 小时前
基于 Python + LangChain + RAG 的知识检索系统实战
前端·langchain·embedding·rag
BJ-Giser7 小时前
Cesium 烟雾粒子特效
前端·可视化·cesium
空中海7 小时前
02 ArkTS 语言与工程规范
java·前端·spring
YJlio7 小时前
7.4.5 Windows 11 企业网络连接与网络重置实战:远程访问、本地策略与故障恢复
前端·chrome·windows·python·edge·机器人·django
Slow菜鸟7 小时前
Codex CLI 教程(五)| Skills 安装指南:面向 Java 全栈工程师打造个人 ECC(V1版)
大数据·前端·人工智能
Lee川7 小时前
打字机是怎么炼成的:Chat 流式输出深度解析
前端·后端·面试
前端若水8 小时前
过渡(transition)高级:贝塞尔曲线、硬件加速
前端·css·css3
Lee川8 小时前
Token 无感刷新与 Logout:前端安全会话管理实战
前端·后端·react.js