层叠样式表

维基百科,自由的百科全书
跳转至: 导航搜索
层叠样式表
Preliminary CSS3 logo.
CSS3 标志
扩展名 .css
互联网媒体类型 text/css
開發者 World Wide Web Consortium
最初版本 1996年12月17日;17年前 (1996-12-17)
格式 样式表语言英语Style sheet language
标准 第一版
第二版
第二版第一次修订
第三版各模組目前的規格化進度與規格書連結
Html5 css3 styling.svg

层叠样式表

CSS動畫
IE盒模型缺陷
CSS filter
无表格网页设计
响应式网页设计
b:CSS
h:CSS

HTML
HTML.svg
Wikibooks-logo.svg
您可以在維基教科書中查找此百科条目的相關電子教程:

层叠样式表英语Cascading Style Sheets,简写CSS),又称串樣式列表階層式樣式表文件,一种用来为结构化文档(如HTML文档或XML应用)添加样式(字体、间距和颜色等)的计算机语言,由W3C定义和维护。目前最新版本是CSS2.1,为W3C的推荐标准。CSS3現在已被大部分現代瀏覽器支援,而下一版的CSS4仍在开发过程中。

優勢[编辑]

网页的讀者和作者都可以使用CSS来决定文件的颜色字体排版等显示特性。CSS最主要的目的是将文件的内容与显示分隔开来。这有许多好处:

  • 文件的可读性加强
  • 文件的结构更加灵活
  • 作者和读者可以自己决定文件的显示
  • 文件的结构简化了

另外,在HTML中:

  • 一个整个网站或其中一部分网页的显示信息被集中在一个地方,要改变它们很方便
  • 不同的读者可以有不同的样式,比如有的读者需要字体比较大
  • HTML文件本身的范围变小了,它的结构简单了,它不需要包含显示的信息

CSS还可以控制其他参数,例如声音(假如浏览器有阅读功能的话)或给視障者用的感受装置。

CSS位置[编辑]

CSS信息可以来自:

  • 作者样式
    • 作者可以在他的HTML文件中确定一个外来的、独立的CSS文件(外部样式表),其优先级最低
    • 作者可以将CSS信息包含在HTML文件内(内部样式表)
    • 作者可以在一个HTML指令内结合CSS指令(内联样式),其优先级最高。一般这样做是为了在特殊情况下,把上面来源的CSS抵消掉
  • 自定样式
    • 读者可以在他的浏览器内设立一个CSS文件。这个CSS文件可以用在所有的HTML文件上。假如作者的CSS文件与读者的相冲突,那么读者可以选择一个
  • 浏览器样式
    • 假如外部没有特别指定一个样式的话,一般浏览器自己有一个内在的样式

语法[编辑]

CSS由多組「規則」組成。每個規則由「選擇器」(selector)、「屬性」(property)和「值」(value)組成:

  • 選擇器(Selector):多個選擇器可以半形逗號(,)隔開。
  • 屬性(property):CSS1、CSS2、CSS3規定了許多的屬性,目的在控制選擇器的樣式。
  • 值(value):指屬性接受的設定值,多個關鍵字時大都以空格隔開。

屬性和值之间用半形冒號(:)隔开,屬性和值合称为「特性」。多个特性间用“;”隔开,最后用“{ }”括起来。

選擇器[编辑]

要針對沒有標籤定義範圍進行樣式設定時,可利用<div><span>標籤 於CSS裡現在共有5種基本選擇器(Basic Selectors)[1]和2种伪选择器。

基本選擇器[编辑]

  • 類型選擇器(h1,p等)——elementname
  • 類別選擇器(class)——.elementname
  • ID選擇器(ID)——#elementname
  • 萬用選擇器——* ns|* *|*
  • 屬性選擇器——[attribute]

偽元素選擇器[编辑]

偽元素可以選擇不在Document結構中的資訊。

属性 描述
:after ::after 元素之后
:before ::before 元素之前
:first-letter ::first-letter 文本第一个字母
:first-line ::first-line 文本首行
::selection 鼠标已选择(CSS3)

虛擬類別選擇器[编辑]

虛擬類別選擇器指的是为不同的状态、性质的元素。

属性 狀態
:link 超链接未被访问
:visited 超链接被访问过
:hover 滑鼠在元素上面
:active 滑鼠在元素上按着
:focus 焦點在元素上
:target 元素被URL標記(CSS 3新增的類別)
:lang 向带有指定lang属性的元素添加样式。

属性选择器[编辑]

屬性选择器允许用户自定义属性名称,而不仅仅限于id,class属性,参见[2]。屬性选择器共有7種[3][4]

代碼 意思
[attribute] 元素有attribute的屬性。
[attribute="value"] 屬性attribute裡是value
[attribute~="value"] 屬性attribute裡使用空白分開的字串裡其中一個是value
[attribute|="value"] 屬性attribute裡是value或者以value-开头的字符串
[attribute^="value"] 屬性attribute裡最前的是value
[attribute$="value"] 屬性attribute裡最後的是value
[attribute*="value"] 屬性attribute裡有value出現過至少一次

組合选择符[编辑]

CSS里现在共有4种組合选择符(Combinators):[1]

符号 标题文字
A > B 选择A下一层的元素B
A ~ B 选择与A同父层的元素B
A + B 选择与A相邻的元素B(不能被任何元素相隔)
A B 包含选择符

注釋[编辑]

CSS檔內也可以包含注釋,注釋放在/**/之间。

例子[编辑]

例子:

p{
    font-size: 110%;
    font-family: garamond, sans-serif;
}
h2{
    color: red;
    background: white;
}
.highlight{
    color: red;
    background: yellow;
    font-weight: bold;
}

在這個例子中有三個選擇器:ph2.highlightcolor: red是一個定義,其中color是屬性,redcolor的值。

在這裏HTML中的結構P(段落)和H2(2級標題)獲得了不同的樣式。每個段落的字體的大小比包含這個段落的結構的字體的大小要大10%,其字形是Garamond,假如Garamond沒有的話那麼使用一般的sans-serif字形。2級標題的字用紅色,底面是白色的。這個例子中的第三個規則規定了一個class的樣式。通過class屬性每個HTML結構都可以被指定為這個class,例如:

<P class="highlight">這個段落將被顯示為黃底紅字粗體。</P>

顯示為

這個段落將被顯示為黃底紅字粗體。

除使用<style>之外,也可於HTML內直接使用 style="/*CSS在這裡*/"

<div style="color:red; background:yellow; font-weight:bold;">
    這個段落同樣會被顯示為黃底紅字粗體。
</div>

缩写[编辑]

使用CSS缩写可以减少CSS文件的大小,并使其更为易读[5],例如:

1.颜色缩写:16进制的色彩值,如果每两位的值相同,可以进行缩写,例如:

  1. 000000可以缩写为#000,#336699可以缩写为#369;

2.盒尺寸缩写:Property: Value1 Value2 Value3 Value4;四个值依次表示Top,Right,Bottom,Left

3.边框缩写

边框的属性如下:

     border-width: 1px;
     border-style: solid;
     border-color: #000;

可以缩写为一句:

     border: 1px solid #000;

4.背景缩写

     background-color: #F00;
     background-image: url(background.gif);
     background-repeat: no-repeat;
     background-attachment: fixed;
     background-position: 0 0;

可以缩写为一句:

     background: #F00 url(background.gif) no-repeat fixed 0 0;

4.文字缩写

	font-weight: bold;
	font-size: 12px;
	line-height: 1.8em;
	font-family: Arial;

可以缩写为一句: 但文字縮寫一定要具有字型大小、字體樣式這兩個屬性。行高用/分隔

     font:bold 12px/1.8em Arial;

历史[编辑]

发展历史[编辑]

从1990年代初HTML被发明开始,样式表就以各种形式出现了,不同的浏览器结合了它们各自的样式语言,读者可以使用这些样式语言来调节网页的显示方式。一开始样式表是给读者用的,最初的HTML版本只含有很少的显示属性,读者来决定网页应该怎样被显示。

但随着HTML的成长,为了满足设计师的要求,HTML获得了很多显示功能。随着这些功能的增加外来定义样式的语言越来越没有意义了。

1994年哈坤·利提出了CSS的最初建议。伯特·波斯(Bert Bos)当时正在设计一个叫做「Argo」的浏览器,他们决定一起合作设计CSS。

当时已经有过一些样式表语言的建议了,但CSS是第一个含有“层叠”的主意的。在CSS中,一个文件的样式可以从其他的样式表中继承下来。读者在有些地方可以使用他自己更喜欢的样式,在其他地方则继承,或“层叠”作者的样式。这种层叠的方式使作者和读者都可以灵活地加入自己的设计,混合各人的爱好。

哈坤于1994年在芝加哥的一次会议上第一次展示了CSS的建议,1995年他与波斯一起再次展示这个建议。当时W3C刚刚建立,W3C对CSS的发展很感兴趣,它为此组织了一次讨论会。哈坤、波斯和其他一些人(比如微软的托马斯·雷尔登)是这个项目的主要技术负责人。1996年底,CSS已经完成。1996年12月CSS要求的第一版本被出版。

1997年初,W3C内组织了专门管CSS的工作组,其负责人是克里斯·里雷。这个工作组开始讨论第一版中没有涉及到的问题,其结果是1998年5月出版的第二版要求。到2007年为止,第三版还未完備。

版本歷史[编辑]

CSS1[编辑]

於1994年,哈坤·利伯特·波斯合作設計CSS。他們在1994年首次在芝加哥的一次会议上第一次展示了CSS的建议。

完全使用CSS做成的網頁

1996年12月发表的CSS1的要求有(W3C管理CSS1要求):

  • 支持字体的大小、字形、强调
  • 支持字的颜色、背景的颜色和其他元素
  • 支持文章特征如字母、词和行之间的距离
  • 支持文字的排列、图像、表格和其他元素
  • 支持边缘、围框和其他关于排版的元素
  • 支持id和class

CSS2-2.1[编辑]

1998年5月W3C发表了CSS2(W3C管理CSS2要求),其中包括新的内容如:

  • 绝对的、相对的和固定的定位元素、媒体型的概念、
  • 双向文件和
  • 一个新的字型。

CSS2.1修改了CSS2中的一些错误,删除了其中基本不被支持的内容和增加了一些已有的浏览器的扩展内容。要求候选者

CSS3[编辑]

CSS3正在发展中。W3C发表一个CSS3发展过程报告

CSS3的標誌。

CSS3 分成了不同類別,稱為「modules」。而每一個「modules」都有於 CSS2 中額外增加的功能,以及向後兼容。CSS3 早於1999年已開始制訂。[6]直到2011年6月7日, CSS 3 Color Module 終於發布為 W3C Recommendation。[7]

CSS3 裡增加了不少功能,如︰「border-radius」、「text-shadow」、「transform」以及「transition」。

div{
    border-radius:10px;
    text-shadow:0px 2px 2px #AAA;
    box-shadow:0px 3px 10px #AAA;
    transform:rotate(-15deg);
}
↑ 把 <div> 圓角半徑10像素px),反時針旋轉15度,加上2像素(px)的文字陰影,並加上10像素(px)的灰色陰影。

但由於現時不同瀏覽器仍需要加上不同的前綴,所以需要寫成這樣︰

div{
    -webkit-border-radius:10px;
    -moz-border-radius:10px;
    border-radius:10px;
 
    text-shadow:0px 2px 2px #AAA;
 
    -webkit-box-shadow:0px 3px 10px #AAA;
    -moz-box-shadow:0px 3px 10px #AAA;
    box-shadow:0px 3px 10px #AAA;
 
    -webkit-transform:rotate(-15deg);
    -moz-transform:rotate(-15deg);
    -ms-transform:rotate(-15deg);
    -o-transform:rotate(-15deg);
    transform:rotate(-15deg);
}
左侧 demo 的理想结果。
↑ 部分屬性在Firefox需要加上-moz-Safari以及Google Chrome需加上-webkit-Opera需加上-o-Internet Explorer 9裡部份需加上-ms-
這是一個CSS3 的示範。
連結︰
 維基百科
  • 上面是一個CSS3 的示範。注意div裡的連結仍可按下。
左侧 Demo 的理想结果。

CSS3 亦支援動畫(animation)及立體(preserved-3d)。但是現時(2012年)只有內有 Webkit 的瀏覽器如 SafariGoogle Chrome,基于 TridentInternet Explorer 10,和基于 GeckoFirefox (10 及以上版本)等浏览器支援。

CSS3 3D
連結︰
 維基百科

CSS4[编辑]

W3C於2011年9月29日開始了設計CSS4[8][9]。直至現時只有極少數的功能被部分網頁瀏覽器支援,如使用在HTML而非SVG上的pointer-events[10]

CSS4增加了一些更方便的方法以選擇不同元素︰

  • 選擇目標
$ul li.clicked {
    background: white;
}

CSS4裡其中一項新功能就是能夠定義於Selection Chain裡哪一個是目標[11]。於上例裡,ul前面加了一個$號,代表它就是要改變的目標,即「把裡面有liclassclicked)的ul的底色轉為白色。」

  • :matches()
:matches(div, p, nav) span{
  font-size: 18px;
}

CSS4裡其中另一項新功能就是能夠是用:matches()來簡化選擇器。上方的例子等如︰

div span, p span, nav span{
  font-size: 18px;
}

事實上現在已有瀏覽器支援類似的功能,如Firefox和Webkit︰[12]

/*Firefox使用-moz-前綴*/
-moz-any(div, p, nav) span{
  font-size: 18px;
}
/*Webkit使用-webkit-前綴*/
-webkit-any(div, p, nav) span{
  font-size: 18px;
}

採納的困難[编辑]

儘管CSS1規格1996年就完成了,但一直到三年後還沒有一個瀏覽器徹底實現了這些規格。2000年3月出版的微軟在麥金塔電腦上運行的Internet Explorer 5.0是第一個徹底貫徹CSS1的瀏覽器。此後許多其他瀏覽器也貫徹了CSS1和CSS2的一部分。但到2004年為止還沒有一個瀏覽器徹底貫徹了CSS2。尤其 aural 和 paged 等特性是被支持得最差的。

即使徹底貫徹了CSS1的瀏覽器也遇到了許多困難。許多CSS的貫徹互相矛盾、有錯或有其他稀奇古怪的地方。為了使他們的頁面在所有的瀏覽器中、在所有的系統上的顯示相同,作者往往要使用特別的技巧或解决特殊的困難。一個最著名的錯誤涉及到顯示方形的寬度,在Internet Explorer瀏覽器中方形的寬度的顯示有錯誤,其結果是方形的寬度在許多瀏覽器中被正確地顯示,但在Internet Explorer上方形的寬度太窄。雖然這個錯誤有解決的辦法,但它限制了其他一些功能(Internet Explorer 8.0已改善方形寬度顯示問題)。

作用[编辑]

CSS最重要的目标是将文件的内容与它的显示分隔开来。在CSS出现前,几乎所有的HTML文件内都包含文件显示的信息,比如字体的颜色、背景应该是怎样的、如何排列、边缘、连线等等都必须一一在HTML文件内列出,有时重复列出。CSS使作者可以将这些信息中的大部分隔离出来,简化HTML文件,这些信息被放在一个辅助的,用CSS语言写的文件中。HTML文件中只包含结构和内容的信息,CSS文件中只包含样式的信息。

比如HTML中H2标志这一个二级标题,它在级别上比一级标题H1低,比三级标题H3高。这些信息都是结构上的信息。

一般来说级别越高的标题其字体也越大,H1的字体最大,因为一般来说字体越大它表示的内容就越重要,此外一般标题都使用粗体字,来突出它们的重要性。一般来说H2使用粗体字,其字体比H3大,比H1小。这些信息是显示用的信息。

在CSS出现前,假如作者要确定H2标题的颜色、字形、大小或其他显示特征的话,他要使用HTML中的font或其他样式指令,光H2不够,因为H2只是一个结构指令。假如一个标题要用斜体字、红色的字符、白色的底色的话,作者要这样写:

<H2><font color="red" bgcolor="white"><i>使用CSS</i></font></H2>

这些显示用的指令使得一个HTML变得非常复杂,要維護也比较困难。假如所有的二级标题都要这样来显示的话,所有的二级标题的指令都要这么复杂。此外读者无法改变这些规定,假如一个读者更喜欢蓝色的标题的话,他无法改变标题的颜色,因为文件的作者特别规定了标题的颜色。

使用CSS的话H2指令只规定文章的结构,其显示由样式表来规定,上面的例子可以变成这样:

<H2>使用CSS</H2>

服从的样式表可以规定H2指令使用斜体字,红色字和白色背景:

H2 { color: red; background: white; font-style: italic; }

这样显示与内容就分开了(由于CSS的优点,W3C现在正在考虑将HTML中的许多显示用的指令废弃掉)。HTML只表达文章的结构,CSS表达所有的显示。CSS可以指示颜色、字形、排列、大小以及其他许多非视觉的表达方式,比如将一篇文件的内容读出来。

CSS样式信息可以包含在一个附件中或包含在HTML文件内。读者可以使用多个样式表,在重复的情况下他可以选择其中之一。不同的媒体可以使用不同的样式表。比如一个文件在荧光屏上的显示可以与在打印机中打印出来的显示不同。这样作者可以为不同的媒体设计最佳的显示方式。此外CSS的目标之一是让读者有更大的控制显示的自由。假如一个读者觉得斜体字的标题读起来很困难,他可以使用自己的样式表文件,这个样式表可以“层叠”使用,他可以只改变红色斜体字这个样式而保留所有其他的样式。

一个包含CSS的XHTML文件的例子[编辑]

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
               "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="zh">
<head>
    <style type="text/css">
    body{
        background:#fff;
        color:#777;
    }
    h1{
        font:bold italic sans-serif;
        color:green;
    }
    </style>
</head>
<body>
    <h1>这个句子用綠色、粗体和斜体字显示</h1>
    <p>普通字。</p>
    <h1 style="color:red; background:green;">
    这个句子用大的、红色斜体字在绿色背景上显示,通用的h1样式在这里被取代了。
    </h1>
    <h1 style="color: green;"><strong><em>这个句子用綠色、粗体和斜体字显示</em></strong></h1>
</body>
</html>

一个读者定义的样式表的例子[编辑]

文件 highlightheaders.css 的内容是:

H1 {color: white; background: orange !important; }
H2 {color: white; background: green !important; }

这样的文件被贮存在读者的计算机内,他在浏览器内记录下显示时使用这个文件。 !important 表示在显示时使用读者的规定,而不是作者的规定。

注意[编辑]

有時一個網頁的作者會濫用CSS。有些習慣於只使用HTML的作者可能會忽視CSS提供的可能性。比如有些習慣於使用HTML的顯示元素的作者可能會在所有的HTML文件內加入CSS樣式。這比將HTML顯示和結構指令混在一起是一個進步,但它還是有許多同樣的缺點,而且維護時的工作量與混合使用差不多。

CSS與其他程式語言有著一些共同的陷阱。尤其在命名CSS的 id 和 class 時,CSS作者常選擇一個比較有說明性的名稱而使用顯示特徵作為它們的名稱。比如一個作者可能使用「big-red」來命名一個用大紅字體的突出顯示的字節。在當時,對作者來說這個名稱可能是很直覺的,但假如後來作者決定突出顯示的字節應該使用綠色,而不是紅色的話,他的命名就有毛病了。在上面這個例子中,一個更合適的名稱應該是「emphasized」(強調),它描寫的是這個「class」的用意,而不是它是如何被顯示的。

另一個毛病是未記錄的、未定義的和往往會被遺忘的名稱。一個網頁作者可能會選擇上百個名稱。名稱如footer、footnote或者explanation、note、info、more可能是指同一回事。這樣許多重複的名稱就出現了。有時一個複雜的網站的設計者可能會結合HTML和CSS來解決這個問題,但這樣一來他又把內容與顯示黏有一起了,而且這樣一來這個文件就只適合於某一媒體了。(外部樣式表的一個大優點就是它是跨媒體的,因為不同的樣式可以特別適用於不同的輸出媒體。)

HTML本身的複雜性是另一個困難處。雖然大部分使用CSS的文件比傳統的使用表格的文件要整潔,但過分使用class和過於細膩的結構層次同樣使HTML變得繁庸。此外有的作者過分使用 div 元素。

另一個陷阱是為了解決常見的瀏覽器錯誤而引入特別的CSS樣式,這些樣式當然是為了除錯而引入的,但它們使一個CSS文件的維護性能降低,有時這樣的CSS文件的維護量甚至比過去的HTML文件的維護量還大。常見的特別CSS樣式多是針對Internet Explorer (尤其IE 6、IE7 等舊版本)的顯示錯誤而額外編寫。

有時一個作者可能會過度地使用CSS來決定他的文件應該怎樣被顯示,如:一個作者會決定隱藏超連結底下的橫線,這很容易做到,但對瀏覽者來說這可能會帶來不便。

有些新的CSS3 樣式尚未成為標準,因此在使用時需要加上前綴(Prefix),使其可以在採用不同排版引擎的瀏覽器中正確顯示。但于 Internet Explorer 10 Release Preview 起, transform, transition, animation 和 gradient 渐变等属性均可不加前缀。[13][14]例如使用transition 時,需要額外撰寫四行編碼:

-webkit-transition: height 0.2s linear; /* 針對使用WebKit排版引擎的瀏覽器,如Google Chrome、Apple Safari */
-moz-transition: height 0.2s linear; /* 針對使用Gecko排版引擎的瀏覽器,如Mozilla Firefox */
-o-transition: height 0.2s linear; /* 針對使用Presto排版引擎的瀏覽器,如Opera */
-ms-transition: height 0.2s linear; /* MSIE, 但 Release Preview 起可以不用前缀 */
transition: height 0.2s linear; /* CSS3標準,放最後 */

CSS 的大小因此增大,到這些 CSS 樣式不需前綴時,又需要額外花時間把它們刪除。

缺点[编辑]

CSS明顯的缺點包括:

  • 瀏覽器不同的支援
    瀏覽器对CSS的支持没有统一,造成不同的瀏覽器顯示效果不同。例如在微軟Internet Explorer 的舊版本6.0 ,有許多独有的CSS 2.0屬性,但錯誤顯示很多重要的屬性,例如:widthheight,和float[15]。許多CSS编写人員为了尽可能在常用的各个瀏覽器中達到一致的版面編排,要写很多针对各个浏览器的不同的CSS代码。当版面编排很复杂时,要在各个浏览器裏取得相同效果是不可能的。
  • CSS沒有父選擇器
    CSS選擇器無法提供元素的繼承性。先進的選擇器(例如XPath)有助於複雜的樣式設計。然而,瀏覽器的性能和增加彩現的問題,關係著父層選擇器,卻是CSS的工作群組拒絕建議的主要原因。
    CSS4則計劃包括類似功能。
  • 不能明確地指定繼承性
    樣式的繼承性,建立在瀏覽器中DOM元素的層級和具體的規則上,參照CSS2說明中的章節6.4.1。[16]
  • 垂直控制的局限
    元素的水平放置普遍地易於控制,垂直控制則不然。簡單來說,垂直地圍繞一個元素、頁尾的放置不能高於可見視窗(viewport,視窗或螢幕的可見範圍[17])的底部範圍。这需要複雜的樣式規則,或是規則簡單,但不被廣泛支援。
  • 没有算术功能
直至 CSS 2.1 的CSS沒有辦法明確簡單地进行计算(例如:margin-left: 10% - 3em + 4px;)。计算功能在很多情況下都是非常有用的,例如:總欄位中計算欄位的尺寸限制。無論如何,CSS WG[18]發表了CSS局限性的草案。IE 5至IE 7提供expression()函数(即所谓的CSS表达式)来执行计算功能,例如left: expression(document.body.offsetWidth - 110 + "px"); 。为了與CSS标准看齐,并且expression()函数性能差,微軟从IE 8开始停止支持此函数。但 CSS 3 中具有 calc() 表达式以执行计算功能[19][20]。例如:
p {
    margin: calc(1rem - 2px) calc(1rem - 1px) 
}
  • 缺乏唯一性
    同樣的效果可以用不同的屬性來完成,這对不少的CSS編寫人員造成困擾。例如positiondisplayfloat定義了不同的配置方式,而且不能有效的交替使用。一個display: table-cell元素不能指定float或是position: relative,因為指定float: left的元素不應該受到display效果的影響。再者,沒有考慮到新建立屬性所造成的影響,例如在表格中你應該使用border-spacing而不是margin-*來指定表格元素。這是因為依照CSS準則,表格內部元素是沒有邊界(margin)的。

参考文献[编辑]

參見[编辑]

外部链接[编辑]