《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 ...
随机推荐
- css垂直居中方法总结
在网页布局中,我们往往会遇到下图所示的场景,让小图标和文字对齐 可能有的小伙伴会说,这个简单,直接给小图标设置左浮动来实现. 这样做是可以的,但不推荐,毕竟浮动是会影响布局的,能少用还是少用. 以前遇 ...
- 知名区块链人脸识别公司iFace Chain [爱妃链] 支招,如何防止钱包数字币被盗...
最近众多钱包发行方跑路频发,让非常多的用户蒙受巨大经济损失,知名区块链人脸识别公司iFace Chain [爱妃链] 前日做客某区块链媒体为网友支招,如何防止钱包数字币被盗. 那么,用户怎么降低Tok ...
- Java数据结构和算法 - 栈和队列
Q: 栈.队列与数组的区别? A: 本篇主要涉及三种数据存储类型:栈.队列和优先级队列,它与数组主要有如下三个区别: A: (一)程序员工具 数组和其他的结构(栈.队列.链表.树等等)都适用于数据库应 ...
- select 如何在选中后获取选中的时是什么元素 ,(原生js)
在日常开发中,我们经常遇到选择框的业务处理:如何去获取我们所选中的数据呢? 很多小伙伴还不是很熟悉! <!DOCTYPE html> <html lang="en" ...
- Java的二分搜索树
定义 二分搜索树是二叉树(不包含重复元素). 二分搜索树的每个节点的值,大于左子树的所有节点的值,小于其右子树的所有节点的值. 每一棵子树也是二分搜索树. 二叉树搜索树必须要有比较,继承Compara ...
- AlertConfirmDialog【基于AlertDialog的确认取消对话框】
版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 确认取消对话框,基于AlertDialog.不是基于DialogFragment. 按钮文本可以根据实际情况更换. 效果图 代码分析 ...
- springboot~JPA把ORM统一起来
JPA介绍 JPA(Java Persistence API)是Sun官方提出的Java持久化规范.它为Java开发人员提供了一种对象/关联映射工具来管理Java应用中的关系数据.他的出现主要是为了简 ...
- 使用FsCheck编写Property-based测试
使用FsCheck编写Property-based的测试 在编写基于Property-based的单元测试一文中,我们介绍了什么是Property-based测试.同时我们也总结了Property-b ...
- Spring Boot配置拦截器及实现跨域访问
拦截器功能强大,能够深入方法前后,常应用于日志记录.权限检查和性能检测等,几乎是项目中不可或缺的一部分,本文就来实现Spring Boot自定义拦截器的配置. 理论指导 问:Spring Boot怎么 ...
- keil教程之新建软件工程
前言 工欲善其事,必先利其器.要学好52单片机,就要会用keil写程序.不然,谈何学习单片机.下面介绍keil的使用. keil简介 Keil C51是美国Keil Software公司出品的51系列 ...