range滑塊自定義樣式,步驟詳解以及實際應用

OBKoro1發表於2017-04-16

寫在前面:

本文的主要內容包括:type="range"屬性介紹,修改range預設css樣式以及在js中的實際應用。本文面向前端小白,寫的不好之處,請多多見諒。文末有demo連結,可以自行復制到本地進行試驗。

相關:自定義 range radio select的樣式滑輪,按鈕,選擇框

最終要實現的效果:

range滑塊自定義樣式,步驟詳解以及實際應用
其中包括一部分js程式碼

步驟:

1.range屬性相關介紹

2.搭建html結構;

3.css樣式修改,包括給滑動軌道新增樣式、給滑塊新增樣式;

4.新增相關js程式碼實現應用效果;

5.關於瀏覽器相容。


在html裡面輸入如下內容,即可使用:

<input type="range">//這是最粗糙的使用方式複製程式碼

range在各個瀏覽器中的預設樣式:

range滑塊自定義樣式,步驟詳解以及實際應用

range屬性相關:

range 輸入型別用於應該包含指定範圍值的輸入欄位。
range 型別顯示為滑塊。
您也可以設定可接受數字的範圍限制:

<input type="range" name="points" min="1" max="10" />//max為最大的值,min為最小的值複製程式碼

html5 range 型別的限定:

range滑塊自定義樣式,步驟詳解以及實際應用
html5關於range的屬性

HTML DOM Input Range 物件(js獲取dom)

range滑塊自定義樣式,步驟詳解以及實際應用
js獲取dom可以看看,到時可以查閱相關資料


搭建html結構:

<div class="js-2-1section3">
    <div class="js-2-1section3-div1">
        <span class="js-2-1section3-div1-span1">玩家人數</span>
        <input type="text" class="player-num" id="player"  value="6"  max="18" min="6" onblur="on_change()">
         <!--onblur是當物件失去焦點的時候執行的函式-->
        <span class="js-2-1section3-div1-span1"></span>
    </div><!--上面這部分是玩家人數方框的html-->
    <div class="js-2-1section3-div2">
        <button class="btn-sub" id="btnSub" onclick="less()" ></button><!--減value的按鈕-->
        <input type="range" class="slider-block" id="slider" max="18" min="6" step="1" value="6" onchange="moveChange()">
        <!--onchange是當物件發生變化時執行的函式-->
        <button class="btn-add" id="btnAdd"  onclick="plus()"></button><!--加value的按鈕-->
    </div>
</div>複製程式碼

解析:

1.考慮到文章篇幅,html其他標籤自行補全。

2.上面中,程式碼註釋已經註釋的很清楚了,不明白的多看幾遍程式碼,然後也可以百度一下相關屬性之類的。

3.滑塊裡面設定value="6"的作用是瀏覽器進入時候滑塊在最小值,也就是最左側的地方,否則預設在中間

4.step="1"意思是,滑塊每次動態改變的數值。

5.關於程式碼中js部分,還沒學js的小夥伴們,可以跳過,不影響修改滑塊的預設樣式的。

range滑塊自定義樣式,步驟詳解以及實際應用
再放一下最終實現的效果,省的翻頁麻煩

css樣式修改:

下面是玩家人數的css樣式(不重要,可以跳過):

        body{
            width: 50%;
            margin:5rem auto 0;
        }
        div{
            margin: 2rem;
        }
        .js-2-1section3{
            background: #fff;}
        .js-2-1section3-div1{
            margin-left: 2rem;}
        .player-num{
            font-size: 1.8rem;
            margin:0 0.6rem;
            background: #f4f5f5;
            padding: 0.2rem 0.6rem;
            color: gold;
            width: 9%;
            border: none;
            outline: none;
        }
        span{
            display: inline-block;
            font-size: 1.8rem;
            color: #444;
        }

        .js-2-1section3-div2{
            display: flex;
            justify-content: space-around;
            align-items: center;
            padding: 1.6rem 0;
        }

        /*上面是玩家人數的css樣式*/複製程式碼

修改滑塊樣式的css程式碼(重點):

        #slider{ /*設定滑塊下面那條線的樣式*/
            outline: none; /*去掉點選時出現的外邊框*/
            -webkit-appearance: none;
            -moz-appearance: none;
            appearance: none; /*這三個是去掉那條線原有的預設樣式,劃重點!!*/
            width: 30%;
            height: 0.3rem;
            background: orange;
            /*這三個是設定滑塊下面那條線的樣式*/
        }
        input[type="range"]::-webkit-slider-thumb {
            /*::-webkit-slider-thumb是代表給滑塊的樣式進行變更*/
            -webkit-appearance: none;
            -moz-appearance: none;
            appearance: none; /*//這三個是去掉滑塊原有的預設樣式,劃重點!!*/
            -webkit-box-shadow:0 0 2px ; /*設定滑塊的陰影*/
            width: 2.6rem;
            height:1.6rem;
            background: url("images/js2-d_03.png");
            background-size: cover;
            /*//這幾個是設定滑塊的樣式*/
        }
        <!--上面是修改滑塊和滑塊軌道的樣式,下面是左右兩邊按鈕的css樣式-->

        .btn-sub{ /*這裡是左邊減按鈕的css樣式*/
            outline: none;
            border: none;
            cursor: pointer;
            background: url("images/js2-f_03.png");
            background-size: 100%;
            width: 1.8rem;
            height: 1.8rem;
        }
        .btn-add{ /*這裡是右邊+按鈕的css樣式*/
            outline: none;
            border: none;
            cursor: pointer;
            background: url("images/js2-e_03.png") no-repeat;
            background-size: 100%;
            width: 1.8rem;
            height: 1.8rem;
        }
    <!--css程式碼寫的有點亂,見諒啊。-->複製程式碼

解析:

1.程式碼註釋裡面已經很清楚了,不清楚多看幾遍程式碼。
2.文末有demo連結,可以自行復制到本地進行試驗。

以上是修改css樣式到上面放的圖片效果。


擴充套件:使用js完成實際應用

      var oPlayerNum = document.getElementById("player");//玩家總人數
    var osliderBlock = document.getElementById("slider");//滑塊的值
    function on_change() {
        if (oPlayerNum.value >= 6 && oPlayerNum.value <= 18) {//設定方框裡面玩家人數範圍
            osliderBlock.value=oPlayerNum.value ;//將玩家總人數賦值給滑塊的值,實現動態變化
        } else {
            alert("請輸入正確的人數6~18");
            oPlayerNum.value=6;
            osliderBlock.value=6;
    //人數超出範圍的話,彈出警告框,並且將方框和滑塊的值重置為6
        }
    }
    function moveChange() {// 滑塊的值改變,執行這個函式
        oPlayerNum.value=osliderBlock.value;
        //滑塊的值改變的話,滑塊的值賦值給方框,實現動態變化
    }
    function less() {
        oPlayerNum.value--;
        //減的按鈕,減掉玩家總人數的值      
        if (oPlayerNum.value<6){
            alert("人太少了,再找幾個小夥伴來吧");
            oPlayerNum.value=6;
            //人數超出範圍的話,彈出警告框,並且將方框和滑塊的值重置為6
        }
        else {
            osliderBlock.value=oPlayerNum.value;// 將玩家人數賦值給滑輪的值
        }
    }
    function plus() {
        oPlayerNum.value++;
        //加的按鈕,減掉玩家總人數的值,上面的值已經相互關聯了,所以方框的值改變,滑塊的值也會改變 
        if (oPlayerNum.value>18){
            alert("人太多了,可以分一批人再開一局");
            oPlayerNum.value=18;
            //人數超出範圍的話,彈出警告框,並且將方框和滑塊的值重置為18
        }
        else {
            osliderBlock.value=oPlayerNum.value;// 將玩家人數賦值給滑輪的值
        }
    }複製程式碼

ps:
1.特地重新再打一遍註釋,註釋裡面說的蠻清楚了,還沒學js的小夥伴別灰心,先mark起來,等以後學會了,再回頭看看。
2.文末有demo連結,可以自行復制到本地進行試驗。

關於瀏覽器相容的問題:還未完成的效果,滑塊填充效果。

ps:關於瀏覽器相容這塊兒,還沒研究好(下面有篇文章是講瀏覽器相容的)。以上只針對谷歌瀏覽器,因為range是html5新出的屬性,w3c還沒出標準屬性,各個瀏覽器的方法不一樣,這塊兒有點麻煩。但我記在筆記裡面了,今後研究清楚了,再回來更文。

range滑塊自定義樣式,步驟詳解以及實際應用
三個瀏覽器的不同效果

關於滑塊的填充效果,各個瀏覽器都不一樣Chrome瀏覽器中不支援直接設定進度條,要藉助js。而在IE 9以上的瀏覽器中可以使用::-ms-fill-lower 和 ::-ms-fill-upper來自定義進度條;在Firefox瀏覽器中則可以通過::-moz-range-progress來自定義;今天下午研究了一陣子,只弄出了一個ie的填充效果,沒研究清楚,可能過段時間會再回來更新。(有興趣的小夥伴可以研究一下,相互交流交流。)

range滑塊自定義樣式,步驟詳解以及實際應用
IE演示的

以下是I相容E瀏覽器的滑塊

  /*以下是I相容E瀏覽器的滑塊,還有一些問題,不過現在沒空再弄了。等到有空了再解決清楚。*/
        input[type=range]::-ms-fill-lower {//::-ms-fill-lower這是ie相容range的屬性寫法下面那個同理
            /*進度條已填充的部分*/
            height: 22px;
            border-radius: 10px;
            /*background: black;*/
            background: linear-gradient(to right, #059CFA, white 100%, white);
        }

        input[type=range]::-ms-fill-upper {
            /*進度條未填充的部分*/
            height: 22px;
            border-radius: 10px;
            background: red;
        }複製程式碼

這裡有篇關於range的文章,裡面有瀏覽器相容的內容,我沒弄清楚:自定義(滑動條)input[type="range"]樣式

range-demo連結obkoro1.github.io/article-dem…

後話:

昨天說好的要詳細更新,range、radio、select這三類的文章,今天如約更好了range部分,後面幾天應該還會持續更文。不說了,要打球去了^_^。

最後:希望看完的朋友點個喜歡,也可以關注一下我,現在這階段基本上每個月都不會少於十五篇文章(看到乾貨我也會進行分享)。寫的不好之處,歡迎指點。碼字不易,感謝支援!
ps:目前待業,座標北京,求推薦工作。然後希望我寫哪方面的文章可以在底下評論,或者是私信我,雖然寫的不好,但我就當這是記錄自己成長的一種方式咯。(前提是我會了,如果不會我也會記下來,等會了的時候再更出來。)
掘金個人主頁簡書主頁連結csdn部落格主頁連結github

以上。2017.4.16

相關文章