CSS2.1

作者: hellomyshadow | 来源:发表于2019-04-15 22:07 被阅读0次

CSS

1. <link />引入CSS的方式可以利用浏览器的缓存,提高访问速度;
2. <a />可以包含任何元素,但<p>除了它自身,不可以包含任何块元素;
3. 复合/交集选择器:用于选中同时满足多个选择器的元素,选择器1选择器2 { ... }
    1. span.p3 { background-color: yellow; } -->只对使用了类选择器p3的span有效
    2. id是标签的唯一标识,所以id选择器通常不会再使用复合的形式。
4. 伪类选择器
    1. a:link { color: black; } --> 为没访问过的链接设置一个颜色;
    2. a:visited{ color: red; } ->设置访问过的链接的颜色,浏览器根据历史纪录判断;
    3. a:active{ color: green; } --> 设置超链接被点击时的颜色;
    4. input:focus {background-color: red;} ->设置<input />获得焦点后的背景色;
    5. p::selection{background-color: red;} -> 设置鼠标选中时的背景色;
    6. 兼容Firefox:p::-moz-selection { ... }
    7. IE6不支持<a />以外的元素设置:hover和:active,也不支持:focus和::selection;
    8. 针对段落<p>的伪元素::first-letter(首字母),:first-line(首行)
5. H5规定的一些语义标签:对于不需要着重的内容、而是单纯的加粗/斜体,就可以使用<b>和<i>
    1. <small>用于表示一些细则一类的内容,如合同中的小字、网站的版权声明;
    2. <cite>:网页中所有的加"《》"的内容,表示引用的参考,如书名、电影名、歌名
    3. <q>:行内引用的内容,为该内容加引号,<p>子曰:<q>温故而知新!</q></p>
    4. <sup>:上标,<p>2<sup>3</sup><p> --> 2的3次方的形式;
    5. <sub>:下标,<p>H<sub>2</sub>O<p> --> 水的化学方程式;
    6. <del>:加删除线,<p><del>17.8</del><p>
    7. <ins>:表示一个插入的内容,自动添加下划线;
    8. <pre>:预格式标签,会保存内容的格式,不会忽略前后的空格;
    9. <code>:专用于表示代码,但不会保留格式,所以通常配合<pre>表示代码。
6. RGB表示颜色时,有两种方式:rgb(255,0,100)、rgb(100%,0%,100%)
1. text-transform:设置文本的大小写,默认值为none
    1. capitalize:每个单词的首字母大写,通过空格识别单词;
    2. uppercase/lowercase:所有字母都大写/小写。
2. text-decoration:设置文本的修饰,下划线、删除线、上划线,如<a>默认带下划线;
3. text-indent:设置文本的首行缩进,通常使用em作为单位;
    1. 如果设置一个足够大的负数,可以把文本隐藏,供搜索引擎查看,而不让用户看到。
4. user-select:none; -->不允许鼠标以任何方式选中文本,包括按住鼠标拖动选中、双击选中

CSS2.1

1. div+CSS布局的原因:<div>是块级元素,在所有浏览器的解析都是一样的,而且<div>的样式
   是很干净的,所以选择用<div>作为包含块(父级元素);
2. 包含块:根元素(html)的包含块也称为初始包含块,有些浏览器会使用body作为根元素;
    1. 对于大多数浏览器,初始包含块就是一个视窗大小的矩形,但不等于视口;
    2. 对于浮动元素,其包含块为最近的块级父元素,定位元素则更为复杂;
    3. position为relative/static的非根元素,包含块由最近的块级框、表单元格或行内块
    祖先框的内容边界构成;
    4. position为absolute的非根元素,包含块设置为最近的、使用了定位的父元素,如果没有
    任何父元素使用定位,则以初始包含块为参照。
3. 默认值与百分比的参考值
    1. width和height都不可继承,默认值为auto,而不是100%!
    2. 没有设置width和height的情况下,内联元素和内联块元素的宽高由内容撑起,所以如果没有
    内容,其width和height的实际值都是0px,而块元素独占一行,如果没有内容,其width仍撑满
    父元素,即width的实际值与父元素的width相同,但其height的实际值也是0px
    <div id="outter"> --> #outter{ width: 100px; height: 100px; }
        <div id="inner"></div> --> #inner{ height: 50px; margin: 0 20px; }
    </div> --->inner的width=100-20-20=60px
    3. width的默认值为auto,实际值为父级width-自身margin-自身padding-自身border
    4. margin和padding的默认值为0,使用百分比时都参照最近父级元素的width
    5. left和top的默认值是auto,而不是0,使用百分比时,分别参照包含块的width和height
    <div id="outter"></div>
    <div id="box"></div> --> #box{ position: absolute; } --> box位于outter下方
    6. 相对定位的包含块为父元素;对于绝对/固定定位,包含块为最近的、使用定位的父级元素。
4. 浮动:浮动只会提升半层层级,而定位提升1个层级;
    1. 文字绕图:浮动只提升半层层级的体现,只浮动下半层;
    2. 只有在浮动的时候才会考虑盒子的分层问题,上层为文字相关,下层为盒模型相关。

固定定位的扩展理解

1. 绝对定位参照的是包含块,固定定位参照的是视口;
2. 视口、html、body的高度实现三合一,必须一层层继承,只设置body{ height:100%; }是无效的
    html, body { height: 100% } --> 让body能够充当视口的大小
4. 滚动条:可分为系统滚动条和元素上的滚动条;
    1. 系统滚动条属于document,作用在整个HTML文档上,也就是浏览器窗口;
    2. 只设置<html>或<body>中的一个overflow,都会传递给document
    3. 禁用系统滚动条:html{ height: 100%; overflow: hidden }
5. 初始包含块是一个视口大小的矩形,但并不是视口,它也在文档的最外层,包裹整个文档;
    1. 拖动系统滚动条,视口不会移动,但初始包含块会随之移动,整个文档也随之移动;
    2. 拖动其他元素上的滚动条,影响的都只是该元素内的子元素,并不会影响初始包含块的位置;
    3. 如果没有任何父元素使用定位,绝对定位则参照初始包含块;
    4. 系统滚动条能影响初始包含块的位置,也就能间接影响绝对定位的元素位置。
6. 解决固定定位不兼容IE6
    1. 如果当前拖动的不是系统滚动条,那也就不影响初始包含块,绝对定位的元素也就不会移动;
    2. 因此,可以用绝对定位间接实现固定定位的效果;
    html{ height: 100%; overflow: hidden; } --> 禁止系统滚动条
    body{ height: 100%; overflow: auto; } --> 让<body>充当视口,使用<body>的滚动条

经典布局

1. 三列布局:两边固定、中间自适应,中间列要完整显示,且中间列要优先加载
    1. 定位实现过于复杂,还会影响后续的布局,所以不建议用定位做框架布局;
    2. 浮动实现:中间列不能优先加载
    div{ height: 100px; }  body{ min-width: 600px; }-->最小宽度:2*left+right
    <div class="left">LEFT</div> --> .left{ width: 200px; float: left; }
    <div class="right">RIGHT</div> --> .right{ width: 200px; float: right; }
    <div class="middle">MIDDLE</div> --> 只能排在最后面,导致中间列不能优先加载
2. 圣杯布局实现三列布局:浮动、margin为负值、相对定位
    1. margin:外边距,控制盒子边框之间的距离,把margin设置为负值是布局中的重要应用;
    2. margin改变的其实是盒子的边界位置,并不会主动改变盒子本身的大小和位置,盒子本身的
    位置只能由定位(left,top)进行改变,但margin会影响盒子的盒模型变化;
    3. 对于两个并列的盒子(内联元素),后者的margin-left设置为负值,在表象上会覆盖前者;
    4. margin-left设置为负值,改变盒子的边界,就是圣杯布局实现的关键
    body { min-width: 600px; margin: 0; padding: 0; } -->最小宽度2*left+right
    .content { padding: 0 200px; } -->为父元素设置左右padding,显现middle
    #middle { width: 100%; float: left; } --> 中间列也要左浮动,且手动设置宽度100%
    #left, #right { width: 200px; float: left; }
    #left { margin-left: -100%; position: relative; left: -200px; } -->left的
    原位置在middle的下面,与middle同层级,左边界垂直在一条线上,middle的width为100%,
    则设置left的margin-left为-100%,left会自动覆盖前面的middle,且左边界合并,又因为
    父元素的左padding为200px,对left设置相对定位,使left向左移动200px
    #right { margin-left: -200px; position: relative; right: -200px; } -->left
    移动了之后,right会自动占据left的位置,right的width为200px,则设置margin-left为
    -200px,right和middle的右边界自动垂直在一条线上,又因为父元素的右padding为200px,
    则对right设置相对定位(right:-200px)
    <div class="content clearfix"> -->.clearfix清除浮动
        <div id="middle">middle</div> -->中间列优先加载
        <div id="left">Left</div>
        <div id="right">right</div>
    </div>
3. 等高布局:伪等高
    1. 原理:padding-bottom改变盒子本身的大小,margin-bottom设置负值改变盒子的边界,
    父元素设置为overflow:hidden,剪切掉盒子padding-bottom超出父元素的部分;
    <div class="box clearfix">
        <div class="left">盒子</div>
        <div class="right">等高布局······等高布局</div>
    </div>
    .box { width: 700px; border: 2px solid gold; overflow: hidden; }
    .left { width: 200px; float:left; }  .right { width: 500px; float:left; }
    .right, .left {  padding-bottom: 10000px; margin-bottom: -10000px; }
    2. right中的内容多于left,所以right的高度更大,父元素的高度也就是right的高度;
    3. 对left和right设置一个足够大的padding-bottom:10000px,盒子的底部边界向下延申
    10000px,那么父元素的高度也被撑开10000px;
    4. 对left和right再设置margin-bottom:-10000px,将盒子的底部边界向上移动10000px,
    盒子本身的大小不会改变,但父元素的高度会随之向上回缩10000px,那么盒子会由10000px
    超出父元素,所以对父元素设置overflow:hidden,剪切掉超出的部分。
4. 双飞翼布局实现三列布局:避免使用定位,样式更干净
    1. 双飞翼与圣杯布局的不同之处:如何处理中间列的位置
    2. 圣杯布局:父元素设置padding:0 200px,再对left和right设置相对定位;
    3. 双飞翼布局:给中间列再添加一个父元素,再对中间列设置padding:0 200px;
    .left, .right { width: 200px; float: left; }  body { min-width: 600px; }
    <div class="clearfix"> -->只清除浮动
        <div class="middle"> --> .middle { width: 100%; float: left; }
            <div class="inner">middle</div> --> .inner{ padding:0 200px; }
        </div>
        <div class="left">Left</div> -->.left { margin-left: -100%; }
        <div class="right">right</div> -->.right { margin-left: -200px; }
    </div>
5. 粘连布局:stickyFooter,一般应用于移动端
    1. 当main中的内容不足以撑满屏幕的高度时,footer固定在屏幕底部;main中的内容高度
    超过屏幕高度时,footer跟随在main的底部;
    html, body { height: 100%; } -->让body充当视口
    <div id="wraper"> -->#wraper { min-height: 100%; },最小高度为屏幕的100%
        <div id="main">main······main</div> -->#main{ padding-bottom: 30px; }
    </div>
    <div id="footer">footer</div> -->#footer{height: 30px; margin-top: -30px;}
    2. wraper设置最小高度为视口的100%,保证下面的兄弟节点footer至少位于底部;
    3. 对main设置padding-bottom,让main中的内容不会与footer交叉;
    4. footer只能布局在wraper之下,设置margin-top为负数,改变边界,让盒子向上移动。

BFC

Box Formatting Context

1. Box:盒子,CSS布局的基本单位,也即一个页面由多个Box组成;
    1. Box也有多种类型,元素的类型和display属性决定了一个Box的类型;
    2. 不同类型的Box,会参与不同的Formatting Context(一个决定如何渲染HTML文档的容器),
    所以,Box内的元素会以不同的方式渲染。
2. Box的类型
    1. display属性值为block、list-item、table的元素,会生成block-level box,并参与
    block formatting context;
    2. display为inline、inline-block、inline-table的元素,会生成inline-level box,
    并参与inline formatting context;
3. Formatting Context:W3C CSS2.1规范的概念,页面中的一块渲染区域,并且有一套渲染规则;
    1. 它决定了其子元素将如何定位,以及和其他元素的关系、相互作用;
    2. 最常见的有Block Formatting Context(简称BFC),Inline Formatting Context(IFC)
    3. 不同于BFC,每个浏览器对IFC维护的规则不同,所以常用的布局是div+CSS.

Block Formatting Context

1. BFC:块级格式化上下文,它是一个独立的渲染区域,只有Block-level Box参与,它规定了内部
   的Block-level Box如何布局,且与区域外部无关;
2. BFC的布局规则
    1. 内部的Box会在垂直方向一个个地放置,也即块级元素独占一行;
    2. BFC的区域不会与浮动的Box重叠;
    3. 内部的Box在垂直方向的距离由margin决定,同一个BFC的两个相邻Box的margin会发生重叠;
    4. 计算BFC的高度时,浮动元素也参与计算(清除浮动、开启haslayout)
    5. BFC就是页面上的一个隔离的独立容器,容器里的子元素不会影响到外面的元素,反之亦然。
3. 会生成BFC的元素:开启BFC的条件
    1. 根元素,也即<html>就是一个BFC容器,所以其中的块元素能够遵循BFC的规则;
    2. float不为none,position为absolute/fixed,都会自动开启BFC,管理其中的块元素;
    3. overflow不为visible,也会开启BFC;
    4. display为inline-block、table-cell、table-caption、flex、inline-flex
4. BFC实现两列布局:利用"BFC的区域不会与浮动的Box重叠"的规则
    body { min-width: 600px; }  div{ height: 200px; }
    <div id="left">Left</div> --> #left{ width: 200px; float: left; }
    <div id="right">Right</div>  --> #right{ overflow: hidden; }
    1. right开启了BFC,将不会与浮动的left重叠,形成两个完全独立的布局;
    2. 使用场景:左边为商品图片,右边为商品的简介。
5. margin的合并:BFC的规则导致,两个Box满足"处在同一个BFC、相邻、都是块元素"
    1. 一旦打破其中一个条件,比如其中一个盒子为display:inline-block,则不会发生重叠;
    2. "相邻"的意义:两个盒子的margin相邻,也即在两个盒子之间加一个空<div>也是无效的,
    但是,如果这个<div>设置height:1px; 那么两个盒子的margin将不再相邻,也不会重叠;
    3. 为了使样式更干净,可以为第二个Box加一个父元素,并设置父元素overflow:hidden;
    4. 除了会导致兄弟元素的margin合并,此规则也会使父子元素之间发生margin的合并,也就是
    margin-top的塌陷,子元素的margin-top传递给了父元素,因为它们也符合BFC的规则。

清除浮动

1. 暴力方式:直接给父元素设置高度;
2. 利用BFC的规则之一:"计算BFC的高度时,浮动元素也参与计算":
    1. 开启BFC的父元素能感知浮动元素的高度,也就能被撑开;
    2. 如overflow:hidden;(常用于移动端),但IE6/7不支持BFC。
3. 在浮动元素下面添加<br clear="all" />,也能清除浮动,但破坏了结构,也不兼容IE6;
4. 在最后一个子元素后面添加一个空标签:<div style="clear:both;"></div>
    1. 副作用:结构与样式未分离,且如果该标签中有内容,即使设置height:0; 在IE6也有19px
    的默认高度,再设置font-size:0; 还是会有2px的高度。
5. 伪元素的方式:.clearfix:after{ content:""; display:block; clear:both; }
    1. 其实是第四种的变种,实现了结构与样式的分离,且基本没有副作用,但IE6/7不支持伪元素。
    2. 兼容IE6/7:.clearfix{ *zoom:1; } 开启IE特有的haslayout,*表示IE的hack

兼容IE

1. haslayout:IE6没有BFC的概念,layout是IE的一个私有概念;
    1. layout决定了元素如何对其内容定位、尺寸计算,以及与其他元素的关系、相互作用;
    2. 当一个元素拥有layout时,它会负责本身及其子元素的尺寸和定位,如果没有,则由最近的、
    拥有layout的父元素控制其尺寸和位置;
    3. IE8+使用了全新的引擎,已经不再支持haslayout了,所以haslayout只针对IE6/7
    4. haslayout出现的原因:理论上每个元素都应该控制自己的尺寸和定位,即每个元素都应该拥有
    layout;然而,对于早期的IE引擎来说,如果让所有元素都拥有layout的话,会导致性能很低;
    所以,IE团队决定使用布局的概念来减少浏览器的性能开销,即只将布局应用于实际需要的元素,
    所以出现"拥有布局"和"没有拥有布局"两种情况。
    5. 默认拥有布局的元素:html、body、table、tr、td、img、hr、input、select、button、
    textarea、iframe、embed、object、applet、marquee
    6. 开启haslayout:浮动、display:inline-block、绝对定位、width/height值非auto、
    zoom值非normal、writing-mode:tb-rl
    7. IE7增加开启haslayout的方式:min-height/min-width为任意值,position:fixed、
    max-heigth/max-width的值不为none,overflow值非visible,仅用于块元素。
2. 了解hack
    1. 不同厂商的浏览器或者同一浏览器的不同版本,如IE6和IE7,对CSS的解析不完全相同,
    CSS hack的目的就是使CSS兼容不同的浏览器,反之,利用hack为不同的浏览器定制CSS效果;
    2. hack使用最多的是IE浏览器,一般只关心IE的hack:*、+、-、_、#、\0、\9\0、!important
    3. -:IE6特有的hack,其他版本的IE都不支持;
    4. *:对于标准版的IE,只有IE6/7支持,所以使用{*zoom:1}开启IE6/7的haslayout,而其他
    版本的IE支持伪元素和BFC,则不需要开启haslayout,节省开销;
    5. 对于标准IE,\9在IE6/7/8/9/10都支持,\0只在IE8/9/10中生效,\9\0只对IE9/10有效;
    6. \0、\9\0、!important都是写在属性值后面,如background:red\9\0;
    7. 除了CSS hack,还有一种hack可以写在HTML中,称为条件注释表达式
    <body>
        <!--[if IE]>
            这段文字只在IE浏览器上显示
        <![endif]-->
        <div> ······ </div> ---> 页面的布局
    </body>
    1. 这种hack只在IE10以下有效,因为IE6是一个版本,IE7/8/9又是一个版本,而IE10以上的
    浏览器已经接近于标准浏览器,取消了这种hack;
    2. <!--[if IE 6]>:只在IE6上生效; <!--[if gte IE 6]>:IE6+上有效;
2. 检测低版本IE
    function checkIE(version) {
        let b = document.createElement('b')
        b.innerHTML = '<!--[if IE ' + version + ']><i></i><![endif]-->'
        return b.getElementsByTagName('i').length == 1
    } --> console.log(checkIE(8)) --> 当前浏览器为IE8时,返回true,否则返回false

相关文章

  • CSS2.1

    1.浏览器渲染规则: 高度层层传递; html或者body任一个添加voerflow:hi...

  • CSS2.1

    CSS CSS2.1 固定定位的扩展理解 经典布局 BFC Box Formatting Context Bloc...

  • css概要

    本系列文章主要是学习 《css世界》的记录与总结 知识点主要 css2.1,不涉及css3 css2.1 开始由I...

  • BFC初识

    推荐看看css2.1规范!!!css2.盒模型 在了解BFC之前,我们先来看看什么是块级格式化。在css2.1规范...

  • css2pdf

    XHTMLRenderer Core Renderer R8 An XML/XHTML CSS2.1 render...

  • BFC,IFC学习笔记

    概念 Formatting context Formatting context 是 W3C CSS2.1 规范中...

  • 伪类和伪元素学习笔记

    css2.1 Selectors章节中对伪类与伪元素的描述: CSS introduces the concept...

  • CSS(margin影响父元素)

    这个问题是CSS2.1的盒模型中规定的内容——Collapsing margins: In this specif...

  • 请描述BFC、及其如何工作

    1.背景介绍 BFC全称是Block Formatting Context,是CSS2.1规范定义的,关于CSS渲...

  • 什么是BFC?

    概述: 全称:Block Formatting Context,块格式上下文。它是CSS2.1规范定义的关于CSS...

网友评论

      本文标题:CSS2.1

      本文链接:https://www.haomeiwen.com/subject/trkmwqtx.html