Overflow Scroll css non funziona nel div


124

Sto cercando una soluzione CSS / Javascript per il mio problema di scorrimento della pagina HTML.

Ho tre div che contengono un div, un'intestazione e un div wrapper,

Ho bisogno di una barra di scorrimento verticale nel div wrapper, l'altezza dovrebbe essere automatica o 100% in base al contenuto.

L'intestazione dovrebbe essere corretta e non voglio la barra di scorrimento complessiva, quindi ho indicato overflow:hiddennel tag body,

Ho bisogno della barra di scorrimento verticale nel mio div wrapper. Come posso risolvere questo problema?

HTML

<div id="container">

    <div class="header"></div>

    <div class="wrapper">
        <p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Vivamus porta tortor sed metus. Nam pretium. Sed tempor. Integer ullamcorper, odio quis porttitor sagittis, nisl erat tincidunt massa, eu eleifend eros nibh sollicitudin est. Nulla dignissim. Mauris sollicitudin, arcu id sagittis placerat, tellus mauris egestas felis, eget interdum mi nibh vel lorem. Aliquam egestas hendrerit massa. Suspendisse sed nunc et lacus feugiat hendrerit. Nam cursus euismod augue. Aenean vehicula nisl eu quam luctus adipiscing. Nunc consequat justo pretium orci. Mauris hendrerit fermentum massa. Aenean consectetuer est ut arcu. Aliquam nisl massa, blandit at, accumsan sed, porta vel, metus. Duis fringilla quam ut eros.</p>
        <!-- Lots more paragraphs-->
    </div>

</div>

CSS

body{ margin:0; padding:0; overflow:hidden; height:100%}
#container { width:1000px; margin:0 auto;}
.header { width:1000px; height:30px; background-color:#dadada;}
.wrapper{ width:1000px; overflow:scroll; position:relative;}

Fare riferimento a questo JS Fiddle

Risposte:


152

Ti manca la heightproprietà CSS.

Aggiungendolo noterai che apparirà la barra di scorrimento.

.wrapper{ 
    // width: 1000px;
    width:600px; 
    overflow-y:scroll; 
    position:relative;
    height: 300px;
}

JSFIDDLE

Dalla documentazione :

overflow-y

La proprietà CSS overflow-y specifica se ritagliare il contenuto, eseguire il rendering di una barra di scorrimento o visualizzare il contenuto di overflow di un elemento a livello di blocco, quando trabocca sui bordi superiore e inferiore.


8
come fare in modo che l'altezza si fermi al viewport? Non voglio codificare in pixel, poiché non funziona per schermi di dimensioni diverse
Djechlin

@djechlin Fai una domanda per questo. Probabilmente puoi usare valori percentuali o dislpay: fixed... Non sono sicuro di cosa stai cercando di fare.
Ionică Bizău

12
utilizzare la proprietà altezza del riquadro di visualizzazione: altezza: 100 vh
Joseph

32

La soluzione è aggiungere anche height:100%;a tutti gli elementi principali del tuo .wrapper-div. Così:

html{
    height: 100%;
}

body{ 
    margin:0;
    padding:0;
    overflow:hidden;
    height:100%;
}

#container{
    width:1000px;
    margin:0 auto;
    height:100%;
}

24

Se aggiungi l'altezza in .wrapperclasse, il tuo scroll funziona, senza heightscroll non funziona.

Prova questo http://jsfiddle.net/ZcrFr/3/

CSS:

.wrapper {
  position: relative;
  overflow: scroll;
  width: 1000px;
  height: 800px;
}

4
Grazie, ma il mio requisito effettivo è che non dovrei dare alcuna altezza può essere può dare il 100% o automaticamente, il contenuto dovrebbe prendere in base alla finestra del browser, puoi qualsiasi altra soluzione in CSS / JAVASCRIPT?
user2493730

2
perché non funziona quando ho dato l'altezza in percentuale comeheight:100%
Coding world

7

Non hai dato un'altezza al div. Quindi si allungherà automaticamente quando viene aggiunto più contenuto. Dagli un'altezza fissa e verranno visualizzate le barre di scorrimento.


2
Grazie, ma il mio requisito effettivo è che non dovrei dare alcuna altezza può essere può dare il 100% o automaticamente, il contenuto dovrebbe prendere in base alla finestra del browser, puoi qualsiasi altra soluzione in CSS / JAVASCRIPT?
user2493730

1
Dagli un'altezza del 100%. Quindi soddisfi i requisiti per l'overflow e te stesso.
Nick

6

Se imposti un'altezza statica per la tua intestazione, puoi usarla in un calcolo per la dimensione del tuo wrapper.

http://jsfiddle.net/ske5Lqyv/5/

Utilizzando il tuo codice di esempio, puoi aggiungere questo CSS:

html, body {
  margin: 0px;
  padding: 0px;
  height: 100%;
}

#container {
  height: 100%;
}

.header {
  height: 64px;
  background-color: lightblue;
}

.wrapper {
  height: calc(100% - 64px);
  overflow-y: auto;
}

Oppure puoi utilizzare flexbox per un approccio più dinamico http://jsfiddle.net/19zbs7je/3/

<div id="container">
  <div class="section">
    <div class="header">Heading</div>
    <div class="wrapper">
      <p>Large Text</p>
    </div>
  </div>
</div>

html, body {
  margin: 0px;
  padding: 0px;
  height: 100%;
}

#container {
  display: flex;
  flex-direction: column;
  height: 100%;
}

.section {
  flex-grow: 1;
  display: flex;
  flex-direction: column;
  min-height: 0;
}

.header {
  height: 64px;
  background-color: lightblue;
  flex-shrink: 0;
}

.wrapper {
  flex-grow: 1;
  overflow: auto;
  min-height: 100%; 
}

E se vuoi diventare ancora più elaborato, dai un'occhiata alla mia risposta a questa domanda https://stackoverflow.com/a/52416148/1513083


4

Ho modificato il tuo: Fiddle

html, body{ margin:0; padding:0; overflow:hidden; height:100% }
.header { margin: 0 auto; width:500px; height:30px; background-color:#dadada;}
.wrapper{ margin: 0 auto; width:500px; overflow:scroll; height: 100%;}

Dare al tag html un'altezza del 100% è la soluzione. Ho anche eliminato il contenitore div. Non ne hai bisogno quando il tuo layout rimane così.


Grazie al suo funzionamento, ma sto usando il concetto di cursore del codificatore ha il div contenitore principale, l'area dell'intestazione che ho tre div dovrebbe essere corretta, solo l'area del contenuto del wrapper dovrebbe scorrere, Hai detto di rimuovere il contenitore quindi come posso risolvere questo problema in altro modo pl?
user2493730

1

Volevo commentare @Ionica Bizau, ma non ho abbastanza reputazione.
Per dare una risposta alla tua domanda sul codice javascript:
Quello che devi fare è ottenere l'altezza dell'elemento genitore (meno gli elementi che occupano spazio) e applicarla agli elementi figli.

function wrapperHeight(){
    var height = $(window).outerHeight() - $('#header').outerHeight(true);
    $('.wrapper').css({"max-height":height+"px"});      
}

Nota la
finestra potrebbe essere sostituita da ".container" se quella non ha figli flottanti o ha una correzione per ottenere l'altezza corretta calcolata. Questa soluzione utilizza jQuery.


È un problema CSS perché usare Javascript?
GlennG

Perché l'OP ha chiesto una soluzione CSS / Javascript. C'era già una buona soluzione CSS e credo che all'epoca l'OP chiedesse in un commento la risposta più votata su come farlo in JS. Ma sono passati alcuni anni quindi potrei ricordare male ;-)
Anima-t3d

1

Per Angular2 + Material2 + Sidenav, dovrai fare quanto segue:

 ngAfterViewInit() {
   this.element.nativeElement.getElementsByClassName('md-sidenav-content')[0].style.overflow = 'hidden'; 
  }

2
altri dettagli su questo? Perché non potevi semplicemente mettere overflow:hiddenin cssin caso di material2?
kuncevic.dev

0

nel mio caso, height: 100vhrisolvi il problema solo con il comportamento previsto


-1

Prova questo per una barra di scorrimento verticale:

overflow-y:scroll;

Ma se sei su un Mac con solo trackpad, anche questo non funzionerebbe.
RR
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.