前端開發:css技巧,如何設置select、radio 、 checkbox 、file這些不可直接設置的樣式 。


前言:

  都說程序員有三寶:人傻,錢多,死得早。博主身邊的程序“猿”一大半應了這三寶,這從側面說明了一個問題,只有理性是過不好日子的。朋友們應該把工作與生活分開,讓生活變得感性,讓工作變得理性,兩者相提並行,豈不快哉。咳,話題扯得有點遠,今天博主給大家寫一篇關於css如何設置select、radio 、 checkbox 、file樣式的問題,這里不涉及模擬框,僅介紹原生情況下如何做到自定義樣式,廢話不多說,賴次夠!

1.select與input file:

  相信大家都遇到過這樣的問題,大多數瀏覽器select選擇框不能被直接修改樣式,實在是不夠美觀,先看一下代碼:

    <style type="text/css">
            #box{ width: 500px; margin: 50px auto;}
            #box select{ width: 200px; height: 30px; border: 1px solid red;background: green;color: #ffffff;}
        </style>
        <div id="box">
            <select name="xuanxiang">
                <option value="">選項一</option>
                <option value="">選項二</option>
                <option value="">選項三</option>
            </select>
        </div>

這里把select設置成寬度200px,高度30px,邊框紅色,背景綠色,文字白色;

咱們來看看各大瀏覽器的顯示效果;

 

博主的win10系統鬧小情緒了,ie打不開 將就一下,總之我們可以看到,它最大的問題是右邊的箭頭,各有特色,另外彈出的框樣式也各不相同。

怎么樣屏蔽瀏覽器自帶的效果呢,樓主有一個小技巧教給大家,支持ie8及以上的瀏覽器。(e6是什么?可以吃嗎?)。

利用css中的“七層重疊法”,即網頁內容先后順序分別為:背景邊框 , 負值z-index , display:block , 浮動 , display:inline-block , z-index:auto , 正值z-index,

越往后在網頁中的層級越靠前,也就是說如果一個z-index值為1或者更高的話 它會遮擋掉他之前的所有元素。

利用這個法則以及opacity設置透明度,可以模擬一個樣式,這個樣式是自定義的。看下面的代碼

    <style type="text/css">
            #box{ width: 500px; margin: 50px auto; position: relative; }
            #box select{ width: 200px; height: 30px; position: relative; z-index: 1;  opacity: 0; } 
            .selectbg{position: absolute; left: 0;top: 0; width: 200px; height: 30px; border: 1px solid red;background: green;color: #ffffff; z-index: -1; line-height: 28px;text-indent: 10px; }
        
        </style>
        <div id="box">
            <select name="xuanxiang">
                <option value="">選項一</option>
                <option value="">選項二</option>
                <option value="">選項三</option>
            </select>
            <div class="selectbg">選項一</div>
        </div>

注意的幾個技巧:

  ① select透明度設置成0,而z-index是1。

  ② div被定位在box的左上角而select默認位置就是左上角 所以他們發生了重疊,因為select的透明度是0,它是被隱藏了,但實際上它是在最上層的;

看看這么做的效果:

nice 幾款瀏覽器顯示一致。此刻顯示的是class名為selectbg的div層,而點擊的則還是select;

這段代碼還有幾個問題,選擇后怎么使div文字跟隨改變?

 

改進一下上面的代碼,這里需要用到一點兒js代碼了:

<style type="text/css">
            #box{ width: 200px;height: 30px; margin: 50px auto; position: relative; }
            #box select{ width: 100%; height: 100%;position: absolute; left: 0;top: 0; z-index: 1;  opacity: 0; } 
            .selectbg{position: absolute; left: 0;top: 0; width: 100%; height: 100%; border: 1px solid red;background: green;color: #ffffff; z-index: -1; line-height: 28px;text-indent: 10px; }
            #box select option{ font-size: 12px; text-align: center; color: #666666; padding: 5px;}
        </style>
        <div id="box">
            <select name="xuanxiang">
                <option value="">選項一</option>
                <option value="">選項二</option>
                <option value="">選項三</option>
            </select>
            <div class="selectbg">選項一</div>
        </div>
            
        <script type="text/javascript">
            var oSelect = function(){
                $("select").on("change",function(){
                    $(this).next(".selectbg").html($(this).find("option:selected").text()); //$(this).find("option:selected").text() 意為獲取select選中的值 設置給selectbg
                });
            }
            oSelect();
        </script>

首先,將select也設置為絕對定位,box則接管背景與select的高寬設置;然后給select完成了它應該有的功能;

順便設置了下option的樣式,但是這個設置在谷歌中沒有並沒有想要的結果。聊勝於無吧。

 

總結select:

  你可以任意修改select的面板部分樣式,這是一個好消息。但是option部分,無法修改。但option部分一般不那么重要,在移動端原生甚至體驗會更好;

 

input file

  
  依舊是根據上一個思路,文件上傳框可以變得更直白美觀;上代碼:

<style type="text/css">
    *{ padding: 0; margin: 0;}
        .fileloding{ position: absolute; opacity: 1; width: 0%;transition: opacity 500ms;-webkit-transition: opacity 500ms;-ms-transition: opacity 500ms;-moz-transition: opacity 500ms;-o-transition: opacity 500ms;  bottom: -15px; height: 15px; background:#90C0F5 ;}
        .uploadbox{ width: 150px;height: 150px; position: relative; margin: 100px;}
        .uploadbox input[type=file]{ cursor: pointer; position: absolute; width: 100%; height: 100%; z-index: 2; opacity: 0; filter: alpha(opacity=0);}/*設置file框在最上層*/
        .uploadbox .uploadbox-bg{ display: block;  width: 100%; height: 100%;  position: absolute; z-index: 1; background: #dfdfdf; border: 1px solid #cccccc; }/*設置模擬樣式*/
        .uploadbox .uploadbox-bg p{font-size: 80px; color: #999999;text-align: center;}
        .uploadbox .uploadbox-bg span{ display: block; width: 100%; text-align: center; line-height: 15px; font-size: 14px; color: #666666;}
        .uploadbox:hover .uploadbox-bg p,.uploadbox:hover .uploadbox-bg span{ color: #90C0F5;}
        
    </style>
    <body>
        
        <div class="uploadbox">
            <input type="file" id="uploadbox" value="上傳" />
            <input type="hidden" name="filepath" id="filepath" value="" />
            <div class="uploadbox-bg">
                <p>+</p>
                <span>點擊上傳</span>
            </div>
        </div>
    </body>

一個不難看的圖片上傳;

  原理相同,有興趣的同學拿下去測試;

2.radio與:checkbox

  網頁中還有哪幾個不能修改的?

     還要radio和checkbox 單選與復選框;如果你用上面的方法,它一樣可以被模擬,只是,它還有一個label標簽可以做做文章,將它寫到label標簽中,點擊label域則會選中它;

</style>
    <style type="text/css">
        #box{ position: relative; }
        #box label input{ position: absolute; left: 0; top: 0; z-index: -1; }
        .rediobg{ background: #ffffff;}
        #box label.active .rediobg{ background: red;}
    </style>
        <div id="box">
            <label>
                <input type="checkbox" name="" id="" value="" />
                <div class="rediobg">
                    點個贊唄
                </div>
            </label>
            
            
        </div>
        <script type="text/javascript">
            $("label").on("click",function(){  //點擊label 
                var _in = $(this).children("input");    
                if(_in[0].checked){                    //判斷當前的checkbox 如果選中則給當前label添加一個classname
                    $(this).addClass("active");
                }else{                                //如果沒選中則移除
                    $(this).removeClass("active");
                }
            });
        </script>

需要判斷checkbox的選中狀態,然后改變div的樣式;

 

效果出來了 nice;

 

3.總結

  寫到這里,博文結束了。但是學習的路永遠都走不到盡頭,希望大家一起共同學習,探討,有任何疑問在評論區回復即可;  夜深了,博主也是困得要緊,睡覺去也。

 

 

---------------------------------------我最嫉妒別人的是:他比我學的快---------------------------------------

 

  我的微信號:    qq:

 歡迎各種技術討論,如果您有建站需求,歡迎聯系;

 (轉載請注明出處)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM