2011-07-05 17 views
6

Il mio problema è che la barra di scorrimento verticale di Windows del browser che viene rimossa, ad esempio overflow:hidden;, farà saltare la pagina, quando riappare dopo. Io uso jQuery per rimuovere l'opzione di scorrimento da parte del visitatore, mentre uno script è in esecuzione e scorrendo la pagina ad un punto specifico, e poi per farlo riapparire di nuovo in seguito:Come creare un segnaposto barra di scorrimento

www.nebulafilm.dk/index.html?content

Posso fare un segnaposto per la barra di scorrimento, quando non è presente, quindi non sarà saltare indietro?

Oppure è possibile "disattivarlo" e farlo "in grigio"?

Non riesco a trovare nessuna soluzione cercando. Ho trovato qualcosa di simile qui: stackoverflow.com dove la barra di scorrimento è sempre lì. Ma la differenza è che la barra di scorrimento deve rimanere disabilitata, anche se la pagina è più lunga della finestra. Deve essere "attivato" di nuovo solo attraverso un altro script che controllo.

È questo in alcun modo possibile?

Grazie.


Aggiornamento:

Tempo per un aggiornamento di stato.

Ho avuto alcuni problemi con l'immagine di sfondo della stella nuvola, che è stata impostata sul tag body.
Quando lo script jQuery (dalla risposta delle lupi) ha aggiunto il padding al tag html e pertanto dovrebbe spostare tutti gli elementi nella pagina a sinistra, l'immagine di sfondo non si è comportata correttamente.

Bene, ho scoperto che l'elemento body non reagisce come qualsiasi elemento div. Non è solo un "blocco" all'interno del tag html come qualsiasi altro elemento del blocco. Ha i suoi comportamenti e apparentemente non può essere ingannato allo stesso modo. Pertanto l'immagine di sfondo era impossibile da toccare, mentre era su body.
Ma mi c'è voluto del tempo per capire ...

La soluzione fine a questo è così lanciando stupidamente semplice che ero quasi in lacrime quando scoprire, pensare alle infinite (potrei esagerare un po ') ore di investigando sul body.
Ho semplicemente avvolto tutto in un <div id="body"> e ho dato questa immagine di sfondo. All'improvviso tutto è andato a posto.

Da:

<body> 
... 
</body> 

E

body {background-image: url(...);} 

A:

<body> 
<div id="body"> 
... 
</div> 
</body> 

E:

#body {background-image: url(...);} 

An d un po 'più saggio su body.

Nessun "salto" più. Delizioso.

L'effetto è ora completamente in esecuzione e quasi non si nota alcun cambiamento con la barra di scorrimento e ogni dettaglio si adatta. La sceneggiatura di Cwolve è perfetta e fa il calcolo esatto:

function getScrollBarWidth(){ 
    var div = $('<div><div>' + new Array(100).join('content<br />') + '</div></div>'), 
     div2 = div.find('div'), 
     body = $(document.body); 

    div.css({ overflow : 'hidden', width: 100, height: 100, position : 'absolute', left : -1000, top : -1000 }); 
    body.append(div); 

    var width1 = div2.width(); 
    div.css({ overflow : 'auto' }); 
    var width2 = div2.width(); 

    div.remove(); 

    return width1 - width2; 
} 

Il getScrollBarWidth() conterrà esattamente la larghezza della barra di scorrimento non importa il browser, e posso usarlo per aggiungere e rimuovere imbottiture come voglio:

var sWidth = getScrollBarWidth(); 

    $("body").css({'overflow': 'hidden'}); 
    $("html").css({'padding-right': sWidth}); 

    $('html, body').delay(1000).animate({ 

     scrollTop: $(hash).offset().top - 170 

    }, 2000, 'swing', function(){ 

     $("body").css({'overflow': 'auto'}); 
     $("html").css({'padding-right': 0}); 

    }); 

Grazie mille. Questo è stato bello.

risposta

5

ne dite di questo:

  • determinare la larghezza della barra di scorrimento nel browser corrente
  • Impostare un div contenuto padding-right: scrollbar-width
  • Nascondi scorrimento sul genitore

e dopo l'animazione :

  • Rimuovere padding-right sui contenuti
  • spettacolo di scorrimento sul genitore

ho fatto una demo: http://jsfiddle.net/cwolves/ezLfU/1/

+0

Sì, questa è una soluzione, se non è possibile la manipolazione diretta della barra di scorrimento. Ma dipenderà dal browser ed è un lavoro laborioso. – Steeven

+0

Quanto è laborioso? Ti ho dato una demo che calcola la larghezza della barra di scorrimento :) L'effettiva implementazione richiede di aggiungere la funzione che ho creato e 3 righe di codice, che sono anche nella demo (cambia semplicemente i selettori). –

+0

Bene, dovrai trovare la larghezza esatta della barra di scorrimento per ciascun tipo di browser e implementare una sorta di controllo del browser. E ancora non sarà una soluzione sicura. Ma è una parte del modo, e una possibile soluzione, quindi grazie per la risposta. – Steeven

-1

La visualizzazione di una barra di scorrimento disabilitata è semplice come l'impostazione di overflow: scorrere;

verticale solo sarebbe overflow-y:scroll

+0

No no, questo non darà una barra di scorrimento disabilitata quando la pagina è più lunga dello schermo. Quindi inizia a "lavorare" che sto cercando di prevenire. Deve essere disabilitato o rimosso e sostituito con un segnaposto. – Steeven

+0

Ah no, non credo che sia possibile con javascript, avresti bisogno di un plugin per browser per manipolare gli elementi del browser. Pensavo volessi semplicemente che la tua pagina non "saltasse" quando era presente la barra di scorrimento. Una cosa che puoi fare è modellare la barra di scorrimento in modo che corrisponda alla tua pagina, ma sfortunatamente funziona solo in IE (Esempio: http://www.steve-terada.com) – AlienWebguy

1

Ho appena guardato il vostro sito e il pensiero di un approccio alternativo. Se stai nascondendo la barra di scorrimento con overflow: nascosto, potresti anche reimplementare lo scrolling.

Fissare gli eventi alla pagina su/pagina giù/home/fine/freccia su/freccia giù, rotella del mouse su/rotellina del mouse verso il basso, e poi fare

$(window).scrollTop($(window).scrollTop() + 15) 

Il codice di cui sopra è ovviamente male e solo un esempio, ma probabilmente qualcosa che potresti provare.

+0

Ok, questa è una soluzione che funzionerà su tutti i browser. È comunque abbastanza contorto invece di ingrigire la barra di scorrimento. Ma non sembra comunque possibile. – Steeven

+1

Giusto. Di solito il browser non ti lascia fare troppo casino con la barra di scorrimento. Stai cercando di fare qualcosa di complicato con il tuo sito, quindi probabilmente stai per ottenere una soluzione più complicata che elegante. – Jordan

1

Che ne dite di fare sul suo sito web un paio di pixel meno largo del contenitore e commutando l'attributo di overflow-y ?

Le barre di scorrimento possono avere larghezze diverse su diversi browser/SO. Se non hai intenzione di calcolare la larghezza della barra di scorrimento è meglio prenderlo abbastanza largo in modo che funzioni su tutti i browser.

Example

+1

Ciò richiede conoscere esattamente l'ampiezza del contenitore e l'osservazione dell'evento 'resize' della finestra e l'aggiornamento delle modifiche. Inoltre, la differenza di '20px' non è sicura poiché le barre di scorrimento possono essere più ampie di quelle. –

+0

Beh, questo è interessante! Ma non avrò problemi nel provare a impostare una larghezza di 20 px in meno rispetto alla finestra? Sul sito non sto impostando alcuna larghezza specifica per le caselle degli elementi della pagina, ma solo le larghezze variabili per renderle allineate al centro. Allora salteranno ancora, come vedo io? – Steeven

+0

@cwolves true, dipende dalla complessità che si è disposti a inserire nella pagina. È sempre un compromesso. Pensavo che la tua soluzione fosse eccessivamente ingegnerizzata, quindi ho inserito un'alternativa con un piccolo compromesso in termini di funzionalità ma un guadagno in termini di prestazioni. – Jan