How to customize the HTML5 input range type looks using CSS?

后端 未结 10 2188
粉色の甜心
粉色の甜心 2020-11-27 15:24

I want to customize the looks of the range input type in HTML5 to look something like a progress bar. I\'ve tried applying some common CSS attributes using CSS class but it

相关标签:
10条回答
  • 2020-11-27 15:39
    input[type='range'] {
        -webkit-appearance: none !important;
        background:red;
        height:7px;
    }
    input[type='range']::-webkit-slider-thumb {
        -webkit-appearance: none !important;
        background:blue;
        height:10px;
        width:10px;
    }
    
    0 讨论(0)
  • 2020-11-27 15:40

    When I looked at this question I needed something simple. There are already a number of framework answers on how to do this, but sometimes it is more lightweight and flexible just to create your own. Of course, you get a certain amount for free with a framework (and it is often the right choice if it is a good fit), but you then have to worry about framework compatibility, support and digging into the depths of the framework to go outside its boundaries.

    Here is a simple javascript-only slider. Basically it is an img for the slider, an img for the button and a callback with a progress percent. Not an all-singing and dancing slider, but something simple to build on.

    The demo

    The HTML

    <div id='bb_sliderContainer'  ondragstart="return false;" ondrop="return false;">
        <img id='bb_slider' src='slider.png'/>
        <img id='bb_sliderButton' src='sliderbutton.png'/>
    </div>
    

    The script

    Place in a javascript file:

    (function(bb,undefined){    
    bb.Slider = function(buttonCssId,sliderCssId,initialPercentage,progressUpdate)
    {
        var halfButtonWidth = 5;
        var sliderMoving = false;
        var buttonElement = document.getElementById(buttonCssId);
        var sliderElement = document.getElementById(sliderCssId);                
        var length = sliderElement.clientWidth;                
        var leftPos = 0;
        var rightPos = leftPos + length;
        length = rightPos - leftPos;              
    
        if( initialPercentage )
        {
            var buttonPos = leftPos + initialPercentage / 100 * length;
            buttonElement.style.left = buttonPos - halfButtonWidth + 'px';  
        }        
    
        buttonElement.addEventListener( 'mousedown', function(){ 
            sliderMoving = true;
        } );        
    
        document.addEventListener( 'mousemove', function(event){
            if( sliderMoving == true )
            {                      
                var rect = sliderElement.getBoundingClientRect();                                                                        
                var mouseX = event.clientX - rect.left;
                var prop = mouseX / length;
                if( prop < 0 )
                {
                    prop = 0;
                    mouseX = 0;
                }
                if( prop > 1 )
                {
                    prop = 1;
                    mouseX = length;
                }                
                buttonElement.style.left = leftPos + prop * length - halfButtonWidth + 'px';                
                progressUpdate(prop * 100);         
            }
        });
        document.addEventListener( 'mouseup', function(){
            sliderMoving = false;
        });
    }    
    }(window.bb = window.bb || {}));
    

    Example use

    HTML:

    <img src='space.png' style='width:50%;position:relative;top:20px' id='bb_sliderSubject'>
    

    Javascript:

    function sliderUpdate(percentage)
    {
        var sliderSubject = document.getElementById('bb_sliderSubject');
        sliderSubject.style.width = percentage + '%';
    }
    window.onload=function()
    {
        var slider = new bb.Slider('bb_sliderButton','bb_slider',50,sliderUpdate);
    }
    
    0 讨论(0)
  • 2020-11-27 15:41

    I did a cross-browser solution (+IE9, FF, Chrome, Safari), only CSS.

    [Updated 24.11.2016]

    http://codepen.io/nlfonseca/pen/MwbovQ

    @import 'bourbon';
    
    $slider-width-number: 240;
    $slider-width: #{$slider-width-number}px;
    $slider-height: 2px;
    $background-slider: #c7c7c7;
    $background-filled-slider: #e33d44;
    $thumb-width: 28px;
    $thumb-height: 18px;
    $thumb-radius: 8px;
    $thumb-background: #fff;
    $thumb-border: 1px solid #777;
    $shadow-size: -8px;
    $fit-thumb-in-slider: -8px;
    
    @function makelongshadow($color, $size) {
      $val: 5px 0 0 $size $color;
    
      @for $i from 6 through $slider-width-number {
        $val: #{$val}, #{$i}px 0 0 $size #{$color};
      }
    
      @return $val;
    }
    
    div {
      height: 100px;
      display: flex;
      justify-content: center;
    }
    
    input {
      align-items: center;
      appearance: none;
      background: none;
      cursor: pointer;
      display: flex;
      height: 100%;
      min-height: 50px;
      overflow: hidden;
      width: $slider-width;
    
      &:focus {
        box-shadow: none;
        outline: none;
      }
    
      &::-webkit-slider-runnable-track {
        background: $background-filled-slider;
        content: '';
        height: $slider-height;
        pointer-events: none;
      }
    
      &::-webkit-slider-thumb {
        @include size($thumb-width $thumb-height);
    
        appearance: none;
        background: $thumb-background;
        border-radius: $thumb-radius;
        box-shadow: makelongshadow($background-slider, $shadow-size);
        margin-top: $fit-thumb-in-slider;
        border: $thumb-border;
      }
    
    
      &::-moz-range-track {
        width: $slider-width;
        height: $slider-height;
      }
    
      &::-moz-range-thumb {
        @include size($thumb-width $thumb-height);
    
        background: $thumb-background;
        border-radius: $thumb-radius;
        border: $thumb-border;
        position: relative;
      }
    
      &::-moz-range-progress {
        height: $slider-height;
        background: $background-filled-slider;
        border: 0;
        margin-top: 0;
      }
    
      &::-ms-track {
        background: transparent;
        border: 0;
        border-color: transparent;
        border-radius: 0;
        border-width: 0;
        color: transparent;
        height: $slider-height;
        margin-top: 10px;
        width: $slider-width;
      }
    
      &::-ms-thumb {
        @include size($thumb-width $thumb-height);
    
        background: $thumb-background;
        border-radius: $thumb-radius;
        border: $thumb-border;
      }
    
      &::-ms-fill-lower {
        background: $background-filled-slider;
        border-radius: 0;
      }
    
      &::-ms-fill-upper {
        background: $background-slider;
        border-radius: 0;
      }
    
      &::-ms-tooltip {
        display: none;
      }
    }
    
    0 讨论(0)
  • 2020-11-27 15:49

    If you're using HTML 5, why not use the progress tag?

    <progress value="1534602" max="4603807">33%</progress>
    
    0 讨论(0)
  • 2020-11-27 15:52

    See http://afarkas.github.io/webshim/demos/demos/webforms/styler/index.html?range

    It's a tool that produces cross-browser code to style both native and webshims range inputs like you want.

    .ws-range, input[type="range"] {
        /* Range styles: width, height, border-radius, background */
        -webkit-appearance: none;cursor: pointer;border: 0;outline: none;padding: 0;margin: 20.5px 0;
    }
    .ws-range .ws-range-thumb {
        /* Thumb styles: width, height, border, border-radius, background */
    }
    .ws-range.ws-focus .ws-range-thumb {
        /* Thumb focus styles: border-color, background */
    }
    .ws-range.ws-active .ws-range-thumb {
        /* Thumb active styles: border-color, background */
    }
    .ws-range .ws-range-min {
        /* Thumb progress styles: display, background */
        border-radius: /* same as range */;
        height: 100%;
    }
    input[type="range"]::-moz-range-track {
        border: none;background: transparent;
    }
    input[type="range"]::-ms-tooltip {
        display: none;
    }
    input[type="range"]::-webkit-slider-thumb {
        /* Thumb styles: width, height, border, border-radius, background */
        -webkit-appearance: none;
    }
    input[type="range"]::-ms-track {
        /* Range styles: width, height, border-radius, background */
        color: transparent;border: 0;
    }
    input[type="range"]::-moz-range-thumb {
        /* Thumb styles: width, height, border, border-radius, background */
    }
    input[type="range"]::-ms-thumb {
        /* Thumb styles: width, height, border, border-radius, background */
    }
    input[type="range"]:focus::-webkit-slider-thumb {
        /* Thumb focus styles: border-color, background */
    }
    input[type="range"]:focus::-moz-range-thumb {
        /* Thumb focus styles: border-color, background */
    }
    input[type="range"]:focus::-ms-thumb {
        /* Thumb focus styles: border-color, background */
    }
    input[type="range"]:active::-webkit-slider-thumb {
        /* Thumb active styles: border-color, background */
    }
    input[type="range"]:active::-moz-range-thumb {
        /* Thumb active styles: border-color, background */
    }
    input[type="range"]:active::-ms-thumb {
        /* Thumb active styles: border-color, background */
    }
    input[type="range"]::-moz-range-progress {
        /* Thumb progress styles: display, background */
        border-radius: /* same as range */;
        height: 100%;
    }
    input[type="range"]::-ms-fill-lower {
        /* Thumb progress styles: display, background */
        border-radius: /* same as range */;
        height: 100%;
    }
    .no-cssrangeinput input[type="range"] {
        background: transparent;margin: 0;border: 0;min-height: 51px;
    }
    
    0 讨论(0)
  • 2020-11-27 15:55

    You can in Webkit, through the -webkit-slider-thumb pseudo-element: http://jsfiddle.net/leaverou/BNm8j/

    input[type=range] {
        -webkit-appearance: none;
        background-color: silver;
        width: 200px;
        height:20px;
    }
    
    input[type="range"]::-webkit-slider-thumb {
        -webkit-appearance: none;
        background-color: #666;
        opacity: 0.5;
        width: 10px;
        height: 26px;
    }
    <input type="range" min="0" max="100" />

    Although the others are right about input type="range" not being the right element for the job.

    You should use the <progress> element and for browsers that don't support it, this polyfill: http://lea.verou.me/polyfills/progress/

    0 讨论(0)
提交回复
热议问题