Jak sprawić, by zawartość stałego elementu była przewijalna tylko wtedy, gdy przekracza wysokość widoku?

94

Mam divpozycję fixedpo lewej stronie strony internetowej, zawierającą menu i linki nawigacyjne. Nie ma ustawionej wysokości z css, zawartość określa wysokość, szerokość jest stała. Problem polega na tym, że jeśli zawartości jest za dużo, divbędzie ona większa niż wysokość okna, a część zawartości nie będzie widoczna. (Przewijanie okna nie pomaga, ponieważ pozycja jest fixedi divnie można przewijać).

Próbowałem ustawić, overflow-y:auto;ale to też nie pomaga, element div zdaje się nie zauważać, że jego część znajduje się poza oknem.

Jak mogę sprawić, by jego zawartość przewijała się tylko w razie potrzeby, jeśli divwisi za oknem?

Mkoch
źródło
Rozwiązanie z CSS calc () można znaleźć tutaj: stackoverflow.com/q/29754195/3168107 .
Shikkediel
calc()jest technologią eksperymentalną i może skutkować nieoczekiwanymi wynikami . Jeśli zdecydujesz się z niego skorzystać, upewnij się, że znasz swoich docelowych odbiorców i przetestuj go w tych przeglądarkach.
c1moore
Wpadłem na ten sam problem i użyłem czegoś takiego jak max-height: calc (100vh - 100px); gdzie mój pasek nawigacyjny i paddinging zarabiały do ​​100px
Zia Ul Rehman Mughal

Odpowiedzi:

102

Prawdopodobnie nie możesz. Oto coś, co się zbliża. Nie dostaniesz zawartości opływającej go, jeśli jest miejsce poniżej.

http://jsfiddle.net/ThnLk/1289

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

Możesz również zrobić wysokość procentową:

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

.stuck {
    max-height: 100%;
}
isherwood
źródło
42

Poniższy link pokaże, jak to osiągnąłem. Niezbyt trudne - po prostu trzeba użyć sprytnego programisty front-end !!

<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
źródło
1
Niedoceniona odpowiedź. W moim przypadku - styl Zewnętrzny div position: fixed; bottom: 0%; top: 0%; overflow: scroll; height: 100vh;sprawia, że ​​zewnętrzny element div będzie można przewijać na podstawie zawartości.
kilogika
8

Spróbuj tego na swojej pozycji: element stały.

overflow-y: scroll;
max-height: 100%;
Lucas Bustamante
źródło
1
Działał jak urok! Dzięki!
Rishi Dev,
7

Prawdopodobnie potrzebujesz wewnętrznego div. Z css jest:

.fixed {
   position: fixed;
   top: 0;
   left: 0;
   bottom: 0;
   overflow-y: auto;
   width: 200px; // your value
}
.inner {
   min-height: 100%;
}
Aureliano Far Suau
źródło
3

Jest to absolutnie wykonalne z pewną magią flexbox. Spójrz na ten długopis .

Potrzebujesz CSS w ten sposób:

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;
}

To zadziała w IE10 +

transGLUKator
źródło
2

Oto czyste rozwiązanie HTML i CSS .

  1. Tworzymy pojemnik na pasek nawigacyjny z pozycją: ustalona; wysokość: 100%;

  2. Następnie tworzymy wewnętrzne pudełko o wysokości: 100%; overflow-y: scroll;

  3. Następnie umieściliśmy zawartość w tym pudełku.

Oto kod:

.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 do jsFiddle:

Manoj Negi
źródło
0

Przedstawiam to raczej jako obejście niż rozwiązanie. To może nie działać przez cały czas. Zrobiłem to w ten sposób, ponieważ tworzę bardzo prostą stronę HTML, do użytku wewnętrznego, w bardzo dziwacznym środowisku. Wiem, że są biblioteki takie jak MaterializeCSS, które potrafią robić naprawdę ładne paski nawigacyjne. (Chciałem ich użyć, ale nie działało to w moim środowisku).

<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
źródło
0

Do swojego celu możesz po prostu użyć

position: absolute;
top: 0%;

i nadal będzie skalowalny, przewijalny i responsywny.

matancl
źródło