2015-06-03 83 views
1

所以我一直在嘗試創建類似於此的東西,請注意示例1:Bootstrap Slider帶輸出的HTML範圍滑塊

正如可以從下面的例子中output看到具有被固定在滑塊,以及使用該bootstrap tooltip用於定型的效果。

陣營: - 我看到其他人試圖創建這種效果,但output似乎從來沒有與你一起滑動拇指留下完美內嵌,這裏有一個例子:

enter image description here

作爲一名設計師和前端開發人員,重要的是設計是像素完美的,所以這是完美的內聯是必須的。

Bootstrap示例效果很好,但它使用了大量的JavaScript,我真的不需要,我只想使用HTML輸入元素與type="range",並根據一個小的JavaScript風格它是功能。

這是我到目前爲止有:

var r = document.querySelectorAll('input[type=range]'), 
 
    prefs = ['webkit-slider-runnable', 'moz-range'], 
 
    styles = [], 
 
    l = prefs.length, 
 
    n = r.length; 
 

 
var getTrackStyleStr = function(el, j) { 
 
    var str = '', 
 
     min = el.min || 0, 
 
     perc = (el.max) ? ~~(100*(el.value - min)/(el.max - min)) : el.value, 
 
     val = perc + '% 100%'; 
 

 
    for(var i = 0; i < l; i++) { 
 
    str += "input[type=range][data-rangeId='" + j + "']::-" + prefs[i] + '-track{background-size:' + val + '} '; 
 
    } 
 
    return str; 
 
}; 
 

 
var setDragStyleStr = function(evt) { 
 
    var trackStyle = getTrackStyleStr(evt.target, this); 
 
    styles[this].textContent = trackStyle; 
 
}; 
 

 
for(var i = 0; i < n; i++) { 
 
    var s = document.createElement('style'); 
 
    document.body.appendChild(s); 
 
    styles.push(s); 
 
    r[i].setAttribute('data-rangeId', i); 
 
    r[i].addEventListener('input', setDragStyleStr.bind(i), false); 
 
} 
 

 
function outputUpdate(value) { 
 
document.querySelector('#slider').value = value; 
 
}
html { 
 
    background: #393939; 
 
} 
 

 
input[type='range'] { 
 
    display: block; 
 
    margin: 2.5em auto; 
 
    border: solid .5em transparent; 
 
    padding: 0; 
 
    width: 15.5em; 
 
    height: 1em; 
 
    border-radius: .25em; 
 
    background: transparent; 
 
    font-size: 1em; 
 
    cursor: pointer; 
 
} 
 
input[type='range'], 
 
input[type='range']::-webkit-slider-runnable-track, 
 
input[type='range']::-webkit-slider-thumb { 
 
    -webkit-appearance: none; 
 
} 
 
input[type='range']::-webkit-slider-runnable-track { 
 
    width: 15.5em; 
 
    height: 0.5em; 
 
    border-radius: 0.25em; 
 
    background: #fff; 
 
} 
 
input[type='range']::-webkit-slider-runnable-track { 
 
    background: linear-gradient(#e44e4f, #e44e4f) no-repeat #fff; 
 
} 
 
input[type='range']::-moz-range-track { 
 
    width: 15.5em; 
 
    height: 0.5em; 
 
    border-radius: 0.25em; 
 
    background: #fff; 
 
} 
 
input[type='range']::-moz-range-track { 
 
    background: linear-gradient(#e44e4f, #e44e4f) no-repeat #fff; 
 
} 
 
input[type='range']::-ms-track { 
 
    border: none; 
 
    width: 15.5em; 
 
    height: 0.5em; 
 
    border-radius: 0.25em; 
 
    background: #fff; 
 
    color: transparent; 
 
} 
 
input[type='range']::-ms-fill-lower { 
 
    border-radius: 0.25em; 
 
    background: #e44e4f; 
 
} 
 
input[type='range']::-webkit-slider-runnable-track { 
 
    background-size: 0% 100%; 
 
} 
 
input[type='range']::-moz-range-track { 
 
    background-size: 0% 100%; 
 
} 
 
input[type='range']::-webkit-slider-thumb { 
 
    margin-top: -0.125em; 
 
    border: none; 
 
    width: 0.75em; 
 
    height: 0.75em; 
 
    border-radius: 50%; 
 
    box-shadow: 0 0 0.125em #333; 
 
    background: #fff; 
 
} 
 
input[type='range']::-moz-range-thumb { 
 
    border: none; 
 
    width: 0.75em; 
 
    height: 0.75em; 
 
    border-radius: 50%; 
 
    box-shadow: 0 0 0.125em #333; 
 
    background: #fff; 
 
} 
 
input[type='range']::-ms-thumb { 
 
    border: none; 
 
    width: 0.75em; 
 
    height: 0.75em; 
 
    border-radius: 50%; 
 
    box-shadow: 0 0 0.125em #333; 
 
    background: #fff; 
 
} 
 
input[type='range']::-ms-tooltip { 
 
    display: none; 
 
} 
 
input[type='range']:focus { 
 
    outline: none; 
 
    box-shadow: 0 0 0.25em #e44e4f; 
 
} 
 
output { 
 
    color: white; 
 
}
<div> 
 
     <input id="range" type="range" value="0" oninput="outputUpdate(value)"> 
 
     <output for=range id=slider>0</output> 
 
    </div> 
 
    <div><input type="range" value="0"></div> 
 
    <div><input type="range" value="0"></div>

我也包括代碼JS Bin

的外部鏈接的任何幫助,將不勝感激!

+0

你說的引導例子效果很好,但包括你不需要額外的JS。爲什麼不從他的bootstrap版本開始,並開始將其配對到只有你需要的? –

+1

有1400行javascript,我認爲只要擴展到我已有的東西就更容易了。 – Jordan

+0

另外我很確定你必須保留所有的許可證和原始代碼的作者在文檔頂部的評論部分,我寧願不這樣做。 – Jordan

回答

0

檢查此鏈接:https://css-tricks.com/value-bubbles-for-range-inputs/

這是代碼

<html> 
<head> 
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script> 
<script src=https://rawgit.com/jeffshaver/styl.js/master/src/styl.min.js></script> 
<style> 

/*position container at the center*/ 
.container { 
    position: absolute; 
    top: 50%; 
    left: 50%; 
    -webkit-transform: translate(-50%, -50%); 
     -ms-transform: translate(-50%, -50%); 
      transform: translate(-50%, -50%); 
} 

input[type=range] { 
    -webkit-appearance: none; /*remove default style*/ 
    background: none; 
} 
/*style for track*/ 
input[type=range]::-webkit-slider-runnable-track { 
    height: 5px; 
    background: #ddd; 
    border: none; 
    border-radius: 3px; 
} 

input[type=range]::-ms-track { 
    height: 5px; 
    background: #ddd; 
    border: none; 
    border-radius: 3px; 
} 

input[type=range]::-moz-range-track { 
    height: 5px; 
    background: #ddd; 
    border: none; 
    border-radius: 3px; 
} 
/*style for thumb*/ 

input[type=range]::-webkit-slider-thumb { 
    -webkit-appearance: none; 
    border: none; 
    height: 16px; 
    width: 16px; 
    border-radius: 50%; 
    background: #555; 
    margin-top: -5px; 
    position: relative; 
} 

input[type=range]::-ms-thumb { 
    -webkit-appearance: none; 
    border: none; 
    height: 16px; 
    width: 16px; 
    border-radius: 50%; 
    background: #555; 
    margin-top: -5px; 
    position: relative; 
} 

input[type=range]::-moz-range-thumb { 
    -webkit-appearance: none; 
    border: none; 
    height: 16px; 
    width: 16px; 
    border-radius: 50%; 
    background: #555; 
    margin-top: -5px; 
    position: relative; 
} 
/*hide the outline behind the border*/ 
input[type=range]:focus { 
    outline: none; 
} 
/*pseudo-element for the thumb*/ 
input[type=range]:focus::-webkit-slider-thumb:after { 
    position: absolute; 
    top: -35px; 
    left: 50%; 
    -webkit-transform: translateX(-50%); 
      transform: translateX(-50%); 
    border: 10px solid transparent; 
    border-bottom-color: #333; 
    top: 100%; 
    left: 50%; 


} 
input[type=range]:focus::-ms-thumb:after { 
position: absolute; 
    top: -35px; 
    left: 50%; 
    -webkit-transform: translateX(-50%); 
      transform: translateX(-50%); 
    border: 10px solid transparent; 
    border-bottom-color: #333; 
    top: 100%; 
    left: 50%; 


} 
input[type=range]:focus::-moz-range-thumb:after { 
    position: absolute; 
    top: -35px; 
    left: 50%; 
    -webkit-transform: translateX(-50%); 
      transform: translateX(-50%); 
    border: 10px solid transparent; 
    border-bottom-color: #333; 
    top: 100%; 
    left: 50%; 

} 

input[type=range]:focus::-webkit-slider-runnable-track { 
    background: #ccc; 
} 

input[type=range]:focus::-ms-track { 
    background: #ccc; 
} 

input[type=range]:focus::-moz-range-track { 
    background: #ccc; 
} 

</style> 
</head> 
<body> 
<div class="container"> 
    <input id="test" type="range" min="0" max="100" step="1" value="0"/> 
</div> 
<script type="text/javascript"> 
$('input[type="range"]').on('mouseup', function() { 
    this.blur(); 
}).on('mousedown input', function() {/*on mousedown, the position of the thumb is set to content and this style is injected using styl.js*/ 
    styl.inject('input[type=range]:focus::-webkit-slider-thumb:after, input[type=range]:focus::-ms-thumb:after, input[type=range]:focus::-moz-range-thumb:after', { 
    content: "'" + this.value + "'" 
    }).apply(); 
}); 
</script> 
</body> 
</html> 
+0

感謝您在編輯一些更多的信息,但你真的應該添加評論。解釋爲什麼這有助於。解釋這段代碼的作用。解釋**如何以及爲什麼**解決了這個問題。另外,如果你可以清理代碼格式 - 這個帖子很難閱讀,那就太好了。 –

+0

感謝您的回覆@Subhashini,但在我的問題中,我插入了一個截圖,我用於exmaple的屏幕截圖實際上來自您也鏈接到了我的CSS技巧站點,它輸出的泡泡永遠不會與滑塊拇指保持完全內聯不同自舉之一。 – Jordan

2

約根據輸入使它跟蹤鼠標的x位置在所述輸入元件的寬度的跨度和設置其y位置什麼元素在文檔中的位置?請參閱下面的代碼片段。如果有的話,我的回答太順利了(實際上比輸入本身稍微不連貫)。如果你希望它遵循輸入的不連貫性,只需做一點編碼就可以將px值變成一個百分比(如輸入),然後從那裏開始。

否則,我認爲這是你正在尋找的答案。只是改變你的喜好(我做了一個快速的工作,只是爲了使其實際工作)

哦,並有文檔加載和調整大小時運行的功能。這樣,它在合適的位置開出,仍然有

var r = document.querySelectorAll('input[type=range]'), 
 
    prefs = ['webkit-slider-runnable', 'moz-range'], 
 
    styles = [], 
 
    l = prefs.length, 
 
    n = r.length; 
 

 
var getTrackStyleStr = function (el, j) { 
 
    var str = '', 
 
     min = el.min || 0, 
 
     perc = (el.max) ? ~~ (100 * (el.value - min)/(el.max - min)) : el.value, 
 
     val = perc + '% 100%'; 
 

 
    for (var i = 0; i < l; i++) { 
 
     str += "input[type=range][data-rangeId='" + j + "']::-" + prefs[i] + '-track{background-size:' + val + '} '; 
 
    } 
 
    return str; 
 
}; 
 

 
var setDragStyleStr = function (evt) { 
 
    var trackStyle = getTrackStyleStr(evt.target, this); 
 
    styles[this].textContent = trackStyle; 
 
}; 
 

 
for (var i = 0; i < n; i++) { 
 
    var s = document.createElement('style'); 
 
    document.body.appendChild(s); 
 
    styles.push(s); 
 
    r[i].setAttribute('data-rangeId', i); 
 
    r[i].addEventListener('input', setDragStyleStr.bind(i), false); 
 
} 
 

 
var mouseDown = false; 
 
var el = document.querySelector("#slider"); 
 
var input = document.querySelector("#this"); 
 

 
function outputUpdate(value) { 
 
    el.value = value; 
 
    el.style.top = input.offsetTop + 30 + "px"; 
 
} 
 

 
(function() { 
 
    document.onmousemove = handleMouseMove; 
 

 
    function handleMouseMove(event) { 
 
     var dot, eventDoc, doc, body, pageX, pageY; 
 

 
     event = event || window.event; // IE-ism 
 

 
     // If pageX/Y aren't available and clientX/Y are, 
 
     // calculate pageX/Y - logic taken from jQuery. 
 
     // (This is to support old IE) 
 
     if (event.pageX === null && event.clientX !== null) { 
 
      eventDoc = (event.target && event.target.ownerDocument) || document; 
 
      doc = eventDoc.documentElement; 
 
      body = eventDoc.body; 
 

 
      event.pageX = event.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc && doc.clientLeft || body && body.clientLeft || 0); 
 
      event.pageY = event.clientY + (doc && doc.scrollTop || body && body.scrollTop || 0) - (doc && doc.clientTop || body && body.clientTop || 0); 
 
     } 
 
     if (mouseDown) { 
 
      if (event.pageX < input.offsetLeft + 14) { 
 
       el.style.left = input.offsetLeft + "px"; 
 
      } else if (event.pageX > input.offsetLeft + input.clientWidth) { 
 
       el.style.left = input.offsetLeft + input.clientWidth - 14 + "px"; 
 
      } else { 
 
       el.style.left = event.pageX - 15 + "px"; 
 
      } 
 
      // Use event.pageX/event.pageY here} 
 
     } 
 
    } 
 
})();
html { 
 
    background: #393939; 
 
} 
 

 
input[type='range'] { 
 
    display: block; 
 
    margin: 2.5em auto; 
 
    border: solid .5em transparent; 
 
    padding: 0; 
 
    width: 15.5em; 
 
    height: 1em; 
 
    border-radius: .25em; 
 
    background: transparent; 
 
    font-size: 1em; 
 
    cursor: pointer; 
 
} 
 
input[type='range'], 
 
input[type='range']::-webkit-slider-runnable-track, 
 
input[type='range']::-webkit-slider-thumb { 
 
    -webkit-appearance: none; 
 
} 
 
input[type='range']::-webkit-slider-runnable-track { 
 
    width: 15.5em; 
 
    height: 0.5em; 
 
    border-radius: 0.25em; 
 
    background: #fff; 
 
} 
 
input[type='range']::-webkit-slider-runnable-track { 
 
    background: linear-gradient(#e44e4f, #e44e4f) no-repeat #fff; 
 
} 
 
input[type='range']::-moz-range-track { 
 
    width: 15.5em; 
 
    height: 0.5em; 
 
    border-radius: 0.25em; 
 
    background: #fff; 
 
} 
 
input[type='range']::-moz-range-track { 
 
    background: linear-gradient(#e44e4f, #e44e4f) no-repeat #fff; 
 
} 
 
input[type='range']::-ms-track { 
 
    border: none; 
 
    width: 15.5em; 
 
    height: 0.5em; 
 
    border-radius: 0.25em; 
 
    background: #fff; 
 
    color: transparent; 
 
} 
 
input[type='range']::-ms-fill-lower { 
 
    border-radius: 0.25em; 
 
    background: #e44e4f; 
 
} 
 
input[type='range']::-webkit-slider-runnable-track { 
 
    background-size: 0% 100%; 
 
} 
 
input[type='range']::-moz-range-track { 
 
    background-size: 0% 100%; 
 
} 
 
input[type='range']::-webkit-slider-thumb { 
 
    margin-top: -0.125em; 
 
    border: none; 
 
    width: 0.75em; 
 
    height: 0.75em; 
 
    border-radius: 50%; 
 
    box-shadow: 0 0 0.125em #333; 
 
    background: #fff; 
 
} 
 
input[type='range']::-moz-range-thumb { 
 
    border: none; 
 
    width: 0.75em; 
 
    height: 0.75em; 
 
    border-radius: 50%; 
 
    box-shadow: 0 0 0.125em #333; 
 
    background: #fff; 
 
} 
 
input[type='range']::-ms-thumb { 
 
    border: none; 
 
    width: 0.75em; 
 
    height: 0.75em; 
 
    border-radius: 50%; 
 
    box-shadow: 0 0 0.125em #333; 
 
    background: #fff; 
 
} 
 
input[type='range']::-ms-tooltip { 
 
    display: none; 
 
} 
 
input[type='range']:focus { 
 
    outline: none; 
 
    box-shadow: 0 0 0.25em #e44e4f; 
 
} 
 
output { 
 
    color: white; 
 
    background-color: red; 
 
    padding: 5px 10px; 
 
    position: absolute; 
 
} 
 
output::before { 
 
    width: 0; 
 
height: 0; 
 
border-style: solid; 
 
border-width: 0 5px 10px 5px; 
 
border-color: transparent transparent #ff0000 transparent; 
 
    position: absolute; 
 
    top: -10px; 
 
    content: " "; 
 
}
<script src="https://code.jquery.com/jquery-1.11.1.min.js"></script><div> 
 
    <input id="this" type="range" value="0" onmousedown="mouseDown = true;" onmouseup="mouseDown = false;" oninput="outputUpdate(value)"> 
 
    <output for="range" id="slider">0</output> 
 
</div> 
 
<div><input type="range" value="0"></div> 
 
<div><input type="range" value="0"></div>

+1

是啊,它很波濤洶涌,當你說輸出單元從'px'改成百分比時,你能演示一個演示嗎?或在語法中的評論? – Jordan

+1

也許你可以像我在我的問題中提到的那樣包含bootstrap工具提示? – Jordan