1. Предпосылки
- Недавно появилась страница обратной связи с пользователями.iPadКонтент, отображаемый на странице, очень мал, а текст на странице нечеткий.
- Большой экран должен видеть более крупные значки и текст, но он не оправдывает ожиданий
Во-вторых, проблема
- Размер страницы не адаптируется к ширине экрана просмотра мобильных устройств.
- Т.к. проект создан давно, единицы css в проекте не унифицированы, например: px/em/rem и т.д.
3. Размышление о проблеме
- Как сделать так, чтобы страница адаптировалась к ширине области просмотра?
- Как преобразовать столько единиц px?
4. Обзор эм/рем
-
em
-
Полный английский перевод rem: Root Element
截图来自: MDN
链接:https://developer.mozilla.org/zh-CN/docs/Web/CSS/length
5. Думать о решении проблем
1. 在网上查找了大量的资料,业界的主要解决方案是 rem,因此楼主也采用了 rem 的方式。
采用 rem 的方式,那自然是引入了 amfe-flexible 库进行实现。问题1迎刃而解
2. 如何实现工程中的 px 转 rem,这是一个头疼的问题。
2.1 直接手动把工程中的所有 px 换算为 rem ? 这不现实,成本太高
2.2 写一个工具先把 工程中的所有 px 换算为 rem ? 这可行,但是还是不够自动化,后期维护恶心
2.3 webpack 打包的时候,把 px 转 rem ? 这可行,实现之后,后期无需维护,只要随着工程构建,就可以实现转换
В-шестых, реализация кода
решить задачу 1
- Внедрить amfe-flexible для реализации конфигурации rem корневого узла.
<head>
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no">
<!--这里的文件可以根据自己的实际情况,将源码copy一份进行修改-->
<script src="./node_modules/amfe-flexible/index.js"></script>
</head>
решить задачу 2
- Во-первых, мы знаем, что загрузчик загрузчиков выполнения последовательности возвращается вперед; заглушка PUTGINS от фронта до заднего порядка выполнения.
- Таким образом, даже если мы используем less/sass для написания стилей в проекте, нам все равно придется пройти через css-loader для обработки, тогда нам нужно будет выполнить операцию только между less-loader/sass-loader и css-loader для операции px в rem.
- Загрузчик px2rem, используемый арендодателем
- Поскольку проект построен с помощью vue-cli2, мы находим util.js
1. 安装
yarn add px2rem-loader -D
2. util.js 配置
exports.cssLoaders = function (options) {
options = options || {}
const cssLoader = {
loader: 'css-loader',
options: {
minimize: process.env.NODE_ENV === 'production',
sourceMap: options.sourceMap,
importLoaders: 1
}
}
// 关键点 !!
const px2remLoader = {
loader: 'px2rem-loader',
options: {
remUnit: 50, // 项目规范以50px为基准数,可根据自己额实际情况而定
exclude: /(node_module)/
}
}
// generate loader string to be used with extract text plugin
function generateLoaders (loader, loaderOptions) {
let loaders = [cssLoader, 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,
fallback: 'vue-style-loader'
})
} else {
return ['vue-style-loader'].concat(loaders)
}
}
// http://vuejs.github.io/vue-loader/en/configurations/extract-css.html
return {
css: generateLoaders(),
postcss: generateLoaders(),
less: generateLoaders('less'),
sass: generateLoaders('sass', { indentedSyntax: true }),
scss: generateLoaders('sass'),
stylus: generateLoaders('stylus'),
styl: generateLoaders('stylus')
}
}
Если в некоторых конкретных ситуациях нет необходимости конвертировать px, вы можете настроить следующее
.selector {
width: 150px;
height: 64px; /*px*/
font-size: 28px; /*px*/
border: 1px solid #ddd; /*no*/
}
px2rem-loader 基于 px2rem 实现,很多用法和 px2rem 类似
https://github.com/Jinjiang/px2rem-loader
После завершения настройки запустите локально и увидите следующий эффект. Мы сделали большой шаг.
7. Проблемы столкнулись
-
Следующая ошибка возникает при упаковке и сборке
-
Решение: обновить happypack, проблема решена
// package.json
"devDependencies": {
"happypack": "5.0.1",
"px2rem-loader": "^0.1.9"
}