【问题标题】:range slider html css javascript范围滑块 html css javascript
【发布时间】:2022-02-11 01:31:55
【问题描述】:

我打算在注册表单中制作一个“范围滑块”类型,并且 JavaScript 验证“必须是 16 岁及以上”。

例如,如果我计划进行 JavaScript 估值“必须至少为 0 年,最长为 50 年”,这些是 html

<input type="range" id="vol" name="vol" min="0" max="50">

但如果我假设“必须年满 16 岁”,最小值为 16 岁,最大值为无限,那么 html 代码会是什么?是无限可能还是最大值总是100?

【问题讨论】:

  • 欢迎来到 SO!我建议所有新用户访问How to Ask,以获取有关如何撰写最能让社区提供帮助的帖子的提示。我还要注意,通常发布代码图像是不可接受的——请将代码作为文本包含在问题的正文中。
  • 无限不是一个数字。你想怎么表现它?

标签: javascript html css


【解决方案1】:

通常我会在问题中指出 MDN 参考,但在这里我会说它提供的内容有些矛盾。他们在max attribute section of the range &lt;input/&gt; MDN reference 中声明:

允许值范围内的最大值。如果输入到元素中的值超过此值,则元素无法通过约束验证。 如果 max 属性的值不是数字,则元素没有最大值。

这会让它听起来好像无限的上限是可能的。但是,MDN 参考还指出 默认 max 值为 100 在开发工具中进行测试,省略 max 确实似乎表明,如果省略,&lt;input type="range" /&gt;将简单地将最大值默认为 100。

如果我们更多地考虑这一点,这是有道理的。与简单地将数值显示为数字的&lt;input type="number" /&gt; 不同,&lt;input type="range" /&gt; 是数字的图形几何表示。鉴于此,如果没有无限长的屏幕和滑块,我们如何传达无限的上限?你会确定在哪里停止递增数字并更改为无穷大吗?

(我声明,从技术上讲,在 JS 中 typeof Infinity 一个数字。但是,将其放在 &lt;input type="range" /&gt;max 属性中只是默认为100。)

【讨论】:

    【解决方案2】:

    giphy animated gif link

    我开发了一个范围滑块,但它使用 html css 和 angular(打字稿)。您可能需要稍微修改代码,但它可以通过使用 CSS 圆圈、将数字值放置在该圆圈中的某个位置并将其放置在输入范围内来工作。

    html部分

    <div class="row small-margin"><div class="col-lg-8 small-padding">
    <div class="form-group has-success">
      <label>Credit Score</label>
      <br />
      <div class="ui medium-padding">
        <div class="slidecontainer">
          <input #creditSlider (input)="updateCreditSlider()"  (change)="updateCreditSlider()" type="range" min="300" max="850" value="{{ creditSliderValue }}" class="slider" id="myRange">
        </div>
      </div>
      <div #creditSliderSpan class="sliderValue circle" >
        <span class="noselect">{{ creditSliderValue }}</span>
      </div>
      <div #creditSliderTrack class="sliderTrack" ></div>
    </div>
    

    打字稿部分(在角度组件类中)

    creditSliderValue : any;
    @ViewChild('creditSlider') creditSlider;
    @ViewChild('creditSliderSpan') creditSliderSpan;
    .
    .
    .
    updateCreditSlider() {
          let horizontalOffset:number = 0;
          //values from 300 to 850 - Next value needs to be adjusted based on your placement of slider object
          horizontalOffset =  ( (Number.parseInt(this.creditSlider.nativeElement.value )- 280)/2.45);
          this.creditSliderSpan.nativeElement.style.left = ( horizontalOffset )+ 'px';
          this.creditSliderSpan.nativeElement.style.top = this.creditSliderSpan.nativeElement.style.top  + 'px';
          this.creditSliderValue = this.creditSlider.nativeElement.value;
        }
    

    css部分

    .smallPadding {
      margin-bottom: 0px;
      padding: 4px;
    }
    
    .slidecontainer {
        width: 100%; /* Width of the outside container */
    }
    
    /* The slider itself */
    .slider {
        position: relative;
        -webkit-appearance: none;  /* Override default CSS styles */
        appearance: none;
        width:275px;
        //width: 100%; /* Full-width */
        height: 15px;
        border-radius: 5px;
        //background: #d3d3d3; /* Grey background */
        background: rgba(211,211,211, 0.00);
    
        outline: none; /* Remove outline */
        opacity: 0.7; /* Set transparency (for mouse-over effects on hover) */
        -webkit-transition: .2s; /* 0.2 seconds transition on hover */
        transition: opacity .2s;
        z-index: 20;
    }
    
    /* Mouse-over effects */
    .slider:hover {
        //opacity: 1; /* Fully shown on mouse-over */
    }
    
    /* The slider handle (use -webkit- (Chrome, Opera, Safari, Edge) and -moz- (Firefox) to override default look) */
    .slider::-webkit-slider-thumb {
        position: relative;
        -webkit-appearance: none; /* Override default look */
        appearance: none;
        width: 50px; /* Set a specific slider handle width */
        height: 50px;
        border-radius: 50%;
        border-style: none;
        //background: #4CAF50; /* Green background */
        background: rgba(76,175,80, 0.00);
        cursor: pointer; /* Cursor on hover */
    
    }
    
    .slider::-moz-range-thumb {
        width: 25px; /* Set a specific slider handle width */
        height: 25px;
        border-radius: 50%;
        border-style: none;
        //background: #4CAF50; /* Green background */
        background: rgba(76,175,80, 0.00);
        cursor: pointer; /* Cursor on hover */
    
    }
    
    .sliderValue {
        position: absolute;
        top: 25px;
        left: 0px;
        width: 100%; /* Width of the outside container */
        z-index: 15;
    
    }
    .noselect {
      -webkit-touch-callout: none; /* iOS Safari */
        -webkit-user-select: none; /* Safari */
         -khtml-user-select: none; /* Konqueror HTML */
           -moz-user-select: none; /* Firefox */
            -ms-user-select: none; /* Internet Explorer/Edge */
                user-select: none; /* Non-prefixed version, currently
                                      supported by Chrome and Opera */
    }
    
    @media screen and (max-width: 992px) {
    
    }
    
    .circle {
      width: 50px;
      height: 50px;
      border-radius: 50%;
      font-size: 14pt;
      color: black;
      line-height: 46px;
      text-align: center;
      background: white;
      vertical-align: center;
      //display: table-cell;
      border-style: solid;
      border-color: #7E7E7E;
    }
    
    .medium-padding {
      padding-top: 14px;
      padding-bottom: 14px;
    }
    .sliderTrack {
      position: relative;
      width: 220px;
      height: 10px;
      background-color: #E0E1E2;
      vertical-align: center;
      border-radius: 5px;
      top: -35px;
      left: 25px;
      //display: table-cell;
      //border-style: solid;
      //border-color: #7E7E7E;
    }
    .left-padding {
      padding-left: 14px;
    
    }
    
    .small-margin {
      margin-left: 4px;
    }
    .medium-margin {
      margin-left: 10px;
    }
    .small-padding{
      padding: 4px;
    }
    

    【讨论】:

      猜你喜欢
      • 2021-01-14
      • 2018-12-23
      • 1970-01-01
      • 2020-08-21
      • 1970-01-01
      • 1970-01-01
      • 2018-11-21
      • 2011-02-10
      • 2014-12-26
      相关资源
      最近更新 更多