同一套代码逻辑,渲染不同的样式到
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样式,未经过任何处理: