1. rem 基础
1.1. rem 单位
em
相对于父元素的字体大小来说的,em
是父元素字体大小。rem
(root em)是一个相对单位,类似于em
,但它是相对于html
元素字体大小来说的。rem
的优点就是可以通过修改html
里面的文字大小来改变页面中元素的大小可以整体控制。- 例如,根元素(html)设置
font-size=12px;
非根元素设置width: 2rem;
则换成px
表示就是24px
。
<style>
html {
font-size: 12px;
}
div {
font-size: 12px;
width: 15rem;
height: 15rem;
background-color: purple;
}
p {
/* 1. em相对于父元素 的字体大小来说的 */
/* width: 10em;
height: 10em; */
/* 2. rem 相对于 html元素 字体大小来说的 */
width: 10rem;
height: 10rem;
background-color: pink;
/* 3.rem的优点就是可以通过修改html里面的文字大小来改变页面中元素的大小可以整体控制 */
}
</style>
</head>
<body>
<div>
<p></p>
</div>
</body>
2. 媒体查询
2.1什么是媒体查询
媒体查询(Media Query)是 CSS3 新语法。
- 使用
@media
查询,可以针对不同的媒体类型定义不同的样式。 @media
可以针对不同的屏幕尺寸设置不同的样式。- 当你重置浏览器大小的过程中,页面也会根据浏览器的宽度和高度重新渲染页面。
- 目前针对很多苹果手机、安卓手机,平板等设备都用得到多媒体查询。
2.2 语法规范
@media mediatype and|not|only (media feature) {
CSS-Code;
}
- 用
@media
开头,注意@
符号。 mediatype
媒体类型- 关键字
and not only
media feature
媒体特性必须有小括号包含。
2.2.1 mediatype
查询类型
将不同的终端设备划分成不同的类型,称为媒体类型。
2.2.2 关键字
关键字将媒体类型或多个媒体特性连接到一起做为媒体查询的条件。
- and:可以将多个媒体特性连接到一起,相当于“且”的意思。
- not:排除某个媒体类型,相当于“非”的意思,可以省略。
- only:指定某个特定的媒体类型,可以省略。
2.2.3 媒体特性
每种媒体类型都具有各自不同的特性,根据不同媒体类型的媒体特性设置不同的展示风格。我们暂且了解三个,注意它们要加小括号包含。
<style>
/* 这句话的意思就是: 在我们屏幕上 并且 最大的宽度是 800像素 设置我们想要的样式 */
/* max-width 小于等于800 */
/* 媒体查询可以根据不同的屏幕尺寸在改变不同的样式 */
@media screen and (max-width: 800px) {
body {
background-color: pink;
}
}
@media screen and (max-width: 500px) {
body {
background-color: purple;
}
}
</style>
</head>
<body></body>
案例:根据页面宽度改变背景颜色
(1)按照从大到小的或者从小到大的思路。
(2)注意我们有最大值 max-width 和最小值 min-width 都是包含等于的。
(3)当屏幕小于540像素,背景颜色变为蓝色(x <= 539)。
(4)当屏幕大于等于540像素并且小于等于969像素的时候背景颜色为绿色(540<=x<=969)。
(5)当屏幕大于等于970像素的时候,背景颜色为红色(x >= 970)。
注意:为了防止混乱,媒体查询我们要按照从小到大或者从大到小的顺序来写,但是我们最喜欢的还是从小到大来写,这样代码更简洁。
<style>
/* 1. 媒体查询一般按照从大到小或者 从小到大的顺序来 */
/* 2. 小于540px 页面的背景颜色变为蓝色 */
@media screen and (max-width: 539px) {
body {
background-color: purple;
}
}
/* 3. 540 ~ 970 我们的页面颜色改为 绿色 */
/* @media screen and (min-width: 540px) and (max-width: 969px) {
body {
background-color: green;
}
} */
@media screen and (min-width: 540px) {
body {
background-color: skyblue;
}
}
/* 4. 大于等于970 我们页面的颜色改为 红色 */
@media screen and (min-width: 970px) {
body {
background-color: pink;
}
}
/* 5. screen 还有 and 必须带上不能省略的 */
/* 6. 我们的数字后面必须跟单位 970px 这个 px 不能省略的 */
</style>
</head>
<body></body>
2.3 媒体查询 + rem实现元素动态大小变化
(1)rem 单位是跟着 html 来走的,有了 rem 页面元素可以设置不同的大小尺寸。(2)媒体查询可以根据不同设备宽度来修改样式。(3)媒体查询 + rem 就可以实现不同设备宽度,实现页面元素大小的动态变化。
<style>
* {
margin: 0;
padding: 0;
}
/* html {
font-size: 100px;
} */
/* 从小到大的顺序 */
@media screen and (min-width: 320px) {
html {
font-size: 50px;
}
}
@media screen and (min-width: 640px) {
html {
font-size: 100px;
}
}
.top {
height: 1rem;
font-size: 0.5rem;
background-color: green;
color: #fff;
text-align: center;
line-height: 1rem;
}
</style>
</head>
<body>
<div class="top">购物车</div>
</body>
2.4 引入资源(理解)
当样式比较繁多的时候,我们可以针对不同的媒体使用不同stylesheets(样式表)。原理,就是直接在link中判断设备的尺寸,然后引用不同的css文件。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta http-equiv="X-UA-Compatible" content="ie=edge" />
<title>Document</title>
<style>
/* 当我们屏幕大于等于 640px以上的,我们让div 一行显示2个 */
/* 当我们屏幕小于640 我们让div一行显示一个 */
/* 一个建议: 我们媒体查询最好的方法是从小到大 */
/* 引入资源就是 针对于不同的屏幕尺寸 调用不同的css文件 */
</style>
<link
rel="stylesheet"
href="style320.css"
media="screen and (min-width: 320px)"
/>
<link
rel="stylesheet"
href="style640.css"
media="screen and (min-width: 640px)"
/>
</head>
<body>
<div>1</div>
<div>2</div>
</body>
</html>
3. Less 基础
3.1 维护 CSS 的弊端
CSS 是一门非程序式语言,没有变量、函数、SCOPE(作用域)等概念。
- CSS 需要书写大量看似没有逻辑的代码,CSS 冗余度是比较高的。
- 不方便维护及扩展,不利于复用。
- CSS 没有很好的计算能力。
- 非前端开发工程师来讲,往往会因为缺少 CSS 编写经验而很难写出组织良好且易于维护的 CSS 代码项目。
3.2 Less 介绍
Less(LeanerStyle Sheets 的缩写)是一门 CSS扩展语言,也成为CSS预处理器
。做为 CSS的一种形式的扩展,它并没有减少CSS的功能,而是在现有的CSS语法上,为CSS加入程序式语言的特性。它在CSS 的语法基础之上,引入了变量
,Mixin(混入)
,运算
以及函数
等功能,大大简化了 CSS 的编写,并且降低了 CSS的维护成本,就像它的名称所说的那样,Less可以让我们用更少的代码做更多的事情。
总结:Less 是一门 CSS 预处理语言,它扩展了CSS的动态特性。
Less安装
- 安装nodejs,可选择版本(8.0),网址:http://nodejs.cn/download/
- 检查是否安装成功,使用
cmd
命令(win10是window+r
打开运行输入cmd
) —输入node –v
查看版本即可。 - 基于nodejs在线安装 Less,使用
cmd
命令npm install -g less
即可。 - 检查是否安装成功,使用cmd命令
lessc -v
查看版本即可。
3.3 Less 使用
我们首先新建一个后缀名为 less 的文件,在这个文件里面书写 less 语句。例如:my.less:
接下来的内容有:Less 变量、Less 编译、Less 嵌套、Less 运算。
3.4 Less 变量
变量是指没有固定的值,可以改变的。因为我们CSS中的一些颜色和数值等经常使用。
- 语法格式:
@变量名: 值;
- 必须有@为前缀。
- 不能包含特殊字符。
- 不能以数字开头。
- 大小写敏感
@color: pink;
3.5 Less 编译
本质上,Less包含一套自定义的语法及一个解析器,用户根据这些语法定义自己的样式,这些规则最终会通过解析器,编译生成对应的 CSS 文件。因此,我们需要把我们的 less 文件编译生成 css 文件,这样我们的 html 页面才能使用。
3.5.1 VScode Less 插件 ⭐⭐
Easy LESS
插件用来把 less 文件编译为 css 文件。安装完毕插件,重新加载下VScode后,只需要保存一下 less 文件,就会自动生成 css 文件。
例如:新建 my.less
文件,文件内容如上述 less
文件,保存后,VScode自动生成 my.css
文件。新建了一个html文件,引入my.css文件,之后就可以改变html中的样式了。
3.6 Less 嵌套
我们经常用到选择器的嵌套,例如下面代码所示:
#header .logo {
width: 300px;
}
将 css 改为 less,less 的写法为:
#header {
.logo {
width: 300px;
}
}
如果遇见 (交集|伪类|伪元素选择器) ,利用 &
进行连接。
- 内层选择器的前面没有 & 符号,则它被解析为父选择器的后代。
- 如果有 & 符号,它就被解析为父元素自身或父元素的伪类。
a:hover{
color:red;
}
/* Less 嵌套写法 */
a{
&:hover{
color:red;
}
}
nest.less 文件
生成的nest.css文件
.header {
width: 200px;
height: 200px;
background-color: pink;
}
.header a {
color: red;
}
.header a:hover {
color: blue;
}
.nav .logo {
color: green;
}
.nav::before {
content: "";
}
less嵌套.html文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta http-equiv="X-UA-Compatible" content="ie=edge" />
<title>Document</title>
<style>
/* .header {}
.header a {} */
</style>
<link rel="stylesheet" href="nest.css" />
</head>
<body>
<div class="header">
<a href="#">文字</a>
</div>
<div class="nav">
<div class="logo">传智播客</div>
</div>
</body>
</html>
3.7 Less 运算 ⭐
任何数字、颜色或者变量都可以参与运算。Less提供了加(+)、减(-)、乘(*)、除(/)算数运算。
/*Less 里面写*/
@witdh: 10px + 5;
div {
border: @witdh solid red;
}
/*生成的css*/
div {
border: 15px solid red;
}
/*Less 甚至还可以这样 */
width: (@width + 5) * 2;
注意:
-
乘号(
*
)和除号(/
)的写法 。 -
运算符中间左右有个空格隔开
1px + 5
。 -
对于两个不同单位的值之间的运算,运算结果的值取第一个值的单位。
-
如果两个值之间只有一个值有单位,则运算结果就取该单位。
-
count.less文件
- count.css 文件
html {
font-size: 50px;
}
div {
width: 150px;
height: 500px;
border: 10px solid red;
background-color: #444444;
}
img {
width: 1.64rem;
height: 1.64rem;
}
- less运算.html文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta http-equiv="X-UA-Compatible" content="ie=edge" />
<title>Document</title>
<link rel="stylesheet" href="count.css" />
</head>
<body>
<div></div>
</body>
</html>
4. rem 适配方案
4.1 rem 实际开发适配方案
(1)按照设计稿与设备宽度的比例,动态地计算并设置 html 根标签的 font-size 大小;(媒体查询)
(2)CSS 中,设计稿元素的宽、高、相对位置等取值,按照同等比例换算为 rem 为单位的值。
4.2 rem 适配方案技术使用(市场主流)
总结:两种方案现在都存在。方案2更简单,现阶段大家无需了解里面的JS代码。
4.3 rem 实际开发适配方案1
rem + 媒体查询 + less 技术
4.3.1 设计稿常见尺寸宽度
一般情况下,我们以一套或者两套效果图适应大部分的屏幕,放弃极端屏或者对其优雅降级,牺牲一些效果。现在基本以750为准。
4.3.2 动态设置 html 标签 font-size 大小
4.3.3 元素大小取值方法
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta http-equiv="X-UA-Compatible" content="ie=edge" />
<title>Document</title>
<style>
@media screen and (min-width: 320px) {
html {
font-size: 21.33px;
}
}
@media screen and (min-width: 750px) {
html {
font-size: 50px;
}
}
div {
width: 2rem;
height: 2rem;
background-color: pink;
}
/* 1. 首先我们选一套标准尺寸 750为准
2. 我们用屏幕尺寸 除以 我们划分的份数 得到了 html 里面的文字大小 但是我们知道不同屏幕下得到的文字大小是不一样的 */
/* 3. 页面元素的rem值 = 页面元素在 750像素的下px值 / html 里面的文字大小 */
</style>
</head>
<body>
<div></div>
</body>
</html>
5. 苏宁首页案例制作
5.1 技术选型
5.2 搭建文件夹结构
5.3 设置视口标签以及引入初始化样式
5.4 设置公共 common.less 文件
5.5 新建 index.html 文件
5.6 body样式
body {
min-width: 320px;
width: 15rem;
margin: 0 auto;
line-height: 1.5;
font-family: Arial,Helvetica;
background: #F2F2F2;
}
6. rem 适配方案2
6.1 简洁高效的rem适配方案flexible.js
github地址:https://github.com/amfe/lib-flexible。
// set 1rem = viewWidth / 10
function setRemUnit () {
var rem = docEl.clientWidth / 10
docEl.style.fontSize = rem + 'px'
}
setRemUnit()
6.2 使用适配方案2制作苏宁移动端首页
6.2.1 技术选型
6.2.2 搭建文件夹结构
6.2.3 设置视口标签、引入初始化样式以及js文件
6.2.4 body样式
6.3 VScode px 转换 rem 插件 cssrem
安装好插件之后,需要设置html字体大小基准值。
- 打开设置,快捷键是 ctrl + 逗号。