純樣式無腳本無圖片自定義單/覆選框

来源:http://www.cnblogs.com/xyzhanjiang/archive/2016/08/25/5808335.html
-Advertisement-
Play Games

單選/覆選框是 Web 應用常用控制項,隨處可見,原生的單/覆選框控制項的外觀一般都不怎麼美觀,有些時候,原生的控制項模樣並不能滿足設計要求,這時需要更為精緻的控制項樣式,我們更希望其樣式可以允許自定義。 CSS3 新增了一個偽類選擇器 ,用於選擇被勾選的單/覆選框,利用該選擇器可以分別為未選中和選中狀態的 ...


單選/覆選框是 Web 應用常用控制項,隨處可見,原生的單/覆選框控制項的外觀一般都不怎麼美觀,有些時候,原生的控制項模樣並不能滿足設計要求,這時需要更為精緻的控制項樣式,我們更希望其樣式可以允許自定義。

CSS3 新增了一個偽類選擇器 :checked,用於選擇被勾選的單/覆選框,利用該選擇器可以分別為未選中和選中狀態的單/覆選框應用不同的樣式,怎麼給它應用樣式呢?直接修改單/覆選框的樣式比較困難,不過可以使用一些其它方法來實現。

單選/覆選框作為一個表單控制項,可以使用一個 <label> 元素與之關聯,將 <label> 元素的 for 屬性指向覆選框的 id 屬性,這裡使用一個覆選框來舉例說明:

<input id="example-checkbox" type="checkbox">
<label for="example-checkbox">Check</label>

此時,每次點擊這個 <label> 元素會發現覆選框的選擇狀態也會變化,測試表明,點擊關聯某個單/覆選框的 <label> 時,產生的效果和點擊單/覆選框自身相同。然後,因為 <label> 元素緊鄰在單/覆選框之後,通過組合使用相鄰元素選擇器(Adjacent sibling selector),我們可以把相應的樣式應用到 <label> 元素上去,相比較而言,給 <label> 元素應用樣式要比給原生的單/覆選框應用樣式簡單多了。

相鄰元素選擇器,在兩個選擇器中間添加一個加號,像這樣 selector1 + selector2,表示選擇 selector1 元素之後緊鄰的 selector2 元素:

input[type="checkbox"] + label {
  /* 未選中狀態 */
}

input[type="checkbox"]:checked + label {
  /* 選中狀態 */
}

為了不對 <label> 元素自身的樣式造成影響,這裡使用生成內容偽元素(::before/::after)來應用單/覆選框的自定義樣式,首先使用 ::before 偽元素來生成覆選框的外框樣式:

input[type="checkbox"] + label::before {
  background-color: #fff;
  border: 1px solid #50a7f8;
  border-radius: 3px;
  content: "\00a0";
  height: 13px;
  left: 0;
  position: absolute;
  width: 13px;
}

然後使用 ::after 偽元素來生成覆選框中間的勾的樣式,用一個矩形只應用左邊框和下邊框,然後逆時針旋轉 45 度即可做成一個簡單的勾形:

input[type="checkbox"] + label::after {
  background: transparent;
  border: 0 solid #50a7f8;
  border-width: 0 0 3px 3px;
  content: "\00a0";
  height: 3px;
  left: 3px;
  position: absolute;
  top: 3px;
  transform: scale(0) rotate(-45deg);
  transition: transform 0.2s linear;
  width: 6px;
}

為了在沒有勾選的時候不顯示這個勾,這裡用 transform: scale(0) 來隱藏了這個勾,當覆選框被勾選的時候才顯示出來:

input[type="checkbox"]:checked + label::after {
  transform: scale(1) rotate(-45deg);
}

這裡使用了絕對定位,所以給 <label> 元素增加一個相對定位,併在左邊預留一定的空間:

input[type="checkbox"] + label {
  min-height: 20px;
  padding-left: 20px;
  position: relative;
}

原生的控制項可以把它隱藏掉了:

input[type="checkbox"] {
  display: none;
}

不過這樣隱藏後就不能通過 Tab 鍵來與控制項交互了,所以可以用另外的方法來隱藏控制項,比如設置不透明度為 0:

input[type="checkbox"] {
  opacity: 0;
  position: absolute;
}

進一步,可以定義控制項獲取焦點時以及控制項禁用時的樣式:

input[type="checkbox"]:focus + label::before {
  outline: 1px dotted #aaa;
}

input[type="checkbox"]:disabled + label::before {
  background-color: #eee;
  border-color: #aaa;
}

input[type="checkbox"]:disabled + label::after {
  border-color: #aaa;
}

更進一步,給勾選添加過渡效果:

input[type="checkbox"] + label::after {
  transition: transform 0.2s linear;
}

單選框

和覆選框一樣,只是把自定義樣式中的外框換成圓形外框,內部的勾換成一個實心圓:

<input id="example-radio" type="radio">
<label for="example-radio">Check</label>

HTML 結構是一樣,樣式也是類似:

input[type="radio"] {
  opacity: 0;
  position: absolute;
}

input[type="radio"] + label {
  min-height: 20px;
  padding-left: 20px;
  position: relative;
}

input[type="radio"] + label::before {
  background-color: #fff;
  border: 1px solid #50a7f8;
  border-radius: 50%;
  content: "\00a0";
  height: 13px;
  left: 0;
  position: absolute;
  top: 0;
  width: 13px;
}

input[type="radio"] + label::after {
  background: #50a7f8;
  border-radius: 50%;
  content: "\00a0";
  height: 9px;
  left: 3px;
  position: absolute;
  top: 3px;
  transform: scale(0);
  transition: transform .2s linear;
  width: 9px;
}

input[type="radio"]:checked + label::after {
  transform: scale(1);
}

input[type="radio"]:focus + label::before {
  outline: 1px dotted #aaa;
}

input[type="radio"]:disabled + label::before {
  background-color: #eee;
  border-color: #aaa;
}

input[type="radio"]:disabled + label::after {
  background-color: #aaa;
}

這篇文章里用到了很多種類的選擇器,詳情可以參考Selectors Level 3

我將這篇文章里涉及到的內容整合成了一個插件,Radio 歡迎吐槽。

參考資料


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

-Advertisement-
Play Games
更多相關文章
  • 觀察者模式 觀察者模式也叫“訂閱者/發佈者”模式,定義對象間的一種一對多的依賴關係,發佈者可以向所有訂閱者發佈消息。 觀察者模式被廣泛地應用於JavaScript客戶端編程中。所有的瀏覽器事件(mouseover,keypress等)都是使用觀察者模式的例子。 使用這個模式的最主要目的就是促進對象之 ...
  • 問題描述 最近在做移動項目時遇到一個頁面滾動穿透問題,具體場景是這樣的,在一個可滾動的列表頁中彈出一個蒙層,蒙層中的內容是可滾動的,底部的父頁面理論上是不可滾動的,但是當滑動蒙層內容時,底部父頁面會跟隨滾動,這就是頁面滾動穿透的問題。這個是比較常見的問題,基本都會遇到,Google一下出解決方案也是 ...
  • 1、安裝node-v6.3.0-x64,安裝成功後再點擊node-v6.3.0-x64卸載(點擊remove)。 2、安裝node-v4.4.7-x64。 3、打開cmd命令行,輸入node -v,查看下版本,如果有顯示版本,說明已經安裝成功。 4、輸入npm -v,查看下npm的版本,如果有顯示版 ...
  • 其實今天的分享很簡單,只要你簡單瞭解Jq拓展方法,只要你會遍歷元素,那就能自己封裝出來。在工作中正是因為有了一個個這樣的方法,大大提升了我們的工作效率,減小了失誤次數。但是我們往往又經常使用別人封裝好的方法,這就很不爽了。 希望熱愛技術的園友們今後都能做一個,自己封裝方法,給整個公司用的人。 再也不 ...
  • indexOf去重 Array.prototype.unique1 = function() { var arr = []; for (var i = 0; i < this.length; i++) { var item = this[i]; if (arr.indexOf(item) -1) { ...
  • 代理模式、中介者模式 代理模式 在面向對象設計中,有一個單一職責原則,指就一個類(對象、函數)而言,應該僅有一個引起它變化的原因。如果一個對象承擔了過多的職責,就意味著它將變得巨大,引起它變化的原因就多,它把這些職責耦合到了一起,這種耦合會導致程式難於維護和重構。 這時候,我們可以把該對象(本體)的 ...
  • 1. 開始使用 canvas 元素 canvas 元素非常簡單,這是指它所有的功能都體現在一個JavaScript對象上,因此該元素本身只有兩個屬性:width 和 height。 canvas 元素里的內容會在瀏覽器不支持此元素時作為備用內容顯示。下麵例子展示了canvas 元素和一些簡單的備用內 ...
  • 0.環境準備 (1)過渡需要瀏覽器的支持,使用這些屬性要加上瀏覽器廠商的首碼,我用的chrome49已經不需要首碼了, -o- Opera -webkit- Safari、Chrome -moz- Firefox -ms- IE (2) css p { height:15px;/*類似於高度這種屬性 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...