《css世界》笔记之流、元素与基本尺寸
1、 块级元素
基本特性:就是一个水平流上只能单独显示一个元素,多个块级元素则换行显示。
块级元素和“display 为block 的元素”不是一个概念,display:list-item、display:table均是块级元素。
用display值为block和list-item来配合clear属性来清除浮动带来的影响(不使用list-item的原因:字母比较多、会出现项目符号、ie浏览器不支持伪元素的display 值为listitem)。
.clear: after {
content: '';
display: table; // 也可以是block,或者是list-item
clear: both;
}
2、list-item 元素会出现项目符号的原因
list-item 元素会出现项目符号是因为生成
了一个附加的盒子,学名“标记盒子”(marker box),专门用来放圆点、数字这些项目号。
IE浏览器下伪元素不支持list-item 或许就是无法创建这个“标记盒子”导致的。display值为block的元素由外在的“块级盒子”和内在的“块级容器盒子”组成。
display值为inline-block的元素由外在的“内联盒子”和内在的“块级容器盒子”组成。
display值为inline的元素内外均是“内联盒子”。
display值为inline-table的元素外面是“内联盒子”,里面是“table 盒子”。
width/height 作用在是内在盒子,也就是“容器盒子”。
3、width:auto
width 的默认值是auto,默认值的4种表现:
<div>、<p>这些元素的宽度默认是100%于父级容器的,这种充分利用可用空间的行为还有个专有名字,叫作fill-available。是浮动、绝对定位、inline-block 元素或table 元素收缩到合适。
收缩到最小,这个最容易出现在table-layout 为auto 的表格中。
超出容器限制
就第一个是“外部尺寸”,其余全部是“内部尺寸”。而这唯一的“外部尺寸”,是“流”的精髓所在。
4、外部尺寸与流体特性
元素尺寸由外部的容器决定
正常流宽度是一种margin/border/padding和content 内容区域自动分配水平空间的机制,尽量用无宽带的流来布局。
格式化宽度:在position属性值为absolute 或fixed 的元素中。在默认情况下,宽度由内部尺寸决定。当left/top 或top/bottom 对立方位的属性值同时存在的时候,元素的宽度表现为“格式化宽度”,其宽度大小相对于最近的具有定位特性(position 属性值不是static)的祖先元素计算。margin、border、padding 和content 内容区域同样会自动分配水平(和垂直)空间
5、内部尺寸与流体特性
元素尺寸由内部元素决定,“内部尺寸”有下面3 种表现形式:
包裹性:元素尺寸由内部元素决定,但永远小于“包含块”容器的尺寸(除非容器尺寸小于元素的“首选最小宽度”)按钮:
按钮就是inline-block 元素。
按钮文字越多宽度越宽(内部尺寸特性),但如果文字足够多,则会在容器的宽度处自动换行(自适应特性)。
<button>标签按钮才会自动换行,<input>标签按钮,默white-space:pre,
是不会换行的,需要将pre 值重置为默认的normal。按钮最大宽度就是容器的240 像素
首选最小宽度:元素最适合的最小宽度.外部容器的宽度是240 像素,假设宽度是0,里面的inline-block 元素的宽度是首选最小宽度。具体表现规则:
东亚文字(如中文)最小宽度为每个汉字的宽度。
西方文字最小宽度由特定的连续的英文字符单元决定。并不是所有的英文字符都会组成连续单元,一般会终止于空格(普通空格)、短横线、问号以及其他非英文字符等。
如果想让英文字符和中文一样,每一个字符都用最小宽度单元,可以试试使用CSS 中的word-break:break-all。
类似图片这样的替换元素的最小宽度就是该元素内容本身的宽度。
最大宽度:是元素可以有的最大宽度。“最大宽度”实际等同于“包裹性”元素设置white-space:nowrap 声明后的宽度。如果内部没有块级元素或者块级元素没有设定宽度值,则“最大宽度”实际上是最大的连续内联盒子的宽度。
6、width 值作用的细节
width 是作用在“内在盒子”上的,“内在盒子”又被分成了4 个盒子,分别是content box、padding box、border box和margin box。
content box : content-box,padding box :padding-box,border box :border-box。margin box没有名字。
margin 的背景永远是透明的。
在CSS2.1 的规范中,有一段非常露骨的描述:content box 环绕着width 和height 给定的矩形。这种宽度设定和表现并不合理:
流动性丢失:对于块状元素,如果width:auto,则元素会如水流般充满整个容器,而一旦设定了width具体数值,则元素的流动性就会被阻断。
与现实世界表现不一致的困扰。
7、CSS 流体布局下的宽度分离原则
- 所谓“宽度分离原则”,就是CSS 中的width 属性不与影响宽度的padding/border(有时候包括margin)属性共存。写法:
.father {
width: 180px;
}
.son {
margin: 0 20px;
padding: 20px;
border: 1px solid;
}
- 为何要宽度分离:当一件事情的发展可以被多个因素所左右的时候,这个事情最终的结
果就会变数很大而不可预期。宽度在这里也是类似,由于盒尺寸中的4 个盒子都能影响宽度,自然页面元素的最终宽度就很容易发生变化而导致意想不到的布局发生。使用“宽度分离”后,咱们不需要烧脑子去计算了,而且页面结构反而更稳固。
8、改变width/height 作用细节的box-sizing
box-sizing 的作用:改变了width 作用的盒子。box-sizing:border-box 就是让100 像素的宽度直接作用在border box上,从默认的content box 变成border box。此时,content box 从宽度值中释放,形成了局部的流动性,和padding 一起自动分配width 值。
box-sizing 并不支持margin-box。
如何评价*{box-sizing:border-box}。从纯个人角度讲,不喜欢这种做法的。
这种做法易产生没必要的消耗,通配符*应该是一个慎用的选择器,因为它会选择所
有的标签元素。这种做法并不能解决所有问题。box-sizing 不支持margin-box,只有当元素没
有水平margin 时候,box-sizing 才能真正无计算,而“宽度分离”等策略则可以彻底解决
所有的宽度计算的问题。替换元素css重置更合适:
input, textarea, img, video, object {
box-sizing: border-box;
}
9、关于height
对于width 属性,就算父元素width 为auto,其百分比值也是支持的。
对于height 属性,如果父元素height 为auto,只要子元素在文档流中,其百分比值完全就被忽略了。百分比高度值要想起作用,其父级必须有一个可以生效的高度值。
如何让元素支持height:100%效果:
设定显式的高度值。
使用绝对定位。绝对定位元素的百分比计算和非绝对定位元素的百分比计算是有区别的,区别在于绝对定位的宽高百分比计算是相对于padding box 的,也就是说会把padding 大小值计算在内,但是,非绝对定位元素则是相对于content box 计算的。
10、min-width/max-width和min-height/max-height
max-width 和max-height 的初始值是none,min-width/min-height 的初始值都是auto。
超越!important 指的是max-width 会覆盖width,而且这种覆盖不是普通的覆盖,是超级覆盖。
<img src="1.jpg" style="width:480px!important;">
img { max-width: 256px; }
答案是256px。
min-width覆盖max-width,此规则发生在min-width和max-width冲突的时候。
任意高度元素的展开收起动画技术:
.element {
height: 0;
overflow: hidden;
transition: height .25s;
}
.element.active {
height: auto; /* 没有transition 效果,只是生硬地展开 */
}
可以试试下面方法
.element {
max - height: 0;
overflow: hidden;
transition: max - height .25s;
}
.element.active {
max - height: 666px; /* 一个足够大的最大高度值 */
}
注意:即虽然说从适用范围讲,max- height 值越大使用场景越多,但是,如果max-height 值太大,在收起的时候可能会有“效果延迟”的问题。因此,我个人建议 max-height 使用足够安全的最小值,这样,收起时即使有延迟,也
会因为时间很短,很难被用户察觉,并不会影响体验。
11、内联元素
块级负责结构,内联负责内容。
“内联元素”的“内联”特指“外在盒子”,和“display 为inline的元素”不是一个概念。
“内联元素”的典型特征就是可以和文字在一行显示。
内容区域(content area):域指一种围绕文字看不见的盒子可以理解为把文本选中的背景色区域作为内容区域。
注意:在IE 和Firefox 浏览器下,文字的选中背景总能准确反映内容区域范围,但是Chrome 浏览器下,::selection 范围并不总是准确的,例如,和图片混排或者有垂直padding 的时候,范围会明显过大,这一点需要注意。
内联盒子(inline box):“内联盒子”不会让内容成块显示,而是排成一行,这里的“内联盒子”实际指的就是元素的“外在盒子”,用来决定元素是内联还是块级。该盒子又可以细分为“内联盒子”和“匿名内联盒子”两类:
内联盒子:外部含内联标签(
<span>、<a>和<em>等)。匿名内联盒子:光秃秃的文字。
行框盒子(line box):每一行就是一个“行框盒子”(实线框标注),每个“行框盒子”又是由一个一个“内联盒子”组成的。
包含盒子(containing box):
<p>标签就是一个“包含盒子”(实线框标注),此盒子由一行一行的“行框盒子”组成。
12、幽灵空白节点
- 在HTML5 文档声明中,内联元素的所有解析和渲染表现就如同每个行框盒子的前面有一个“空白节点”一样。这个“空白节点”永远透明,不占据任何宽度,看不见也无法通过脚本获取,就好像幽灵一样,但又确确实实地存在,表现如同文本节点一样,因此,我称之为“幽灵空白节点”。
注意:这里有一个前提,文档声明必须是HTML5 文档声明(HTML 代码如下),如果还是
很多年前的老声明,则不存在“幽灵空白节点”。
《css世界》笔记之流、元素与基本尺寸的更多相关文章
- 读<css世界>笔记之img标签
Web开发时,为了节约带宽以及提高加载性能,首屏以下的图片就会通过滚屏加载的方式异步加载,然后这个即将被异步加载的图片为了布局稳健,体验良好,往往会使用一张透明的图片占位,如: <img src ...
- 《CSS世界》读书笔记(十一)
激进的margin属性 margin与元素尺寸以及相关布局 元素尺寸 border box尺寸,对应jQuery中的$().outerWidth()和$().outerHeight()方法,在原生DO ...
- 《CSS世界》读书笔记(一)
<!-- <CSS世界> 张鑫旭 著 --> CSS世界构建的基石是HTML,而HTML最具代表的两个基石<div>和<span>正好是CSS世界中块级 ...
- css中的流,元素,基本尺寸
流 元素 基本尺寸 流之所以影响整个css世界,是因为它影响了css世界的基石 --HTML HTML 常见的标签有虽然标签种类繁多,但通常我们就把它们分为两类: 块级元素(block-level e ...
- 《CSS世界》笔记二:盒模型四大家族
上一篇:<CSS世界>笔记一:流/元素/尺寸下一篇:<CSS世界>笔记三:内联元素与对齐 写在前面 在读<CSS世界>第四章之前,粗浅的认为盒模型无非是margin ...
- 《CSS世界》读书笔记(十二)
<!-- <CSS世界>张鑫旭著 --> 正确看待 CSS 世界里的 margin 合并 什么是 margin 合并 块元素的上外边距(margin-top)与下外边距(mar ...
- 《CSS世界》读书笔记(九)
<!-- <CSS世界>张鑫旭著 --> content内容生成技术 1. content 辅助元素生成 清除浮动: .clear:after { content: ''; d ...
- 《CSS世界》读书笔记(五) --height:100%
<!-- <CSS世界> 张鑫旭著 --> 相对简单而单纯的height:auto height:auto比width:auto简单的多,原因在于: CSS默认流是水平方向的, ...
- 《CSS世界》读书笔记(三) --width:auto
<!-- <CSS世界> 张鑫旭著 --> width:auto width:auto至少包含了以下4种不同的宽度表现: 充分可利用空间.比方说,<div>.&l ...
- 《CSS世界》学习笔记(一)
<CSS世界>,张鑫旭著,人民邮电出版社,2017年12月第一版. 1.P9二维码链接文章的demo值得一看,可以实现有关“某些区域颜色始终保持一致”的效果. P9二维码所链接文章的一个d ...
随机推荐
- .NET Core 性能分析: xUnit.Performance 简介
xunit-performance 是xUnit的一个扩展, 使用它可以对.NET Core项目进行性能测试. 官网:https://github.com/Microsoft/xunit-perfor ...
- knockoutjs data-bind 声明式绑定整理
一.Visible绑定 1.功能 Visible绑定通过绑定一个值来确定DOM元素显示或隐藏 2.示例 <div data-bind="visible: shouldShowMessa ...
- 西安活动 | 4月20日「拥抱开源,又见.NET :云时代 • 新契机」
云计算日渐兴起,成为提升企业效率和生产力的最终解决方案,而云时代也为软件开发模式带来了翻天覆地的变化.可以说 .NET Core就是这个时代催生的产物.自2016年 .NET Core 1.0 发布以 ...
- PostgreSql的Explain命令详解
http://toplchx.iteye.com/blog/2091860 使用EXPLAIN PostgreSQL为每个收到的查询设计一个查询规划.选择正确的匹配查询结构和数据属性的规划对执行效率是 ...
- 关于Exceptionless的使用注意
大家都应该比较熟悉NLOG,我们知道log4net和nlog,也有其它的记日志框架.目前我们的生产环境使用nlog,而且对Exceptionless的对接也是无缝的.可能有人会问为什么不用ELK,主要 ...
- 20190409-层叠の层叠上下文、层叠水平、层叠顺序、z-index、伪元素层叠
写在前面乱七八糟的前言: 此"八卦"的源于,在写下图这个圆滚滚的导航布局时,使用元素及其伪元素加上绝对定位完成,但遇到:before或:after伪元素与元素的层叠顺序,就是伪元素 ...
- 第二章 Linux目录学习
Linux 目录结构相对windows来说更简单,Linux 目录 以 斜杠 / 为根目录,其整体结构是以/为根的树状结构. 使用 tree -L 1 查看1级目录结构 /bin 常用的二进制命令目录 ...
- HTML5之webSocket使用
webSocket是什么 webSocket是HTML5新出的一种协议,底层是基于TCP/IP协议的.跟http没有关系,只是复用了http握手通道,用来升级协议. webSocket的作用 轮询:客 ...
- Spring笔记
Spring概念 Spring是一个开源的轻量级的框架 Spring核心主要两部分 (1) Aop面向切面编程,扩展功能不是修改源代码实现 (2) Ioc控制反转, 比如说有一个类,在类里面有方法(不 ...
- Hacking HackDay: Albania
概述: Name: HackDay: Albania Date release: 18 Nov 2016 Author: R-73eN Series: HackDay 下载: https://down ...