2010-10-01 3 views
6

C'è un modo semplice per aggiungere padding alla barra di scorrimento di un cursore dell'interfaccia utente jQuery? Mi piacerebbe poter avere la maniglia del cursore che non raggiunge le estremità della barra. Quindi, se questa è la fine regolare sinistra:Aggiungi padding a jQuery UI Slider

no padding 
\/ 
[]------------------ 

Vorrei che avesse padding a sinistra (e destra) fine:

padding of 10px for instance 
\/ 
--[]---------------- 

Ho provato questo nel file css:

.ui-slider-horizontal { height: .8em; padding: 0 10px; }

Ma sembra jQuery UI Slider utilizza la la (outerWidth()) larghezza predefinita per determinare l'intervallo di scorrimento del manico, invece della larghezza senza PA ggiunta. Ho anche provato a hackerare il codice, sostituendo outerWidth() con width(), ma non ha fatto nulla.

In modo esplicito non voglio ricorrere a un trucco per impostare valori minimi e massimi. I valori dovrebbero sempre continuare a funzionare come previsto.

Qualche suggerimento?

Edit:

seguito il commento di pkauko; Sto usando il cursore come un elemento che ha tre etichette sopra di essa:

not      very 
important important important 
----[]-----------[]----------[]---- 

Quanto sopra illustrazione indica le posizioni in cui voglio che appaia la maniglia, centrati sotto le etichette. Ma la barra visivamente ha bisogno di allungare fino ai bordi.

+0

Sono solo curioso di perché si vuole farlo funzionare come Questo? A meno che l'idea sia che non è possibile impostare i valori minimo e massimo utilizzando il cursore e non solo l'aspetto. Altrimenti sembrerà che lo slider non funzioni correttamente se non si trova alla fine della diapositiva quando è impostato il valore minimo o massimo. – pkauko

+0

@pkauko: guarda l'aggiunta che ho fatto alla mia domanda. –

+0

Ah ok, ora capisco perché vorresti che funzionasse come descritto. Peccato, non posso aiutarti a raggiungere il comportamento desiderato. Comunque potrei avere un'idea e risponderò a breve. – pkauko

risposta

6

Ok, lo volevo spesso, ma non avevo mai avuto la motivazione per sedermi e quindi qualcosa su di esso. Dato che ora mi hai chiesto, mi sono seduto e ho hackerato il cursore di jQuery UI per aggiungere le opzioni di padding come richiesto.

Nota: l'ho aggiunto solo per i cursori orizzontali con una sola maniglia. Gli altri casi non sono più complicati. Non avevo la motivazione per eseguire la tipizzazione e i test successivi per coprire casi che probabilmente non erano necessari al momento.

Includere questo codice dopo aver incluso il dispositivo di scorrimento originale dall'interfaccia utente di jQuery. L'estensione sovrascrive un paio di metodi e aggiunge le opzioni 'paddingMin' e 'paddingMax' al widget Slider (i valori devono essere numerici e verranno interpretati come pixel, anche questo può essere facilmente esteso per prendere altre unità, ovviamente, ma anche in questo caso implicherebbe più tipizzazione/test per i casi attualmente non richiesti).

semplice esempio di utilizzo:

$('#slider').slider({ paddingMin: 50, paddingMax: 100 }); 

codice di estensione mod (fornito come è, non mi citare in giudizio):

(
    function($, undefined) 
    { 
     $.ui.slider.prototype.options = 
      $.extend(
       {}, 
       $.ui.slider.prototype.options, 
       { 
        paddingMin: 0, 
        paddingMax: 0 
       } 
      ); 

     $.ui.slider.prototype._refreshValue = 
      function() { 
       var 
        oRange = this.options.range, 
        o = this.options, 
        self = this, 
        animate = (!this._animateOff) ? o.animate : false, 
        valPercent, 
        _set = {}, 
        elementWidth, 
        elementHeight, 
        paddingMinPercent, 
        paddingMaxPercent, 
        paddedBarPercent, 
        lastValPercent, 
        value, 
        valueMin, 
        valueMax; 

       if (self.orientation === "horizontal") 
       { 
        elementWidth = this.element.outerWidth(); 
        paddingMinPercent = o.paddingMin * 100/elementWidth; 
        paddedBarPercent = (elementWidth - (o.paddingMin + o.paddingMax)) * 100/elementWidth; 
       } 
       else 
       { 
        elementHeight = this.element.outerHeight(); 
        paddingMinPercent = o.paddingMin * 100/elementHeight; 
        paddedBarPercent = (elementHeight - (o.paddingMin + o.paddingMax)) * 100/elementHeight; 
       } 

       if (this.options.values && this.options.values.length) { 
        this.handles.each(function(i, j) { 
         valPercent = 
          ((self.values(i) - self._valueMin())/(self._valueMax() - self._valueMin()) * 100) 
          * paddedBarPercent/100 + paddingMinPercent; 
         _set[ self.orientation === "horizontal" ? "left" : "bottom" ] = valPercent + "%"; 
         $(this).stop(1, 1)[ animate ? "animate" : "css" ](_set, o.animate); 
         if (self.options.range === true) { 
          if (self.orientation === "horizontal") { 
           if (i === 0) { 
            self.range.stop(1, 1)[ animate ? "animate" : "css" ]({ left: valPercent + "%" }, o.animate); 
           } 
           if (i === 1) { 
            self.range[ animate ? "animate" : "css" ]({ width: (valPercent - lastValPercent) + "%" }, { queue: false, duration: o.animate }); 
           } 
          } else { 
           if (i === 0) { 
            self.range.stop(1, 1)[ animate ? "animate" : "css" ]({ bottom: (valPercent) + "%" }, o.animate); 
           } 
           if (i === 1) { 
            self.range[ animate ? "animate" : "css" ]({ height: (valPercent - lastValPercent) + "%" }, { queue: false, duration: o.animate }); 
           } 
          } 
         } 
         lastValPercent = valPercent; 
        }); 
       } else { 
        value = this.value(); 
        valueMin = this._valueMin(); 
        valueMax = this._valueMax(); 
        valPercent = 
         ((valueMax !== valueMin) 
         ? (value - valueMin)/(valueMax - valueMin) * 100 
         : 0) 
         * paddedBarPercent/100 + paddingMinPercent; 

        _set[ self.orientation === "horizontal" ? "left" : "bottom" ] = valPercent + "%"; 

        this.handle.stop(1, 1)[ animate ? "animate" : "css" ](_set, o.animate); 

        if (oRange === "min" && this.orientation === "horizontal") { 
         this.range.stop(1, 1)[ animate ? "animate" : "css" ]({ width: valPercent + "%" }, o.animate); 
        } 
        if (oRange === "max" && this.orientation === "horizontal") { 
         this.range[ animate ? "animate" : "css" ]({ width: (100 - valPercent) + "%" }, { queue: false, duration: o.animate }); 
        } 
        if (oRange === "min" && this.orientation === "vertical") { 
         this.range.stop(1, 1)[ animate ? "animate" : "css" ]({ height: valPercent + "%" }, o.animate); 
        } 
        if (oRange === "max" && this.orientation === "vertical") { 
         this.range[ animate ? "animate" : "css" ]({ height: (100 - valPercent) + "%" }, { queue: false, duration: o.animate }); 
        } 
       } 
      }; 

     $.ui.slider.prototype._normValueFromMouse = 
      function(position) { 
       var 
        o = this.options, 
        pixelTotal, 
        pixelMouse, 
        percentMouse, 
        valueTotal, 
        valueMouse; 

       if (this.orientation === "horizontal") { 
        pixelTotal = this.elementSize.width - (o.paddingMin + o.paddingMax); 
        pixelMouse = position.x - this.elementOffset.left - o.paddingMin - (this._clickOffset ? this._clickOffset.left : 0); 
       } else { 
        pixelTotal = this.elementSize.height - (o.paddingMin + o.paddingMax); 
        pixelMouse = position.y - this.elementOffset.top - o.paddingMin - (this._clickOffset ? this._clickOffset.top : 0); 
       } 

       percentMouse = (pixelMouse/pixelTotal); 
       if (percentMouse > 1) { 
        percentMouse = 1; 
       } 
       if (percentMouse < 0) { 
        percentMouse = 0; 
       } 
       if (this.orientation === "vertical") { 
        percentMouse = 1 - percentMouse; 
       } 

       valueTotal = this._valueMax() - this._valueMin(); 
       valueMouse = this._valueMin() + percentMouse * valueTotal; 

       return this._trimAlignValue(valueMouse); 
      }; 
    } 
)(jQuery); 
+0

Ho visto nella tua modifica che vuoi usarlo con valori di snap predefiniti. Non ho ancora provato questo caso d'uso, quindi non posso garantire che funzioni. Ci sto lavorando, comunque. EDIT: Nevermind, apparentemente la mia implementazione è stata abbastanza solida da coprire quel caso. :) – Thomas

+0

@Thomas: funziona perfettamente! Grazie mille! Lo snap non è particolarmente necessario, perché uso 'min: 1, max: 3' che distribuisce le posizioni in modo uniforme come già. Ma non preoccuparti di modificarlo un po 'di più e pubblica la nuova versione, se ne hai voglia. :) Ottimo lavoro finora. Veramente bello! –

+0

Rifattorizzato il codice un po ', ha aggiunto il supporto per i cursori verticali. – Thomas

3

Lo "scatto su incrementi" accoppiato con "incompatibile" (non uniforme ai valori di snap) valori min e max danno l'effetto desiderato? So che questo porterebbe probabilmente alla conversione del valore del lato dell'applicazione, poiché probabilmente non è possibile ottenere usando i valori usati ora, ma se funziona funziona una soluzione "hack and slash".

Quello che sto suggerendo è impostare il valore minimo su, diciamo, 750. Valore di snap a 1200 e valore massimo a 4050. In questo modo lo snap più basso è 450 superiore al valore minimo e il cursore non dovrebbe mai raggiungere il più a sinistra bordo. Lo stesso vale per il valore massimo, ovvero 3 x 1200 + 450 = 4050. I valori qui utilizzati sono arbitrari e, ad esempio, solo.

Non ho provato questo e non ho idea se funziona e so che questo non è quello che stavi cercando, ma solo un'idea che mi è venuta in mente, quando ho controllato gli esempi di come jquery UI slider funziona a jqueryui .com.

Modifica: non potevo lasciarlo andare e ora so che questo funziona nel modo in cui impedisce al cursore di raggiungere le estremità della diapositiva. Hai solo bisogno di impostare il valore iniziale di conseguenza per evitare che il cursore si trovi da una parte o dall'altra quando viene caricata la pagina.

+0

Non riesco a spiegarmi perché questi valori siano necessari (non sono molto preciso in questo momento), ma questi sembrano funzionare. Ho provato anche min 300, max 3900, passo 1200, ad esempio, ma questo ha causato l'handle di andare fuori dal lato sinistro. Hmmm, strano. Dividerò per 10, che è fondamentalmente lo stesso. E anche se speravo in una soluzione in cui non avessi bisogno di convertire il valore selezionato, lo userò per ora. Grazie! –