在《css世界》这本书中有一些“黑魔法”给列举出来,在结合本身的理解。 篇幅有点长,但愿你们可以坚持看完,必定会有收获!!!
如下是摘自每章内一些重要的概念与技巧。其中有解决图片间隙的问题、小图标与文字居中问题等;
ps: 特别是 “line-height、vertical-align”内容须要反复仔细研究阅读php
成为 文档流,将窗体自上而下分红一行一行,并在每行中按从左至右依次排放元素 (引导元素排列和定位)
利用元素“流”的特性实现的各种布局效果。由于“流”自己具备自适应特性,因此“流体布局”每每都是具备自适应性。
元素宽度按照分辨率宽度进行长度、宽度的调整,但布局不变。
当某个浏览器中出现与其余浏览器 不同的行为或样式表现;
Web应用场景变幻无穷,Web标准也是不可能面面俱到的,也会存在规范描述之外的场景,此时,各大浏览器厂家只能根据本身的理解与喜爱去实现,一旦个性化就会出现差别
当前的文字颜色;凡事须要使用颜色值的地方,均可以使用currentColor替换,比方说背景色 – background-color, 渐变色 – gradient, 盒阴影 – box-shadow, SVG的填充色 – fill等等
div { color:#3c3c3c; border: 1em solid currentColor; }
currentColor-CSS3超高校级好用CSS变量css
默认状况下,块级元素会新起一行;占据其父元素(容器)的整个空间
正是因为“块级元素”具备换行特性,所以理论上它均可以配合clear属性来清除浮动带来的影响
.clear:after { content: ''; display: table; // 也能够是block,或者是list-item clear: both; }
list-item(“ 附加盒子”)名“ 标记盒子”;由于生成了一个附加的盒子, 学名“标记盒子”(marker box),专门用来放圆点、数字这些项目符号;
元素都两个盒子,外在盒子和内在盒子;
外在盒子:外在的“内联盒子”(inline)
内在盒子:内在的“块级容器盒子”(block)
<div>、<p>这些元素的宽度默认是100%于父级容器的
浮动、绝对定位、inline-block元素或table元素
出如今table-layout为auto的表格中;当每一列空间都不够的时候,文字能断就断,但中文是随便断的,英文单词不能断
内容很长的连续的英文和数字,或者内联元素被设置了white-space:nowrap
“内部尺寸”: 尺寸由内部元素决定
“外部尺寸”: 宽度由外部元素决定
<div>、<p>这些元素的宽度默认是100%于父级容器;display:block;
宽度100%显示,margin/border/padding和content内容区域自动分配水平空间html
绝对定位元素的宽度表现是“包裹性”,宽度由内部尺寸决定
div { position: absolute; left: 20px; right: 20px; } div { position: absolute; top: 20px; bottom: 20px; } // 但不知道为何不行
除了“包裹”(max-width:100%),还有“自适应性(元素尺寸由内部元素决定, 但永远小于“包含块”容器的尺寸)”
<button>按钮</button> <input type="button" value="按钮">
著名的“按钮”元素:极具表明性的inline-block元素css3
文字少的时候居中显示,文字超过一行的时候居左显示web
.box { padding: 10px; background-color: #cd0000; text-align: center; } .content { display: inline-block; text-align: left; }
<div class="box"> <p id="content" class="content">文字内容</p> </div>
元素最适合的最小宽度
是元素能够有的最大宽度( 若是内部没有块级元素或者块级元素没有设定宽度值,其实是最大的连续内联盒子的宽度)
解决 替换元素宽度自适应问题
父元素height为auto,只要子元素在文档流中,其百分比值彻底就被忽略了;百分比高度值要想起做用,其父级必须有一个能够生效的高度值;
包含块的高度没有显式指定(即 高度由内容决定),而且该 元素不是绝对定位,则计算值为auto
'auto' * 100/100 = NaN
width:100%有效包含块的宽度取决于该元素的宽度,那么产生的布局在CSS 2.1中是未定义的
假如说 max-width初始值是auto,咱们的width永远不能设置为比auto计算值更大的宽度值
max-width会覆盖width,不是普通的覆盖,是超级覆盖;比直接在元素的style属性中设置CSS声明还要高
min-width和max-width冲突; 遵循“超越最大”规则(注意不是“后来居上”规则), min-width覆盖
咱们展开的元素内容是动态的,换句话说高度是不固定的
.element { max-height: 0; overflow: hidden; transition: max-height .25s; } .element.active { max-height: 666px; /* 一个足够大的最大高度值 */ }
max-height值比height计算值大的时候,元素的高度就是height属性的计算高度canvas
max-height不能设置很大,若是延迟时间长,会有延迟的感受。浏览器
围绕 文字看不见的盒子,其大小仅受字符自己特性控制,本质上是一个 字符盒子(character box);可是有些元素,如图片这样的替换元素,其内容显然不是文字,不存在字符盒子之类的,所以,对于这些元素,内容区域能够当作元素自身markdown
元素的“外在盒子”,用来决定元素是内联仍是块级
<span>、<a>和<em>等
由一个一个“内联盒子”组成的
由一行一行的“行框盒子”组成(CSS规范中,并无“包含盒子”的说法,更准确的称呼应该是“ 包含块”)
内联元素的全部解析和渲染会有前面有一个“空白节点”;不占据任何宽度,看不见也没法经过脚本获取( 文档声明必须是HTML5文档声明(HTML代码以下))
div { background-color: #cd0000; } span { display: inline-block; } <div><span></span></div>
过修 改某个属性值呈现的内容就能够被替换的元素; 如“img”
须要相似appearance属性,或者浏览器自身暴露的一些样式接口,例如::-ms-check{}
其默认的尺寸(不包括边框)是300像素×150像素,如<video>、<iframe>或者<canvas>
vertical-align属性,对于替换元素和非替换元素,vertical-align属性值的解释是不同
替换内容本来的尺寸有着本身的宽度和高度
HTML原生属性width和height属性、<input>的size属性、<textarea>的cols和rows属性等
经过CSS的width和height或者max-width/min-width和max-height/min-height设置的尺寸
CSS尺寸 > HTML尺寸 > 固有尺寸
在没有src属性下,各个浏览器表现的各不相同;src缺省的<img>不是替换元素,而是一个普通的内联元素
<img>
<img>直接没有src属性;当图片的src属性缺省的时候,图片不会有任何请求,是最高效的实现方式
设置图片个尺寸不是直接设置图片的固有尺寸,图片的固有尺寸是没法设置;可是设定width和height会影响图片的尺寸
查看示例app
基于伪元素的图片内容生成技术
查看示例异步
在Chrome浏览器下,全部的元素都支持content属性,而 其余浏览器仅在::before/::after伪元素中才有支持
content属性改变的仅仅是视觉呈现,当咱们以右键或其余形式保存这张图片的时候,所保存的仍是原来src对应的图片
content属性生成的内容都是 替换元素
div:before { content: url(1.jpg); }
img::after { /* 生成alt信息 */ content: attr(alt); /* 其余CSS略 */ }
内联元素没有 可视宽度和可视高度的说法(clientHeight和clientWidth永远是0), 垂直方向的行为表现彻底受line-height和vertical-align的影响;视觉上并无改变和上一行下一行内容的间距
padding百分比值不管是 水平方向仍是垂直方向均是相对于宽度计算
margin才能够改变元素的可视尺寸
列表块两端对齐,一行显示3个,中间有2个20像素的间隙
ul { margin-right: -20px; } ul > li { float: left; width: 100px; margin-right: 20px; }
块级元素的上外边距(margin-top)与下外边距(margin-bottom)有时会合并为单个外边距
p { margin: 1em 0; } <p>第一行</p> <p>第二行</p>
让图文信息的排版更加舒服天然
在页面中任何地方嵌套或直接放入任何裸""<div>"",都不会影响原来的块状布局。
width或height为auto时;元素是具 有对应方向的自动填充特性
填充闲置尺寸
三道杠
.icon-menu { width: 120px; height: 20px; border-top: 60px double; border-bottom: 20px solid; }
border-color默认颜色就是color色值;没有指定 border-color颜色值的时候,会使用当前元素的 color计算值做为边框色
.icon-clear { width: 16px; height: 16px; border: 11px solid transparent; }
ex是CSS中的一个相对单位; 小写字母x的x-height(不受字体和字号影响的内联元素的垂直居中对齐效果);内联元素默认是基线对齐的,而基线就是x的底部,而1ex就是一个x的高度;
vertical-align:middle
定了用来计算行框盒子高度的基础高度; 经过改变“行距”来实现
行距 = line-height - font-size
能够瞬间明确咱们的阅读方向,让咱们阅读文字更轻松
当前文字的上方和下方;这个“行距”的高度仅仅是完整“行距”高度的一半
半行距 = (line-height - font-size )/2;
line-height不能够影响替换元素;可是在视觉上是受到line-height影响了,那是由于把“幽灵空白节点”的高度变高了;图片为内联元素,会构成一个“行框盒子”,而在HTML5文档模式下,每个“行框盒子”的前面都有一个宽度为0的“幽灵空白节点”特性表现和普通字符如出一辙;
经过改变块级元素里面内联级别元素占据的高度实现
CSS中“行距的上下等分机制”
只须要line-height这一个属性就能够
文字字形的垂直中线位置广泛要比真正的“行框盒子”的垂直中线位置低
须要line-height属性的好朋友vertical-align属性帮助
不一样系统不一样浏览器的默认line-height都是有差别
如line-height:1.5,其最终的计算值是和当前font-size相乘后的值
如line-height:150%,其最终的计算值是和当前font-size相乘后的值
也就是带单位的值,如line-height:21px或者line-height:1.5em;最终的计算值是和当前font-size相乘后的值
考虑到文章阅读的温馨度,line-height值能够设置在1.6~1.8
长度值或者数值
终父级元素的高度都是由 数值大的那个line-height决定
如baseline(默认值)、top、middle、bottom
如text-top、text-bottom;
如sub、super
如20px、2em、20%等 百分比是相对于line-height的计算值计算
只能做用在display计算值为 inline、inline- block,inline-table或table-cell的元素上
对字符而言, font-size越大字符的基线位置越往下,由于文字默认所有都是基线对齐,因此当字号大小不同的两个文字在一块儿的时候,彼此就会发生上下位移,若是位移距离足够大,就会超过行高的限制,而致使出现意料以外的高度
默认和基线(也就是这里字母x的下边缘)对齐,字母x往下的行高产生的多余的间隙就嫁祸到图片下面,让人觉得是图片产生的间隙,实际上,是 “幽灵空白节点”、line-height和vertical-align属性共同做用的结果
一个inline-block元素,若是里面没有内联元素,或者overflow不是visible,则该元素的基线就是margin底边缘;
不然其基线就是元素里面最后一行内联元素的基线
图标与文字居中
盒子的顶部和父级内容区域的顶部对齐
盒子的底部和父级内容区域的底部对齐
提升盒子的基线到父级合适的上标基线位置
下降盒子的基线到父级合适的下标基线位置。
浮动的本质就是为了 实现文字环绕效果。 而这种文字环绕,主要指的就是文字环绕图片显示的效果
包裹
自适应性
元素一旦float的属性值不为none,则其display计算值就是block或者table
是float元素所在的“流”中的一个点,这个点自己并不浮动,就表现而言如同一个空的内联元素,有内联元素天然就有“行框盒子”
是浮动元素对齐参考的实体: float元素的“浮动参考”是“行框盒子”,也就是float元素在当前“行框盒子”内定位
.animal元素没有浮动,也没有设置宽度, 所以,流动性保持得很好,设置margin-left、border-left或者padding-left均可以自动改变content box的尺寸,继而实现了宽度自适应布局效果
clear属性是 让自身不能和前面的浮动元素相邻,注意这里“前面的”3个字,也就是clear属性对“后面的”浮动元素是漠不关心的
“CSS世界的结界”;经过一些特定的手段造成的封闭空间,里面的人出不去,外面的人进不来,具备极强的防护力
只要元素符合上面任意一个条件, 就无须使用clear:both属性去清除浮动
img { float: left; } .animal { overflow: hidden; } <div class="father"> <img src="me.jpg"> <p class="animal">小猫1,小猫2,...</p> </div>
通流体元素在设置了overflow:hidden后, 会自动填满容器中除了浮动元素之外的剩余空间,造成自适应布局效果,并且这种自适应布局要比纯流体自适应更加智能
要想完全清除浮动的影响,最适合的属性不是clear而是overflow。通常使用overflow:hidden,利用BFC的“结界”特性完全解决浮动对外部或兄弟元素的影响
当子元素内容超出容器宽度高度限制的时候,剪裁的边界是 border box的内边缘
要尽可能避免滚动容器设置padding-bottom值,除了样式表现不一致外,还会致使scrollHeight值不同
URL地址中的锚链与锚点元素对应并有交互行为
可focus的锚点元素处于focus状态
经过改变容器滚动高度或者宽度来实现;容器的滚动高度,而不是浏览器的滚动高度; 并且定位行为的发生是由内而外
普通元素和窗体同时可滚动的时候,会由内而外触发全部可滚动窗体的锚点定位行为
别就在于有没有那个滚动条。元素设置了overflow:hidden声明, 里面内容高度溢出的时候,滚动依然存在,仅仅滚动条不存在
当 absolute和float同时存在的时候, float属性是无任何效果的
元素用来计算和定位的一个框
position:absolute,则“包含块”由最近的position不为static的祖先元素创建
内联元素也能够做为“包含块”所在的元素
内联元素的“包含块”是由“生成的”先后内联盒子决定的,与里面的内联盒子细节没有任何关系
包含块”所在的元素不是父块级元素,而是最近的position不为static的祖先元素或根元素
边界是padding box而不是content box
由于绝对定位元素的定位值和列表容器的padding值耦合在一块儿了:咱们对padding间距进行调整的时候,绝对定位元素的right、top值也必定要跟着一块儿调整,不然就会出现样式问题
一个绝对定位元素,没有任何left/top/right/bottom属性设置,而且其祖先元素所有都是非定位元素: 当前位置
若是 overflow不是定位元素, 同时绝对定位元素和overflow容器之间没有定位元素,则overflow没法对absolute元素进行剪裁若是overflow的属性值不是hidden而是auto或者scroll,即便绝对定位元素高宽比overflow元素高宽还要大,也都不会出现滚动条
clip属性要想起做用,元素必须是 绝对定位或者固定定位
overflow属性每每就力不能及了,由于fixed固定定位元素的包含块是根元素,除非是根元素滚动条,普通元素的overflow是根本没法对其进行剪裁的; 可是clip能够
它具 有更强的广泛适应性,任何元素、任何场景均可以无障碍使用
absolute元素才 真正变成绝对定位元素若是咱们仅设置了一个方向的绝对定位,没有设置方向依然保持了相对特性
流体特性:对立方向同时发生定位的时候设置了对立定位属性的绝对定位元素的表现神似普通的<div>元素,不管设置padding仍是margin,其占据的空间一直不变,变化的就是content box的尺寸
.element { width: 300px; height: 200px; position: absolute; left: 0; right: 0; top: 0; bottom: 0; margin: auto; }
相对于自身进行偏移定位
即便本身移动,也会在原来的位置留下空间当relative进行定位偏移的时候,通常状况下不会影响周围元素的布局
position:fixed固定定位元素的“包含块”是<html>根元素;
当内容发生层叠的时候,必定会有一个先后的层叠顺序产生
自成一个小世界。这个小世界中可能有其余的“层叠结界”,而自身也可能处于其余“层叠结界”中
同一个层叠上下文中元素在z轴上的显示顺序
元素发生层叠时有着特定的垂直显示顺序
当具备明显的层叠水平标识的时候,如生效的z-index属性值,在同一个层叠上下文领域,层叠水平值大的那一个覆盖小的那一个
当元素的层叠水平一致、层叠顺序相同的时候,在DOM流中处于后面的元素会覆盖前面的元素
页面根元素天生具备层叠上下文,称为根层叠上下文。
z-index值为数值的定位元素的传统“层叠上下文”。position值为relative/absolute以及Firefox/IE浏览器(不包括Chrome浏览器)下含有position:fixed声明的定位元素,当其z-index值不是auto的时候,会建立层叠上下文
其余CSS3属性
z-index负值渲染的过程就是一个寻找第一个层叠上下文元素的过程,而后层叠顺序止步于这个层叠上下文元素
从普通定位元素变成了层叠上下文元素,相互间的层叠顺序就发生了根本的变化,很容易出现设置了巨大的z-index值也没法覆盖其余元素的问题
line-height的部分类别属性值是相对于font-size计算的,vertical-align百分比值属性值又是相对于line-height计算的
font-size值越大,天然ex对应的大小也就大em相对于当前元素,
rem相对于根元素,本质差异在于当前元素是多变的,根元素是固定的,也就是说,若是使用rem,咱们的计算值不会受当前元素font-size大小的影响
font-size默认值是medium,而medium计算值仅与浏览器设置有关
并非全部小于12px的font-size都会被看成12px处理,有一个值例外,那就是0,也就是说,若是font-size:0的字号表现就是0,那么文字会直接被隐藏掉,而且只能是font-size:0,哪怕设置成font-size:0.0000001px,都仍是会被看成12px处理的
笔画开始、结束的地方有额外装饰并且笔画的粗细会有所不一样的字体
没有这些额外的装饰,并且笔画的粗细差很少
font-family: Consolas, Monaco, monospace;
利于代码呈现
ch相关的字符是0,就是阿拉伯数字0;1ch表示一个0字符的宽度,因此6个0所占据的宽度就是6ch
用数值做为font-weight属性值,必须是100~900的整百数
由于咱们的系统里面缺少对应粗细的字体
用当前字体的斜体字体
单纯地让文字倾斜
font-size和font-family是必需的
使用关键字做为属性值的时候必须是独立的,不能添加font-family或者font-size之类
但愿非Windows系统下不要使用“微软雅黑”字体,而是使用其系统字体
html { font: menu; } body { font-size: 16px; } html { font: small-caption; } body { font-size: 16px; } html { font: status-bar; } body { font-size: 16px; }
让网页的字体跟系统走
@font-face { font-family: 'example'; src: url(example.ttf); font-style: normal; font-weight: normal; unicode-range: U+0025-00FF; }
font-family能够当作是 一个字体变量;本来系统就有的字体名称,不能随便设置
引入的字体资源能够是系统字体,也能够是外链字体
使用系统安装字体
使用外链字体
重置对应字体样式或字重下该使用什么字体
它定义了不一样字重、使用不一样字体
让特定的字符或者特定范围的字符使用指定的字体
对文本进行缩进控制
控制字符之间的间距,这里说的“字符”包括英文字母、汉字以及空格等
增长空格的间隙宽度; 是做用在“空格”上
是全部的都换行,绝不留情,一点儿空隙都不放过
若是这一行文字有能够换行的点,如空格或CJK(中文/日文/韩文)之类的,就不打英文单词或字符的主意了,在这些换行点换行,至于对不对齐、好很差看则不关心
如何处理元素内的空白字符
当white-space设置为nowrap的时候,元素的宽度此时表现为“最大可用宽度”,换行符和一些空格所有合并,文本一行显示
border
a { text-decoration: none; border-bottom: 1px solid; }
常见的标点符号、各种括号和引号在::first-letter伪元素眼中所有都是“辅助类”字符
电商产品常常会有价格,价格前面通常都有一个¥符号,这个符号字体每每会比较特殊,字号也比较大,同时和文字的数值有几像素的距离
p:before { content: '新闻:'; } p:first-letter { color: silver; } <p>这是新闻的标题……</p>
向文本的首行添加特殊样式
至于Chrome和Safari浏览器则彷佛更加智能一点
<script type="text/html"> <img src="1.jpg"> </script>
.dn { display: none; }
.hidden { position: absolute; visibility: hidden; }
.vh { visibility: hidden; }
.clip { position: absolute; clip: rect(0 0 0 0); } .out { position: relative; left: -999em; }
.lower { position: relative; z-index: -1; }
.opacity { position: absolute; opacity: 0; filter: Alpha(opacity=0); }
.opacity { opacity: 0; filter: Alpha(opacity=0); }
Chrome和Safari浏览器
父元素设置visibility:hidden,子元素也会看不见
visibility:hidden不会影响计数器的计数
CSS3 transition支持的CSS属性中有visibility,可是并无display
语法和border属性很是相似,分宽度、类型和颜色,支持的关键字和属性值与border属性如出一辙
outline属性确实不占据任何空间,轮廓宽度设置得再宽广,也不会影响任何元素的任何布局,而且outline轮廓是可穿透的
.direction { direction: ltr; // 默认值 direction: rtl; }
@media screen and (max-width: 480px) { .dialog-footer { direction: rtl; } }
用来实现文字竖向呈现
.writing-mode { writing-mode: lr-tb | tb-rl | tb-lr (IE8+); writing-mode: horizontal-tb | vertical-rl | vertical-lr; }
基于 本来水平方向才适用的规则所有均可以在垂直方向适用
.btn:active { text-indent: 2px; } .verticle-mode { writing-mode: tb-rl; writing-mode: vertical-rl; }
当文档变成垂直流的时候,height高度自然自适应
改变 文档流为垂直方向
改变的是 垂直方向的内联元素的文本方向
ps:有什么不清楚、错误,欢迎提出。