Como posso tornar o conteúdo de um elemento fixo rolável apenas quando ele excede a altura da janela de visualização?

94

Eu tenho um divposicionado fixedno lado esquerdo de uma página da web, contendo menus e links de navegação. Não tem altura definida a partir do css, o conteúdo determina a altura, a largura é fixa. O problema é que, se o conteúdo for muito, o divserá maior do que a altura da janela e parte do conteúdo não ficará visível. (Rolar a janela não ajuda, já que a posição é fixede divnão rola.)

Eu tentei definir overflow-y:auto; mas também não ajudou, o div não parece notar que parte dele está fora da janela.

Como posso tornar seu conteúdo rolável apenas, se necessário, se ele divpendurar para fora da janela?

Mkoch
fonte
Uma solução com CSS calc () pode ser encontrada aqui: stackoverflow.com/q/29754195/3168107 .
Shikkediel de
calc()é uma tecnologia experimental e pode resultar em resultados inesperados . Se você optar por usá-lo, certifique-se de conhecer seu público-alvo e teste-o nesses navegadores.
c1moore de
Encontrei o mesmo problema e usei algo como max-height: calc (100vh - 100px); onde meu navbar e paddings estavam fazendo até 100px
Zia Ul Rehman Mughal

Respostas:

102

Você provavelmente não pode. Aqui está algo que chega perto. Você não conseguirá que o conteúdo flua em torno dele se houver espaço abaixo.

http://jsfiddle.net/ThnLk/1289

.stuck {
    position: fixed;
    top: 10px;
    left: 10px;
    bottom: 10px;
    width: 180px;
    overflow-y: scroll;
}

Você também pode fazer uma porcentagem de altura:

http://jsfiddle.net/ThnLk/1287/

.stuck {
    max-height: 100%;
}
Isherwood
fonte
42

O link abaixo irá demonstrar como eu fiz isso. Não é muito difícil - basta usar algum desenvolvedor front-end inteligente !!

<div style="position: fixed; bottom: 0%; top: 0%;">

    <div style="overflow-y: scroll; height: 100%;">

       Menu HTML goes in here

    </div>

</div>

http://jsfiddle.net/RyanBrackett/b44Zn/

Ryan Brackett
fonte
1
Resposta subestimada. Para o meu caso de uso - o estilo div externo position: fixed; bottom: 0%; top: 0%; overflow: scroll; height: 100vh;tornará o div externo capaz de rolar com base no conteúdo.
kilogic
7

Você provavelmente precisa de um div interno. Com css é:

.fixed {
   position: fixed;
   top: 0;
   left: 0;
   bottom: 0;
   overflow-y: auto;
   width: 200px; // your value
}
.inner {
   min-height: 100%;
}
Aureliano Far Suau
fonte
7

Experimente isto na sua posição: elemento fixo.

overflow-y: scroll;
max-height: 100%;
Lucas Bustamante
fonte
Funcionou como um encanto! Obrigado!
Rishi Dev de
3

Isso é absolutamente viável com alguma mágica do flexbox. Dê uma olhada nesta caneta .

Você precisa de css assim:

aside {
  background-color: cyan;
  position: fixed;
  max-height: 100vh;
  width: 25%;
  display: flex;
  flex-direction: column;
}

ul {
  overflow-y: scroll;
}

section {
  width: 75%;
  float: right;
  background: orange;
}

Isso funcionará no IE10 +

transGLUKator
fonte
2

Aqui está a solução HTML e CSS pura .

  1. Criamos uma caixa container para navbar com posição: fixa; altura: 100%;

  2. Em seguida, criamos uma caixa interna com altura: 100%; overflow-y: scroll;

  3. Em seguida, colocamos o conteúdo dentro dessa caixa.

Aqui está o código:

.nav-box{
        position: fixed;
        border: 1px solid #0a2b1d;
        height:100%;
   }
   .inner-box{
        width: 200px;
        height: 100%;
        overflow-y: scroll;
        border: 1px solid #0A246A;
    }
    .tabs{
        border: 3px solid chartreuse;
        color:darkred;
    }
    .content-box p{
      height:50px;
      text-align:center;
    }
<div class="nav-box">
  <div class="inner-box">
    <div class="tabs"><p>Navbar content Start</p></div>
    <div class="tabs"><p>Navbar content</p></div>
    <div class="tabs"><p>Navbar content</p></div>
    <div class="tabs"><p>Navbar content</p></div>
    <div class="tabs"><p>Navbar content</p></div>
    <div class="tabs"><p>Navbar content</p></div>
    <div class="tabs"><p>Navbar content</p></div>
    <div class="tabs"><p>Navbar content</p></div>
    <div class="tabs"><p>Navbar content</p></div>
    <div class="tabs"><p>Navbar content</p></div>
    <div class="tabs"><p>Navbar content</p></div>
    <div class="tabs"><p>Navbar content End</p></div>
    </div>
</div>
<div class="content-box">
  <p>Lorem Ipsum</p>
  <p>Lorem Ipsum</p>
  <p>Lorem Ipsum</p>
  <p>Lorem Ipsum</p>
  <p>Lorem Ipsum</p>
  <p>Lorem Ipsum</p>
  <p>Lorem Ipsum</p>
  <p>Lorem Ipsum</p>
  <p>Lorem Ipsum</p>
  <p>Lorem Ipsum</p>
  <p>Lorem Ipsum</p>
  <p>Lorem Ipsum</p>
</div>

Link para jsFiddle:

Manoj Negi
fonte
0

Estou apresentando isso como uma solução alternativa, em vez de uma solução. Isso pode não funcionar o tempo todo. Fiz assim porque estou criando uma página HTML muito básica, para uso interno, em um ambiente muito bizarro. Eu sei que existem bibliotecas como MaterializeCSS que podem fazer barras de navegação realmente boas. (Eu ia usá-los, mas não funcionou com meu ambiente.)

<div id="nav" style="position:fixed;float:left;overflow-y:hidden;width:10%;"></div>
<div style="margin-left:10%;float:left;overflow-y:auto;width:60%;word-break:break-all;word-wrap:break-word;" id="content"></div>
Tyler Montney
fonte
0

Adicione isso ao seu código para altura fixa e adicione um pergaminho.

.fixedbox {
    max-height: auto;
    overflow-y: scroll;
}
Saurav Sen
fonte
max-heightnão pode ser auto developer.mozilla.org/en-US/docs/Web/CSS/max-height
joseantgv
0

Para o seu propósito, você pode apenas usar

position: absolute;
top: 0%;

e ainda pode ser redimensionável, rolável e responsivo.

matancl
fonte