CSS层叠样式(四)
思维导图 [一]
传统布局和flex布局对比
传统布局特点
兼容性好
布局繁琐
局限性,不能再移动端很好的布局
flex布局特点
操作方便,布局极其简单,移动端使用比较广泛
pc端浏览器支持情况比较差
IE11或更低版本不支持flex或仅支持部分
建议
移动端 或者 PC端不需要兼容低版本浏览器 就可以使用用flex布局
flex布局原理
给父盒子设置display:flex;来控制子元素的排列方式
flex布局注意事项
使用flex布局就不要使用浮动、vertical-align,这两个样式会失效
flex布局中没有X轴和Y轴的概念
主轴和交叉轴是相对的,可以变换的。主轴方向是横的,交叉轴方向就是竖的。主轴方向是竖的,交叉轴方向就是横的
主轴相关配置
注意事项
1.主轴侧轴相关配置要写到父盒子中
flex-direction
功能和注意事项
功能:设置主轴的方向
注意事项:主轴和交叉轴是相对的,可以变换的。主轴是横的,交叉轴就是竖的,主轴是竖的,交叉轴就是横的
取值范围
值 | 说明 |
---|---|
row(默认) | 主轴为横轴,子元素横着排列(默认,常用) |
column | 主轴为纵轴,子元素竖着排列 |
flex-direction:row(默认值,常用)
主轴为横轴,子元素横着排列
1 | <style> |
(https://gitee.com/haoyongliang/resources/raw/master/images/前端/css/flex/images/1623660908216.png)
flex-direction:column (偶尔用)
主轴为纵轴,子元素从上到下排列
1 | <style> |
(https://gitee.com/haoyongliang/resources/raw/master/images/前端/css/flex/images/1623661237965.png)
justify-content
功能
设置主轴上的子元素排列方式
取值范围
值 | 说明 |
---|---|
flex-start(默认) | 从主轴头部开始排列 |
flex-end | 从主轴尾部开始排列 |
center | 居中显示 |
space-around | 平分剩余空间 |
space-between | 先两边贴边,再平分剩余空间 |
justify-content:flext-start(默认)
主轴为横轴时,从左向右排列
1 | <style> |
(https://gitee.com/haoyongliang/resources/raw/master/images/前端/css/flex/images/1623662578223.png)
主轴为纵轴时,从上向下排列
1 | <style> |
(https://gitee.com/haoyongliang/resources/raw/master/images/前端/css/flex/images/1623662675756.png)
justify-content:flex-end
主轴为横轴时,从右向左排列
1 | <style> |
(https://gitee.com/haoyongliang/resources/raw/master/images/前端/css/flex/images/1623662791509.png)
主轴为纵轴时,从下向上排列
1 | <style> |
(https://gitee.com/haoyongliang/resources/raw/master/images/前端/css/flex/images/1623662870094.png)
justify-content:center(常用)
主轴为横向时,左右居中
1 |
|
(https://gitee.com/haoyongliang/resources/raw/master/images/前端/css/flex/images/1623663027777.png)
主轴为纵向时,上下居中
1 | <style> |
(https://gitee.com/haoyongliang/resources/raw/master/images/前端/css/flex/images/1623663076952.png)
justify-content:space-around(常用)
主轴为横轴时
1 |
|
(https://gitee.com/haoyongliang/resources/raw/master/images/前端/css/flex/images/1623663358530.png)
主轴为纵轴时
1 |
|
(https://gitee.com/haoyongliang/resources/raw/master/images/前端/css/flex/images/1623663442172.png)
justify-content:space-between(常用)
主轴为横轴时
1 |
|
(https://gitee.com/haoyongliang/resources/raw/master/images/前端/css/flex/images/1623663674550.png)
主轴为纵轴时
1 |
|
(https://gitee.com/haoyongliang/resources/raw/master/images/前端/css/flex/images/1623663733543.png)
flex-wrap
功能
设置子元素是否换行
取值范围
值 | 说明 |
---|---|
wrap | 换行(常用) |
nowrap | 不换行(默认) |
flex-wrap:wrap(常用)
1 |
|
(https://gitee.com/haoyongliang/resources/raw/master/images/前端/css/flex/images/1623664075692.png)
flex-wrap:nowrap
内容会挤到一块,子元素设置的宽度或高度会失效。
1 |
|
(https://gitee.com/haoyongliang/resources/raw/master/images/前端/css/flex/images/1623664134543.png)
交叉轴(侧轴)相关配置
交叉轴和主轴是垂直关系,主轴为横向,交叉轴为纵向。主轴为纵向,交叉轴为横向。
注意事项
交叉轴的相关配置也是写在父盒子中。
align-items 设置侧轴上的子元素的排列方式(主轴不换行)
功能
设置侧轴上的子元素排列方式
取值范围
值 | 说明 |
---|---|
stretch(默认) | 侧轴内容拉伸显示 |
flex-start | 从侧轴尾部开始排列 |
flex-end | 从侧轴尾部开始排列 |
center | 居中显示 |
在线演示地址
https://www.runoob.com/try/playit.php?f=playcss_align-items&preval=stretch
align-items:flex-start
(https://gitee.com/haoyongliang/resources/raw/master/images/前端/css/flex/images/1623682847928.png)
align-items:flex-end
(https://gitee.com/haoyongliang/resources/raw/master/images/前端/css/flex/images/1623682935504.png)
align-items:center
(https://gitee.com/haoyongliang/resources/raw/master/images/前端/css/flex/images/1623682976427.png)
align-items:stretch
(https://gitee.com/haoyongliang/resources/raw/master/images/前端/css/flex/images/1623683036038.png)
align-content 设置侧轴上的子元素的排列方式(主轴换行)
功能
设置子项在侧轴上的排列方式
注意事项
主轴必须换行,flex-wrap:的值是wrap
取值范围
值 | 说明 |
---|---|
flex-start | 默认值,在侧轴的头部开始排列 |
flex-end | 在侧轴的尾部开始排列 |
center | 在侧轴中间显示 |
space-around | 子项在侧轴平分剩余空间 |
space-between | 子项在侧轴先贴边,剩下的平分剩余空间 |
在线演示地址
https://www.runoob.com/try/try.php?filename=trycss3_align-content
align-content:flex-start
(https://gitee.com/haoyongliang/resources/raw/master/images/前端/css/flex/images/1623684218538.png)
align-content:flex-end
(https://gitee.com/haoyongliang/resources/raw/master/images/前端/css/flex/images/1623684264695.png)
align-content:center
(https://gitee.com/haoyongliang/resources/raw/master/images/前端/css/flex/images/1623684305973.png)
align-content:space-around
(https://gitee.com/haoyongliang/resources/raw/master/images/前端/css/flex/images/1623684640418.png)
align-content:space-between
(https://gitee.com/haoyongliang/resources/raw/master/images/前端/css/flex/images/1623685526782.png)
align-content 和align-items区别
- align-items 适用于单行情况下, 只有上对齐、下对齐、居中和 拉伸
- align-content适应于换行(多行)的情况下(单行情况下无效), 可以设置 上对齐、下对齐、居中、拉伸以及平均分配剩余空间等属性值。
- 总结就是单行找align-items 多行找 align-content
flex-flow
该属性是 flex-direction 和 flex-wrap 属性的复合属性
1 | flex-flow:row wrap; |
flex布局子项常见属性
- flex子项目占的份数
- align-self控制子项自己在侧轴的排列方式
- order属性定义子项的排列顺序(前后顺序)
flex 属性
flex 属性定义子项目分配剩余空间,用flex来表示占多少份数。
1 | .item { |
(https://gitee.com/haoyongliang/resources/raw/master/images/前端/css/flex/images/1623685804325.png)
align-self控制子项自己在侧轴上的排列方式
align-self 属性允许单个项目有与其他项目不一样的对齐方式,可覆盖 align-items 属性。
默认值为 auto,表示继承父元素的 align-items 属性,如果没有父元素,则等同于 stretch。
1 | span:nth-child(2) { |
(https://gitee.com/haoyongliang/resources/raw/master/images/前端/css/flex/images/1623685872763.png)
order 属性定义项目的排列顺序
数值越小,排列越靠前,默认为0。
注意:和 z-index 不一样。
1 | .item { |
面试题
如果以下两个面试题能理解,那么flex布局就掌握的非常OK了
使用flex布局完成圣杯布局
1 |
|
使用flex布局完成三点的骰子
1 |
|
思维导图 [二]
rem单位
rem (root em)是一个相对单位,类似于em,em是父元素字体大小。
不同的是rem的基准是相对于html元素的字体大小。
比如,根元素(html)设置font-size=12px; 非根元素设置width:2rem; 则换成px表示就是24px。
1 | /* 根html 为 12px */ |
rem的优势:父元素文字大小可能不一致, 但是整个页面只有一个html,可以很好来控制整个页面的元素大小。
媒体查询
媒体查询作用★
根据不同的分辨率为标签设置不同的样式
什么是媒体查询
媒体查询(Media Query)是CSS3新语法。
- 使用 @media查询,可以针对不同的媒体类型定义不同的样式
- @media 可以针对不同的屏幕尺寸设置不同的样式
- 当你重置浏览器大小的过程中,页面也会根据浏览器的宽度和高度重新渲染页面
- 目前针对很多苹果手机、Android手机,平板等设备都用得到多媒体查询
媒体查询语法规范
- 用 @media开头 注意@符号
- mediatype 媒体类型
- 关键字 and not only
- media feature 媒体特性必须有小括号包含
1 | @media mediatype and|not|only (media feature) { |
- mediatype 查询类型
将不同的终端设备划分成不同的类型,称为媒体类型
- 关键字
关键字将媒体类型或多个媒体特性连接到一起做为媒体查询的条件。
- and:可以将多个媒体特性连接到一起,相当于“且”的意思。
- not:排除某个媒体类型,相当于“非”的意思,可以省略。
- only:指定某个特定的媒体类型,可以省略。
媒体特性
每种媒体类型都具体各自不同的特性,根据不同媒体类型的媒体特性设置不同的展示风格。我们暂且了解三个。
注意他们要加小括号包含
媒体查询书写规则
注意: 为了防止混乱,媒体查询我们要按照从小到大或者从大到小的顺序来写,但是我们最喜欢的还是从小到大来写,这样代码更简洁
代码演示★
最大宽度320PX,超过了就不会生效。如果屏幕宽度小于等于320PX该样式生效
1 | @media screen and (max-width:320px){ |
最小宽度320PX,如果小于320px就不生效了,如果屏幕宽度大于等于320PX该样式生效
1 | @media screen and (min-width:320px){ |
如果屏幕宽度在801-900之间使用该样式
1 | @media (min-width: 801px) and (max-width: 900px) { |
less 基础
维护css弊端
CSS 是一门非程序式语言,没有变量、函数、SCOPE(作用域)等概念。
- CSS 需要书写大量看似没有逻辑的代码,CSS 冗余度是比较高的。
- 不方便维护及扩展,不利于复用。
- CSS 没有很好的计算能力
- 非前端开发工程师来讲,往往会因为缺少 CSS 编写经验而很难写出组织良好且易于维护的 CSS 代码项目。
Less 介绍
Less(LeanerStyle Sheets 的缩写)是一门 CSS扩展语言,也成为CSS预处理器。
做为 CSS的一种形式的扩展,它并没有减少CSS的功能,而是在现有的CSS语法上,为CSS加入程序式语言的特性。
它在CSS 的语法基础之上,引入了变量,Mixin(混入),运算以及函数等功能,大大简化了 CSS 的编写,并且降低了 CSS的维护成本,就像它的名称所说的那样,Less可以让我们用更少的代码做更多的事情。
常见的CSS预处理器:Sass、Less、Stylus
一句话:Less是一门 CSS 预处理语言,它扩展了CSS的动态特性。
VSCode插件安装——EasyLess
Easy LESS 插件用来把less文件编译为css文件
安装完毕插件,重新加载下 vscode。
只要保存一下Less文件,会自动生成CSS文件。
less嵌套案例(三点的骰子)★
html
1 | <div class="big"> |
less
1 | @fontSize: 24px; |
变量的定义和使用
定义格式 @变量名:值; 变量名用纯英文
使用格式 width:@变量名;
Less 变量名的语法规范
- 必须有@为前缀
- 不能包含特殊字符
- 不能以数字开头
- 大小写敏感
1 | // 定义变量 |
&符号
如果遇见 (交集|伪类|伪元素选择器) ,利用&进行连接
1 | a:hover{ |
less 运算
任何数字、颜色或者变量都可以参与运算。就是Less提供了加(+)、减(-)、乘(*)、除(/)算术运算。
1 | /*Less 里面写*/ |
注意
除法运算要加(),比如width: (100rem / @fontSize);
运算符的左边和右边需要有空格
如果参与运算的两个数据都有单位以第一个为准
如果两个值之间只有一个值有单位,则运算结果就取该单位
rem适配方案
适配目标
1.让一些不能等比自适应的元素,达到当设备尺寸发生改变的时候,等比例适配当前设备。
2.使用媒体查询根据不同设备按比例设置html的字体大小,然后页面元素使用rem做尺寸单位,当html字体大小变化元素尺寸也会发生变化,从而达到等比缩放的适配。
技术方案
1.less+rem+媒体查询
2.lflexible.js+rem
总结:
两种方案现在都存在。方案2 更简单
rem适配方案1
详细步骤:(万字文,不想看直接看适配方式2,按照步骤来即可)
①假设设计稿是750px
②假设我们把整个屏幕划分为15等份(划分标准不一可以是20份也可以是10等份)
③每一份作为html字体大小,这里就是50px
④那么在320px设备的时候,字体大小为320/15就是 21.33px
⑤用我们页面元素的大小除以不同的 html字体大小会发现他们比例还是相同的
⑥比如我们以750为标准设计稿
⑦一个100100像素的页面元素在 750屏幕下, 就是 100/ 50 转换为rem 是 2rem2rem 比例是1比1
⑧320屏幕下, html字体大小为21.33 则 2rem= 42.66px 此时宽和高都是 42.66 但是宽和高的比例还是 1比1
⑨但是已经能实现不同屏幕下 页面元素盒子等比例缩放的效果
总结
①最后的公式:页面元素的rem值 = 页面元素值(px) / (屏幕宽度 / 划分的份数)
②屏幕宽度/划分的份数就是 htmlfont-size 的大小
③或者:页面元素的rem值 = 页面元素值(px) / html font-size 字体大小
rem 适配方案2★
相比较适配方案1的优势
适配方案1需要手动写媒体查询,在不同的分辨率上给html标签设置不同的字体大小。媒体查询程阶梯式的,不能做到很精确,比如在320
360分辨率上使用的是同样大的字体可能,如果要在320360分辨率上分别显示不同大小的字体,手动实现几乎不可能,但是适配方案2可以实现。
手机淘宝团队出的简洁高效 移动端适配库
我们再也不需要在写不同屏幕的媒体查询,因为里面js做了处理
它的原理是把当前设备划分为N(默认10)等份,但是不同设备下,比例还是一致的。
我们要做的,就是确定好我们当前设备的html 文字大小就可以了
比如当前设计稿是 750px, 那么我们只需要把 html 文字大小设置为 75px(750px / 10) 就可以
里面页面元素rem值: 页面元素的px 值 / 75
剩余的,让flexible.js来去算
github地址:https://github.com/amfe/lib-flexible
使用Flexible.js完成REM布局技术点总结
因为flexible是默认将屏幕分为10等分
但是当屏幕大于750的时候希望不要再去重置html字体了
所以要自己通过媒体查询设置一下
并且要把权重提到最高
VSCode px 转换rem 插件 cssrem
因为cssrem中css自动转化为rem是参照默认插件的16转换的所以需要自己配置
使用步骤
第一步: 为vscode安装并配置cssrem插件
安装插件
(https://gitee.com/haoyongliang/resources/raw/master/images/前端/css/rem/images/1623771090501.png)
配置插件
文件->首选项-设置 搜索cssrem.填写1REM对应的文字大小。比如原型图750,页面分成10份。那么1REM=75PX 。则填写75即可
(https://gitee.com/haoyongliang/resources/raw/master/images/前端/css/rem/images/1623771144977.png)
第二步:引入flexible.js到当前项目
flexible.js的作用就是代替媒体查询,给不同分辨率下的html设置字体大小。
在页面使用script标签引入js
1 | <script src="./flexible.js"></script> |
第三步:引入normalize.css,reset.css
normalize.css
reset.css
1 | /*点击高亮我们需要清除清除 设置为transparent 完成透明*/ |
第四步:适配最小和最大分辨率,并且为body标签设置最小和最大宽度
编写媒体查询的作用:适配最小和最大分辨率。比如要适配的最下分辨率320PX,最大分辨率750PX,分辨率小于320,页面内容就不能再继续缩小;分辨率大于750,页面内容就不能再继续放大。
新建common.css
1 | /* 适配最大分辨率,如果页面超过750PX则设置html文字大小为75px。表示页面内容不能再放大了 */ |
最终的html代码
1 |
|
思维导图 [三]
响应式开发原理
响应式开发原理
就是使用媒体查询针对不同宽度的设备进行布局和样式的设置,从而适配不同设备的目的。
设备的划分情况:
- 小于768的为超小屏幕(手机)
- 768~992之间的为小屏设备(平板)
- 992~1200的中等屏幕(桌面显示器)
- 大于1200的宽屏设备(大桌面显示器)
响应式布局容器
响应式需要一个父级做为布局容器,来配合子级元素来实现变化效果。
原理就是在不同屏幕下,通过媒体查询来改变这个布局容器的大小,再改变里面子元素的排列方式和大小,从而实现不同屏幕下,看到不同的页面布局和样式变化。
父容器版心的尺寸划分
- 超小屏幕(手机,小于 768px):设置宽度为 100%
- 小屏幕(平板,大于等于 768px):设置宽度为 750px
- 中等屏幕(桌面显示器,大于等于 992px):宽度设置为 970px
- 大屏幕(大桌面显示器,大于等于 1200px):宽度设置为 1170px
但是我们也可以根据实际情况自己定义划分
bootstrap的介绍
Bootstrap简介
Bootstrap 来自 Twitter(推特),是目前最受欢迎的前端框架。Bootstrap 是基于HTML、CSS 和 JAVASCRIPT 的,它简洁灵活,使得 Web 开发更加快捷。
框架:顾名思义就是一套架构,它有一套比较完整的网页功能解决方案,而且控制权在框架本身,有预制样式库、组件和插件。使用者要按照框架所规定的某种规范进行开发。
bootstrap优点
- 标准化的html+css编码规范
- 提供了一套简洁、直观、强悍的组件
- 有自己的生态圈,不断的更新迭代
- 让开发更简单,提高了开发的效率
版本简介
2.x.x:停止维护,兼容性好,代码不够简洁,功能不够完善。
3.x.x:目前使用最多,稳定,但是放弃了IE6-IE7。对 IE8 支持但是界面效果不好,偏向用于开发响应式布局、移动设备优先的WEB 项目。
4.x.x:最新版,高级课程中使用
使用步骤
在现阶段我们还没有接触JS相关课程,所以我们只考虑使用它的样式库。
Bootstrap 使用四步曲:
导入bootstrap相关资源到项目
创建 html 骨架结构
1 |
|
引入相关样式文件
1 | <!-- Bootstrap 核心样式--> |
书写内容
直接拿Bootstrap 预先定义好的样式来使用
修改Bootstrap 原来的样式,注意权重问题
学好Bootstrap 的关键在于知道它定义了哪些样式,以及这些样式能实现什么样的效果
bootstrap布局容器
Bootstrap 需要为页面内容和栅格系统包裹一个 .container 或者.container-fluid 容器,它提供了两个作此用处的类。
.container
- 响应式布局的容器 固定宽度
- 大屏 ( >=1200px) 宽度定为 1170px
- 中屏 ( >=992px) 宽度定为 970px
- 小屏 ( >=768px) 宽度定为 750px
- 超小屏 (100%)
.container-fluid
- 流式布局容器 百分百宽度
- 占据全部视口(viewport)的容器。
bootstrap栅格系统
Bootstrap提供了一套响应式、移动设备优先的流式栅格系统,随着屏幕或视口(viewport)尺寸的增加,系统会自动分为最多12列。
栅格系统用于通过一系列的行(row)与列(column)的组合来创建页面布局,你的内容就可以放入这些创建好的布局中。
- 按照不同屏幕划分为1~12 等份
- 行(row) 可以去除父容器作用15px的边距
- xs-extra small:超小; sm-small:小; md-medium:中等; lg-large:大;
- 列(column)大于 12,多余的“列(column)”所在的元素将被作为一个整体另起一行排列
- 每一列默认有左右15像素的 padding
- 可以同时为一列指定多个设备的类名,以便划分不同份数 例如 class=”col-md-4 col-sm-6”
栅格嵌套
栅格系统内置的栅格系统将内容再次嵌套。简单理解就是一个列内再分成若干份小列。我们可以通过添加一个新的 .row 元素和一系列 .col-sm-* 元素到已经存在的 .col-sm-*
元素内。
1 | <!-- 列嵌套 --> |
列偏移
使用 .col-md-offset-* 类可以将列向右侧偏移。这些类实际是通过使用 * 选择器为当前元素增加了左侧的边距(margin)。
1 | <!-- 列偏移 --> |
列排序
通过使用 .col-md-push-* 和 .col-md-pull-* 类就可以很容易的改变列(column)的顺序。
列排序的使用目的就是把左边的列放到右变,右边的列放到左边。实现互换。
1 | <!-- 列排序 --> |
响应式工具
为了加快对移动设备友好的页面开发工作,利用媒体查询功能,并使用这些工具类可以方便的针对不同设备展示或隐藏页面内容。
bootstrap 布局规则★
1.先编写大容器,样式名为container或者container-fluid
2.编写行,样式名为row
3.行中嵌套列
4.如果有需要,列中可以继续嵌套行,行中继续嵌套列..