Impedisci alla barra di scorrimento di aggiungersi alla larghezza della pagina su Chrome


125

Ho un piccolo problema cercando di mantenere le mie pagine .html a una larghezza costante su Chrome, ad esempio ho una pagina (1) con molti contenuti che supera l'altezza del viewport (parola giusta?), Quindi c'è una barra di scorrimento verticale in quella pagina (1). A pagina (2) ho lo stesso layout (menu, div, ... ecc.) Ma meno contenuto, quindi nessuna barra di scorrimento verticale.

Il problema è che a pagina (1) le barre di scorrimento sembrano spingere gli elementi leggermente a sinistra (sommando la larghezza?) Mentre tutto appare ben centrato sulla pagina (2)

Sono ancora un principiante su HTML / CSS / JS e sono abbastanza convinto che non sia così difficile, ma non ho avuto fortuna a trovare la soluzione. Funziona come previsto su IE10 e FireFox (barre di scorrimento non interferenti), l'ho riscontrato solo su Chrome.

Risposte:


42

È possibile ottenere la dimensione della barra di scorrimento e quindi applicare un margine al contenitore.

Qualcosa come questo:

var checkScrollBars = function(){
    var b = $('body');
    var normalw = 0;
    var scrollw = 0;
    if(b.prop('scrollHeight')>b.height()){
        normalw = window.innerWidth;
        scrollw = normalw - b.width();
        $('#container').css({marginRight:'-'+scrollw+'px'});
    }
}

CSS per rimuovere la barra di scorrimento h:

body{
    overflow-x:hidden;
}

Prova a dare un'occhiata a questo: http://jsfiddle.net/NQAzt/


1
Soluzione intelligente, però non capisco la condizione nel "se"!
Acemad

3
ScrollHeight è l'altezza totale di un elemento. Quello che vedi e quello che è nascosto. Un esempio: la tua finestra è alta come 500px, il corpo ha un contenuto per 900px. Vengono mostrati 500px ma gli altri 400px sono nascosti e la barra di scorrimento apparirà per mostrare questo pixel rimanente. Quindi la condizione è del tipo "se l'altezza di tutti i contenuti è maggiore dell'altezza del punto di vista, aggiungi il margine al corpo". Scusa per il mio cattivo inglese
Lwyrn

Ho capito ora, grazie per la chiara spiegazione, ho provato questa soluzione e ho ottenuto una barra di scorrimento orizzontale aggiuntiva, non so perché però.
Acemad

2
Ho aggiunto un piccolo pezzo di CSS per impedirlo nella risposta :)
Lwyrn

4
Questa soluzione disabilita lo scorrimento
valanga1

117

DISCLAIMER : l' overlay è stato deprecato .
Puoi ancora usarlo se devi assolutamente, ma cerca di non farlo.

Funziona solo sui browser WebKit , ma mi piace molto. Si comporterà come autosu altri browser.

.yourContent{
   overflow-y: overlay;
}

Questo farà apparire la barra di scorrimento solo come una sovrapposizione , quindi non influenzerà la larghezza del tuo elemento!


Non funziona per IE11. C'è qualche soluzione per far funzionare il valore di sovrapposizione in IE.
Anvesh Reddy il

non per quanto ne so, dovrai
accontentarti

Molto richiesto! Ho impiegato più di mezz'ora per vedere cosa diavolo ho fatto di sbagliato con il mio markup. Quali stili ho abusato? Anche questo dovrebbe essere predefinito.
kushalvm

3
Ma è deprecato
Akash Yellappa

1
Ho aggiornato la soluzione per riflettere questo. Un po 'triste: P
simonDos

57

Tutto quello che devi fare è aggiungere:

html {
    overflow-y: scroll;
}

Nel tuo file css in quanto questo avrà lo scroller se è necessario o meno, anche se non sarai in grado di scorrere

Ciò significa che il viewport avrà la stessa larghezza per entrambi


4
quindi, sono obbligato ad aggiungere barre di scorrimento ad entrambi? non c'è un modo per ignorare semplicemente la larghezza della barra di scorrimento verticale? Grazie !
Acemad

Non c'è modo di ignorarlo di cui sono a conoscenza, ma quello che ho detto funziona a meraviglia @ Rockr90
Hive7

@ d3c0y questo è vero e l'ho menzionato nella risposta, ma è il metodo più semplice per farlo. Tuttavia, non so se la situazione sia cambiata negli ultimi 3 anni
Hive7

@aks. costringe il browser a pensare che puoi scorrere, quindi abilita la barra di scorrimento e lo scorrimento y è lo scorrimento laterale
Hive7

1
overflow-y: scorrimento; aggiungerà / mostrerà la barra di scorrimento in tutte le finestre anche se non ci sono elementi scorrevoli.
Abhilash

35

Probabilmente

html {
    width: 100vw;
}

è proprio quello che vuoi.


1
Ha funzionato benissimo per il mio caso d'uso: gist.github.com/bmcminn/1ab50da18bde75f39bc88e8292a5a847 che sto usando calc()per determinare la larghezza della visualizzazione del contenuto principale in modo che il navigatore fuori schermo fisso possa occupare il lato sinistro dello schermo sul desktop, il tutto preservando il nativo scorri sul cellulare.
bmcminn

3
Ho scherzato con le mie barre di scorrimento nelle ultime 36 ore. Ho avuto alcune soluzioni diverse che hanno funzionato, ma ho sollevato altri problemi. Questa è la prima soluzione che funziona e mi permette di utilizzare una normale barra di scorrimento altrove. Grazie.
kosher

Prego! Ma scherzare con htmlla larghezza di in vws è un po ' complicato , quindi fai attenzione!
Neurotrasmettitore

Ha funzionato alla grande, qualcuno può spiegare come funziona?
Zeus

1
Soluzione non male, ma potrebbe aggiungere lo scorrimento orizzontale.
FDisk

18

I browser Webkit come Safari e Chrome sottraggono la larghezza della barra di scorrimento dalla larghezza della pagina visibile durante il calcolo della larghezza: 100% o 100vw. Altro su Scrolling and Page Width di DM Rutherford .

Prova a usare overflow-y: overlayinvece.


9
Si prega di non pubblicare risposte identiche a più domande. Pubblica una buona risposta, quindi vota / contrassegna per chiudere le altre domande come duplicati. Se la domanda non è un duplicato, adatta le tue risposte alla domanda.
Paul Roub

Dovrebbe funzionare, ma l'overlay non è ancora standard né è supportato in tutti i browser.
Zia Ul Rehman Mughal

Singhiozzo rapido: in Safari questo ha causato l'interruzione dello scorrimento della pagina
joshfindit

13

Ho scoperto di poter aggiungere

::-webkit-scrollbar { 
display: none; 
}

direttamente al mio css e renderebbe invisibile la barra di scorrimento, ma mi permetterebbe comunque di scorrere (almeno su Chrome). Ottimo per quando non vuoi una barra di scorrimento che distragga sulla tua pagina!


5
E 'un po' rischioso e non una soluzione cross-browser se stackoverflow.com/questions/9251354/...
Alex Pyzhianov

4

Per i contenitori con una larghezza fissa, è possibile ottenere una soluzione cross browser CSS pura avvolgendo il contenitore in un altro div e applicando la stessa larghezza a entrambi i div.

#outer {
  overflow-y: auto;
  overflow-x: hidden;
  /*
   * width must be an absolute value otherwise the inner divs width must be set via
   * javascript to the computed width of the parent container
   */
  width: 200px;
}

#inner {
  width: inherit;
}

Clicca qui per vedere un esempio su Codepen


3

Al momento non sembra che l'altra mia risposta funzioni correttamente (ma continuerò a provare a renderla operativa).

Ma fondamentalmente quello che devi fare, e quello che stava cercando di fare in modo dinamico, è impostare la larghezza del contenuto su leggermente inferiore a quella del riquadro principale scorrevole.
In modo che quando viene visualizzata la barra di scorrimento non ha alcun effetto sul contenuto.

Questo ESEMPIO mostra un modo più hacky per raggiungere questo obiettivo, codificando widths invece di cercare di convincere il browser a farlo per noi tramite padding.
Se questo è possibile, questa è la soluzione più semplice se non vuoi una barra di scorrimento permanente.


Questa è una buona soluzione, tuttavia sto lavorando su un sito Web reattivo utilizzando Bootstrap, ed è importante automatizzare la larghezza e tutto, cosa ne dici?
Acemad

bene a meno che (in ordine decrescente di probabilità): qualcuno capisca come far funzionare la mia altra risposta (con riempimento o margine); puoi in qualche modo utilizzare le media query per applicare il riempimento in modo selettivo; o le espressioni CSS sono implementate nei browser moderni per applicare in modo selettivo il riempimento. Penso che solo una barra di scorrimento permanente o l'utilizzo di JS per rilevare la barra di scorrimento sia la strada da percorrere
Hashbrown

1

EDIT: questa risposta non è corretta al momento, fare riferimento alla mia altra risposta per vedere cosa stavo tentando di fare qui. Sto cercando di sistemarlo, ma se puoi offrire assistenza fallo nei commenti, grazie!

L'utilizzo padding-rightmitigherà la comparsa improvvisa di una barra di scorrimento

ESEMPIO

devtools cromati che mostrano l'imbottitura immobile

Come puoi vedere dai punti, il testo arriva nello stesso punto della pagina prima del ritorno a capo, indipendentemente dalla presenza o meno di una barra di scorrimento.
Questo perché quando viene introdotta una barra di scorrimento, il riempimento si nasconde dietro di essa, quindi la barra di scorrimento non preme sul testo!


3
La larghezza della barra di scorrimento può cambiare in base al sistema operativo e al browser in uso. Può misurare sia 20 px che 40 px
Lwyrn

2
beh,
useresti

1
Le pergamene del browser di alcuni dispositivi / SO non hanno nemmeno una larghezza.
Sergey Goliney

0
.modal-dialog {
   position: absolute;
   left: calc(50vw - 300px);
}

dove 300 px è la metà della larghezza della finestra di dialogo.

Questa è in realtà l'unica cosa che ha funzionato per me.


0

Ho avuto lo stesso problema su Chrome. È successo solo per me quando la barra di scorrimento è sempre visibile. (trovato nelle impostazioni generali) ho un modale e quando apro il modale ho notato che ...

body {
    padding-left: 15px;
}

viene aggiunto al corpo. Per evitare che ciò accada ho aggiunto

body {
    padding-left: 0px !important;
}

0

Non posso aggiungere commenti per la prima risposta ed è passato molto tempo ... ma quella demo ha un problema:

if(b.prop('scrollHeight')>b.height()){
    normalw = window.innerWidth;
    scrollw = normalw - b.width();
    $('#container').css({marginRight:'-'+scrollw+'px'});
}

b.prop ('scrollHeight') è sempre uguale a b.height (),

Penso che dovrebbe essere così:

if(b.prop('scrollHeight')>window.innerHeight) ...

Infine vi consiglio un metodo:

html {
 overflow-y: scroll;
}

:root {
  overflow-y: auto;
  overflow-x: hidden;
}

:root body {
  position: absolute;
}

body {
 width: 100vw;
 overflow: hidden;
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.