Виправлений верхній і нижній колонтитули з прокручуваним вмістом


83

Як отримати фіксований верхній, нижній колонтитул із прокручуваним вмістом? Щось на зразок цієї сторінки . Я можу подивитися джерело, щоб отримати CSS, але я просто хочу знати мінімум CSS і HTML, які мені потрібні, щоб це працювало.

введіть тут опис зображення


те саме питання з цими кваліфікаторами: кутовий, матеріалізований ...
mobibob

Відповіді:


130

Щось на зразок цього

<html>
  <body style="height:100%; width:100%">
    <div id="header" style="position:absolute; top:0px; left:0px; height:200px; right:0px;overflow:hidden;"> 
    </div> 
    <div id="content" style="position:absolute; top:200px; bottom:200px; left:0px; right:0px; overflow:auto;"> 
    </div> 
    <div id="footer" style="position:absolute; bottom:0px; height:200px; left:0px; right:0px; overflow:hidden;"> 
    </div>
  </body>
</html> 

Не пов’язано з голосами проти, але я потрапив сюди, і це мені не вдалося (і я скопіював стиль буквально). Можливо, jQuery Mobile псується. Але навіть якщо це спрацювало, я не люблю харкодувати фіксовані розміри. Я думаю, HTML / css відстає від власних компонентів інтерфейсу. На кожній рідній платформі, з якою я працював, виготовлення прокручуваних контейнерів було шматочком пирога.
Містер Сміт

@MisterSmith Вибачте, я явно забув додати стиль, щоб зафіксувати праву сторону контейнерів. Крім того, цей код буде відображатися лише за розміром свого контейнера. Якщо він знаходиться під тегом body, і ви хочете повноекранний режим, вам потрібно встановити висоту та ширину до 100%. Нарешті, що стосується жорстко закодованих стилів, це лише приклад, а не для виробничого випуску, я б ніколи не випускав такі вбудовані стилі, але це здавалося більш доречним способом пояснити відповідь.
Джон Хартсок

@JohnHartsock Безумовно, це JQM робить погані речі. Що стосується жорстко закодованих розмірів, то мені не подобається встановлювати абсолютну висоту в пікселях. На інших платформах, з якими я працював, можна було створити контейнер і сказати йому використовувати всю необхідну йому висоту.
Mister Smith

@ Містер Сміт. Вам не потрібно жорстко кодувати розміри в пікселях. Ви можете використовувати відсотки, якщо хочете, крім того, вам не потрібно встановлювати стиль за допомогою атрибута style на тегу, а натомість просто встановити таблицю стилів css, що посилається на ідентифікатори. Я просто робив речі таким чином у відповіді, щоб було дуже легко зрозуміти.
John Hartsock,

2
@JohnHartsock проти, можливо, тому, що це вбудований css і не пояснює, чому це просто відповідь на копіювання та вставлення
treyBake

61

Якщо ви націлюєтесь на браузери, що підтримують гнучкі вікна, ви можете зробити наступне .. http://jsfiddle.net/meyertee/AH3pE/

HTML

<div class="container">
    <header><h1>Header</h1></header>
    <div class="body">Body</div>
    <footer><h3>Footer</h3></footer>
</div>

CSS

.container {
    width: 100%;
    height: 100%;
    display: flex;
    flex-direction: column;
    flex-wrap: nowrap;
}

header {
    flex-shrink: 0;
}
.body{
    flex-grow: 1;
    overflow: auto;
    min-height: 2em;
}
footer{
    flex-shrink: 0;
}

Оновлення:
див. Розділ "Чи можу я використовувати" для підтримки веб-переглядача гнучких коробок .


Я використовую верхній і нижній колонтитули, які мають змінну висоту, і я вважаю, що це зробить для мене фокус. Я також націлююсь на найновіші браузери, на щастя. Дякую!
Jimmie Tyrrell

Чудово! Чи є спосіб розмістити в районі ще одну таку споруду .body? Коли я це роблю, зовнішній .containerпрокручується з поля зору, як тільки внутрішній .body .bodyпрокручується до кінця.
philk

1
На мою думку, це найкраща відповідь, і це повинна бути найкраща відповідь! Дякую!
Об’єднати

Якщо я не помиляюся, це відповідь на інше питання? Тут смуга прокрутки відображається на цілій сторінці, тоді як у відповіді Джона смуга прокручування просто з'являється в основному вмісті (саме про це задається питання)? Принаймні це те, що я бачу в скрипці.
берслінг

49

Підхід 1 - flexbox

Він чудово працює як для відомих, так і для невідомих елементів висоти. Переконайтеся в тому , щоб встановити зовнішні справи до height: 100%;і скидання за замовчуванням marginна body. Див . Таблиці підтримки браузера .

jsFiddle

html, body {
  height: 100%;
  margin: 0;
}
.wrapper {
  height: 100%;
  display: flex;
  flex-direction: column;
}
.header, .footer {
  background: silver;
}
.content {
  flex: 1;
  overflow: auto;
  background: pink;
}
<div class="wrapper">
  <div class="header">Header</div>
  <div class="content">
    <div style="height:1000px;">Content</div>
  </div>
  <div class="footer">Footer</div>
</div>

Підхід 2 - таблиця CSS

Як для відомих, так і для невідомих елементів висоти. Він також працює у застарілих браузерах, включаючи IE8.

jsFiddle

Підхід 3 - calc()

Якщо верхній і нижній колонтитули мають фіксовану висоту, ви можете використовувати CSS calc().

jsFiddle

Підхід 4 -% для всіх

Якщо верхній і нижній колонтитули відомі по висоті, і вони також мають відсоток, ви можете просто прорахувати математику, зробивши їх разом на 100% висоти.

jsFiddle


6

Тепер у нас є сітка CSS. Ласкаво просимо до 2019 року.

/* Required */
body {
   margin: 0;
   height: 100%;
}

#wrapper {
   height: 100vh;
   display: grid;
   grid-template-rows: 30px 1fr 30px;
}

#content {
   overflow-y: scroll;
}

/* Optional */
#wrapper > * {
   padding: 5px;
}

#header {
   background-color: #ff0000ff;
}

#content {
   background-color: #00ff00ff;
}

#footer {
   background-color: #0000ffff;
}
<body>
   <div id="wrapper">
      <div id="header">Header Content</div>
      <div id="content">
         Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
      </div>
      <div id="footer">Footer Content</div>
   </div>
</body>


1
Вам не потрібна висота тіла. Просто встановіть висоту обгортки на 100vh, і вона буде працювати як тут, так і на природі.
Генріке Ерзінгер,

5

Станом на 2013 рік: це був би мій підхід. jsFiddle:


HTML

<header class="container global-header">
    <h1>Header (fixed)</h1>
</header>

<div class="container main-content">
    <div class="inner-w">
        <h1>Main Content</h1>
    </div><!-- .inner-w -->
</div> <!-- .main-content -->

<footer class="container global-footer">
    <h3>Footer (fixed)</h3>
</footer>


СКСС

// User reset

* { // creates a natural box model layout
    -moz-box-sizing: border-box; 
    -webkit-box-sizing: border-box; 
    box-sizing: border-box; 
} // asume normalize.css


// structure

.container {
    position: relative;
    width: 100%;
    float: left;
    padding: 1em;
}


// type

body {
    font-family: arial;   
}

.main-content {
    h1 {
        font-size: 2em;
        font-weight: bold;
        margin-bottom: .2em;
    }
} // .main-content


// style

    // variables
    $global-header-height: 8em;
    $global-footer-height: 6em;

.global-header {
    position: fixed;
    top: 0; left: 0;
    background-color: gray;
    height: $global-header-height;
}

.main-content {
    background-color: orange;
    margin-top: $global-header-height;
    margin-bottom: $global-footer-height;
    z-index: -1; // so header will be on top
    min-height: 50em; // to make it long so you can see the scrolling
}

.global-footer {
    position: fixed;
    bottom: 0;
    left: 0;
    height: $global-footer-height;
    background-color: gray;
}

Я б, швидше за все, використовував flex-box станом на 2016 рік. Це завжди залежить від контексту. Хитрі ситуації! :)
sheriffderek

5

Ось, що мені вдалося. Мені довелося додати нижнє поле, щоб нижній колонтитул не з’їв мій вміст:

header {
  height: 20px;
  background-color: #1d0d0a;
  position: fixed;
  top: 0;
  width: 100%;
  overflow: hide;
}

content {
  margin-left: auto;
  margin-right: auto;
  margin-bottom: 100px;
  margin-top: 20px;
  overflow: auto;
  width: 80%;
}

footer {
  position: fixed;
  bottom: 0px;
  overflow: hide;
  width: 100%;
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.