CSS作为一种样式语言, 本身用来给HTML元素添加样式是没有问题的。
但是目前前端项目已经越来越复杂, 不再是简简单单的几行CSS就可以搞定的, 我们需要几千行甚至上万行的CSS来完成页面的美化工作。
随着代码量的增加, 必然会造成很多的编写不便:
所以有一种对CSS称呼是 “面向命名编程”;
社区为了解决CSS面临的大量问题, 出现了一系列的CSS预处理器(CSS_preprocessor)
常见的预处理器有哪些呢? 目前使用较多的是三种预处理器:
Sass/Scss:
Less:
Stylus:
Less (Leaner Style Sheets 的缩写) 是一门CSS 扩展语言, 并且兼容CSS。
less代码如何被编译成CSS代码运行呢?
方式一:下载Node环境,通过npm包管理下载less工具,使用less工具对代码进行编译;
方法二:通过VSCode插件来编译成CSS或者在线编译,Less Preview (online playground)
方式三:引入CDN的less编译代码,对less进行实时的处理;
方式四:将less编译的js代码下载到本地,执行js代码对less进行编译;
在一个大型的网页项目中,我们CSS使用到的某几种属性值往往是特定的
在Less中使用如下的格式来定义变量;
@变量名: 变量值;
在之前的项目中,当我们需要找到一个内层的元素时,往往需要嵌套很多层的选择器
Less提供了选择器的嵌套
特殊符号:& 表示当前选择器的父级
html代码
Document
- 1
- 2
- 3
- 4
- 5
less代码
// 1.兼容CSS代码
// .box {
// width: 100px;
// height: 100px;
// background-color: orange;
// font-size: 20px;
// color: #fff;
// }
// 2.定义变量
@mainColor: #a40011;
@smallFontSize: 12px;
@normalFontSize: 14px;
@bigFontSize: 18px;
// .box .pel {
// color: @mainColor;
// font-size: @normalFontSize;
// }
// .box h1 .keyword .section .list .item a .desc {
// color: @mainColor;
// font-size: @bigFontSize;
// }
// .box p .link {
// color: @mainColor;
// font-size: @smallFontSize;
// }
// 3.选择器的嵌套
.box {
.pel {
color: @mainColor;
font-size: @normalFontSize;
}
h1 {
.keyword {
color: @mainColor;
font-size: @bigFontSize;
}
}
p {
a.link {
color: @mainColor;
font-size: @smallFontSize;
background-color: #0f0;
&:hover {
color: #00f;
}
}
}
}
// &符号的练习
.list {
.item {
font-size: 20px;
&:hover {
color: @mainColor;
}
&:nth-child(1) {
color: orange;
}
&:nth-child(2) {
color: #00f;
}
}
}
在Less中,算术运算符 +、-、*、/ 可以对任何数字、颜色或变量进行运算。
在原来的CSS编写过程中,多个选择器中可能会有大量相同的代码
混合(Mixin)是一种将一组属性从一个规则集(或混入)到另一个规则集的方法。
注意:混入在没有参数的情况下,小括号可以省略,但是不建议这样使用;
混入也可以传入变量
映射(Maps):
混入和映射结合:混入也可以当做一个自定义函数来使用
html代码
Document
向阳草木青,明媚春光暖。伴随着天气晴好、气温回升,沉闷了一个冬日的人们纷纷走出家门,与大自然亲密接触,恣意享受春日好时光。
“露营热”不断升温的背后,是人们生活方式日趋多元、生活观念不断蝶变的折射。
less代码:
// 1.运算
// .box {
// font-size: 20px;
// width: 10% + 50px;
// height: 100px;
// background-color: #ff0000 + #00ff00;
// }
// px to rem
// 2.混入
// 2.1. 混入的基本使用
.nowrap_ellipsis {
white-space: nowrap;
text-overflow: ellipsis;
overflow: hidden;
}
// 2.2.混入是可以传递参数(定义变量)的
.box_border(@borderWidth: 5px, @borderColor: purple) {
border: @borderWidth solid @borderColor;
}
// 2.3.混入和映射(Map)结合使用
// 作用: 弥补less中不能自定义函数的缺陷
.box_size {
width: 100px;
height: 100px;
}
.box1 {
width: .box_size()[width];
background-color: #f00;
.nowrap_ellipsis();
.box_border();
}
.box2 {
width: 150px;
background-color: #0f0;
.nowrap_ellipsis();
.box_border(10px, orange);
}
extend继承
Less内置函数
作用域(Scope)
注释(Comments):在Less中,块注释和行注释都可以使用;
导入(Importing)
html代码:
Document
我是box文本
我是item文本
呵呵呵呵
我是结束文本
less代码:
// 1.extend
// .box_border {
// border: 5px solid #f00;
// }
// .box {
// width: 100px;
// background-color: orange;
// // .box_border();
// &:extend(.box_border);
// }
// 2.内置函数
// .box {
// color: color(skyblue);
// width: convert(100px, "in");
// font-size: ceil(18.5px);
// background-color: orange;
// }
// 3.作用域(scope)
@mainColor: #f00;
.box_mixin {
@mainColor: orange;
}
.box {
// @mainColor: #0f0;
.item {
span {
color: @mainColor;
.box_mixin();
// @mainColor: #00f;
}
}
}
// 4.注释(comment)
// 单行注释
/* 多行注释 */
我们会发现它的语法和CSS区别很大,后来官方推出了全新的语法SCSS,意思是Sassy CSS,他是完全兼容CSS的。
目前在前端学习SCSS直接学习SCSS即可:
移动互联网的快速发展,让人们已经越来越习惯于使用手机来完成大部分日常的事务。
移动端开发目前主要包括三类:
因为目前移动端设备较多,所以我们需要对其进行一些适配。
这里有两个概念:
在前面我们已经简单了解过视口的概念了:
但是在移动端,不太一样,你布局的视口和你可见的视口是不太一样的。
所以在移动端,我们可以将视口划分为三种情况:
这些概念的区分,事实上来自ppk,他也是对前端贡献比较大的一个人(特别是在移动端浏览器)
A tale of two viewports — part two
布局视口(layout viewport)
默认情况下,一个在PC端的网页在移动端会如何显示呢?
我们相对于980px布局的这个视口,称之为布局视口(layout viewport);
视觉视口(visual viewport)
在Chrome上按shift+鼠标左键可以进行缩放。
如果所有的网页都按照980px在移动端布局,那么最终页面都会被缩放显示。
理想视口(ideal viewport):
值 |
可能的附加值 |
描述 |
width |
一个正整数,或者字符串 device-width |
定义 viewport 的宽度。 |
height |
一个正整数,或者字符串 device-height |
定义 viewport 的高度。未被任何浏览器使用。 |
initial-scale |
一个 0.0 和 10.0 之间的正数 |
定义设备宽度与 viewport 大小之间的缩放比例。 |
maximum-scale |
一个 0.0 和 10.0 之间的正数 |
定义缩放的最大值,必须大于等于 minimum-scale,否则表现将不可预测。 |
minimum-scale |
一个 0.0 和 10.0 之间的正数 |
定义缩放的最小值,必须小于等于 maximum-scale,否则表现将不可预测。 |
user-scalable |
yes 或者 no |
默认为 yes,如果设置为 no,将无法缩放当前页面。浏览器可以忽略此规则; |
Document
移动端的屏幕尺寸通常是非常繁多的,很多时候我们希望在不同的屏幕尺寸上显示不同的大小;
这个时候,我们可能可以想到一些方案来处理尺寸:
rem单位是相对于html元素的font-size来设置的,那么如果我们需要在不同的屏幕下有不同的尺寸,可以动态的修改html的font-size尺寸。
比如如下案例:
屏幕尺寸 |
html的font-size |
盒子的设置宽度 |
盒子的最终宽度 |
375px |
37.5px |
1rem |
37.5px |
320px |
32px |
1rem |
32px |
414px |
41.4px |
1rem |
41.4px |
这样在开发中,我们只需要考虑两个问题:
方案一:媒体查询
Document
方案二:编写js代码
html代码:
Document
我是文本
哈哈哈哈哈哈
js代码:
// 1.获取html的元素
const htmlEl = document.documentElement
function setRemUnit() {
// 2.获取html的宽度(视口的宽度)
const htmlWidth = htmlEl.clientWidth
// 3.根据宽度计算一个html的font-size的大小
const htmlFontSize = htmlWidth / 10
// 4.将font-size设置到html上
htmlEl.style.fontSize = htmlFontSize + "px"
}
// 保证第一次进来时, 可以设置一次font-size
setRemUnit()
// 当屏幕尺寸发生变化时, 实时来修改html的font-size
window.addEventListener("resize", setRemUnit)
方案三:lib-flexible库
html代码:
Document
我是文本
js代码:
(function flexible(window, document) {
var docEl = document.documentElement
var dpr = window.devicePixelRatio || 1
// adjust body font size
function setBodyFontSize() {
if (document.body) {
document.body.style.fontSize = (12 * dpr) + 'px'
} else {
document.addEventListener('DOMContentLoaded', setBodyFontSize)
}
}
setBodyFontSize();
// set 1rem = viewWidth / 10
function setRemUnit() {
var rem = docEl.clientWidth / 10
docEl.style.fontSize = rem + 'px'
}
setRemUnit()
// reset rem unit on page resize
window.addEventListener('resize', setRemUnit)
window.addEventListener('pageshow', function (e) {
if (e.persisted) {
setRemUnit()
}
})
// detect 0.5px supports
if (dpr >= 2) {
var fakeBody = document.createElement('body')
var testElement = document.createElement('div')
testElement.style.border = '.5px solid transparent'
fakeBody.appendChild(testElement)
docEl.appendChild(fakeBody)
if (testElement.offsetHeight === 1) {
docEl.classList.add('hairlines')
}
docEl.removeChild(fakeBody)
}
}(window, document))
方案一:手动换算
方案二:less/scss函数
方案三:postcss-pxtorem:目前在前端的工程化开发中,我们可以借助于webpack的工具来完成自动的转化;
方案四:VSCode插件:px to rem 的插件,在编写时自动转化;
在flexible GitHub上已经有写过这样的一句话:
所以它更推荐使用viewport的两个单位vw、wh。
vw的兼容性如何呢?
rem事实上是作为一种过渡的方案,它利用的也是vw的思想。
vw相比于rem的优势:
vw我们只面临一个问题,将尺寸换算成vw的单位即可;
所以,目前相比于rem,更加推荐大家使用vw(但是理解rem依然很重要)
方案一:手动换算
方案二:less/scss函数
方案三:postcss-px-to-viewport-8-plugin:和rem一样,在前端的工程化开发中,我们可以借助于webpack的工具来完成自动的转化;
方案四:VSCode插件:px to vw 的插件,在编写时自动转化;
Document