《CSS世界》学习笔记

190 阅读6分钟

未定义行为

我们总认为一些所谓的浏览器个性差异是一种bug,但实际上这种表现的差异,是一种未定义行为
即,标准并未对这种渲染做出一种强制性的规定,故,浏览器根据自己的理解进行渲染,造成浏览器之间的一种表现差异。

举个例子:

假设给一个button按钮绑定一个:active事件,鼠标点击,元素执行:active伪类对应的CSS样式,按钮变红,
普通浏览器:鼠标按下,还未离开,则按钮变红
火狐:鼠标按下,离开之后,才能触发按钮变红

这个原因在于火狐认为:active应该发生在mouse down之后

这种就是因为标准没有统一定义,所以各自理解,造成的“未定义事件”.

块级元素

块级元素display为block的元素不是一个概念 块级元素的基本特征:一个水平流上,只能单独显示一个元素,多个块级元素则换行显示。(换行特性)

display:list-item / table(都是块级元素--满足换行特性)

换行特性:配合clear属性清除浮动

补充学习:
CSS-清除浮动
MDN:clear

// 换行特性:配合clear属性清除浮动
.clear:after{
    content:'';
    display:table;// 也可以是block,或者是list-item
    clear:both;
}

上述示例中,一般只会用display:block,而不会用display:list-item
原因如下:
1:block拼写更短
2:list-item会出现项目符号,虽然可以用list-style:none清除,不过这不是很麻烦吗
3:list-item兼容性不好,对于IE,普通法元素设置display:list-item可以,对于伪元素:after/:before不可以

盒子

从上面的最后一句,我们可以看到,IE不支持伪元素的display:list-item
为什么不支持呢?
这可以追溯到,为什么display:list-item会出现项目符号。

首先简单了解一下“盒子”

元素有块级元素、内联元素,
块级元素用块级盒子装着,内联元素用内联盒子装着,
块级盒子负责结构,内联盒子负责内容。
但是现在多了个display:list-item,它默认要显示项目符号的,一个盒子显然解释不了,怎么办?
于是又创造了一个“附加盒子”。

附加盒子,学名“标记盒子”,专门用来放远点、数字这些项目符号的

可能IE没办法在为元素应用display:list-item就是没办法创建这个“标记盒子”

然后深入学习一下“盒子”

我们在上面了解到三个盒子:
块级盒子、内联盒子、附加盒子
搞不清楚的可以回去捋一下思路。

display:inline-block的盒子

刚才提到的三个盒子,没办法解释display:inline-block的特性,
那怎么办呢?
于是规定每个元素都有一个内在盒子(这个是俗名,不用记,学名“容器盒子”)和一个外在盒子
内在盒子负责宽高、内容呈现
外在盒子负责元素是否一行显示还是换行显示。

内在盒子,学名“容器盒子

display容器盒子(内在盒子)外在盒子
block块级容器 盒子块级 盒子
inline内联 盒子内联 盒子
inline-block块级容器 盒子内联 盒子
inline-tabletable 盒子内联 盒子

当然,我们应该意识到display:table-cell的容器盒子是cell盒子,外在盒子是table盒子……

盒子小结

上面出现了很多盒子,这里来捋一下,

块级元素用块级盒子装着,
内联元素用内联盒子装着

标记盒子:专门用来放远点、数字这些项目符号的(“附加盒子”这个名词只是便于理解)

容器盒子负责宽高(这句话说明了width作用在容器盒子上)、内容呈现(同样“内在盒子”这个名词只是便于理解)
外在盒子负责元素是否一行显示还是换行显示。

数了数得有五个盒子的名词,他们之间什么关系呢?

从我的理解来看,块级盒子和内联盒子是我们理解元素最开始所定义的盒子,
只不过后来发现这么理解可能不太对劲,
于是我们对元素的解析上升一个版本,进入2.0时代。

一个元素并不仅仅是被内联盒子或者块级盒子包裹在内的,
一个元素是由外在盒子和容器盒子共同包裹着的,
这个外在盒子和容器盒子可能是块级盒子也可能是内联盒子。

width:auto

参考文章深入理解CSS的width:auto

这句语句有四种不同的表现形式:

(1)充分利用可用空间

比如说,普通来说,div、p这些元素,都会默认充满整个父元素标签,这就是充分利用可以用的空间,把自己的宽度充满整个父元素。

(2)收缩与包裹shrink-to-fit
CSS3中的fit-content即指此

参考文章:CSS中的包裹性

哪些元素具有包裹性?
就我已知的有:absolute,fixed,float,inline-box等等。

(3)收缩到最小 CSS3中的min-content即指此
image.png

(4)超出容器限制 CSS3中的max-content即指此
子元素既保持了收缩包裹的特性,又无视父元素的宽度冲了出去(让内容宽度最大)
父元素定宽,而子元素white-space:nowrap或者子元素是一串特别长不能断开的英文字母(英文单词不能断开)

image.png

外部流尺寸与流体特性

上面四种尺寸表现,哪个是“外部尺寸”?哪个是“内部尺寸”?
其实,只有第一种“充分利用可用空间”,即div默认宽度100%是“外部尺寸”,其余的是“内部尺寸”。
这个唯一的“外部尺寸”,即文档流、流的精髓所在。

(1)正常流宽度

正常来说一个div的宽度是正常铺满整个容器的,如果说设置了宽度,反而会使流动性丢失\

流动性:并不是仅仅看上去的宽度100%那么简单。
而是一种margin/border/paddingcontent内容区域自动分配水平空间的机制

看个例子:

image.png image.png

下面那个设置了width:100%反而丢失了流动性

(2)格式化宽度

格式化宽度仅仅会出现在绝对定位模型

简而言之就是,如果一个绝对定位的非替换元素,同时设置了两个相反方向的属性值,那么,它的宽度将会表现为格式化宽度

div{
    position: absolute;
    left: 20px;
    right: 20px;
}

如果这个div的第一个有定位(非static)的祖父元素宽度为1000,则这个div宽度表现为1000-20-20=960

内部尺寸与流体特性

好啦后面的内容大家买书自看吧,有机会我再补全这个笔记。