2015-06-01 17 views
6

Quindi, di recente, ho modificato lo stile del dispositivo di scorrimento della gamma html.Dispositivo di scorrimento Html Range con Javascript

Mi sono imbattuto in una penna su una codepen che aveva qualcosa di diverso da alcuni progetti davvero ispiratori, alcuni dei quali funzionanti.

Questo è il codice sorgente da uno.

HTML:

<input type="range" data-idx="1"> 

CSS:

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; 
} 
.js 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; 
} 
.js 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']:nth-of-type(1)::-webkit-slider-runnable-track { 
    background-size: 50% 100%; 
} 
input[type='range']:nth-of-type(1)::-moz-range-track { 
    background-size: 50% 100%; 
} 
input[type='range']:nth-of-type(1)::-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']:nth-of-type(1)::-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']:nth-of-type(1)::-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']:nth-of-type(1)::-ms-tooltip { 
    display: none; 
} 
input[type='range']:focus { 
    outline: none; 
    box-shadow: 0 0 0.25em #e44e4f; 
} 

Javascript:

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

document.body.appendChild(s); 

var getTrackStyleStr = function(el) { 
    var str = '', 
     j = el.dataset.idx, 
     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 += '.js input[type=range]:nth-of-type(' + j + ')::-' + prefs[i] + '-track{background-size:' + val + '}'; 
    } 

    return str; 
}; 

var getTipStyleStr = function(el) { 
    var str = '.js input[type=range]:nth-of-type(' + el.dataset.idx + ') /deep/ #thumb:after{content:"' + el.value + '%"}'; 

    return str; 
}; 

for(var i = 0; i < n; i++) { 
    styles.push(''); 

    r[i].addEventListener('input', function() {  
    styles[this.dataset.idx] = getTrackStyleStr(this); 
    if(this.classList.contains('tip')) { 
     styles[this.dataset.idx] += getTipStyleStr(this); 
    } 

    s.textContent = styles.join(''); 
    }, false); 
} 

Questa grande opera per una r elemento di ange ma se provo ad aggiungere più elementi di intervallo sulla stessa pagina e cambi l'attributo di dati in data-idx="2" non funzionerà, il primo intervallo li controllerà tutti.

Come posso regolare il codice per far funzionare ciascuna gamma in modo indipendente?

Ecco un JSFiddle del codice che sto utilizzando, per qualche motivo il javascript non funziona sul lì a tutti, ma è funziona bene su codepen? Hmm ...

Ecco l'originale Codepen

+0

Non funziona su codepen con più elementi IDX sia – rafaelcastrocouto

+0

Sì, lo so, è per questo che ho bisogno di regolare il javascript. – Jordan

+0

Ok, l'ho risolto! non un grosso problema ... solo qualche strano codice da babydino con quelli idx e/deep/stuff rsrss – rafaelcastrocouto

risposta

0

SOLUTION

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%'; 
 

 
    el.previousElementSibling.textContent = el.value; 
 
    
 
    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)); 
 
}
html { 
 
    background: #393939; 
 
} 
 

 
div { 
 
    margin: 2.5em auto; 
 
} 
 

 
input[type='range'] { 
 
    display: block; 
 
    margin: 0.2em 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[for='range'] { 
 
    font-family: "Lucida Grande","Lucida Sans Unicode", Tahoma, Sans-Serif; 
 
    font-size: 13px; 
 
    color: white; 
 
    display: block; 
 
    text-align: center; 
 
}
<div> 
 
    <output for="range">0</output> 
 
    <input type="range" value="0"> 
 
</div> 
 
<div> 
 
    <output for="range">0</output> 
 
    <input type="range" value="0"> 
 
</div> 
 
<div> 
 
    <output for="range">0</output> 
 
    <input type="range" value="0"> 
 
</div>

+0

Wow, funziona perfettamente. Sì, babydino ha parecchi esempi di cursori e usa la stessa javascript per la maggior parte di questi, mi ha confuso il modo in cui ne ha scritto alcuni e usando 'data-idx'. Ottimo lavoro per semplificarlo, grazie! :) – Jordan

+0

Inoltre, hai idea del motivo per cui il codice non funzionava quando l'ho copiato in un jsfiddle? – Jordan

+0

Basta testare il tuo codice e notato che se inserisci uno degli input in un tag div, ad esempio, il codice si rompe. Potresti aggiornare la tua risposta con una soluzione per questo? – Jordan

0

jQuery UI offre alcuni cursori funzionali che possono essere utilizzati in più istanze in una pagina. Non è necessario scrivere o modificare tanto codice per utilizzarli come sopra. A meno che tu non stia cercando di evitare jquery, questa potrebbe essere una soluzione migliore per te.

Questo è un collegamento allo multiple sliders demo.

L'approccio utilizzato per molteplici dispositivi di scorrimento si basa naturalmente su jQuery, ma dato markup come:

<div id="eq"> 
    <span>88</span> 
    <span>77</span> 
    <span>55</span> 
    <span>33</span> 
    <span>40</span> 
    <span>45</span> 
    <span>70</span> 
</div> 

Una semplice dichiarazione .each loro tutte le maniglie impostazione.

$("#eq > span").each(function() { 
    // read initial values from markup and remove that 
    var value = parseInt($(this).text(), 10); 
    $(this).empty().slider({ 
    value: value, 
    range: "min", 
    animate: true, 
    orientation: "vertical" 
    }); 
}); 

Edit: Come da commenti qui sotto, se si desidera aggiungere tool-suggerimenti/consigli, è necessario roll your own. Ecco un breve esempio tratto da un codice che ho scritto l'anno scorso. Ha alcuni comportamenti specifici che si adattano alle esigenze dei miei utenti, ma questo dovrebbe darti un'idea. L'id "hintrow" si riferisce a una riga di una tabella su una griglia che conteneva il mio cursore. Attraverso la sperimentazione, puoi probabilmente trovare il posto migliore relativo ai tuoi vari cursori per aggiungerlo. Si posizionerà in modo tale che tu voglia solo un nodo dom ad aggiungerlo.

function drawExtCues(){ 
    z = 200; 
    $('#hintrow').append('<div id="hintContainer" style="position:relative"></div>'); 
    for(h in rowobjects){ 
     z++; 
     $('#hintContainer').append('<div title="' + rowobject[h].property1 + '" class="' + rowobject[h].property2+ ' ui-slider-range hint" style="z-index:' + z +';">' + rowobject[h].property1+ '</div>'); 
    } 
    $('.hint').mouseover(function(){ 
      hintMouseOver();     
     });  
    } 

    function hintMouseOver(){ 
    $('.hint').addClass('hintInspect',500); 
    $('.hint').unbind('mouseover'); 
    $('.hint').click(function(){ 
      $J('.hint').removeClass('hintInspect',500); 
      $J('.hint').mouseover(function(){hintMouseOver();}) 
     });     

    } 

Nota z ++. Questo è stato usato per garantire che i miei suggerimenti per gli strumenti si accumulassero. Dal momento che li abbiamo fatti fare clic per chiudere nel nostro caso, questo ha funzionato bene. Non è necessario, ma se non si utilizza un clic per ignorare, è possibile associare un timeout per cancellare il suggerimento.

La funzione hintMouseOver esegue alcune operazioni di pulizia della casa, ad esempio l'interruzione automatica della connessione per evitare chiamate ripetute. È rimbalzo dopo l'evento click per ignorare che il tool tip è stato attivato. Questo è solo il comportamento che il mio cliente voleva. Potresti fare un sacco di cose qui. La classe hintInspect è fondamentalmente le regole di stile per la visualizzazione del tuo suggerimento. Puoi farlo sembrare come più ti piace. Penso di aver appena usato un semplice contorno nero con sfondo grigio.

+0

Quanto sarebbe facile per lo stile del cursore? Sto volendo usare stili simili a quello che ho postato sopra. Ho anche bisogno di ottenere un risultato dal cursore, voglio espandermi sopra e avere una bolla sopra il cursore che mostra il valore. – Jordan

+0

Puoi usare il rullo per i temi ui jquery o puoi semplicemente scrivere il tuo foglio di stile. Il controllo slider inserito ha nomi di classi prevedibili che puoi ispezionare per scrivere le tue regole di stile, che ho fatto da solo, e quindi suggerisco di usare i temi jquery con un po 'di lavoro. Penso che ci sia anche un argento su nero come il tuo violino. –

+0

Ho appena aggiornato il mio commento^ – Jordan

Problemi correlati