整合營(yíng)銷服務(wù)商

          電腦端+手機(jī)端+微信端=數(shù)據(jù)同步管理

          免費(fèi)咨詢熱線:

          CSS美化單選框 radio 、多選框 checkbox 和 switch開關(guān)按鈕

          adio、checkbox和switch應(yīng)該是一個(gè)比較常用的html標(biāo)簽,尤其是在中后臺(tái)ERP系統(tǒng)里面更為常見。不過瀏覽器自帶的樣式不怎么好看,而且不同瀏覽器效果也不一樣。出于美化和統(tǒng)一視覺效果的需求,自定義樣式就被提出來了。

          實(shí)現(xiàn)思路

          純css實(shí)現(xiàn)的主要手段是利用label標(biāo)簽的模擬功能。label的for屬性可以關(guān)聯(lián)一個(gè)具體的input元素,即使這個(gè)input本身不可被用戶可見,有個(gè)與它對(duì)應(yīng)的label后,用戶可以直接通過和label標(biāo)簽交互來替代原生的input——而這給我們的樣式模擬留下了空間。簡(jiǎn)而言之就是:

          隱藏原生input,樣式定義的過程留給label (那為什么不直接改變checkbox的樣式?因?yàn)閏heckbox作為瀏覽器默認(rèn)組件,樣式更改上并沒有l(wèi)abel那么方便,很多屬性對(duì)checkbox都是不起作用的,比如background,而label在樣式上基本和div一樣'任人宰割')

          而在選擇事件上,由于css的“相鄰選擇符(E+F)”的存在,讓我們可以直接利用html的默認(rèn)checkbox,免去了js模擬選擇的麻煩。

          準(zhǔn)備知識(shí)

          DEMO的部分CSS3屬性只寫了webkit前綴,所以建議用webkit內(nèi)核的瀏覽器查看本頁(yè)案例,當(dāng)然只要你給樣式補(bǔ)上對(duì)應(yīng)的瀏覽器前綴,就可以實(shí)現(xiàn)更多樣式匹配

          HTML代碼:

           <!-- input的id必須有,這個(gè)是label進(jìn)行元素匹配所必需的 -->
           <!-- 可以看到每個(gè)input的id和label的“for”屬性對(duì)應(yīng)同一字符串 -->
          <input type="checkbox" id="checkbox01" />
          <label for="checkbox01"></label>
          
          <input type="checkbox" id="checkbox02" />
          <label for="checkbox02"></label>
          
          <input type="checkbox" id="checkbox03" />
          <label for="checkbox03"></label>
          
          <input type="checkbox" id="checkbox04" />
          <label for="checkbox04"></label>
          

          HTML構(gòu)建完成,接下來是對(duì)應(yīng)的css:

          /* 隱藏所有checkbox */
          input[type='checkbox'] {
           display: none;
          }
          /* 對(duì)label進(jìn)行模擬.背景圖片隨便拼湊的,不要吐槽品味*/
          /* transition效果是做個(gè)背景切換效果,這里單純演示而已,實(shí)際上這個(gè)過渡不加更自然*/
          label {
           display: inline-block;
           width: 60px;
           height: 60px;
           position: relative;
           background: url(//www.chitanda.me/images/blank.png);
           background-position: 0 0px;
           -webkit-transition: background 0.5s linear;
          }
          /* 利用相鄰選擇符和checkbox`:checked`的狀態(tài)偽類來模擬默認(rèn)選中效果(就是點(diǎn)擊后那個(gè)勾號(hào)的效果) */
          /*如果這段代碼注釋,點(diǎn)擊后將沒有任何反饋給用戶*/
          /*因?yàn)閘abel本身是沒有點(diǎn)擊后被選中的狀態(tài)的,checkbox被隱藏后,這個(gè)狀態(tài)只能手動(dòng)模擬*/
          input[type='checkbox']:checked+label {
           background-position: 0 -60px;
          }
          

          上面代碼看起來好像也可以了。不過仔細(xì)想想,貌似缺了點(diǎn)什么:選項(xiàng)對(duì)應(yīng)的提示文字

          對(duì)css不了解的新人可能這時(shí)候第一反應(yīng)就是在label后面用p標(biāo)簽或者span標(biāo)簽來添加文字。不過這種方式都不怎么優(yōu)雅。個(gè)人建議用css的::before和::after偽元素(::before和:before是一個(gè)東西。不過為了把“偽元素”和“偽類”區(qū)分出來,W3C建議的寫法是偽元素用::而偽類用:)

          /* 偽元素的生效很簡(jiǎn)單,定義`content`就好,其余的屬性和普通div一樣 */
          label::after {
           content: attr(data-name);
           /*利用attr可以減少css代碼量,data-name寫在html部分的label屬性里*/
           display: inline-block;
           position: relative;
           width: 120px;
           height: 60px;
           left: 100%;
           vertical-align: middle;
           margin: 10px;
          }
          

          當(dāng)然既然可以用::after模擬label的文字,那也就可以用::before模擬label的checkbox樣式,這里就不做解析了。

          這里提一下偽類和偽元素的區(qū)分:

          1)偽類:存在的意義是為了通過選擇器找到那些不存在于DOM樹中的信息以及不能被常規(guī)CSS選擇器獲取到的信息。 偽類由一個(gè)冒號(hào):開頭,冒號(hào)后面是偽類的名稱和包含在圓括號(hào)中的可選參數(shù)。

          常用的偽類:

          :active 向被激活的元素添加樣式。 
          :focus 向擁有鍵盤輸入焦點(diǎn)的元素添加樣式。 
          :hover 當(dāng)鼠標(biāo)懸浮在元素上方時(shí),向元素添加樣式。 
          :link 向未被訪問的鏈接添加樣式。 
          :visited 向已被訪問的鏈接添加樣式。 
          :first-child 向元素的第一個(gè)子元素添加樣式。 
          :checked 向選中的控件元素添加樣式
          

          2)偽元素:偽元素在DOM樹中創(chuàng)建了一些抽象元素,這些抽象元素是不存在于文檔語(yǔ)言里的(可以理解為html源碼);

          注意: css3為了區(qū)分偽類和偽元素,規(guī)定偽類前面有一個(gè)冒號(hào),偽元素前面有兩個(gè)冒號(hào)

          常用偽元素:

          關(guān)于偽元素的講解,可以參考CSS偽類與偽元素總是傻傻分不清,這份總結(jié)夠面試用了

          ::before 為作用元素的第一個(gè)子節(jié)點(diǎn)插入dom中
          ::after 為作用元素的最后一個(gè)子節(jié)點(diǎn)插入dom中
          
          • 同:都是通過選擇器為元素添加樣式
          • 異:偽元素會(huì)創(chuàng)建一個(gè)元素,但不是真正的Html元素,偽類相當(dāng)于為一個(gè)元素創(chuàng)建一個(gè)class樣式

          實(shí)例

          自定義radio

          html代碼:

          <input type="radio" id="radio">
          <label for="radio"></label>
          

          css代碼:

          input{
           display:none;
          }
          label {
           display: inline-block;
           width: 30px;
           height: 30px;
           border: 1px solid #333;
           border-radius: 50%;
           position: relative;
          }
          label::after {
           -webkit-transition: all .5s ease;
           -moz-transition: all .5s ease;
           -o-transition: all .5s ease;
           -ms-transition: all .5s ease;
           transition: all .5s ease;
           cursor: pointer;
           position: absolute;
           width: 16px;
           height: 16px;
           border-radius: 50%;
           top: 50%;
           left: 50%;
           margin-top:-8px;
           margin-left:-8px;
           z-index: 1;
           content: '';
           border:1px solid #333;
          }
          input:checked+label::after{
           background:red;
          }
          

          實(shí)現(xiàn)效果:

          點(diǎn)擊前和點(diǎn)擊后:

          自定義checkbox

          漂亮的checkbox長(zhǎng)這樣的,看著就很可愛

          我們可以不追求那么完美的樣式,可以實(shí)現(xiàn)下面簡(jiǎn)單好看的樣式就可以

          html代碼:

          <input type="checkbox" id="checkbox">
          <label for="checkbox"></label>
          

          css代碼:

          input{
           display:none;
          }
          label {
           display: inline-block;
           width: 30px;
           height: 30px;
           border: 1px solid #333;
           position: relative;
          }
          label::after {
           -webkit-transition: opacity .5s ease;
           -moz-transition: opacity .5s ease;
           -o-transition: opacity .5s ease;
           -ms-transition: opacity .5s ease;
           transition: opacity .5s ease;
           cursor: pointer;
           position: absolute;
           content: '';
           opacity: 0;
          }
          input:checked+label::after{
           border: 2px solid #d73d32;
           border-top: none;
           border-right: none;
           -webkit-transform: rotate(-45deg);
           -ms-transform: rotate(-45deg);
           transform: rotate(-45deg);
           width:20px;
           height:10px;
           top:50%;
           margin-top:-8px;
           left:50%;
           margin-left:-10px;
           opacity: 1.0;
          }
          

          實(shí)現(xiàn)效果:

          點(diǎn)擊前和點(diǎn)擊后:

          自定義switch

          繼續(xù)分享一個(gè)iOS風(fēng)格的switch開關(guān)按鈕,樣子也非常常見,如圖:

          主要是使用了<input ?type="checkbox">來模擬實(shí)現(xiàn),具體的HTML:

          html 代碼:

          <label><input class="mui-switch" type="checkbox"> 默認(rèn)未選中</label>
          
          <label><input class="mui-switch" type="checkbox" checked> 默認(rèn)選中</label>
          
          <label><input class="mui-switch mui-switch-animbg" type="checkbox"> 默認(rèn)未選中,簡(jiǎn)單的背景過渡效果,加mui-switch-animbg類即可</label>
          
          <label><input class="mui-switch mui-switch-animbg" type="checkbox" checked> 默認(rèn)選中</label>
          
          <label><input class="mui-switch mui-switch-anim" type="checkbox"> 默認(rèn)未選中,過渡效果,加 mui-switch-anim
          類即可</label>
          
          <label><input class="mui-switch mui-switch-anim" type="checkbox" checked> 默認(rèn)選中</label>
          

          在實(shí)際的使用中后來又增加了兩個(gè)過渡效果,分別加?mui-switch-animbg和mui-switch-anim?類即可,具體效果查看下面的demo頁(yè)面。

          CSS代碼(SCSS導(dǎo)出的,排版有些奇怪):

          css 代碼:

          剩下部分

          這里給出具體的css,方便大家復(fù)制本地實(shí)現(xiàn)

          <style>
           .mui-switch {
           width: 52px;
           height: 31px;
           position: relative;
           border: 1px solid #dfdfdf;
           background-color: #fdfdfd;
           box-shadow: #dfdfdf 0 0 0 0 inset;
           border-radius: 20px;
           border-top-left-radius: 20px;
           border-top-right-radius: 20px;
           border-bottom-left-radius: 20px;
           border-bottom-right-radius: 20px;
           background-clip: content-box;
           display: inline-block;
           -webkit-appearance: none;
           user-select: none;
           outline: none;
           }
           .mui-switch:before {
           content: '';
           width: 29px;
           height: 29px;
           position: absolute;
           top: 0px;
           left: 0;
           border-radius: 20px;
           border-top-left-radius: 20px;
           border-top-right-radius: 20px;
           border-bottom-left-radius: 20px;
           border-bottom-right-radius: 20px;
           background-color: #fff;
           box-shadow: 0 1px 3px rgba(0, 0, 0, 0.4);
           }
           .mui-switch:checked {
           border-color: #64bd63;
           box-shadow: #64bd63 0 0 0 16px inset;
           background-color: #64bd63;
           }
           .mui-switch:checked:before {
           left: 21px;
           }
           .mui-switch.mui-switch-animbg {
           transition: background-color ease 0.4s;
           }
           .mui-switch.mui-switch-animbg:before {
           transition: left 0.3s;
           }
           .mui-switch.mui-switch-animbg:checked {
           box-shadow: #dfdfdf 0 0 0 0 inset;
           background-color: #64bd63;
           transition: border-color 0.4s, background-color ease 0.4s;
           }
           .mui-switch.mui-switch-animbg:checked:before {
           transition: left 0.3s;
           }
           .mui-switch.mui-switch-anim {
           transition: border cubic-bezier(0, 0, 0, 1) 0.4s, box-shadow cubic-bezier(0, 0, 0, 1) 0.4s;
           }
           .mui-switch.mui-switch-anim:before {
           transition: left 0.3s;
           }
           .mui-switch.mui-switch-anim:checked {
           box-shadow: #64bd63 0 0 0 16px inset;
           background-color: #64bd63;
           transition: border ease 0.4s, box-shadow ease 0.4s, background-color ease 1.2s;
           }
           .mui-switch.mui-switch-anim:checked:before {
           transition: left 0.3s;
           }
           /*# sourceMappingURL=mui-switch.css.map */
          </style>
          

          如果你喜歡scss,那么代碼更加簡(jiǎn)潔

          @mixin borderRadius($radius:20px) {
           border-radius: $radius;
           border-top-left-radius: $radius;
           border-top-right-radius: $radius;
           border-bottom-left-radius: $radius;
           border-bottom-right-radius: $radius;
           }
           $duration: .4s;
           $checkedColor: #64bd63;
           .mui-switch {
           width: 52px;
           height: 31px;
           position: relative;
           border: 1px solid #dfdfdf;
           background-color: #fdfdfd;
           box-shadow: #dfdfdf 0 0 0 0 inset;
           @include borderRadius();
           background-clip: content-box;
           display: inline-block;
           -webkit-appearance: none;
           user-select: none;
           outline: none;
           &:before {
           content: '';
           width: 29px;
           height: 29px;
           position: absolute;
           top: 0px;
           left: 0;
           @include borderRadius();
           background-color: #fff;
           box-shadow: 0 1px 3px rgba(0, 0, 0, 0.4);
           }
           &:checked {
           border-color: $checkedColor;
           box-shadow: $checkedColor 0 0 0 16px inset;
           background-color: $checkedColor;
           &:before {
           left: 21px;
           }
           }
           &.mui-switch-animbg {
           transition: background-color ease $duration;
           &:before {
           transition: left 0.3s;
           }
           &:checked {
           box-shadow: #dfdfdf 0 0 0 0 inset;
           background-color: $checkedColor;
           transition: border-color $duration, background-color ease $duration;
           &:before {
           transition: left 0.3s;
           }
           }
           }
           &.mui-switch-anim {
           transition: border cubic-bezier(0, 0, 0, 1) $duration, box-shadow cubic-bezier(0, 0, 0, 1) $duration;
           &:before {
           transition: left 0.3s;
           }
           &:checked {
           box-shadow: $checkedColor 0 0 0 16px inset;
           background-color: $checkedColor;
           transition: border ease $duration, box-shadow ease $duration, background-color ease $duration*3;
           &:before {
           transition: left 0.3s;
           }
           }
           }
           }
          

          鏈接文章

          https://www.html.cn/archives/9274

          https://segmentfault.com/a/1190000003711140

          沒有覺得默認(rèn)的HTML 的SELECT 的下拉選擇框丑到爆呢,一點(diǎn)沒有讓人想看第二遍的欲望呢。

          Select-or-Die基于 jQuery 的下拉框美化插件來了(Select-or-Die 還另外提供了 3 套皮膚)

          GitHub地址:https://github.com/vestman/Select-or-Die/ (沒有下載地址的都是耍流氓)

          首先上效果圖

          select美化插件 圖片來源網(wǎng)絡(luò)

          Select-or-Die 的兼容性怎么樣?

          瀏覽器兼容:兼容 IE8 及以上 IE 瀏覽器和其他主流現(xiàn)代瀏覽器。

          jQuery 兼容:兼容 1.7 及以上版本。

          使用方法(這個(gè)才是重點(diǎn))

          1. 引入CSS 和JS

            <link rel="stylesheet" href="css/selectordie.css">

            <script src="js/jquery.min.js"></script>

            <script src="js/selectordie.min.js"></script>

          2. 綁定元素美化(JavaScript)

          $(function(){

          $('select').selectOrDie();

          });

          望收藏了我寫的文章的你同時(shí)可以關(guān)注一下“小海前端”,因?yàn)檫@些文章都是連載的,并且是經(jīng)過我系統(tǒng)的歸納過的。

          【技術(shù)等級(jí)】初級(jí)

          【承接文章】《CSS實(shí)現(xiàn)圖片精靈,原來要這樣使用背景屬性,前端設(shè)計(jì)師必備知識(shí)

          本文小海老師為大家講解利用CSS處理HTML中的列表,也就是CSS有關(guān)列表的屬性。本文屬于前端開發(fā)的初級(jí)教程,適合于剛剛開始接觸CSS技術(shù)的學(xué)習(xí)者。

          列表屬性是指可以對(duì)HTML中的<ol></ol>標(biāo)記對(duì)和<ul></ul>標(biāo)記對(duì)進(jìn)行樣式設(shè)置的屬性。這一組CSS屬性包括以下三個(gè):

          • list-style-type

          • list-style-image

          • list-style-position

          一、設(shè)置列表的項(xiàng)目符號(hào)或編號(hào):

          CSS技術(shù)使用 list-style-type 設(shè)置列表的項(xiàng)目符號(hào)或編號(hào)

          在HTML中,主要操作的列表有兩種:

          • 無序列表:用<ul></ul>標(biāo)記對(duì)實(shí)現(xiàn)。無序列表項(xiàng)中左側(cè)的標(biāo)識(shí)我們把它稱為“項(xiàng)目符號(hào)”。

          • 有序列表:用<ol></ol>標(biāo)記對(duì)實(shí)現(xiàn)。有序列表項(xiàng)中左側(cè)的標(biāo)識(shí)我們把它稱為“編號(hào)”。

          有序列表與無序列表

          CSS技術(shù)利用 list-style-type 屬性來設(shè)置HTML列表左側(cè)標(biāo)識(shí)的樣式。并且在CSS看來,<ul></ul>和<ol></ol>兩個(gè)標(biāo)記對(duì)不再進(jìn)行有序和無序的區(qū)分,使用list-style-type屬性設(shè)置為哪個(gè)取值,就是對(duì)應(yīng)的哪種列表。

          該屬性包括以下幾種取值:

          • none,列表項(xiàng)無標(biāo)記。

          • disc,默認(rèn)值,標(biāo)記為實(shí)心圓。

          • circle,標(biāo)記為空心圓。

          • square,標(biāo)記為實(shí)心方塊。

          • decimal,標(biāo)記為數(shù)字。

          • decimal-leading-zero,標(biāo)記為0開頭的數(shù)字(01、02、03 等)。

          • lower-roman,標(biāo)記為小寫羅馬數(shù)字(i、ii、iii等)。

          • upper-roman,標(biāo)記為大寫羅馬數(shù)字(I、II、III等)。

          • lower-alpha,標(biāo)記為小寫英文字母(a、b、c等)。

          • upper-alpha,標(biāo)記為大寫英文字母(A、B、C等)。

          二、使用自定義圖片來代替項(xiàng)目符號(hào)和編號(hào):

          CSS技術(shù)利用 list-style-image 屬性來設(shè)置列表左側(cè)的標(biāo)識(shí)為指定的圖片

          CSS技術(shù)利用 list-style-image 屬性來設(shè)置列表左側(cè)的標(biāo)識(shí)為指定的圖片。

          格式:list-style-image:url(Image_URL);

          例如:ul{list-style-image:url(../images/01.jpg);}

          三、設(shè)置列表中列表項(xiàng)的縮進(jìn):

          CSS技術(shù)利用 list-style-position 屬性來設(shè)置列表項(xiàng)的縮進(jìn)

          CSS技術(shù)利用 list-style-position 屬性來設(shè)置列表項(xiàng)的縮進(jìn)。

          該屬性包括以下兩種取值:

          • loutside,默認(rèn)值,列表項(xiàng)不縮進(jìn)。

          • linside,列表項(xiàng)縮進(jìn)。

          這個(gè)屬性使用在列表項(xiàng)<li></li>標(biāo)記對(duì)上的,不能用在<ol></ol>或<ul></ul>之上。

          文章預(yù)告

          下一篇文章中,小海老師會(huì)繼續(xù)為大家向下講解CSS屬性,下一次我們講解CSS中最為重要的一組屬性:定位屬性。這是CSS中非常常用的一組屬性,希望大家千萬不要錯(cuò)過!

          小海教材

          如果大家希望得到更加全面的關(guān)于HTML和CSS技術(shù)講解的內(nèi)容,可以私信我,我會(huì)免費(fèi)將小海老師自己編寫的HTML和CSS的PDF教材發(fā)給你,幫助你在前端開發(fā)的道路上闊步前行。

          小海聲明

          在頭條上發(fā)表的這些文章都是從前端開發(fā)的基礎(chǔ)開始一步一步講起的。我非常希望能有更多的前端開發(fā)初學(xué)者通過我寫的文章,逐步學(xué)到一定的知識(shí),甚至慢慢有了入門的感覺。這些文章都是我這幾年教學(xué)過程中的經(jīng)驗(yàn),每寫一篇時(shí)我都盡量把握好措辭,用簡(jiǎn)單易懂的語(yǔ)言描述,同時(shí)精心設(shè)計(jì)版面,讓版面更加豐富,激發(fā)閱讀興趣。所以,每一篇文章可能篇幅不長(zhǎng),但是都要耗費(fèi)小海老師很久的時(shí)間。

          希望收藏了我寫的文章的你同時(shí)可以關(guān)注一下“小海前端”,因?yàn)檫@些文章都是連載的,并且是經(jīng)過我系統(tǒng)的歸納過的。

          關(guān)注“小海前端”,我會(huì)繼續(xù)為大家奉上更加深入的前端開發(fā)文章,也希望更多的初學(xué)者跟著學(xué)下去,我們共同將前端開發(fā)的路努力堅(jiān)持的走下去。


          主站蜘蛛池模板: 精品福利视频一区二区三区| 亚洲一区视频在线播放| 国产人妖在线观看一区二区| 国产一区二区三区亚洲综合| 日韩精品一区二区三区色欲AV| 精品一区二区三区电影| 久久精品无码一区二区三区免费| 国产一区二区在线看| 激情爆乳一区二区三区| 亚洲熟妇AV一区二区三区宅男| 亚洲av无码一区二区三区不卡 | 中文字幕一区二区三匹| 亚洲成AV人片一区二区| 人妻少妇精品一区二区三区| 亚洲福利视频一区二区| 天天看高清无码一区二区三区| 白丝爆浆18禁一区二区三区| 日本一区免费电影| 福利一区二区在线| 一级毛片完整版免费播放一区| 日本夜爽爽一区二区三区| 又紧又大又爽精品一区二区| 无码8090精品久久一区| 国产精品一区在线观看你懂的| 中文字幕亚洲一区二区va在线| 国产一区二区三区高清在线观看| 国产在线无码一区二区三区视频| 亚洲综合av永久无码精品一区二区| 中文字幕永久一区二区三区在线观看 | 国产一区二区三区免费在线观看| 多人伦精品一区二区三区视频| 日本福利一区二区| 日韩精品一区二区午夜成人版| 亚洲AV日韩精品一区二区三区| 波多野结衣一区二区三区aV高清| 亚洲熟妇av一区二区三区漫画| 少妇特黄A一区二区三区| 亚洲乱码av中文一区二区| 国产精品日韩一区二区三区| 亚洲一区二区三区在线播放| 亚洲乱码国产一区三区|