zoukankan      html  css  js  c++  java
  • CSS小结

    最近再次读了《精通CSS 高级Web标准解决方案》,有了项目经验以及一些踩过的坑让我对CSS的理解更为深刻一些,借此机会将原文更新一下,以此来记录我的理解之路。(づ ̄ 3 ̄)づ    

    1.基本概念

    1.什么是 CSS?


    1. CSS 指层叠样式表 (Cascading Style Sheets)
    2. 样式定义如何显示 HTML 元素
    3. 样式通常存储在样式表中
    4. 把样式添加到 HTML 中,是为了解决内容与表现分离的问题
    5. 外部样式表可以极大提高工作效率
    6. 外部样式表通常存储在 CSS 文件中
    7. 多个样式定义可层叠为一

    2.如何插入样式表


    插入样式表的方法有三种:

    • 外部样式表
    • 内部样式表
    • 内联样式

    1.外部样式表

    当样式需要应用于很多页面时,外部样式表将是理想的选择。在使用外部样式表的情况下,你可以通过改变一个文件来改变整个站点的外观。每个页面使用<link>标签链接到样式表。<link>标签在(文档的)头部:

    <head>

    <link rel="stylesheet" type="text/css" href="mystyle.css">

    </head>

    浏览器会从文件 mystyle.css 中读到样式声明,并根据它来格式文档。

    外部样式表可以在任何文本编辑器中进行编辑。文件不能包含任何的 html 标签。样式表应该以 .css 扩展名进行保存。下面是一个样式表文件的例子:

    hr {color:sienna;}

    p {margin-left:20px;}

    body {background-image:url("/images/back40.gif");}

    不要在属性值与单位之间留有空格。假如你使用 "margin-left: 20 px" 而不是 "margin-left: 20px" ,它仅在 IE 6 中有效,但是在 Mozilla/Firefox 或 Netscape 中却无法正常工作。

    2.内部样式表

    当单个文档需要特殊的样式时,就应该使用内部样式表。你可以使用<style>标签在文档头部定义内部样式表,就像这样:

    <head>

    <style>

    hr {color:sienna;}

    p {margin-left:20px;}

    body {background-image:url("images/back40.gif");}

    </style>

    </head>

    3.内联样式

    由于要将表现和内容混杂在一起,内联样式会损失掉样式表的许多优势。请慎用这种方法,例如当样式仅需要在一个元素上应用一次时。

    要使用内联样式,你需要在相关的标签内使用样式(style)属性。Style 属性可以包含任何 CSS 属性。本例展示如何改变段落的颜色和左外边距:

    <p style="color:sienna;margin-left:20px">This is a paragraph.</p>

    4.多重样式

    如果某些属性在不同的样式表中被同样的选择器定义,那么属性值将从更具体的样式表中被继承过来。

    多重样式将层叠为一个

    样式表允许以多种方式规定样式信息。样式可以规定在单个的 HTML 元素中,在 HTML 页的头元素中,或在一个外部的 CSS 文件中。甚至可以在同一个 HTML 文档内部引用多个外部样式表。

    5.多重样式将层叠为一个——层叠次序

    一般而言,所有的样式会根据下面的规则层叠于一个新的虚拟样式表中,其中数字 4 拥有最高的优先权。

    1. 浏览器缺省设置
    2. 外部样式表
    3. 内部样式表(位于<head>标签内部)
    4. 内联样式(在 HTML 元素内部)
    5. !important的用户样式

    因此,内联样式(在 HTML 元素内部)拥有最高的优先权,这意味着它将优先于以下的样式声明:标签中的样式声明,外部样式表中的样式声明,或者浏览器中的样式声明(缺省值)。

    Remark提示:如果你使用了外部文件的样式在<head>中也定义了该样式,则内部样式表会取代外部文件的样式。

    2.重点概念

    2.1 选择器


    选择器通常是您需要改变样式的 HTML 元素(标签)。

    每条声明由一个属性和一个值组成。

    属性(property)是您希望设置的样式属性(style attribute)。每个属性有一个值。属性和值被冒号分开。

    用来去找到需要设置样式的元素。

    2.1.1 常用选择器

    1.元素选择器(类型选择器或简单选择器):

    p {color: black;}
    

    2.后代选择器

    选择特定元素或元素组的所有后代,由两个选择器之间的空格表示:

    blockquote p {padding-left: 2em;}
    

    3.ID选择器与类选择器

    用于查找具有制定ID或类名的元素,ID选择器由#开头,类选择器由一个点号表示。

    #intro {font-weight: bold;}
    .date-posted (color: #ccc;)

    注意:

    1. ID选择器只能用一次。
    2. ID属性不要以数字开头,数字开头的ID在 Mozilla/Firefox 浏览器中不起作用。
    3. 类名的第一个字符不能使用数字!它无法在 Mozilla 或 Firefox 中起作用。

    4.伪类

    常用的伪类有:(链接伪类,只能用于锚元素):link,:visited;(动态伪类,理论上可以应用于任何元素):hover,:active,:focus

    通过把伪类连接在一起,可以创建为复杂的行为,比如在已访问链接和未访问链接上实现不同的鼠标悬停效果。

    a:visited:hover {color: olive;}
    

    2.1.2 通用选择器

    他的作用就像是通配符,匹配所有可用的元素,由*表示,在与其他选择器结合使用时,可以用来对某个元素的所有后代应用样式,或跳过若干级后代。

    * {
        padding:  0;
        margin: 0;
    }
    

    2.1.3 高级选择器

    1. 子代选择器与相邻同胞选择器

    a. 子选择器用于选择元素的直接后代(后代选择器是选择元素的所有后代)。

    #nav>li{
        background: url(folder.png) no-repeat left top;
    }
    

    id="nav" 的直接后代<li>都被套用图标。

    b. 相邻同胞选择器用于定位同一个父元素下某个元素之后的元素

    h2 + p {
        font-size: 1.4em;
    }
    

    上述代码将紧挨h2的p元素字体大小设置为1.4em。

    注意:IE7中如果父元素与子元素之间有HTML注释,就会有问题。

    2. 属性选择器

    可以根据某个属性是否存在或属性的值来寻找元素

    <p>The term <acronym title="self-contained underwater breathing apparatus">SCUBA</acronnym> is an acronym rather than an abbreviation as it is pronounced as a word.</p>
    
    acronym[title] {
        border-bottom: 1px dotted #999;
    }
    

    提醒:在对于站点功能或布局很重要的任何元素上,都应该避免使用这些高级选择器。

    2.1.4 特殊的选择器格式

    多标签选择器一般和html上下文有关,它有以下集中分类

    1. 选择一个祖先的所有子孙节点,例如 div p{…}
    2. 选择一个父元素的所有直属节点,例如 div > p{…}
    3. 选择某一个元素紧挨着的兄弟节点,例如 li + li{…}
    4. 选择某一个元素的所有同胞节点,例如 span ~ a{…}
    5. 以上各种情况的组合应用(不要组合过于复杂,编码讲求可读性第一)

    要解决以上问题,我们需要引入一个概念——特指度(specificity)。特指度表示一个css选择器表达式的重要程度,可以通过一个公式来计算出一个数值,数越大,越重要。

      这个计算叫做“I-C-E”计算公式,

    1. I——Id;
    1. C——Class;
    1. E——Element;

      即,针对一个css选择器表达式,遇到一个id就往特指度数值中加100,遇到一个class就往特指度数值中加10,遇到一个element就往特指度数值中加1。

      下面举几个css表达式的特指度计算结果,大家也自己算一算,是不是对:

    CSS选择器表达式

    特指度计算结果

    p

    1

    p.large

    11

    P#large

    101

    div p#large

    102

    div p#large ul.list

    113

    div p#large ul.list li

    114

      还有一个重点要注意:!important优先级最高,高于上面一切。* 选择器最低,低于一切。

      哪个的计算结果大,浏览器就会以哪个为优先。

    2.1.5 简版规则

      如果你嫌上面的计算过于复杂,有一个简版规则。它只有三个规则,这三个规则能覆盖大多数情况,而且比较好记。

      规则一,包含ID的选择器胜过包含Class的选择器,包含Class的选择器胜过包含元素的选择器;

      规则二,不同选择器的特指度比较时,不区分加载的顺序(相同选择器在层叠时,后加载的覆盖前加载的); 

      规则三,设置的样式高于继承的样式,不用考虑特指度。

      其实,大部分情况下,你通过这个简版的规则,即可判断选择器的优先级。

    2.2 盒式模型


    基本概念在此不赘述,如有疑问请自行谷歌(=W=),在此说一些比较特别的点。

    外边距叠加

    当两个或更多垂直外边距相遇时,它们会形成一个外边距。这个外边距的高度等于两个叠加的外边距的高度中的较大者。

    外边距甚至可以与本身发生叠加,但是只有普通文档流中块框的垂直外边距才会发生外边距叠加。行内框、浮动框或绝对定位框值之间的外边距不会叠加。

    2.3 定位概述


    2.3.1 可视化格式模型

    CSS中有3种基本的定位机制:普通流、浮动和绝对定位。默认所有框都在普通流中定位。

    块级框从上到下一个一个地垂直排列,框之间的处置距离由框的垂直外边距计算出来,但是行内距的垂直内边距、边框和外边距不影响行内框的高度,除非去设置行高。

    2.3.2 相对定位

    对一个元素进行相对定位,它将出现在相对于元素在文档流中的初始位置上

    2.3.3 绝对定位

    绝对定位使元素的位置与文档流无关,因此不占据空间。普通文档流中其他元素的布局就像绝对定位的元素不存在一样。

    它的位置是相对于距离它最近的那个已定位的祖先元素,如果没有已定位的祖先元素,那么它的位置是相对于初始包含块的。可能是画布或是HTML元素。

    可以通过设置z-index属性来控制这些框的叠放次序,值越高,框在栈中的位置就越高。

    2.3.4 浮动

    浮动的框可以左右移动,直到它的外边缘碰到包含框或另一个浮动框的边缘。因为浮动框不在文档的普通流中,所以文档的普通流中的块框表现得就像浮动框不存在一样。

    如果浮动的元素后面有一个文档流中元素,那么这个元素的框会表现得就像浮动框不存在一样。但是,框的文本内容会受到浮动元素的影响,会移动以留出空间。

    在此强调一点:它的设计初衷是为了解决文字的环绕效果,所以在设计时勿忘初心(⁄(⁄ ⁄•⁄ω⁄•⁄ ⁄)⁄)

    其中最为重要的便是浮动的清除,下次再说吧♪(^∇^*)

  • 相关阅读:
    leetcode-Rotate Image
    leetcode- Rotate Array
    leetcode- Remove Element
    项目小结
    java到底有哪些重要知识点???
    js学习笔记 -- await/ async
    js学习笔记 -- Promise
    js学习笔记 -- 函数
    js学习笔记 -- 随记
    4、栈的实现:顺序存储和链式存储
  • 原文地址:https://www.cnblogs.com/nanchen/p/4788138.html
Copyright © 2011-2022 走看看