【问题标题】:How to customize the HTML5 input range type looks using CSS?如何使用 CSS 自定义 HTML5 输入范围类型的外观?
【发布时间】:2011-04-03 03:20:09
【问题描述】:

我想自定义 HTML5 中范围输入类型的外观,使其看起来像一个进度条。我尝试使用 CSS 类应用一些常见的 CSS 属性,但似乎它们不起作用。

谁能指导我如何定制它??

【问题讨论】:

  • 用javascript的组合?通过 CSS,您可以不显示输入并呈现适合的 :before 和 :after 元素。然后通过 javascript 处理所有这些如何相互交互。
  • 这是一篇关于这个主题的优秀文章:hongkiat.com/blog/html5-range-slider-style.
  • 如果您不接受当前接受的答案(并且可能接受您喜欢的另一个答案),这将很有帮助。 5 年前的回答“甚至不要尝试这个,技术太新了”仍然被固定在答案列表的顶部,这对任何人都没有帮助。
  • 这有点旧,但仍然会出现在搜索引擎中,所以 - 这是一个很好的实现示例和 x-browser brennaobrien.com/blog/2014/05/… 。接受的答案没有错,只是有点过时了。
  • 是否有基于 javascript 的方式以编程方式执行此操作?我对动态修改 thumb 元素的属性感兴趣。

标签: css html progress-bar input-type-range


【解决方案1】:
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;
}

【讨论】:

  • 这也适用于 iOS 5.0,这很好,因为对于触摸设备来说,默认值非常小。
【解决方案2】:

如果您使用的是 HTML 5,为什么不使用 progress 标记?

<progress value="1534602" max="4603807">33%</progress>

【讨论】:

  • 有没有浏览器可以渲染这个?
  • 我认为还没有任何浏览器可以呈现这个,也许modernizr.com 可以提供帮助?
  • @MarcoDemaio Firefox、Safari 和 Chrome 渲染它
  • @cofiem Modernizer 不会帮助不受支持的浏览器呈现新功能,它只会检测它们是否支持该功能。
  • progress 和 input[type=range] 有不同的用途,只有 range 是为用户输入而设计的。
【解决方案3】:

编辑:现在所有主流浏览器都支持

因此您应该使用这两个中的一个,如其他答案中所述,这不再是公认的答案。


&lt;input type="range"&gt; 非常新,您已经尝试使用 CSS 对其进行自定义。 :)

我不会尝试这样做有两个原因:

  1. 现在和未来几年(或多年)可能存在巨大的兼容性问题。 想想现在,像&lt;select&gt; 这样的表单控件(自网络启动以来就可用)仍然无法以跨浏览器的方式使用 CSS 进行自定义。例如,如果您为选择框设置padding,许多浏览器(IE7、OPERA9、CHROME5、SAFARI4)将完全忽略填充。 它仅适用于 IE8 和 FF 3.6。 (所有测试都是使用 HTML5 DOCTYPE 完成的,所以在标准模式下)。

  2. &lt;input type="range"&gt; 被创建为显示滑块而不是进度条,试图用 CSS 欺骗它以便将滑块转换为进度条,这听起来很奇怪。就像尝试使用 CSS 将 &lt;textarea&gt; 更改为表格一样,但为什么不直接使用 &lt;table&gt; 来渲染表格?!

要在 HTML5 中显示进度条,您应该遵循 marcgg 在他的回答中给出的建议。由于当前没有浏览器正在渲染它,您可以使用一个简单的 div,里面有一个 p,如下所示:

<div id="progress" style="position:relative; width:100px; height:20px; border:1px solid #cccccc;">
   <p style="position:absolute; left:0; top:0; background-color:#0000ff; height:100%; width:30%; font-size:0px;">&nbsp;</p>
</div>

然后简单地更新内部P元素的style.width,以百分比表示:

width: 75%

仅供参考:如果你想在简单的 JS 中做到这一点,这里是代码:

document.getElementById('progress').(getElementsByTagName('p')[0]).style.width = '75%';

【讨论】:

  • 好吧,我不知道最好的选择是什么。我阅读了关于 HTML5 音频标签的教程,他们在那里使用输入范围类型来显示正在播放的音频的进度。所以我只想自定义外观。关于使用什么的任何建议???
  • 我的回答中关于使用什么的建议!使用内部带有 P 的 DIV。它显示了一个进度条,如果您不相信我,只需将代码复制并粘贴到页面中并尝试一下。有教程的链接吗?他们建议通过 CSS 修改滑块以将其变为进度条,这似乎很奇怪,这很奇怪!滑块是用户可以通过移动滑块进行交互的东西,进度条是用户只能看到而不能通过将鼠标移到上面来改变的东西。
  • 非常感谢。我想我会使用你的建议。好吧,它来自dev.opera.com/articles/view/…。实际上他们并不建议使用 CSS 来改变它。他们只是使用滑块,但我不喜欢它的外观,所以我想我是否可以使用 CSS 更改它,因为我知道一点:)
  • -1。关于“这是新的”的答案很糟糕:如今,大多数浏览器都支持 HTML5 的“范围”和“进度”输入,正确答案如下,但 2010 年关于“不要那样做”的答案仍然被标记为接受的答案。
  • 使用滑块作为进度条根本不是一个糟糕的主意,它与使用文本区域来模拟表格不同(你会如何做到这一点?),+如果你知道您的网站在哪个平台上运行,您可以使用新标签,(例如,它可能仅限于手机,甚至手机类型)+ 有时摆脱过去是件好事,是时候让人们使用好的网络浏览器(而不是 IE)
【解决方案4】:

我做了一个跨浏览器解决方案(+IE9、FF、Chrome、Safari),只有 CSS。

[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;
  }
}

【讨论】:

  • 这是一个聪明的尝试,也是最接近问题的回答。但它存在一些问题:它本质上是通过拉长滑块控件(拇指?)来工作的。这适用于拖动,但您只能单击以将栏的位置设置在滑块的右侧。单击左侧不会执行任何操作。
  • 不错的收获。非常感谢。我已经解决了这个问题,将pointer-events: none; 放在拇指的“前面”。演示已经更新。 ;)
  • 精彩的解决方案感谢您的所有努力!不敢相信他们没想过剥皮控件。哦,开玩笑,我完全可以
  • 是的@fedeghe。 Chrome 现在不允许在阴影元素上使用伪元素......因此目标“::-webkit-slider-thumb:before”不再存在。我没有找到解决这个问题的方法。 ://
  • 我找到的唯一真正的解决方案依赖于js
【解决方案5】:

你可以在Webkit中,通过-webkit-slider-thumb伪元素: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;
}
&lt;input type="range" min="0" max="100" /&gt;

尽管其他人认为输入 type="range" 不是该工作的正确元素是正确的。

你应该使用&lt;progress&gt;元素,对于不支持它的浏览器,这个polyfill:http://lea.verou.me/polyfills/progress/

【讨论】:

  • input type="range" 是正确的元素,如果需要用户输入,progress 则不是。
【解决方案6】:

您可以使用input[type="range"]::-webkit-slider-thumbinput[type="range"] 编辑范围输入的CSS。

这是它的例子,

http://webstutorial.com/range-input-slider-html5-css3/html-5

我知道这已经回答但只是分享它。

【讨论】:

    【解决方案7】:

    jQuery Tools 提供了一个插件,可以从范围输入创建可样式化的元素,此外,它还可以在不支持input[type=range] 的旧浏览器中作为滑块工作。

    允许您设置样式:

    • 把手
    • 滑块
    • 可选进度填充
    • 值输出字段

    我已经用过很多次了,它是一个很棒的工具。

    警告:不适用于触控设备。我没有太多经验,但你可以试试 jQuery 移动滑块:http://view.jquerymobile.com/1.3.0/docs/widgets/sliders/

    http://jquerytools.github.io/demos/rangeinput/index.html

    【讨论】:

      【解决方案8】:

      当我看到这个问题时,我需要一些简单的东西。已经有许多关于如何做到这一点的框架答案,但有时它更轻量级和灵活,只是创建自己的。当然,您可以免费获得一定数量的框架(如果合适,通常是正确的选择),但是您必须担心框架的兼容性,支持和深入了解框架的深度在它的边界之外。

      这是一个简单的纯 JavaScript 滑块。基本上它是滑块的 img、按钮的 img 和带有进度百分比的回调。不是一个能歌善舞的滑块,而是一个易于构建的东西。

      The demo

      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>
      

      脚本

      放在一个javascript文件中:

      (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 || {}));
      

      使用示例

      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);
      }
      

      【讨论】:

        【解决方案9】:

        这是一个例子:

        input[type='range'] {
        	-webkit-appearance: none;
        	border-radius: 5px;
        	box-shadow: inset 0 0 5px #333;
        	background-color: #999;
        	height: 10px;
        	vertical-align: middle;
        }
        input[type='range']::-moz-range-track {
        	-moz-appearance: none;
        	border-radius: 5px;
        	box-shadow: inset 0 0 5px #333;
        	background-color: #999;
        	height: 10px;
        }
        input[type='range']::-webkit-slider-thumb {
        	-webkit-appearance: none !important;
        	border-radius: 20px;
        	background-color: #FFF;
        	box-shadow:inset 0 0 10px rgba(000,000,000,0.5);
        	border: 1px solid #999;
        	height: 20px;
        	width: 20px;
        }
        input[type='range']::-moz-range-thumb {
        	-moz-appearance: none;
        	border-radius: 20px;
        	background-color: #FFF;
        	box-shadow:inset 0 0 10px rgba(000,000,000,0.5);
        	border: 1px solid #999;
        	height: 20px;
        	width: 20px;
        }
        &lt;input type="range"&gt;

        【讨论】:

        • sn-p 的作者从哪里得到像 moz-range-track 这样的选择器名称?有没有可能在 chrome 中找到它们?
        【解决方案10】:

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

        这是一个生成跨浏览器代码的工具,可以根据需要设置本机和 webshims 范围输入的样式。

        .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;
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-04-17
          • 1970-01-01
          • 2021-11-12
          • 2016-02-02
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多