代码下载
相对单位
em:相对于父元素字体大小
rem:相对于html元素字体大小(优点是通过修改html字体大小使页面元素大小得到整体控制)
<body><div><p></p></div>
</body><style>html {font-size: 14px;}div {background-color: red;font-size: 12px;/* 140px */width: 10rem;/* 140px */height: 10rem;}p {background-color: cyan;/* 140px */width: 10rem;/* 120px */height: 10em;}</style>
媒体查询
媒体查询(Media Query)是CSS3新语法。
使用 @media 查询,可以针对不同的媒体类型定义不同的样式,可以针对不同的屏幕尺寸设置不同的样式
当重置浏览器大小的过程中,页面也会根据浏览器的克度和高度重新渲染页面,目前针对很多苹果手机、Android手机,平板等设备都用得到多媒体查询。
语法
- 用 @media 开头 注意@符号
- mediatype 媒体类型(all 用于所有设备,print 用于打印机或打印预览,screen 用于电脑、平板、手机等设备)
- 关键字 and not only(and 可以将多个媒体特性连接到一起,相当于“且”的意思,not 排除某个媒体类型,相当于“非”。的意思,可以省路,only 指定某个特定的媒体类型,可以省路。)
- media feature 媒体特性,必须由小括号包含(width 输出设备页面可贝区域的竞度,min-width 翰出设备页面最小可见区域宽度,max-width 定义输出设备中页面最大可见区域竞度)
@media mediatype and|not|only (media feature) (CSS-Code;
}
注意点:
- 为了防止混乱 ,媒体查询我们要按照从小到大或者从大到小的顺序来写
- 有最大值 max-width和最小值min-width都是包含等于的
- 后面的档位会覆盖与前面的档位冲突的部分
<body><div class="query"><ul><li>屏幕宽度小于600为红色</li><li>屏幕宽度600到700为蓝色</li><li>屏幕宽度大于800为绿色</li></ul></div>
</body><style>@media screen and (max-width: 600px) {div {background-color: red;}}@media screen and (min-width: 600px) {div {background-color: green;}}@media screen and (min-width: 800px) {div {background-color: blue;}}</style>
使用 媒体查询 和 rem 可以实现元素动态变化:
<style>@media screen and (max-width: 600px) {html {font-size: 50px;}}@media screen and (min-width: 600px) {html {font-size: 100px;}}* {margin: 0;padding: 0;}.top {text-align: center;font-size: .5rem;background-color: cyan;}</style>
<body><div class="top">购物车</div>
</body>
引入资源
当样式比较繁多的时候,可以针对不同的媒体使用不同 stylesheets(样式表)。原理,就是直接在link中判断设备的尺寸,然后引用不同的 css 文件。
语法规范:
针对小于640的屏幕引入不同的 css 文件:
<link rel="stylesheet" href="css/style640.css" media="screen and (max-width: 640px)"><link rel="stylesheet" href="css/styleGreaterthan640.css" media="screen and (min-width: 640px)">
Less
CSS 是一门非程序式语言,没有变量、西数、SCOPE(作用域)等概念。
- CSS 需要书写大量看似没有逻辑的代码,CSS元余度是比较高的。
- 不方便维护及扩展,不利于复用。
- CSS 没有很好的计算能力
- 非前端开发工程师来讲,往往会因为缺少CSS编写经验而很难写出组织良好且易于维护的CSS代码项目。
Less (Leaner Style Sheets 的缩写)是一门CSS扩展语言,也成为CSS预处理器。做为 CSS 的一种形式的扩展,它并没有减少 CSS的功能,而是在现有的CSS语法上,为CSS加入程序式语言的特性。
它在CSS 的语法基础之上,引入了变量,Mixin(混入),运算以及函数等功能,大大简化了CSS 的编写,并且降低了CSS 的维护成本,就像它的名称所说的那样,Less可以让我们用更少的代码做更多的事情。详情参考 less中文网。
基于nodejs在线安装Less:
- 使用cmd命令 “npm install-g less"
- 检查是否安装成功,使用cmd命令 “lessc-v" 查看版本即可
Less 编译
本质上,Less包含一套自定义的语法及一个解析器,用户根据这些语法定义自己的样式规则,这些规则最終会通过解析器,编译生成对应的CSS 文件。所以,需要把less文件,编泽生成为css文件,这样html页面才能使用。
Easy LESS 插件用来把less文件编译为css文件,安装完毕插件,重新加载 vscode。只要保存一下Less文件,会自动生成CSS文件。
基本使用
@变量名: 值;
变量命名规范:1、必须有@为前缀,2、不能包含特殊字符,3、不能以数字开头,4、大尔写敏感。
less 可以嵌套书写,如果遇见(交集、伪类、伪元素选择器)。内层选择器的前面没有 &符号,则它被解析为父选择器的后代;如果有 & 符号,它就被解析为父元素自身或父元素的伪类。
任何数字、颜色或者变量都可以参与运算。就是Less提供了加(+)、减(-)、乘(*)、除(/) 算术运算。
- 运算符左右用空格隔开
1px + 5
,除法运算一定要加括号 - 对于两个不同的单位的值之间的运算,运算结果的值取第一个值的单位
- 如果两个值之间只有一个值有单位,则运算结果就取该单位
@mainColor: #666666 + #333333;
@textColor: red;
div.main {background-color: @mainColor;width: 100px * 2;height: (100px / 2) + 100;.text {color: @textColor;}> .text {font-size: 40px - 1rem;}
}<!--对应的css-->
div.main {background-color: #999999;width: 200px;height: 150px;
}
div.main .text {color: red;
}
div.main > .text {font-size: 39px;
}
rem 屏幕适配
屏幕适配的目的是:
- 让一些不能等比自适应的元素,达到当设备尺寸发生改变的时候,等比例适配当前设备。
- 使用媒体查询根据不同设备按比例设置htmnl的字体大小,然后页面元素使用rem做尺寸单位,当html字体大小变化元素尺寸也会发生变化,从而达到等比缩放的适配。
具体做法:
- 屏幕宽度度/划分的份数(份数不一定,一般根据设计稿定一个易于计算的数) 就是html font-size 的大小
- 最后的公式:页面元素的rem值 = 页面元素值(px)/(屏幕宽度 /划分的份数)
- 或者:页面元素的rem值 = 页面元素值( px)/ html font-size 字体大小
<style>@media screen and (max-width: 375px) {html {/* 根据iPhone6 375 的设计稿将屏幕分为15份 */font-size: 25px;}}/* 12 */@media screen and (min-width: 390px) {html {/* 根据比例缩放 */font-size: 26px;}}/* Xr */@media screen and (min-width: 414px) {html {/* 根据比例缩放 */font-size: 27.6px;}}div {width: 4rem;height: 4rem;font-size: 1rem;background-color: cyan;}</head>
<body><div>标题</div>
</body>
</html>
rem 适配方案技术主流方案:
- less + 媒体查询 + rem
- flexible.js + rem
两种方案现在都存在,相对来说方案2更简单,比较推荐方案2。
这是 less + 媒体查询 + rem 方案实现的苏宁首页案例。
flexible.js
手机淘宝团队出的简洁高效移动端适配库,再也不需要写不同屏幕的媒体查询,因为里面js做了处理。
它的原理是把当前设备划分为10等份(比如屏幕750px,那么font-size就是75),不同设备下保持比例是一致的。
我们要做的就是确定页面元素rem值,剩余的让flexible.js来去算,实际的px值就是(rem值*屏幕宽/10)。
flexible.js github地址:https://github.com/amfe/lib-flexible
flexible.js + rem 适配
首先需要引入 flexible.js 文件
<script src="js/index.js"></script>
由于设计稿都是px单位,在实际开发过程中就需要将px单位转rem,这种计算非常繁琐且不友好,VSCode 插件 cssrem 可以将 px 转换 rem。
默认 cssrem 插件将16px转换为1rem,这在绝大部分情况下是不能满足开发要求的(比如按照750的设计稿开发,由于flexible.js将屏幕分成10等分,也就是说1rem等于屏幕的十分之一,那么就是75px)。此时在设置中搜索 cssrem
找到相应的修改项,改为75就可以了。这样一来设置rem值都会按照750的设计稿根据屏幕宽度进行缩放适配。
如果有一些特殊情况不需要完全按比例进行缩放,那么依然可以通过媒体查询来固定rem值,比如超过750的屏幕都按750进行处理,那么就可以通过如下代码固定屏幕超过750时,1rem都等于75px:
@media screen and (min-width: 750px) {html {font-size: 75px!important;}
}
注意:由于 flexible.js 会改为屏幕的十分之一,所以需要使用 !important
,将权重值提高,否则不起作用。
这是 flexible.js + rem 方案实现的苏宁首页案例。