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

相关推荐
TeamDev1 分钟前
使用 JxBrowser 在桌面应用中集成 Spring
java·前端·后端·spring·混合应用·jxbrowser·浏览器控件
陈随易1 小时前
Rolldown 把插件改动回传提速 26 倍
前端·后端·程序员
笃行3509 小时前
集中式与分布式,KingbaseES 的四种形态共用一套内核
前端
陈随易10 小时前
Vue 编译器换掉 source map,快了三四成
前端·后端·程序员
ZhengEnCi11 小时前
12 种高级 UI 交互效果及对应 AI 提示词:从按压回弹到底部抽屉的物理感教学
前端·css·交互设计
IT_陈寒14 小时前
Redis大key删除为什么会导致服务卡顿?我的线上事故复盘
前端·人工智能·后端
用户27050777252415 小时前
MCP 最小 Server 实测:3 个 JSON-RPC 报错与修法
前端
用户4993350250715 小时前
一人VIP账号多人共用:Web 代理里的会话共享怎么实现
前端
用户老李15 小时前
无线电自学教程 05:第一台收音机——从矿石机到 SDR
前端
IPIPD15 小时前
Node.js请求遇到503怎么重试?先解析Retry-After,再做有上限退避
前端