4. CSS进阶
作者:互联网
@规则
at-rule:@规则、@语句、css语句、css指令
@import "./reset.css";
- import
@import “路径”
表示导入另外一个css文件
在network中可以看见加载的css文件
- charset
@charset “utf-8”;
这个指令必须要写到第一行;
告诉浏览器该css文件,使用的字符编码集是utf-8
web字体与图标
web字体
解决用户电脑上没有安装相应字体的问题
font-family:‘翩翩体-简’, ‘微软雅黑’, sans-serif;
当用户电脑上没有安装相应字体,强制让用户下载该字体,放到服务器上的
ttf后缀名文件–字体文件
使用font-face制作一个新字体
@font-face{
font-family:‘good night’;
src:url(‘字体文件存放的位置’);
}
后面设置font-family的时候,就下载该字体----临时下载,第二次访问重新下载
ctrl + r强制刷新
因为中文字体文件一般较大,所以应用不多
考虑用户体验
字体图标库:iconfont.cn
添加图标到项目之后. 复制在线链接—在线链接省略了协议名
<link href="//at.alicdn.com/t/font_2314517_gurjwm4ohnq.css">
字体图标是字体,到那时展示的样子像图片,它可以设置文字的所有特点
i元素表示图标,给它的类名加上字体图标文件里的class
bfc 块级格式化上下文
block fomatting context
它是一块独立的渲染区域,它规定了在该区域中,常规流块盒的布局;
- 常规流块盒在水平方向上,必须撑满包含块
- 常规流块盒在包含块的垂直方向上依次摆放
- 常规流块盒若外边距无缝相邻,则进行外边距合并
- 常规流块盒的自动高度和摆放位置,无视浮动元素
上面的是由视觉格式化模型规定的,准确的说是视觉格式化模型包括了块级格式化上下文,块级格式化上下文又包含了这些规则;
独立:不同的BFC区域,他们进行渲染时互不干扰;
创建BFC的元素,隔绝了它内部和外部的联系,内部的渲染不会影响到外部
具体规则:
- 创建BFC的元素,它的高度计算需要考虑浮动元素;—可以用来解决高度坍塌(一般用overflow:hidden,副作用最小)
- 创建BFC的元素,它的边框盒不会与浮动元素重叠
- 创建BFC的元素,不会和它的子元素进行外边距合并(不同的BFC外边距时不可能合并的,只有在同一个BFC中的元素才会合并)
绝对定位的元素是不可能计算高度的,因为定位元素直接脱离文档流,无法计算;
而浮动元素虽然不会计算高度,但是清除了浮动或者创建BFC之后,就可以计算高度了;
BFC渲染区域:
这个区域由某个HTML元素创建,以下元素会在其内部创建BFC区域:
- 根元素 意味着,元素创建的BFC区域,覆盖了网页中所有的元素
- 浮动和绝对定位元素
- overflow不等于visible的块盒
- display:table
- 行块盒
布局
布局:排列页面中的区域
多栏布局
两栏布局和三栏布局
假设左边侧边栏,右边主区域
两栏布局:
左边左浮动,右边右浮动;左边定宽,如果内容太多,右边也需要定宽(是否定宽和设计师商量),定宽的话可视区宽度减少的话可能会出问题;
右边区域设置BFC(overflow:hidden),这样右边会避开浮动盒子显示;如果需要两块有空隙,需要设置浮动元素的margin-right,而不是设置主区域的margin-left;
三栏布局
左右两边都是侧边栏,中间是主区域
左边左浮动,右边右浮动,并且左右两边定宽,中间是主区域;中间创建BFC,因为块盒无视浮动元素;而容器元素一般都是块盒
等高
通常侧边栏高度不够,需要设置两者等高;
- css的弹性盒
- js控制
- 伪等高
元素书写顺序
-
先写浮动元素,后写常规流盒子
-
主区域代码靠前书写
搜索引擎优化:从上往下读,它认为越在前面的部分越重要
.main{
margin: 0 300px;
}
再设置绝对定位解决;这种方法无法计算侧边栏,因为侧边栏永远脱离了常规流布局,无法计算高度;
后台页面的布局
浮动的细节
- 左浮动的盒子向上向左排列
- 右浮动的盒子向上向右排列
- 浮动盒子的顶边不得高于上一个盒子的顶边
- 若剩余空间无法放下浮动的盒子,则该盒子向下移动,直到具备足够的空间能容纳盒子,然会再向左或向右移动;
行高的取值
line-height
该属性值可以被继承;先计算像素值,再继承
-
px, 像素值
-
无单位的数字
先继承数字,然后根据当前元素的字体大小计算像素值; -
em单位
1em表示当前元素的字体大小
- 百分比
和em 一样
body的背景
画布 canvas
这里的画布不是这个元素,而是指一块区域
特点:
- 最小宽度为视口宽度
- 最小高度为视口高度
HTML元素的背景
覆盖画布
BODY元素的背景
如果HTMl元素有背景,BODY元素正常(背景覆盖边框盒)
如果HTML元素没有背景,BODY元素背景覆盖画布
关于画布背景图
背景图片规则:和前面的背景规则相同
- 背景图的宽度百分比,相对于视口
- 背景图的高度百分比,相对HTML元素高度(网页高度)
- 背景图的横向位置的百分比、预设值(right,left…),相对于视口
- 背景图的纵向位置的百分比、预设值,相对于HTML元素高度(网页高度)
行盒的垂直对齐
多个行盒垂直方向上的对齐
给没有对齐元素设置vertical-algin
预设值:middle, top, bottom, text-top, text-bottom super(上基线对齐), sub(下基线对齐)
数值
百分比
图片的底部白边
字体越大,白边越大;
图片的父元素是一个块盒,块盒高度自动,图片底部和父元素底边之间往往会出现可空白
解决方法:
- 设置父元素的字体大小为0;如果有文字则不能用这种方法;
- 将图片设置为块盒
参考线-深入理解字体
font-size、line-height、vertical-align|font-family
文字
文字通过一些文字制作软件做出来,如fontforge
制作文字时,会有几根参考线,不同的文字类型,参考线不同,但是同一个文字,参考线相同
参考线:一共5根
顶线:text top , ascent
上基线:super
基线:baseline—大概是字母M的最底下
下基线:sub
底线:text bottom, descent
font-size
字体大小,设置的是文字的相对大小
文字的相对大小:在印刷学中 1000、2048、1024
文字顶线到底线的距离,是文字的实际大小(content-area,内容区);
但是设置的时候是设置的是相对大小;
consolas字体的相对大小为2048,但是文字的实际大小—顶线+底线=2398, 2398 / 2048,所以设置字体大小为200px,实际的字体大小为200 * (2398 / 2048);
行盒的背景,覆盖content-area
行高
顶线向上延申的空间(text top – top),和底线向下延申的空间(text bottom – bottom),两个空间相同,该空间叫做line gap(空隙)
gap默认情况下,是字体设计者决定的
top到bottom,叫做virtual-area(虚拟区)
行高就是virtual-area
line-height:normal,默认值-使用文字默认的gap
文字一定出现在一行的最中间? 错,取决于设计者;
content-area一定出现在virtual-area的最中间;对,即使gap是负值中线也重叠
vertical-align
参考线的决定因素:font-size(确定相对距离), font-family(确定实际距离), line-height(确定virtual-area) 三者确定,参考线一定确定
一个元素如果子元素出现行盒,该元素内部也会产生参考线
只有行盒才有参考线,所以如果文字不在行盒中的话,会生成一个匿名行盒包裹
<p>
<span>M</span>
</p>
默认情况下,两个元素的参考线以基线对齐
vertica-align:baseline
super:该元素的的基线与父元素的上基线对齐
sub:该元素的基线与父元素的下基线对齐
text-top:该元素的virtual-area的顶边对齐父元素的text-top
text-bottom:该元素的virtual-area的底边,对齐父元素的text-bottom
top:该元素的virtual-area的顶边对齐父元素的定边(该行中的最高顶边)
bottom:该元素的virtual-area的底边,对齐父元素的底边(父元素的最低底边)
middle:该元素的中线(content-area的一半),与父元素的X字母的一半对齐
行盒组合起来,可以形成多行,每一行的区域叫做line-box,line-box的顶边是该行内所有行盒最高顶边,底边是该行盒最低底边
实际,一个元素的实际占用高度(高度自动),高度的计算通过line-box
行盒:inline-box
行框:line-box
数值:相对于基线的偏移量,向下为正数,向上为负数
百分比:相对于基线的偏移量,百分比是相对于自身的Virtual-area的高度
line-box是承载文字内容的必要条件,以下情况不生成Line-box
- 某元素内部没有任何行盒
- 某元素字体大小为0
可替换元素和行块盒的基线
白边的原因
图片:基线位于图片的下外边距。
表单元素:基线位置在内容底边
行块盒:
-
行块盒最后一行有line-box,用最后一行的基线作为整个行块盒的基线
-
如果行块盒内部没有行盒,则使用下外边距作为基线
堆叠上下文
stack context (堆叠上下文),他是一块区域,这块区域由某个元素创建,它规定了该区域中的内容在z轴上排列的先后顺序。
创建堆叠上下文的元素
- html元素(根元素)
- 设置了z-index数值的定位元素(非auto)
同一个堆叠上下文中元素在z轴上的排列
从后到前的排列顺序
处于同一级别的话比较的时候按照书写的先后顺序
- 创建堆叠上下文的元素的背景和边框
- 堆叠级别(z-index,stack level)为负值的堆叠上下文
- 常规流非定位的块盒
- 非定位的浮动盒子
- 常规流非定位行盒
- 任何z-index 是auto的定位子元素,以及z-index是0的堆叠上下文
- 堆叠上下文为正值的堆叠上下文
每个堆叠上下问,独立于其他堆叠上下文,他们之间不能相互穿插
svg
scalable vector graphics,可缩放的矢量图
- 该图片使用代码书写而成
- 缩放不会失真
- 内容轻量
使用方法
-
svg可以嵌入浏览器,也可以单独成为一个文件
-
可以在img的src属性中书写路径
-
背景图url
-
embed, object元素的src书写路径, MIME的type是images/svg+xml
-
iframe元素的src,这种方法需要在svg文件中改尺寸
svg文件的书写
直接将尺寸按照属性在行间书写,一般不带像素,默认尺寸为300 * 150
详细看html5笔记中的svg书写
数据链接
data url
如何书写
数据链接:将目标文件的数据直接书写到路径位置
语法:data:MIME,数据
意义
优点:
- 减少了浏览器中的请求 减少了请求中浪费的时间
- 有利于动态生成数据
缺点:
-
增加了页面资源的体积 导致了传输内容增加,从而增加了单个资源的传输时间
-
不利于浏览器的缓存
浏览器通常会缓存图片文件、css文件、js文件。 -
增加源文件的体积为原来大小的4/3;
应用场景:
- 当请求单个图片体积较小,并且该图片因为各种原因,不适合制作雪碧图(雪碧图可以减少请求次数),可以使用数据链接
- 图片由其他代码动态生成,并且图片较小,可以使用数据链接
base64
一种编码方式,通常用于将一些二进制数据(图片就是二进制数据),用一个可书写的字符串表示
浏览器兼容性
问题产生原因
更详细见css3笔记
-
市场竞争
-
标准版本的变化
chrome 54 支持部分css3功能
厂商前缀
比如:box-sizing,chrome旧版本中使用-webkit-box-sizing:border-box;
- 市场竞争,标准没有发布
- 标准仍在讨论中(草案),浏览器厂商希望先支持
IE: -ms-
chrome,safari: -webkit-
opera:-o-
firefox:-moz-
浏览器在处理样式或元素时,使用如下的方式
当遇到无法识别的样式的时候,不会报错,直接略过
- chrome的滚动条样式
实际上,在开发中使用自定义的滚动条,往往是使用div+css+js实现的
div::-webkit-scrollbar{
width:10px;
}
/* 轨道 */
div::-webkit-scrollbar-track{
background:#74c0c0;
border-radius:8px;
}
/* 滑块 */
div::-webkit-scrollbar-thumb{
background:#008c8c;
border-radius:8px;
}
/* 上下两个小块 */
div::-webkit-scrollbar-button{
background:red;
}
/* 如果需要页面中所有的滚动条都是这个样式的话,去掉div即可 */
- 多个背景图作为一个背景
div{
background-image:image-set(url()1x , url() 2x);
/* 前面加上-webkit- */
}
/* 1x表示一个显像单元上只有一个像素点-小图, 2x表示一个显像单元上只有一个像素点- 大图*/
css hack
根据不同的浏览器(主要针对IE),设置不同的样式和元素
- 样式
IE 中,css的特殊符号
- *属性名, 兼容IE5, IE6, IE7
- _属性名, 兼容IE5, IE6
- 属性值\9, 兼容IE5 ~ IE11
- 属性值\0, 兼容IE8 ~ IE11
- 属性值\9\0,兼容IE9 ~ IE10
IE5, 6 7外边距bug,浮动元素的做外边距翻倍
- 条件判断
低版本IE浏览器
<!--[if IE]>
<p>
这是IE浏览器
</p>
<![endif]-->
<!--[if !(IE)]><-->
<p>
这是非IE浏览器
</p>
<!--<![endif]-->
[ ]中还可以写if lt IE8判断版本的语句
渐进增强 和 优雅降级
两种解决兼容性问题的思路,会影响代码的书写风格
- 渐进增强:先适用大部分浏览器,然后针对新版本浏览器加入新的样式
书写代码时,先尽量书写有兼容性的代码,完成之后,再逐步加入新标准中的代码
- 优雅降级:先制作完整的功能,然后针对低版本浏览器进行特殊处理
书写代码时,先不用特别在意兼容性,完成整个功能之后,在针对低版本浏览器处理样式
查找兼容性网站
caniuse
[doyoe]http://css.doyoe.com/
居中总结
居中:盒子在其包含块中居中
行盒或行块盒水平居中
直接设置行盒(行块盒) 父元素text-algin:center
常规流块盒水平居中
定宽,设置margin:0 auto
浮动元素需要使用css3解决或者慢慢调margin-left和margin-right(这种方法不好)
绝对定位元素的水平居中
定宽,设置左右的坐标为0,将左右margin设置为auto
实际上,固定定位(fixed)是绝对定位(absolute)的特殊形式
定宽,设置左坐标为50%,将左margin设置为负的宽的一半
单行文本的垂直居中
设置文本所在元素的行高,为整个区域的高度
行块盒或块盒多行文本的垂直居中
没有完美方案
设置盒子上下内边距相同,达到类似的效果。-无法知道盒子的高度
绝对定位的垂直居中
定高,设置上下的坐标为0,将上下的margin设置为0 auto
定高,设置上坐标为50%,将上margin设置为负的高的一半
样式补充
display:list-item
设置为该属性值的盒子,本质上仍然是一个块盒,但同时该盒子会附带另一个盒子
元素本身生成的盒子叫做主盒子,附带的盒子称为次盒子,次盒子和主盒子水平排列
次盒子就是前面的小黑点,该盒子无法调整,只能调整样式
li元素的display就是list-item
涉及的CSS
list-style-type
设置次盒子中内容的类型,该属性可以继承,li的该属性就是继承自ul
list-style-position
设置次盒子相对于主盒子的位置
- 速写属性
list-style
type + position
清空次盒子
list-style:none
图片失效时的宽高问题
如果img元素的图片链接无效,img元素的特性和普通行盒一样,无法设置宽高
解决:设置为行块盒或者块盒
行盒中包括行块盒或可替换元素
行盒的高度与它内部的行块盒或可替换元素的高度无关
例如a元素中套一个img可替换元素,会发现二者高度无关,行盒的高度与字体大小有关
如果行盒内部是块盒的话,内部的块盒会将行盒撑开
text-algin:justify
text-algin: 只有块盒或者行块盒才有该属性
- start : 起始位置对齐(默认值)
- left :左对齐
- right: 右对齐
- center:居中
- justify:除最后一行外,分散对齐(平均分配空格) 如果需要最后一行也分散对齐,需要设置伪元素内容为’’,display为inline-block
制作一个三角形
div{
width:0px;
height:0px;
border:10px solid transparent;
border-left-color:red;
}
direction 和 writing-mode
开始(start)->结束(end)
左(left)->右(right)
左右是绝对的;开始和结束是相对的,不同的国家可能有所不同
direction:;
ltr:left to right
rtl:right to left //默认值
margin-block-start:1em; //距离开始一个字体大小
writing-mode:设置文字书写方向
vertical-rl:vertical right to left
垂直方向上从左到右
设置了这个属性之后的块盒宽度自适应,如果要使其占满一行的话设置宽度为100%
utf-8字符
实体字符:香
x表示后面的数是16 进制
在’'中写的话需要写\,然后直接写数字
标签:浮动,盒子,进阶,元素,行盒,设置,对齐,CSS 来源: https://blog.csdn.net/weixin_44756776/article/details/112424339