最近需要一个个性化的range(滑块)。ionic库中的range已经自带了一些简单的样式。根据ionic自己的css修改,似乎方便了许多。

ionic自带的range分析(不想深究的这一段可以不看)

官方文档给的range例子如下:

  <div class="range range-positive">
    <i class="icon ion-ios7-sunny-outline"></i>
    <input type="range" name="volume" min="0" max="100" value="33">
    <i class="icon ion-ios7-sunny"></i>
  </div>

运行后如下:
图片描述
打开ionic.min.css,搜range,我天,好多行。
一个个看吧。
.range

.range {
  /*display: -webkit-box;
  display: -webkit-flex;
  display: -moz-box;
  display: -moz-flex;
  display: -ms-flexbox;*/
  display: flex;
  -webkit-box-align: center;
  /*-ms-flex-align: center;
  -webkit-align-items: center;
  -moz-align-items: center;*/
  align-items: center;
  padding: 2px 11px; }

我把这个样式单独提出来,就像这样:

  <div class="range calm-bg">
       test
  </div>

然后将没有用到的样式注释掉,就像上面一样。一行行开始看吧!

display: flex;//弹性子元素的父元素。通过设置display 属性的值为flex 或 inline-flex将其定义为弹性容器。
-webkit-box-align: center;//设置弹性盒模型对象的子元素居中对齐
align-items: center;//弹性子元素如何在当前线上沿着侧轴排列。

clipboard.png

这是在使用flexbox的居中布局,css3的。
参考文献http://zh.learnlayout.com/flexbox.html
http://www.mamicode.com/info-detail-229179.html
以及https://developer.mozilla.org/zh-CN/docs/Web/CSS/CSS_Flexible_Box_Layout/Using_CSS_flexible_boxes
综上,range只是把最外层的div设置为了弹性容器,并且子元素上下居中。
注意:此时无论盒子内有多少个div,它们始终在同一行!
.range input

  [1]: /img/bVsp8L
  [2]: /img/bVcb4K
.range input {
  /*display: inline-block;*/
  overflow: hidden;
  margin-top: 5px;
  margin-bottom: 5px;
  padding-right: 2px;
  padding-left: 1px;
  width: auto;
  height: 43px;
  outline: none;
  /*background: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #ccc), color-stop(100%, #ccc));*/
  background: linear-gradient(to right, #ccc 0%, #ccc 100%);
  background-position: center;
  background-size: 99% 2px;
  background-repeat: no-repeat;
  -webkit-appearance: none;
  /*
   &::-ms-track{
     background: transparent;
     border-color: transparent;
     border-width: 11px 0 16px;
     color:transparent;
     margin-top:20px;
   }
   &::-ms-thumb {
     width: $range-slider-width;
     height: $range-slider-height;
     border-radius: $range-slider-border-radius;
     background-color: $toggle-handle-off-bg-color;
     border-color:$toggle-handle-off-bg-color;
     box-shadow: $range-slider-box-shadow;
     margin-left:1px;
     margin-right:1px;
     outline:none;
   }
   &::-ms-fill-upper {
     height: $range-track-height;
     background:$range-default-track-bg;
   }
   */ }
   
   
 .range input {
  -webkit-box-flex: 1;
  /*-webkit-flex: 1;
  -moz-box-flex: 1;
  -moz-flex: 1;
  -ms-flex: 1;*/
  flex: 1;
  display: block;
  margin-right: 10px;
  margin-left: 10px; }

真是非常的长。首先放一个测试程序。

<div class="range calm-bg">
       <input type="text"></input>
  </div>

图片描述

发现这个测试程序中间有一个 横线!
横线原因:

.range input {
      background: linear-gradient(to right, #ccc 0%, #ccc 100%);//CSS3 线性渐变(linear-gradient),都设置为灰色
      background-position: center;
      background-size: 99% 2px;//background-size css3的属性,宽99%,高2px
      background-repeat: no-repeat;
      }

所以,要改变range右侧的条背景颜色,就改上面就好了。
线性渐变参考文章:http://www.cnblogs.com/lhb25/archive/2013/01/30/css3-linear-gradient.html
测试程序改为:

<div class="range calm-bg">
       <input type="range">
</div>

图片描述

.range input {
-webkit-appearance:none;//chrome的CSS3 appearance 属性,先清除原有的样式。
}

接下来设置滑块样式,用Webkit内核的浏览器的属性-webkit-slider-thumb,滑块样式。
Webkit核心,如Chrome浏览器下,使用的伪元素为::-webkit-slider-runnable-track::-webkit-slider-thumb. 前者指的是“跑动轨迹”,也就是那个条条元素;后者指用来拖的哪块突出的小疙瘩。
参考文献http://www.zhangxinxu.com/wordpress/2013/06/%E4%BC%AA%E5%85%83%E7%B4%A0-%E8%A1%A8%E5%8D%95%E6%A0%B7%E5%BC%8F-pseudo-elements-style-form-controls/
所以,设置滑块就要用:

.range.myrange input[type="range"]::-webkit-slider-thumb{//range button's style 
  background:#233746;
}

滑块前的背景:

.range.range-darkgray.myrange input::-webkit-slider-thumb:before {
    /* what creates the colorful line on the left side of the slider */
    top: 10px;
    height: 7px;
    background: #4e6272;
}

结论

css:

.range.myrange input[type="range"]::-webkit-slider-thumb{//range button's style 
  background:#233746;
}
.range.range-darkgray.myrange input::-webkit-slider-thumb:before {
    /* what creates the colorful line on the left side of the slider */
    top: 10px;
    height: 7px;
    background: #4e6272;
}
.range.myrange input {
  background: linear-gradient(to right, #9bafbe 0%, #9bafbe 100%);
  background-position: center;
  background-size: 99% 7px;
  background-repeat: no-repeat;
}

html:

<div class="range range-darkgray myrange">
    <input type="range" min="0" max="1000" name="volume">
</div>

效果图:
图片描述


jiayi797
78 声望5 粉丝

引用和评论

0 条评论