CSS3基礎學習之選擇器篇

来源:http://www.cnblogs.com/qieguo/archive/2016/04/12/5382002.html
-Advertisement-
Play Games

在CSS3中是提倡使用選擇器來將樣式與元素直接綁定在一起的。 網頁開發過程中,我們需要定義很多class來應用到不同的元素上,由於class本身是沒有語義而且是可以復用的,所以過度使用class會使得整個樣式表結構非常混亂。為了減少class的使用頻度,需要儘可能的使用選擇器來指定元素。而且使用選擇 ...


    在CSS3中是提倡使用選擇器來將樣式與元素直接綁定在一起的。

    網頁開發過程中,我們需要定義很多class來應用到不同的元素上,由於class本身是沒有語義而且是可以復用的,所以過度使用class會使得整個樣式表結構非常混亂。為了減少class的使用頻度,需要儘可能的使用選擇器來指定元素。而且使用選擇器還可以定義很多規則,這樣也可以減少重覆定義class的代碼量。

    在CSS3中,主要有以下幾種選擇器:屬性選擇器、結構性選擇器、UI狀態選擇器、通用兄弟元素選擇器。下麵分別介紹一下:

    (一)屬性選擇器

     顧名思義,屬性選擇器就是根據各種屬性來選定目標的。通常我們還會結合通配符來使用屬性選擇器。表達式為:[attr=val] {樣式內容},常用通配符有以下3個:

    1) [ attr*=val ] 返回'attr'屬性中包含val字元串的所有元素。如[id*=section]可選中#section1、#subsection,不能選中sec-tion。

    2) [ attr^=val ] 返回'attr'屬性以val字元串開頭的所有元素。如[id*=section]可選中#section1、不能選中#subsection。

    3) [ attr$=val ] 返回'attr'屬性以val字元串結尾的所有元素。如[id*=section]可選中#subsection、不能選中#section1。

    屬性選擇器規則簡單,但是使用非常靈活多變,恰當使用可以對代碼起到很好的精簡。

    (二)結構性選擇器

    在CSS中,除了我們自定義的類選擇器外,還有CSS已經定義好的選擇器,如a元素上的a:link, a:visited, a:hover, a:active這些狀態偽類。可以結合類來使用,表達式:選擇器 類名:偽類/偽元素{樣式內容}。在CSS中結構性選擇器如下(引自http://www.w3school.com.cn/):

選擇器例子例子描述CSS
first-line p:first-line 選擇每個 <p> 元素的首行。 1
:first-letter p:first-letter 選擇每個 <p> 元素的首字母。 1
:before p:before 在每個 <p> 元素的內容之前插入內容。 2
:after p:after 在每個 <p> 元素的內容之後插入內容。 2
:root :root 選擇文檔的根元素。 3
:empty p:empty 選擇沒有子元素的每個 <p> 元素(包括文本節點)。 3
:target #news:target 選擇當前活動的 #news 元素。 3
:not(selector) :not(p) 選擇非 <p> 元素的每個元素。 3
:first-child p:first-child 選擇屬於父元素的第一個子元素的每個 <p> 元素。 2
:last-child p:last-child 選擇屬於其父元素最後一個子元素每個 <p> 元素。 3
:only-child p:only-child 選擇屬於其父元素的唯一子元素的每個 <p> 元素。 3
:nth-child(n) p:nth-child(2) 選擇屬於其父元素的第二個子元素的每個 <p> 元素。 3
:nth-last-child(n) p:nth-last-child(2) 同上,從最後一個子元素開始計數。 3
:first-of-type p:first-of-type 選擇屬於其父元素的首個 <p> 元素的每個 <p> 元素。 3
:last-of-type p:last-of-type 選擇屬於其父元素的最後 <p> 元素的每個 <p> 元素。 3
:only-of-type p:only-of-type 選擇屬於其父元素唯一的 <p> 元素的每個 <p> 元素。 3
:nth-of-type(n) p:nth-of-type(2) 選擇屬於其父元素第二個 <p> 元素的每個 <p> 元素。 3
:nth-last-of-type(n) p:nth-last-of-type(2) 同上,但是從最後一個子元素開始計數。 3

    這裡選一些常用的有內容的選擇器來說一下。

    1)befor和after選擇器:通常會配合content使用,在被選元素內(添加到該元素內的innerHTML)的前後添加content。

 1 <!DOCTYPE html>
 2   <html>
 3   <head>
 4     <meta charset="UTF-8">
 5     <title>各種選擇器</title>
 6     <style type="text/css">
 7         h2:after {
 8            content: "(在後面添加文字,可以指定樣式)";
 9            color: blue;
10         }
11     </style>
12   </head>
13   <body>
14     <p>顯示效果:</p>
15     <div id="main">
16       <h2>第一個標題</h2>
17       <p>第1個段落</p>
18       <h2>第二個標題</h2>
19       <p>第2個段落</p>
20       <h2>第三個標題</h2>
21       <p>第3個段落</p>
22     </div>
23   </body>
24 </html>

如果有某些元素不加的話,可以為他們設置一個類,設置其content為none即可。h2.noadd:after { content: none; }

此外,content還可以是圖片url(pathname.png),不用img標簽而用content的好處可以不用編寫大量img標簽,常用於購物單上的新貨品,文章列表中的新文章等。

看到content的作用,當然大家都能想到他的一個重要用途就是為項目增加序號了,添加序號需要兩步:在content中指定couter,然後在目標元素的樣式表中定義couter屬性,比如couter-increment和counter-reset

 1 <!DOCTYPE html>
 2 <html>
 3   <head>
 4     <meta charset="UTF-8">
 5     <title>各種選擇器</title>
 6     <style type="text/css">
 7       h2:before { content: '第'counter(hcouter)'項'; color: red;}
 8       h2 { counter-increment: hcouter; counter-reset: pcouter;}
 9       p:before { content: '第'counter(pcouter)'段'; color: blue;}
10       p { counter-increment: pcouter; }
11     </style>
12   </head>
13   <body>
14     <span>顯示效果:</span>
15     <div id="main">
16       <h2>第一個標題</h2>
17       <p>段落</p>
18       <p>段落</p>
19       <p>段落</p>
20       <h2>第二個標題</h2>
21       <p>段落</p>
22       <p>段落</p>
23     </div>
24   </body>
25 </html>


在嵌套中要註意的是需要在子項目前設置counter-reset: 來為下級項目號重置couter,否則上文中的第2標題下的段落就從4開始了。

    2)target:使用target選擇器來對頁面中的target元素(ID被設置為頁面中的超鏈接來使用)指定樣式,樣式只有在用戶點擊了該鏈接,並且跳轉到target元素後起作用。

    3):nth-child(n),:nth-of-type(n):child與type的區別在於,child在統計子元素時是不分類型的,而type是區分類型的。舉個慄子:

 1 <!DOCTYPE html>
 2 <html>
 3     <head>
 4         <meta charset="UTF-8">
 5         <title>各種選擇器</title>
 6         <style type="text/css">
 7             h2:nth-child(2) { background-color: blue; }
 8             h2:nth-child(3) { background-color: grey; }
 9         </style>
10     </head>
11     <body>
12         <h2>第一個標題</h2>
13         <p>第1個段落</p>
14         <h2>第二個標題</h2>
15         <p>第2個段落</p>
16         <h2>第三個標題</h2>
17         <p>第3個段落</p>
18     </body>
19 </html>
View Code

頁面顯示:

    我們本意是要設置第2第3個<h2>標簽的背景色,而瀏覽器給出的結果卻把第二個h2改成了灰底,第3個h2完全沒作用。這是因為在統計h2父元素的child時是不分類型的,所以<p>也被算了進去。這樣的話,h2:child(2)就成了“<p>第1個段落</p>”,h2:child(3)就是“<h2>第二個標題</h2>”了。

為瞭解決這個問題,我們可以使用:nth-of-type(n)來指定元素類型就可以得到想要的結果了。

1 <style type="text/css">
2     h2:nth-of-type(2) { background-color: blue; }
3     h2:nth-of-type(3) { background-color: grey; }
4 </style>

    

另外(n)還可以參數化以實現迴圈模式,輸入xn+y指定x個數為一個迴圈,y取1~x代表迴圈里的x種類型,如3n+1,3n+2,3n+3(可簡寫成3n)。當x=2的時候就是奇偶項了,可以用單詞odd(奇數)even(偶數)表示,這個方法常用在列表或者表格背景色交替切換的場景。

 1 <!DOCTYPE html>
 2 <html>
 3     <head>
 4         <meta charset="UTF-8">
 5         <title>各種選擇器</title>
 6         <style type="text/css">
 7             ul.lis { 
 8                 width: 140px;
 9                 padding: 10px;
10                 margin: 0;
11             }
12             ul.lis li {
13                 list-style-type: none;
14                 white-space: nowrap;
15                 overflow: hidden;
16                 text-overflow: ellipsis;
17             }
18             ul.lis li:nth-child(odd) { background-color: aquamarine; }
19             ul.lis li:nth-child(even) { background-color: burlywood; }
20         </style>
21     </head>
22     <body>
23         <span>顯示效果:</span>
24         <div id="main">
25             <ul class="lis">
26                 交替顯示列表項目
27                 <li>列表項目1,奇數項目背景色</li>
28                 <li>列表項目2,偶數項目</li>
29                 <li>列表項目3</li>
30                 <li>列表項目4</li>
31             </ul>
32         </div>
33     </body>
34 </html>

    (三)UI狀態偽類選擇器

      CSS3還提供了11種UI元素狀態偽類選擇器,但各瀏覽器對UI元素狀態選擇器支持不同,如下圖:

    這些選擇器很大一部分是專為PC端設置的,主要是用在一些動態表單中。從屏幕尺寸和交互體驗上考慮,移動端頁面中一次呈現的表單元素應該儘可能少,因為輸入表單在移動端的體驗是比較差的(其實PC端也差!)。所以,在不多的內容裡面,不需要太多形式上的東西!

    (四)通用兄弟元素選擇器

     使用格式:子元素1 - 子元素2 {樣式內容}

     返回的是子元素1後面的所有與元素1同級的子元素2。這裡的選擇規則有兩個:元素1後面、同級的子元素2。

 

總結:選擇器規則不多,用法也相當簡單,難點在於如何選擇適當的選擇器組合。上述選擇器的優勢是精准定位,但同時擴充性就變差了,後續假如要更改結構增減元素的話,使用上述選擇器就有可能出現問題了。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 打包的目的和意義就不用敘述了直接上乾貨 http://www.gruntjs.net/getting-started裡面的教程也太簡單了,需要下一番功夫去研究才行。本文將grunt打包的常用方法都用實例描述,更加清晰易懂。 1. 第一個簡單的grunt打包 1)需要安裝nodejs:http://w ...
  • 所謂的瀏覽器相容性問題,是指因為不同的瀏覽器對同一段代碼有不同的解析,造成頁面顯示效果不統一的情況。在大多數情況下,我們的需求是,無論用戶用什麼瀏覽器來查看我們的網站或者登陸我們的系統,都應該是統一的顯示效果。所以瀏覽器的相容性問題是前端開發人員經常會碰到和必須要解決的問題。 在學習瀏覽器相容性之前 ...
  • sublime text3 是個很好的編輯工具,前端程式員覺得她很好,我是在一次視頻中看到她能幫助自動完成很多快捷的操作。 為什麼安裝? 如果想要給sublime text 中安裝別的插件(這裡稱呼為 包),那麼首先得先給她安裝個插件管理器,也就是包管理器 package control 怎麼安裝她... ...
  • 值得打一個helloworld好好紀念一下! <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>Document</title></head><body> <strong>HELLO WORLD</strong>< ...
  • 區分 DOM 屬性和元素屬性 區分 DOM 屬性和元素屬性 通常開發人員習慣將id,src,alt等叫做這個元素的"屬性"。我們將其稱為"元素屬性"。但是在解析成 DOM 對象時,實際瀏覽器最後會將標簽元素解析成"DOM 對象", 並且將元素的"元素屬性"存儲為"DOM 屬性",兩者是有區別的。 甚 ...
  • 《超實用的Node.js代碼段》連載一:獲取Buffer對象位元組長度 《超實用的Node.js代碼段》連載二:正確拼接Buffer Node.js是一種後起的優秀伺服器編程語言,它用來構建和運行Web應用,這和ASP.NET,Ruby on Rails或Spring框架做的工作是類似的。它使用Jav ...
  • 今天在使用bootbox做彈出提示遇到些麻煩,由於使用kendoWindow先彈出數據輸入視窗, 然後在檢核輸入時,又用bootbox做為提示視窗,這下悲劇了,後彈出的bootbox視窗總是在kendoWindow後面, 查了兩者的API文檔,均沒有設置的地方,木有辦法,只能自己搞了,使用調試工具查 ...
  • × 目錄 [1]定義 [2]漸變線 [3]色標 [4]重覆漸變 [5]多背景 [6]應用場景 [7]IE相容 前面的話 在CSS3出現之前,漸變效果只能通過圖形軟體設計圖片來實現,可拓展性差,還影響性能。如今已經進入CSS3標準的漸變可以很輕鬆的完成漸變效果。漸變實際上分為線性漸變和徑向漸變兩種,本 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...