HTML5: Slider ที่มีสองอินพุตเป็นไปได้หรือไม่?


106

เป็นไปได้ไหมที่จะสร้างแถบเลื่อน HTML5 ที่มีค่าอินพุตสองค่าตัวอย่างเช่นเพื่อเลือกช่วงราคา ถ้าเป็นเช่นนั้นจะทำได้อย่างไร?

คำตอบ:


68

ไม่อินพุตช่วง HTML5ยอมรับอินพุตเดียวเท่านั้น ฉันอยากจะแนะนำให้คุณใช้บางอย่างเช่นแถบเลื่อนช่วง jQuery UIสำหรับงานนั้น


ขอบคุณสำหรับลิงค์และข้อมูล ฉันต้องตรวจสอบว่าฉันสามารถทำให้สิ่งนี้ทำงานบนอุปกรณ์มือถือได้หรือไม่
บ่อย

36
เมื่อไม่นานมานี้ ... แต่ฉันสามารถ "ปลอม" ตัวเลื่อนคู่ได้โดยวางแถบเลื่อนสองตัวไว้ด้านบนของกันและกัน ค่าเริ่มต้นที่ค่าต่ำสุดอีกค่าหนึ่งเริ่มต้นที่ค่าสูงสุด ฉันเดาว่ามันกำลังโกง แต่ ... มันได้ผลสำหรับฉัน
บ่อย

อย่างน้อย WhatWG กำลังพูดคุยถึงการนำไปใช้: html.spec.whatwg.org/multipage/…
kunambi

7
ฉันชอบ ionRangeSlider ดีกว่าตัวเลื่อน jQuery UI เล็กน้อยด้วยตัวเอง: ionden.com/a/plugins/ion.rangeSlider/en.html
Charlotte

5
อีกวิธีหนึ่งคือการ "ปลอม" แถบเลื่อนคู่พร้อมปุ่มควบคุมการป้อนข้อมูลแบบเคียงข้างกัน: simple.gy/blog/range-slider-two-handles
SimplGy

84

ฉันมองหาตัวเลื่อนคู่ที่มีน้ำหนักเบาและพึ่งพาได้มาระยะหนึ่งแล้ว (ดูเหมือนจะบ้าที่จะนำเข้า jQuery เพื่อสิ่งนี้) และดูเหมือนจะไม่มีอะไรมากมาย ฉันลงเอยด้วยการแก้ไขโค้ดของ @ Wildhoneyเล็กน้อยและชอบมาก


น่าเสียดายที่มันใช้ไม่ได้กับเบราว์เซอร์ Android 4.0.4 Mobile Safari 4.0 :-(
erik

@erik ฉันไม่มีวิธีที่ดีในการทดสอบเวอร์ชันเหล่านั้น แต่ใช้ได้กับฉันบน Android 5.0 กับ Safari เวอร์ชันล่าสุด (ซึ่ง Google Play ระบุว่าเป็น 1.2 ดังนั้นฉันจึงสับสนเกี่ยวกับ 4.0 ของคุณ) ถ้าคุณคิดออกฉันก็อยากรู้
Gary

1
ฉลาดจริงๆ! ฉันสงสัยว่ามันไม่ได้ถูกทำเครื่องหมายว่าเป็นคำตอบที่ถูกต้องได้อย่างไรเนื่องจากมันแก้ปัญหาได้อย่างสง่างามโดยไม่มีการพึ่งพาใด ๆ การเพิ่ม jQuery เพียงเพื่อทำเช่นนั้นเห็นได้ชัดว่า overkill
zanona

@zanona ขอบคุณ แต่คำตอบที่ถูกต้องถูกระบุไว้เมื่อ 4 ปีก่อนดังนั้นฉันไม่คิดว่า OP ให้ความสำคัญกับโซลูชันอื่นมากนัก
Gary

12
ฉันชอบแนวทางของคุณมากและพยายามปรับให้เข้ากับกรณีการใช้งานของฉัน แต่ต้องยอมแพ้เมื่อฉันตระหนักว่าข้อกำหนดการออกแบบบางอย่างที่ฉันมี (เช่นการระบายสีส่วนที่ "ใช้งานอยู่" ของช่วงให้แตกต่างจากส่วนที่เหลือของแทร็ก ) ไม่สามารถใช้กับสิ่งนี้ได้ ดังนั้นฉันจึงมองหาวิธีแก้ปัญหาอื่นและพบว่าโครงการนี้เรียบร้อยจริงๆ: refreshless.com/nouislider ไม่ ต้องพึ่งพามี API ที่ดีและสะอาดเข้ากันได้กับ AMD และมีตัวเลือกมากมาย จนถึงตอนนี้ฉันค่อนข้างพอใจกับมัน
Felix Wienberg

39

มาช้า แต่noUiSliderหลีกเลี่ยงการพึ่งพา jQuery-ui ซึ่งคำตอบที่ยอมรับไม่มี "ข้อแม้" เพียงอย่างเดียวคือการสนับสนุน IE สำหรับ IE9 และใหม่กว่าหาก IE แบบเดิมเป็นตัวทำลายข้อตกลงสำหรับคุณ

นอกจากนี้ยังฟรีโอเพ่นซอร์สและสามารถใช้ในโครงการเชิงพาณิชย์ได้โดยไม่มีข้อ จำกัด

การติดตั้ง: ดาวน์โหลด noUiSlider แยกไฟล์ CSS และ JS ที่ใดที่หนึ่งในระบบไฟล์ไซต์ของคุณจากนั้นเชื่อมโยงไปยัง CSS จาก head และไปยัง JS จาก body:

<!-- In <head> -->
<link href="nouislider.min.css" rel="stylesheet">

<!-- In <body> -->
<script src="nouislider.min.js"></script>

ตัวอย่างการใช้งาน: สร้างแถบเลื่อนซึ่งไปจาก 0 ถึง 100 และเริ่มตั้งค่าเป็น 20-80

HTML:

<div id="slider">
</div>

JS:

var slider = document.getElementById('slider');

noUiSlider.create(slider, {
    start: [20, 80],
    connect: true,
    range: {
        'min': 0,
        'max': 100
    }
});

1
ว้าวทึ่ง !! นี่คือสิ่งที่เราต้องการและได้รับการพัฒนาอย่างยอดเยี่ยม! WHITOUT jQuery
DavidTaubmann

มันควรจะง่ายพอสมควรที่จะเพิ่มตัวคุณเองและส่งคำขอดึงไปยังโครงการ แต่?
dario_ramos

3
ฉันไม่ได้ขุดมันลงไป แต่ฉันสามารถใช้แถบเลื่อนกับแป้นพิมพ์ได้ดังนั้นฉันคิดว่ามันใช้งานได้แล้วตอนนี้ @ptrin :)
Edu Ruiz

24

แน่ใจว่าคุณสามารถใช้แถบเลื่อนสองตัวซ้อนทับกันและเพิ่มจาวาสคริปต์ (จริงๆแล้วไม่เกิน 5 บรรทัด) ที่ตัวเลือกไม่เกินค่าต่ำสุด / สูงสุด (เช่นใน @Garys)

แนบมาด้วยคุณจะพบตัวอย่างสั้น ๆ ที่ดัดแปลงมาจากโปรเจ็กต์ปัจจุบันรวมถึงสไตล์ CSS3 บางอย่างเพื่อแสดงสิ่งที่คุณทำได้ (webkit เท่านั้น) ฉันยังเพิ่มป้ายกำกับบางป้ายเพื่อแสดงค่าที่เลือก

ใช้ JQuery แต่เวอร์ชัน vanillajs นั้นไม่มีเวทมนตร์

    (function() {

        function addSeparator(nStr) {
            nStr += '';
            var x = nStr.split('.');
            var x1 = x[0];
            var x2 = x.length > 1 ? '.' + x[1] : '';
            var rgx = /(\d+)(\d{3})/;
            while (rgx.test(x1)) {
                x1 = x1.replace(rgx, '$1' + '.' + '$2');
            }
            return x1 + x2;
        }

        function rangeInputChangeEventHandler(e){
            var rangeGroup = $(this).attr('name'),
                minBtn = $(this).parent().children('.min'),
                maxBtn = $(this).parent().children('.max'),
                range_min = $(this).parent().children('.range_min'),
                range_max = $(this).parent().children('.range_max'),
                minVal = parseInt($(minBtn).val()),
                maxVal = parseInt($(maxBtn).val()),
                origin = $(this).context.className;

            if(origin === 'min' && minVal > maxVal-5){
                $(minBtn).val(maxVal-5);
            }
            var minVal = parseInt($(minBtn).val());
            $(range_min).html(addSeparator(minVal*1000) + ' €');


            if(origin === 'max' && maxVal-5 < minVal){
                $(maxBtn).val(5+ minVal);
            }
            var maxVal = parseInt($(maxBtn).val());
            $(range_max).html(addSeparator(maxVal*1000) + ' €');
        }

     $('input[type="range"]').on( 'input', rangeInputChangeEventHandler);
})();
body{
font-family: sans-serif;
font-size:14px;
}
input[type='range'] {
  width: 210px;
  height: 30px;
  overflow: hidden;
  cursor: pointer;
    outline: none;
}
input[type='range'],
input[type='range']::-webkit-slider-runnable-track,
input[type='range']::-webkit-slider-thumb {
  -webkit-appearance: none;
    background: none;
}
input[type='range']::-webkit-slider-runnable-track {
  width: 200px;
  height: 1px;
  background: #003D7C;
}

input[type='range']:nth-child(2)::-webkit-slider-runnable-track{
  background: none;
}

input[type='range']::-webkit-slider-thumb {
  position: relative;
  height: 15px;
  width: 15px;
  margin-top: -7px;
  background: #fff;
  border: 1px solid #003D7C;
  border-radius: 25px;
  z-index: 1;
}


input[type='range']:nth-child(1)::-webkit-slider-thumb{
  z-index: 2;
}

.rangeslider{
    position: relative;
    height: 60px;
    width: 210px;
    display: inline-block;
    margin-top: -5px;
    margin-left: 20px;
}
.rangeslider input{
    position: absolute;
}
.rangeslider{
    position: absolute;
}

.rangeslider span{
    position: absolute;
    margin-top: 30px;
    left: 0;
}

.rangeslider .right{
   position: relative;
   float: right;
   margin-right: -5px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
<div class="rangeslider">
                                <input class="min" name="range_1" type="range" min="1" max="100" value="10" />
                                <input class="max" name="range_1" type="range" min="1" max="100" value="90" />
                                <span class="range_min light left">10.000 €</span>
                                <span class="range_max light right">90.000 €</span>
                            </div>


7
เฮ้ดูดีมาก! แต่มันไม่ทำงานใน Firefox คุณสามารถลากอินพุตสูงสุดเท่านั้น คุณจัดการเพื่อแก้ไขหรือไม่
Toni Michel Caubet

6
โอ้มนุษย์ ฉันมาที่นี่เพื่อเพิ่มสิ่งเดียวกัน! simple.gy/blog/range-slider-two-handles เวอร์ชันของฉันใส่อินพุตเคียงข้างกัน แต่ยังใช้อินพุตคู่
SimplGy

9

อันที่จริงฉันใช้สคริปต์ของฉันใน html โดยตรง แต่ใน javascript เมื่อคุณเพิ่ม oninput event listener สำหรับเหตุการณ์นี้จะให้ข้อมูลโดยอัตโนมัติคุณเพียงแค่ต้องกำหนดค่าตามความต้องการของคุณ

[slider] {
  width: 300px;
  position: relative;
  height: 5px;
  margin: 45px 0 10px 0;
}

[slider] > div {
  position: absolute;
  left: 13px;
  right: 15px;
  height: 5px;
}
[slider] > div > [inverse-left] {
  position: absolute;
  left: 0;
  height: 5px;
  border-radius: 10px;
  background-color: #CCC;
  margin: 0 7px;
}

[slider] > div > [inverse-right] {
  position: absolute;
  right: 0;
  height: 5px;
  border-radius: 10px;
  background-color: #CCC;
  margin: 0 7px;
}


[slider] > div > [range] {
  position: absolute;
  left: 0;
  height: 5px;
  border-radius: 14px;
  background-color: #d02128;
}

[slider] > div > [thumb] {
  position: absolute;
  top: -7px;
  z-index: 2;
  height: 20px;
  width: 20px;
  text-align: left;
  margin-left: -11px;
  cursor: pointer;
  box-shadow: 0 3px 8px rgba(0, 0, 0, 0.4);
  background-color: #FFF;
  border-radius: 50%;
  outline: none;
}

[slider] > input[type=range] {
  position: absolute;
  pointer-events: none;
  -webkit-appearance: none;
  z-index: 3;
  height: 14px;
  top: -2px;
  width: 100%;
  opacity: 0;
}

div[slider] > input[type=range]:focus::-webkit-slider-runnable-track {
  background: transparent;
  border: transparent;
}

div[slider] > input[type=range]:focus {
  outline: none;
}

div[slider] > input[type=range]::-webkit-slider-thumb {
  pointer-events: all;
  width: 28px;
  height: 28px;
  border-radius: 0px;
  border: 0 none;
  background: red;
  -webkit-appearance: none;
}

div[slider] > input[type=range]::-ms-fill-lower {
  background: transparent;
  border: 0 none;
}

div[slider] > input[type=range]::-ms-fill-upper {
  background: transparent;
  border: 0 none;
}

div[slider] > input[type=range]::-ms-tooltip {
  display: none;
}

[slider] > div > [sign] {
  opacity: 0;
  position: absolute;
  margin-left: -11px;
  top: -39px;
  z-index:3;
  background-color: #d02128;
  color: #fff;
  width: 28px;
  height: 28px;
  border-radius: 28px;
  -webkit-border-radius: 28px;
  align-items: center;
  -webkit-justify-content: center;
  justify-content: center;
  text-align: center;
}

[slider] > div > [sign]:after {
  position: absolute;
  content: '';
  left: 0;
  border-radius: 16px;
  top: 19px;
  border-left: 14px solid transparent;
  border-right: 14px solid transparent;
  border-top-width: 16px;
  border-top-style: solid;
  border-top-color: #d02128;
}

[slider] > div > [sign] > span {
  font-size: 12px;
  font-weight: 700;
  line-height: 28px;
}

[slider]:hover > div > [sign] {
  opacity: 1;
}
<div slider id="slider-distance">
  <div>
    <div inverse-left style="width:70%;"></div>
    <div inverse-right style="width:70%;"></div>
    <div range style="left:0%;right:0%;"></div>
    <span thumb style="left:0%;"></span>
    <span thumb style="left:100%;"></span>
    <div sign style="left:0%;">
      <span id="value">0</span>
    </div>
    <div sign style="left:100%;">
      <span id="value">100</span>
    </div>
  </div>
  <input type="range" value="0" max="100" min="0" step="1" oninput="
  this.value=Math.min(this.value,this.parentNode.childNodes[5].value-1);
  let value = (this.value/parseInt(this.max))*100
  var children = this.parentNode.childNodes[1].childNodes;
  children[1].style.width=value+'%';
  children[5].style.left=value+'%';
  children[7].style.left=value+'%';children[11].style.left=value+'%';
  children[11].childNodes[1].innerHTML=this.value;" />

  <input type="range" value="100" max="100" min="0" step="1" oninput="
  this.value=Math.max(this.value,this.parentNode.childNodes[3].value-(-1));
  let value = (this.value/parseInt(this.max))*100
  var children = this.parentNode.childNodes[1].childNodes;
  children[3].style.width=(100-value)+'%';
  children[5].style.right=(100-value)+'%';
  children[9].style.left=value+'%';children[13].style.left=value+'%';
  children[13].childNodes[1].innerHTML=this.value;" />
</div>


คุณคืออัจฉริยะ! นี่เป็นไอเดียที่ยอดเยี่ยมและสไตล์ของคุณก็ยอดเยี่ยมเช่นกัน
Puspam

2

คำถามคือ: เป็นไปได้ไหมที่จะสร้างแถบเลื่อน HTML5 ที่มีค่าอินพุตสองค่าเช่นเพื่อเลือกช่วงราคาถ้าเป็นเช่นนั้นจะทำได้อย่างไร?

สิบปีที่แล้วคำตอบคือ "ไม่" อย่างไรก็ตามเวลามีการเปลี่ยนแปลง ในปี2020เป็นไปได้ที่จะสร้างแถบเลื่อน HTML5 แบบเนทีฟและไม่ใช่ jquery ที่เข้าถึงได้โดยสมบูรณ์พร้อมด้วยสองนิ้วโป้งสำหรับช่วงราคา หากพบสิ่งนี้โพสต์หลังจากที่ฉันสร้างโซลูชันนี้แล้วและฉันคิดว่าจะเป็นการดีที่จะแบ่งปันการใช้งานของฉันที่นี่

การใช้งานนี้ได้รับการทดสอบบนมือถือ Chrome และ Firefox (Android) และ Chrome และ Firefox (Linux) ฉันไม่แน่ใจเกี่ยวกับแพลตฟอร์มอื่น ๆ แต่ก็น่าจะดีทีเดียว ฉันชอบที่จะรับคำติชมของคุณและปรับปรุงโซลูชันนี้

โซลูชันนี้ช่วยให้สามารถใช้งานได้หลายอินสแตนซ์ในหน้าเดียวและประกอบด้วยอินพุตเพียงสองอินพุต (แต่ละอินพุต) พร้อมป้ายกำกับคำอธิบายสำหรับโปรแกรมอ่านหน้าจอ คุณสามารถกำหนดขนาดหัวแม่มือในจำนวนป้ายชื่อตาราง นอกจากนี้คุณสามารถใช้การสัมผัสแป้นพิมพ์และเมาส์เพื่อโต้ตอบกับแถบเลื่อน ค่าจะได้รับการอัปเดตระหว่างการปรับปรุงเนื่องจากตัวฟังเหตุการณ์ 'on input'

วิธีแรกของฉันคือการวางทับแถบเลื่อนและคลิปไว้ อย่างไรก็ตามนั่นส่งผลให้เกิดโค้ดที่ซับซ้อนและมีการอ้างอิงเบราว์เซอร์จำนวนมาก จากนั้นฉันสร้างโซลูชันขึ้นมาใหม่โดยมีแถบเลื่อนสองตัวที่ 'อินไลน์' นี่คือวิธีแก้ปัญหาที่คุณจะพบด้านล่าง

var thumbsize = 14;

function draw(slider,splitvalue) {

    /* set function vars */
    var min = slider.querySelector('.min');
    var max = slider.querySelector('.max');
    var lower = slider.querySelector('.lower');
    var upper = slider.querySelector('.upper');
    var legend = slider.querySelector('.legend');
    var thumbsize = parseInt(slider.getAttribute('data-thumbsize'));
    var rangewidth = parseInt(slider.getAttribute('data-rangewidth'));
    var rangemin = parseInt(slider.getAttribute('data-rangemin'));
    var rangemax = parseInt(slider.getAttribute('data-rangemax'));

    /* set min and max attributes */
    min.setAttribute('max',splitvalue);
    max.setAttribute('min',splitvalue);

    /* set css */
    min.style.width = parseInt(thumbsize + ((splitvalue - rangemin)/(rangemax - rangemin))*(rangewidth - (2*thumbsize)))+'px';
    max.style.width = parseInt(thumbsize + ((rangemax - splitvalue)/(rangemax - rangemin))*(rangewidth - (2*thumbsize)))+'px';
    min.style.left = '0px';
    max.style.left = parseInt(min.style.width)+'px';
    min.style.top = lower.offsetHeight+'px';
    max.style.top = lower.offsetHeight+'px';
    legend.style.marginTop = min.offsetHeight+'px';
    slider.style.height = (lower.offsetHeight + min.offsetHeight + legend.offsetHeight)+'px';
    
    /* correct for 1 off at the end */
    if(max.value>(rangemax - 1)) max.setAttribute('data-value',rangemax);

    /* write value and labels */
    max.value = max.getAttribute('data-value'); 
    min.value = min.getAttribute('data-value');
    lower.innerHTML = min.getAttribute('data-value');
    upper.innerHTML = max.getAttribute('data-value');

}

function init(slider) {
    /* set function vars */
    var min = slider.querySelector('.min');
    var max = slider.querySelector('.max');
    var rangemin = parseInt(min.getAttribute('min'));
    var rangemax = parseInt(max.getAttribute('max'));
    var avgvalue = (rangemin + rangemax)/2;
    var legendnum = slider.getAttribute('data-legendnum');

    /* set data-values */
    min.setAttribute('data-value',rangemin);
    max.setAttribute('data-value',rangemax);
    
    /* set data vars */
    slider.setAttribute('data-rangemin',rangemin); 
    slider.setAttribute('data-rangemax',rangemax); 
    slider.setAttribute('data-thumbsize',thumbsize); 
    slider.setAttribute('data-rangewidth',slider.offsetWidth);

    /* write labels */
    var lower = document.createElement('span');
    var upper = document.createElement('span');
    lower.classList.add('lower','value');
    upper.classList.add('upper','value');
    lower.appendChild(document.createTextNode(rangemin));
    upper.appendChild(document.createTextNode(rangemax));
    slider.insertBefore(lower,min.previousElementSibling);
    slider.insertBefore(upper,min.previousElementSibling);
    
    /* write legend */
    var legend = document.createElement('div');
    legend.classList.add('legend');
    var legendvalues = [];
    for (var i = 0; i < legendnum; i++) {
        legendvalues[i] = document.createElement('div');
        var val = Math.round(rangemin+(i/(legendnum-1))*(rangemax - rangemin));
        legendvalues[i].appendChild(document.createTextNode(val));
        legend.appendChild(legendvalues[i]);

    } 
    slider.appendChild(legend);

    /* draw */
    draw(slider,avgvalue);

    /* events */
    min.addEventListener("input", function() {update(min);});
    max.addEventListener("input", function() {update(max);});
}

function update(el){
    /* set function vars */
    var slider = el.parentElement;
    var min = slider.querySelector('#min');
    var max = slider.querySelector('#max');
    var minvalue = Math.floor(min.value);
    var maxvalue = Math.floor(max.value);
    
    /* set inactive values before draw */
    min.setAttribute('data-value',minvalue);
    max.setAttribute('data-value',maxvalue);

    var avgvalue = (minvalue + maxvalue)/2;

    /* draw */
    draw(slider,avgvalue);
}

var sliders = document.querySelectorAll('.min-max-slider');
sliders.forEach( function(slider) {
    init(slider);
});
* {padding: 0; margin: 0;}
body {padding: 40px;}

.min-max-slider {position: relative; width: 200px; text-align: center; margin-bottom: 50px;}
.min-max-slider > label {display: none;}
span.value {height: 1.7em; font-weight: bold; display: inline-block;}
span.value.lower::before {content: "€"; display: inline-block;}
span.value.upper::before {content: "- €"; display: inline-block; margin-left: 0.4em;}
.min-max-slider > .legend {display: flex; justify-content: space-between;}
.min-max-slider > .legend > * {font-size: small; opacity: 0.25;}
.min-max-slider > input {cursor: pointer; position: absolute;}

/* webkit specific styling */
.min-max-slider > input {
  -webkit-appearance: none;
  outline: none!important;
  background: transparent;
  background-image: linear-gradient(to bottom, transparent 0%, transparent 30%, silver 30%, silver 60%, transparent 60%, transparent 100%);
}
.min-max-slider > input::-webkit-slider-thumb {
  -webkit-appearance: none; /* Override default look */
  appearance: none;
  width: 14px; /* Set a specific slider handle width */
  height: 14px; /* Slider handle height */
  background: #eee; /* Green background */
  cursor: pointer; /* Cursor on hover */
  border: 1px solid gray;
  border-radius: 100%;
}
.min-max-slider > input::-webkit-slider-runnable-track {cursor: pointer;}
<div class="min-max-slider" data-legendnum="2">
    <label for="min">Minimum price</label>
    <input id="min" class="min" name="min" type="range" step="1" min="0" max="3000" />
    <label for="max">Maximum price</label>
    <input id="max" class="max" name="max" type="range" step="1" min="0" max="3000" />
</div>

โปรดทราบว่าคุณควรคงขนาดขั้นตอนไว้ที่ 1 เพื่อป้องกันไม่ให้ค่าเปลี่ยนแปลงเนื่องจากข้อบกพร่องในการวาดใหม่ / วาดใหม่

ดูออนไลน์ได้ที่: https://codepen.io/joosts/pen/rNLdxvK


ขอบคุณฉันชอบวิธีแก้ปัญหานี้มาก!
Svatopluk Ledl

ฉันมีปัญหากับการปัดเศษ ( avgvalueสามารถเป็น XX.5) ด้วยเหตุนี้คุณสามารถสร้างช่วงของขนาดต่ำสุด 1 ด้วยแถบเลื่อนด้านซ้าย แต่เป็น 0 ด้วยตัวเลื่อนด้านขวา ฉันได้แก้ไขแล้วด้วยfloor/ ceilสำหรับอินพุตที่เกี่ยวข้องmax/ min+ ตามเงื่อนไขpadding-leftสำหรับตัวเลื่อนที่สองจึงให้ช่วงของขนาดต่ำสุด 1 จากทั้งสองด้าน
Svatopluk Ledl
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.