布局自适应_【第2172期】自适应布局最佳实践

前言

最近天气好冷。今日前端早读课文章由@keep_curious投稿分享。

正文从这开始~~

目前css主流布局方案对比
百分比布局(%)、视口布局(vw/vh)

优势:全部元素应用后,比例保持完好。劣势:计算繁琐,工程效率太低,还要时刻区分是相对于父元素的哪个属性。实用性欠佳。

rem布局(rem)

优势:计算规则统一,不容计算混乱。劣势:复制样式后还不能用,再人工计算,再修改。效率低下。

弹性盒布局(flex)

优势:解决的是盒子布局问题。劣势:带px的属性值如何自适应不同屏幕大小,尚未解决。

网格布局(grid)

优势:之前css框架的网格布局,浏览器逐渐内置了。劣势:劣势同弹性盒布局

媒体查询(@media)

优势:根据浏览器屏幕大小适用相关自定义样式。劣势:需要书写多套样式,多套。

postcss-pxtorem

优势:将px按照相关配置条件转换成rem。劣势:要自己通过js计算根元素的像素值,还要保证postcss-pxtorem的配置参数填写正确。自己做的工作较多,还要撸代码,容易出错。

smart-rem

优势:自动计算rem合理值。劣势:书写代码时,像素单位px要改成rem,对应关系100px=>1rem。要手工将100px改成1rem,与懒癌气质不符。

postcss-auto-rem

优势:自动将px转换成rem。如果代码中是100px,则在浏览器中看到的编译后是1rem。零配置。劣势:需要自定义rem的合理值,如何合理定义rem的合理值,需要撸码,容易出错。

smart-rem加postcss-auto-rem

优势:smart-rem自动完成rem值计算,posts-auto-rem自动将px编译成rem。两者的计算比例完美相合 劣势:两个包结合使用,而无需手工撸码,也无需多余配置。工程化最佳,大大提高了开发效率。

将smart-rem和postcss-auto-rem结合使用,一点点改变~,也有很大的差别

目前支持所有主流框架和webpack、gulp、及nodejs Api等等等等。

例如

源代码

.foo {

/* Input example */

margin: 100px;

padding: 100px;

width: 50px;

font-size: 50px;

}

输出到浏览器中的代码

.foo {

/* Output example */

margin: 1rem;

padding: 1rem;

width: 0.5rem;

font-size: 0.5rem;

}

调试问题:

如果在代码编辑器中,正常修改px值即可;

如果在浏览器中,100px = 1rem,如果调整1px,只需增加0.01rem;(在浏览器上微调,看实时效果,着实比其他方案简单很多哦)

用法

给出以下参考用法,当然,高手可以自己随便玩。

Vue、react、angular框架使用步骤参考如下

第一步:

npm install smart-rem -S

第二步:

在入口文件

import smartRem from 'smart-rem'

smartRem(Arguments)

注释: Arguments参数是设计稿的整个尺寸宽度,如果设计稿的尺寸宽度是750px,那么参数就是750(不带px),如下:

smartRem(750)

注意vue2.x已经内置了对postcss的支持,所以,如果在根目录有.postcssrc.js文件,直接在此文件添加一行"postcss-auto-rem":{},然后npm install -D postcss-auto-rem 即可,下面第三步和第四步都不用看了。如果其它框架有变动,亦可酌情处理哦。

第三步:

安装依赖postcss postcss-auto-rem

npm install --save-dev postcss postcss-auto-rem

第四步:

修改css相关rules配置

如果是Webpack,在webpack.config.js中使用postcss-loader:

module.exports = {

module: {

rules: [

{

test: /\.css$/,

exclude: /node_modules/,

use: [

{

loader: 'style-loader',

},

{

loader: 'css-loader',

options: {

importLoaders: 1,

}

},

{

loader: 'postcss-loader'

}

]

}

]

}

}

如果是CSS-in-JS,在jsx中使用postcss最好的方式是使用astroturf,添加到你的webpack.config.js中。

module.exports = {

module: {

rules: [

{

test: /\.css$/,

use: ['style-loader', 'postcss-loader'],

},

{

test: /\.jsx?$/,

use: ['babel-loader', 'astroturf/loader'],

}

]

}

}

第五步:

检查你的项目是否存在postcss配置文件,一般位于根目录。

如果没有postcss的相关配置文件,则可以手动创建一个postcss.config.js,在plugins中,添加require(postcss-auto-rem)

module.exports = {

plugins: [

+ require('postcss-auto-rem'),

require('autoprefixer')

]

}

如果你使用parcel打包,而非webpack,那么parcel内置了postcss,你只需在根目录创建postcss.config.js,添加如代码

Nuxt框架,使用可参考如下

可在nuxt.config.js中的head部分做添加

head: {

// ** 开始添加

script: [

{

innerHTML: require('smart-rem') + 'smartRem(Arguments)',

type: 'text/javascript',

charset: 'utf-8'

}

],

__dangerouslyDisableSanitizers: ['script']

// ** 结束添加

},

其它步骤参考上面第一步到第四步。

Next 框架使用可参考如下

根目录下创建文件pages/_document.js,在render中添加script脚本

// _document is only rendered on the server side and not on the client side

// Event handlers like onClick can't be added to this file

// ./pages/_document.js

import Document, { Head, Main, NextScript } from 'next/document'

export default class MyDocument extends Document {

static async getInitialProps(ctx) {

const initialProps = await Document.getInitialProps(ctx)

return { ...initialProps }

}

render() {

return (

<Head>

{`body { margin: 0 } /* custom! */`}style>

// **开始添加

<script dangerouslySetInnerHTML={{__html: require('smart-rem') + 'smartRem(Arguments)'}}>script>

// ** 结束添加

Head>

<body className="custom_class">

<Main />

<NextScript />

body>

html>

)

}

}

其它步骤参考最上面第一步到第四步。

Node Api用法参考如下

var fs = require('fs');

var postcss = require('postcss');

var postcssAutoRem = require('postcss-auto-rem');

var css = fs.readFileSync('main.css', 'utf8');

var processedCss = postcss(postcssAutoRem()).process(css).css;

fs.writeFile('auto-rem.css', processedCss, function (err) {

if (err) {

throw err;

}

console.log('file written.');

});

gulp用法参考如下

var gulp = require('gulp');

var postcss = require('gulp-postcss');

var autoprefixer = require('autoprefixer');

var postcssAutoRem = require('postcss-auto-rem');

gulp.task('css', function () {

var processors = [

autoprefixer({

browsers: 'last 1 version'

}),

postcssAutoRem()

];

return gulp.src(['build/css/**/*.css'])

.pipe(postcss(processors))

.pipe(gulp.dest('build/css'));

});

关于本文 作者:@keep_curious 原文:https://juejin.cn/post/6914676904909864968/

ceee87e3987fd9d15b042d2822c63de7.png

本周你可能错过的前端早读课

为你推荐

【第2038期】使用滚动特效的最佳实践

【第1625期】 从原型图到成品:步步深入 CSS 布局

欢迎自荐投稿,前端早读课等你来

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值