元素,无论设置padding还是margin,其占据的空间一致不变,变化的就是content box的尺寸,这就是典型的流体表现特性;
absolute的margin:auto
居中:当绝对定位元素处于流体状态的时候,各个盒模型相关属性的解析和普通流体元素都是一模一样的,margin负值可以让元素的尺寸更大,并且可以使用margin:auto让绝对定位元素保持居中;区别在于,绝对定位元素margin:auto居中从IE8浏览器开始支持,而普通元素的margin:auto居中很早就支持了;如果绝对定位元素的尺寸是已知了,没有必要使用transform,百分比transform会让ios微信闪退,其实首推的方法就是利用绝对定位元素的流体特性和margin:auto的自动分配特性实现居中;
6.9.position:relative才是大哥
- relative对absolute的限制
- relative与定位:relative的定位有两大特性:一是相对自身,二是无侵入;当relative进行定位偏移的时候,一般情况下不会影响周围元素的布局;relative的定位还有另外两点值得一提:相对定位元素的left/top/right/bottom的百分比值是相对于包含块计算的,而不是自身;
- relative的最小化影响原则:总结的一套更好的布局实践的原则,主分为两部分;1.尽量不使用relative,如果想定位某些元素,看看能否使用“无依赖的绝对定位”;2.如果场景受限,一定要使用relative,则该relative务必最小化;
6.10.强悍的position:fixed固定定位
- 固定定位之所以这么强悍,根本原因是其“包含块”和其他元素不一样
- position:fixed不一样的包含块:position:fixed固定定位元素的“包含块”是根元素,我们可以将其近似看成元素。换句话说,唯一可以限制固定定位元素的就是根元素
- position:fixed的absolute模拟:有时候我们希望元素既有不跟随滚动的固定定位效果,又能被定位元素限制和精准定位,可以使用position:absolute进行模拟。原理很简单:页面的滚动使用普通元素替代,此时滚动元素之外的其他元素自然就有了“固定定位”的效果
- position:fixed与背景锁定:蒙层弹窗,其中黑色半透明全屏覆盖的蒙层基本上都是使用position:fixed定位实现的。缺点:蒙层无法覆盖浏览器右侧的滚动栏,并且鼠标滚动的时候后面的背景内容依然可以被滚动;如果希望背景被锁定,可以借鉴“absolute模拟fixed定位”的思路,让页面滚动条由内部的普通元素产生即可;移动端项目,阻止touchmove事件的默认行为可以防止滚动;桌面端项目,可以让根元素直接overflow:hidden;
第七章 css世界的层叠规则
- 所谓“层叠规则”,指的是当网页中德元素发生层叠时的表现规则
7.1.z-index只是css层叠规则中的一叶小舟
- z-index属性只有和定位元素(position不为static的元素)在一起的时候才有作用,可以使是正数也可以是负数
7.2.理解css世界的层叠上下文和层叠水平
- 什么是层叠上下文:英文称作stacking context;HTML中的一个三维概念;可以把层叠上下文理解为一种“层叠结界”,自成一个小世界;
- 什么是层叠水平:层叠水平,决定了同一个层叠上下文中元素在z轴上的显示顺序;所有的元素都有层叠水平,包括层叠上下文元素,也包括普通元素;千万不要把层叠水平和CSS的z-index属性混为一谈;
7.3.理解元素的层叠顺序
- 表示元素发生层叠时有着特定的垂直显示顺序
- 层叠顺序规则:层叠上下文background/border》负z-index》block块状水平盒子》float浮动盒子》inline水平盒子》z-index:auto或看成z-index:0》正z-index
- 一些补充说明:位于最下面的background/border特指层叠上下文元素的边框和背景色;inline水平盒子指的是包括inline/inline-block/inline-table元素的“层叠顺序”,它们都是同等级别的;单纯从层叠水平上看,实际上z-index:0和z-index:auto是可以看成是一样的;
7.4.务必牢记的层叠准则
7.5.深入了解层叠上下文
- 层叠上下文的特性:层叠上下文的层叠水平要比普通元素高;层叠上下文可以阻断元素的混合模式;层叠上下文可以嵌套,内部层叠上下文及其所有子元素均受制于外部的“层叠上下文”;每个层叠上下文和兄弟元素独立。当进行层叠变化或渲染的时候,只需要考虑后代元素;每个层叠上下文是自成体系的。当元素发生层叠的时候,整个元素被认为是在父层叠上下文的层叠顺序中;
- 层叠上下文的创建:1.根层叠上下文指的是页面根元素,可以看成是元素;2.对于position值为relative/absolute以及Firefox/IE浏览器(不包括Chrome浏览器)下含有position:fixed声明的定位元素,当其z-index值不是auto的时候,会创建层叠上下文;差别就在于z-index:auto所在的
元素是一个普通定位元素
- 层叠上下文与层叠顺序:元素一旦成为定位元素,其z-index就会自动生效,此时其z-index就是默认的auto,也就是0级别,根据上面的层叠顺序表,就会覆盖inline或block或float元素;opacity的值不是1的时候,是具有层叠上下文的,层叠顺序是z-index:auto级别,跟没有z-index值得absolute绝对定位元素是平起平坐的;
7.6.z-index负值深入理解
- z-index是支持负值的
- z-index负值元素的层级是在层叠上下文元素上面、block元素的下面,也就是z-index虽然名为负数层级,但依然无法突破当前层叠上下文包裹的小世界
- CSS3 transform可以让元素具有新的层叠上下文
- z-index负值在实际项目中的作用:1.可访问性隐藏;2.IE8下的多背景模拟;3.定位在元素的后面;
7.7.z-index不犯二准则
- 准则内容:对于非浮层元素,避免设置z-index值,z-index值没有任何道理需要超过2
- 为什么需要这个准则:1.定位元素一旦设置了z-index值,就从普通定位元素变成了层叠上下文元素,相互间的层叠顺序就发生了根本的变化,很容易出现设置了巨大的z-index值也无法覆盖其他元素的问题;2.避免z-index一山比一山高的样式混乱问题;
- 对于JavaScript驱动的浮动组件,借助层级计数器来管理:1.总会遇到意想不到的高层级元素;2.组件的覆盖规则具有动态性;
- 所谓层级计数器,实际上就是一段JavaScript脚本,会遍历所有body处于显示状态的子元素,并得到最大z-index值,和默认的z-index做比较
第八章 强大的文本处理能力
- CSS就是凭借自身强大的文本处理和文本展示能力成为样式布局的标杆语言的。同时代的SVG的优势在于图形展示,在文本处理这一块实在是不敢恭维
8.1.line-height的另外一个朋友font-size
- font-size和vertical-align的隐秘故事:line-height的部分类别属性值是相对于font-size计算的,vertical-align百分比值属性又是相对于line-height计算的;无论font-size如何变化,后面图标都垂直居中对齐的例子;原理如下:内联元素默认基线对齐,图片的基线可以看成是图片的下边缘,文字内容的基线是字符x下边缘;居中原理本质上和绝对定位元素50%定位加偏移自身1/2尺寸实现居中是一样的,只不过这里的偏移使用的是vertical-align百分比值;
- 理解font-size与ex、em和rem的关系:ex是字符x的高度,显然和font-size关系密切,font-size值越大,自然ex对应的大小也就大;但是em和字符m确实有关。em在传统排版中指一个字模的高度(可以脑补下活字印刷的字模),注意是字模的高度,不是字符的高度。之所以叫做em完全取决于M的字形;CSS世界的渲染是一次渲染,是不会有死循环的;
- 理解font-size的关键字属性值:font-size的关键字属性值分为以下两类:相对尺寸关键字(相对于当前元素font-size计算)、绝对尺寸关键字(与当前元素font-size无关,仅受浏览器设置的字号影响);如何权衡“易于实现维护”“视觉还原”“可访问性”三者,两个珍藏的建议;1.即使是定宽的传统桌面端网页,也需要做响应式处理,尤其是针对1200像素宽度设计的网页,但只需要响应到800像素即可,可以保证至少有1.5倍的缩放空间,如果做到这一步,那么是否需要响应浏览器的字号设置这一点就可以忽略;2.如果因各种原因无法做到响应式处理,也没有必要全局都使用相对单位,毕竟成本等现实问题摆在那里,其实需要在图文为主的重要局部区域使用可缩放的font-size处理即可;
- font-size: 0与文本的隐藏:实际上,并不是所有小于12px的font-size都会被当作12px处理。有一个值例外,那就是0,也就是说,如果font-size:0的字号表现就是0,那么文字会直接被隐藏掉,并且只能是font-size:0,哪怕设置成font-size:0.00000001px,都会当作12px处理的
8.2.字体属性家族的大家长font-family
- font-family默认值由操作系统和浏览器共同决定
- 字体族分为很多类:serif衬线字体、sans-serif无衬线字体、monospace等宽字体、cursive手写字体、fantasy奇幻字体、system-ui系统UI字体
- 了解衬线字体和无衬线字体:所谓衬线字体,通俗讲就是笔画开始、结束的地方有额外装饰而且笔画的粗细会有所不同的字体
- 等宽字体的实践价值:所谓等宽字体,一般是针对英文字体而言的
- 中文字体和英文名称
- 一些补充说明:微软正黑体是一款全面支持ClearType技术的TrueType无衬线字体,用于繁体中文系统;“思源黑体”和“思源宋体”是Adobe与Google合作推出的开源字体。其设计目标是可以广泛用于多种用途的计算机字体,比如用于手机、平板或者桌面的用户界面、网页浏览或者电子书阅读等,均包含7个字重;
8.3.字体家族其他成员
- 貌似粗犷、实则精细无比的font-weight:可不可以自创一个font-weight:550的写法?不可以;实际上,所有这些数值关键字浏览器都是支持的,之所以没有看到任何粗细的变化,是因为我们的系统里面缺乏对应粗细的字体;
- 具有近似姐妹花属性值得font-style:font-style表示文字造型是斜还是正;italic是使用当前字体的斜体字体,而oblique只是单纯的让文字倾斜;之所以会专门为一个字体设计倾斜字体,就是因为单纯倾斜的时候不好看;
- 不适合国情的font-variant:font-variant是一个从IE6时代就过来的CSS属性;在母语是英文的国家这个属性估计都用得不多;
8.4.font属性
- 作为缩写的font属性:如果你的CSS代码原本就没有line-height属性,使用font缩写反而是不推荐的;还有一个令人头疼的问题,就是font缩写必须要带上font-family;
- 使用关键字值的font属性:font属性除了缩写用法,还支持关键字属性值;各个关键字的含义若如下:(caption活动窗口标题栏使用的字体;icon包含图标内容所使用的字体;menu菜单使用的字体;message-box消息盒里面使用的字体)
- font关键字属性值得应用价值:希望非Windows系统下不要使用微软雅黑字体,而是使用其系统字体;一种方法是可以试试使用非标准的-apple-system等关键字字体;实际上还真有标准的系统字体关键字,叫做system-ui;让网页的字体跟系统走,还有一个更加长远的好处。随着软件的不断发展,我们的操作系统的默认中文字体一定是越来越好看,如果网页的font-family定死为某个字体,用户就无法及时享受到新系统新字体带来的愉悦的视觉感受;
8.5.真正了解@font-face规则
- @font face的本质是变量:@font face本质上就是一个定义字体或字体集的变量,这个变量不仅仅是简单的自定义字体,还包括重命名、默认字体样式设置等;@font face规则支持的CSS属性有font-family、src、font-style、font-weight、unicode-range、font-variant、font-stretch和font-feature-settings;如果是使用系统安装字体,则使用local()功能符,如果是使用外链字体,则使用url()功能符;format()功能符的作用是让浏览器提前知道字体的格式,以决定是否需要加载这个字体,而不是加载完了之后再自动判断;unicode-range的作用是可以让特定的字符或者特定字符范围的字符使用指定的字体;
- @font face与字体图标技术:从面向未来的角度讲,字体图标技术的使用会越来越边缘化,因为和SVG图标技术相比,其唯一的优势就是兼容一些老的IE浏览器;SVG图标同样是矢量的,同样颜色可控,但资源占用更少,加载体验更好,呈现效果更佳,更加符合语义,我个人是非常推崇SVG图标的;两个需要关注的东西,一个是字体,另一个是字符,而这两个东西就是字体图标技术的本质所在;字体图标技术就是使用类似的原理实现的,即把通常的字符映射成为另外的图标形状;
写在后面
[书籍精读]《CSS世界》精读笔记分享
原文:https://www.cnblogs.com/yzsunlei/p/12907750.html