在开发中可以直接使用设计图的尺寸开发,项目为我们自动编译,转换成rem。
注意:适配对于浏览器视口小的友好,视口大的话,也许一个轮播图就占据 2 屏了
PC端不要用第二种方法
vue-cli:使用脚手架工具创建项目。
postcss-pxtorem:转换 px 为 rem 的插件。
// 基准大小
const baseSize = 32
// 设置 rem 函数
function setRem () {
// 当前页面宽度相对于 750 宽的缩放比例,可根据自己需要修改。(简单的说 750 是设计稿的宽度)
const scale = document.documentElement.clientWidth / 750
// 设置页面根节点字体大小
document.documentElement.style.fontSize = (baseSize * Math.min(scale, 2)) + 'px'
}
// 初始化
setRem()
// 改变窗口大小时重新设置 rem
window.onresize = function () {
setRem()
}
import './utils/rem' // 引入时,需要注意路径
npm install postcss-pxtorem -D
"postcss-pxtorem": {
"rootValue": 32,
"propList": ["*"],
"selectorBlackList": [".el-"],// 忽略的选择器 .el- 表示 .el- 开头的都不会转换
}
注意:此方法支持 import 和 .vue 单文件中 style。暂不支持 style 中使用 @import url();
npm install lib-flexible --save
import 'lib-flexible/flexible'
npm install px2rem-loader --save
const cssLoader = {
loader: 'css-loader',
options: {
sourceMap: options.sourceMap
}
}
const px2remLoader = {
loader: 'px2rem-loader',
options: {
//设计图是750px
remUnit: 75
}
}
我们只需要在 cssLoader 后面加上一个 px2remLoader 即可,px2rem-loader 的 remUnit 选项意思是 1rem=多少像素,结合 lib-flexible,我们将 px2remLoader 的 option.remUnit 设置成设计稿宽度的1/10,这里我们假设设计稿的宽度为750px,那么 px2remLoader 中的 remUnit 的值为75
// generate loader string to be used with extract text plugin
function generateLoaders(loader, loaderOptions) {
const loaders = options.usePostCSS ? [cssLoader, postcssLoader, px2remLoader] : [cssLoader, px2remLoader]
// 这里不管真假,都增加了 px2remLoader,其他地方没变化
if (loader) {
loaders.push({
loader: loader + '-loader',
options: Object.assign({}, loaderOptions, {
sourceMap: options.sourceMap
})
})
}
// Extract CSS when that option is specified
// (which is the case during production build)
if (options.extract) {
return ExtractTextPlugin.extract({
use: loaders,
publicPath: '../../',
fallback: 'vue-style-loader'
})
} else {
return ['vue-style-loader'].concat(loaders)
}
}
cnpm install postcss-pxtorem -D
let docEl = document.documentElement
getSize () { // 获取屏幕的宽度
function getWdith () {
let myWidth = 0
if (typeof (window.innerWidth) === 'number') {
// Non-IE
myWidth = window.innerWidth
} else if (document.documentElement && (document.documentElement.clientWidth)) {
// IE 6+ in 'standards compliant mode'
myWidth = document.documentElement.clientWidth
} else if (document.body && (document.body.clientWidth)) {
// IE 4 compatible
myWidth = document.body.clientWidth
}
return parseInt(myWidth)
}
let screenWidth = window.screen.width > getWdith() ? getWdith() : window.screen.width
if (screenWidth >= 768) {
screenWidth = 768
}
docEl.style.fontSize = screenWidth / (750 / 40) + 'px'
window.document.addEventListener('focusout', function () {
window.scrollTo()
})
if (!window.ISALES) {
window.ISALES = {
ready: function () {}
}
} else {
if (!window.ISALES.ready) {
window.ISALES.ready = function () {}
} else {
if (typeof window.ISALES.ready === 'function') {
let fn = window.ISALES.ready
window.ISALES.ready = function () {
fn()
}
} else {
window.ISALES.ready = function () {}
}
}
}
}
// 页面适配
getSize()
window.addEventListener('resize', () => {
getSize()
})
getSize()
会自动改为rempackage.json
中与 devDependencies
同级 添加: "postcss": {
"plugins": {
"autoprefixer": {},
"postcss-pxtorem": {
"rootValue": 40,
"replace": true,
"propWhiteList": [
"*"
],
"minPixelValue": 2, // 意思是所有小于2px的样式都不被转换
"selectorBlackList": [
"mint-"
] // 对css选择器进行过滤的数组,class以mint-开头不被转换
}
}
},
!(function (doc, win) {
// 拿到html标签的dom元素对象
var docEle = doc.documentElement,
evt = "onorientationchange" in window ? "orientationchange" : "resize",
fn = function () {
// 拿到当前屏幕的尺寸。
var width = docEle.clientWidth;
width = width < 320 ? 320 : width;
width = width > 640 ? 640 : width;
width && (docEle.style.fontSize = 100 * (width / 750) + "px");
setTimeout(function() {
var width = docEle.clientWidth;
width = width < 320 ? 320 : width;
width = width > 640 ? 640 : width;
width && (docEle.style.fontSize = 100 * (width / 750) + "px");
}, 300);
};
win.addEventListener(evt, fn, false);//监听横屏
doc.addEventListener("DOMContentLoaded", fn, false);
height: 200/100rem;