rem基础
什么是rem
? 它 和 em
有什么区别?
回顾 em
公式:1em = 1 font-size大小
<style>
body{
font-size: 20px;
}
div{
font-size: 15px;
width: 5em;
height: 5em;
background: rebeccapurple;
}
</style>
width = 15 * 5 = 75px;
缺点:font-size 经常会修改,em是根据当前自身的font-size进行计算的,很容易宽高就发生变化。
基于这个问题,来学习一个新的单位了,叫做 rem
rem -> root em
翻译过来就是根据 根节点计算em,这里的根节点指的是<html></html>
<style>
html{
font-size: 20px;
}
div{
font-size: 15px;
width: 5rem;
height: 5rem;
background: rebeccapurple;
}
</style>
width = 20* 5 = 100px;
rem的优势:父元素文字大小可能不一致, 但是整个页面只有一个html
,rem
只相对于根目录,即html
,有了rem
这个单位,就只需要调整根目录元素html
的font-size
就可以很好来控制整个页面的元素大小了。
媒体查询
媒体查询(Media Query)是CSS3新语法。
- 使用 @media查询,可以针对不同的媒体类型定义不同的样式
- @media 可以针对不同的屏幕尺寸设置不同的样式
- 当你重置浏览器大小的过程中,页面也会根据浏览器的宽度和高度重新渲染页面
- 目前针对很多苹果手机、Android手机,平板等设备都用得到多媒体查询
媒体查询语法规范
- 用 @media开头 注意@符号
- mediatype 媒体类型
- 关键字 and not only
- media feature 媒体特性必须有小括号包含
@media mediatype and|not|only (media feature) {
......
}
mediatype 查询类型
将不同的终端设备划分成不同的类型,称为媒体类型
媒体设备
all
所有类型的设备
screen
彩屏设备
- handheld 手持设备
- print 打印预览
- braille 盲文触觉设备
- speech 屏幕阅读器
- tv 电视类设备
关键字
关键字将媒体类型或多个媒体特性连接到一起做为媒体查询的条件。
and
- 和,在多个条件的时候,可以用 and 连接,表示以上条件都满足就加载样式
@media screen and (max-width:1100px) and (orientation:portrait){
div{
background: red;
}
}
not
- 不,表示只要不是某一个条件的情况下,其他条件都可以加载样式
@media not screen and (min-width:1100px){
div{
background: red;
}
}
这里的not
表示的不是:不可以是screen设备
表示:排除 彩屏 并且 最小宽度符合1100px(意思就是小于1100px的不符合) 的
only
- 只有,表示只有在某个条件下,才可以加载样式
@media only screen and (orientation:portrait){
div{
background: red;
}
}
,
- 或,表示只要满足其中一个条件,就可以加载样式
@media (min-width:1000px) , (max-width:500px){
div{
background: red;
}
}
媒体特征
- 宽度
- width 定义输出设备中页面可见区域的宽度
- min- width 定义输出设备中页面最小可见区域宽度
- max - width 定义输出设备中页面最大可见区域宽度
- 横竖屏
- orientation
- portrait 竖屏
- landscape 横屏
@media screen and (min-width:500px) {
/* 查屏幕 且 最小宽度是500px 的时候 w>=500px 下面的CSS会生效*/
}
@media screen and (width:500px) {
/* 查屏幕且宽度为500px的时候,下面CSS-code生效 */
}
@media screen and (max-width:500px) {
/* 宽度最大界值是500px w<=500px CSScode生效 */
}
@media screen and (orientation:landscape){
/* 当满足 彩色屏幕 并且 横屏状态下,就添加这里的样式 */
}
- 媒体查询书写规则
注意: 为了防止混乱,媒体查询我们要按照从小到大或者从大到小的顺序来写,但是我们最喜欢的还是从小到大来写,这样代码更简洁
媒询的不同引入方式
通过link设定条件引入
<link rel="stylesheet" href="1.css" media="screen and (min-width:1000px)">
通过media
设置媒询设备及媒询特征
通过import 设定条件引入
@import url('1.css') all and (min-width:600px);
必须是写在样式表的最前面,所以不推荐使用
直接在写样式的时候设定条件
@media screen and (min-width:600px){ }
less
less 基础
维护css弊端
CSS 是一门非程序式语言,没有变量、函数、SCOPE(作用域)等概念。
- CSS 需要书写大量看似没有逻辑的代码,CSS 冗余度是比较高的。
- 不方便维护及扩展,不利于复用。
- CSS 没有很好的计算能力
rem适配方案
1.让一些不能等比自适应的元素,达到当设备尺寸发生改变的时候,等比例适配当前设备。
2.使用媒体查询根据不同设备按比例设置html的字体大小,然后页面元素使用rem做尺寸单位,当html字体大小变化元素尺寸也会发生变化,从而达到等比缩放的适配。
技术方案:
1.less
+ rem
+ 媒体查询
2.lflexible.js
+ rem
rem实际开发适配方案1
①假设设计稿是750px
②假设我们把整个屏幕划分为15
等份( 划分标准不一 可以是20
份也可以是10
等份)
③每一份作为html
字体大小,这里就是50px
④那么在320px
设备的时候,字体大小为``320/
15就是
21.33px`
⑤用我们页面元素的大小除以不同的 html
字体大小会发现他们比例还是相同的
⑥比如我们以750
为标准设计稿
⑦一个100*100
像素的页面元素在 750
屏幕下, 就是 100/ 50
转换为 rem
是 2rem*2rem
比例是1比1
⑧320
屏幕下, html
字体大小为21.33
则 2rem
= 42.66px
此时宽和高都是 42.66
但是宽和高的比例还是 1比1
⑨但是已经能实现不同屏幕下 页面元素盒子等比例缩放的效果
总结:
①最后的公式:页面元素的rem值 = 页面元素值(px) / (屏幕宽度 / 划分的份数)
②屏幕宽度/划分的份数就是 htmlfont-size 的大小
③或者:页面元素的rem值 = 页面元素值(px) / html font-size 字体大小
// 因为pc上也可以打开移动端界面,这里设置一个默认字体大小写在最上面
html {
font-size: 50px;
}
// 我们此次定义划分的份数为 15
// 定义一个变量存15,每次去引用变量,易于修改
@no: 15;
// 320
@media screen and (min-width:320px) {
html {
font-size: 320px / @no ;
}
}
......
// 375
@media screen and (min-width: 375px) {
html {
font-size: 375px / @no;
}
}
......
// 720
@media screen and (min-width: 720px) {
html {
font-size: 720px / @no;
}
}
// 750
@media screen and (min-width: 750px) {
html {
font-size: 750px / @no;
}
}
----------------------------------------
html {
font-size: 50px;
}
@media screen and (min-width: 320px) {
html {
font-size: 21.33333333px;
}
}
@media screen and (min-width: 375px) {
html {
font-size: 25px;
}
}
@media screen and (min-width: 720px) {
html {
font-size: 48px;
}
}
@media screen and (min-width: 750px) {
html {
font-size: 50px;
}
}
body {
// 设置页面最小宽度
min-width: 320px;
// 设置页面宽度
width: 15rem;
margin: 0 auto;
line-height: 1.5;
font-family: Arial, Helvetica, sans-serif;
background: #f2f2f2;
}
rem实际开发适配方案2
手机淘宝团队出的简洁高效 移动端适配库
我们再也不需要在写不同屏幕的媒体查询,因为里面js做了处理
它的原理是把当前设备划分为10等份,但是不同设备下,比例还是一致的。
我们要做的,就是确定好我们当前设备的html 文字大小就可以了
比如当前设计稿是 750px, 那么我们只需要把 html 文字大小设置为 75px(750px / 10) 就可以
里面页面元素rem值: 页面元素的px 值 / 75
VSCode px 转换rem 插件 cssrem
cssrem中css自动转化为rem是参照默认插件的16转换的所以需要自己配置
手动更改或者把它添加到项目里的.vscode目录下的settings.json里
"cssrem.rootFontSize": 16
剩余的,让flexible.js来去算
github地址:https://github.com/amfe/lib-flexible
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, user-scalable=no,initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<link rel="stylesheet" href="css/normalize.css">
<!-- 引入flexible.js 库 -->
<script src="js/flexible.js"></script>
<title>Document</title>
</head>
body {
min-width: 320px;
max-width: 750px;
/* flexible 给我们划分了 10 等份 */
width: 10rem;
margin: 0 auto;
line-height: 1.5;
font-family: Arial, Helvetica;
background: #f2f2f2;
}
/* flexible.js是按照当前屏幕大小来去算 */
/* 如果我们的屏幕超过了 750px 那么我们就按照 750设计稿来走 不会让我们页面超过750px */
@media screen and (min-width: 750px) {
html {
font-size: 75px!important;
}
}
/* 相比于用less去计算,这可以直接使用插件 px 转换rem 换算出来*/
.search-content {
display: flex;
position: fixed;
top: 0;
left: 50%;
transform: translateX(-50%);
width: 10rem;
height: 1.173333rem;
background-color: #FFC001;
}