Установить высоту боковой панели на 100% с помощью CSS (с липким нижним изображением)?

Я часами бился головой о стену, пытаясь понять эту проблему, и думаю, что это должно быть что-то маленькое, что мне не хватает. Я искал в Интернете, но ничего не нашел, похоже, работает. HTML:

<body>
  <div id="header">
    <div id="bannerleft">
    </div>

    <div id="bannerright">
      <div id="WebLinks">
        <span>Web Links:</span>
        <ul>
          <li><a href="#"><img src="../../Content/images/MySpace_32x32.png" alt="MySpace"/></a></li>
          <li><a href="#"><img src="../../Content/images/FaceBook_32x32.png" alt="Facebook"/></a></li>
          <li><a href="#"><img src="../../Content/images/Youtube_32x32.png" alt="YouTube"/></a></li>
        </ul>
      </div>
    </div>
  </div>
  <div id="Sidebar">
    <div id="SidebarBottom">
    </div>
  </div>
  <div id="NavigationContainer">
    <ul id="Navigation">
      <li><a href="#">Nav</a></li>
      <li><a href="#">Nav</a></li>
      <li><a href="#">Nav</a></li>
      <li><a href="#">Nav</a></li>
      <li><a href="#">Nav</a></li>
      <li><a href="#">Nav</a></li>
    </ul>
  </div>
  <div id="Main">
    <!-- content -->
  </div>
</body>

Мой полный CSS:

* {
  margin: 0px;
  padding: 0px;
}

body {
  font-family: Calibri, Sans-Serif;
  height: 100%;
}

#header {
  width: 100%;
  z-index: 1;
  height: 340px;
  background-image: url("../../Content/images/bannercenter.gif");
  background-repeat: repeat-x;
}

#header #bannerleft {
  float: left;
  background-image: url("../../Content/images/bannerleft.gif");
  background-repeat: no-repeat;
  height: 340px;
  width: 439px;
  z-index: 2;
}

#bannerright {
  float: right;
  background-image: url("../../Content/images/bannerright.gif");
  background-repeat: no-repeat;
  width: 382px;
  height: 340px;
  background-color: White;
  z-index: 2;
}

#Sidebar {
  width: 180px;
  background: url("../../Content/images/Sidebar.png") repeat-y;
  z-index: 2;
  height: 100%;
  position: absolute;
}

#SidebarBottom {
  margin-left: 33px;
  height: 100%;
  background: url("../../Content/images/SidebarImage.png") no-repeat bottom;
}

#NavigationContainer {
  position: absolute;
  top: 350px;
  width: 100%;
  background-color: #bbc4c3;
  height: 29px;
  z-index: 1;
  left: 0px;
}

#Navigation {
  margin-left: 190px;
  font-family: Calibri, Sans-Serif;
}

#Navigation li {
  float: left;
  list-style: none;
  padding-right: 3%;
  padding-top: 6px;
  font-size: 100%;
}

#Navigation a:link, a:active, a:visited {
  color: #012235;
  text-decoration: none;
  font-weight: 500;
}

#Navigation a:hover {
  color: White;
}

#WebLinks {
  float: right;
  color: #00324b;
  margin-top: 50px;
  width: 375px;
}

#WebLinks span {
  float: left;
  margin-right: 7px;
  margin-left: 21px;
  font-size: 10pt;
  margin-top: 8px;
  font-family: Helvetica;
}

#WebLinks ul li {
  float: left;
  padding-right: 7px;
  list-style: none;
}

#WebLinks ul li a {
  text-decoration: none;
  font-size: 8pt;
  color: #00324b;
  font-weight: normal;
}

#WebLinks ul li a img {
  border-style: none;
}

#WebLinks ul li a:hover {
  color: #bcc5c4;
}

Я бы хотел, чтобы боковая панель растянулась по высоте вместе с содержимым моей страницы, а нижнее изображение боковой панели всегда оставалось внизу боковой панели.


person Jon    schedule 26.04.2009    source источник
comment
Не могли бы вы также показать свою разметку?   -  person Bjorn    schedule 26.04.2009
comment
Прикомандированные, наценка может помочь. И позволит нам предлагать конкретные CSS или предложения.   -  person David says reinstate Monica    schedule 26.04.2009


Ответы (15)


ОБНОВЛЕНИЕ: Поскольку этот ответ все еще набирает голоса как вверх, так и против, и на момент написания ему восемь лет: сейчас, вероятно, есть лучшие методы. Оригинальный ответ следует ниже.


Очевидно, вы ищете технику Faux columns :-)

По тому, как вычисляется свойство height, вы не можете установить height: 100% внутри чего-то, что имеет автоматическую высоту.

person Arve Systad    schedule 26.04.2009
comment
Использование техники искусственных столбцов было самым близким, что я смог найти. Проблемы, с которыми я столкнулся, заключались в том, что я не мог заставить боковую панель перекрывать верхнюю часть панели навигации, и я не мог понять, как разместить нижнее изображение боковой панели всегда внизу боковой панели. - person Jon; 26.04.2009
comment
Если у вас есть один основной контейнер, в котором у вас есть фон для всей страницы, вы можете использовать изображение внизу боковой панели следующим образом: background: url(blabla) no-repeat bottom;. Перекрытие боковой панели поверх панели навигации также можно решить, эмулируя боковую панель в фоновом режиме nav-bar-background. Если для вас это не имеет смысла, не могли бы вы нарисовать набросок того, чего пытаетесь достичь? :) - person Arve Systad; 27.04.2009
comment
поместите нижнее изображение боковой панели в нижний колонтитул сайта, но используйте положение относительное или абсолютное, или отрицательное верхнее поле, tp поднимите его, чтобы оно появилось поверх боковой панели. - person wheresrhys; 27.04.2009
comment
Ответы могут быть дорогими, доступными или дешевыми, и этот ответ дешев. - person John; 28.02.2015
comment
Также они могут быть старыми и подходящими для своего времени. - person Arve Systad; 20.10.2015

Это сработало для меня

.container { 
  overflow: hidden; 
  .... 
} 

#sidebar { 
  margin-bottom: -5000px; /* any large number will do */
  padding-bottom: 5000px; 
  .... 
} 
person montrealmike    schedule 09.12.2011
comment
это здорово, есть ли недостатки? - person kinet; 29.03.2012
comment
Идеально подходит и для меня! Спасибо! - person Deekor; 03.01.2013
comment
Я нашел в этом обратную сторону. Если вы попытаетесь установить ссылку на определенное место внутри .container с помощью <a href="#location">, .container будет прокручиваться до этого места, оставляя все, что находится над ним, скрытым. См. Это: jsfiddle.net/PTvcS - вы можете изменить переполнение на автоматический, чтобы лучше видеть. - person Norbert; 07.02.2013
comment
я чувствую, что нашел Святой Грааль. это крутой трюк, у меня тогда было столько проблем с боковыми панелями .. - person nakajuice; 24.04.2013
comment
На случай, если кто-то еще такой же слепой, как я: не забывай overflow: hidden часть, иначе случится плохое. - person Doodad; 26.10.2014
comment
Это делает страницу высотой 5000 пикселей, верно? Никого больше не беспокоит эта полоса прокрутки, отображающая только небольшую часть просматриваемой страницы? - person Dave Morse; 14.09.2016

Пока флексбокс CSS не станет более распространенным, вы всегда можете просто позиционировать боковую панель абсолютно, прикрепив ее к нулю пикселей сверху и снизу, а затем установить запас на вашем основном контейнере для компенсации.

JSFiddle

http://jsfiddle.net/QDCGv/

HTML

<section class="sidebar">I'm a sidebar.</section>

<section class="main">I'm the main section.</section>

CSS

section.sidebar {
  width: 250px;
  position: absolute;
  top: 0;
  bottom: 0;
  background-color: green;
}

section.main { margin-left: 250px; }

Примечание. Это очень простой способ сделать это, но вы обнаружите, что bottom означает не «нижняя часть страницы», а «нижняя часть окна». Боковая панель, вероятно, резко закроется, если ваше основное содержимое прокрутится вниз.

person Adam Grant    schedule 28.12.2012
comment
Рад, что у вас сработало, смотрите мою заметку о его недостатках. - person Adam Grant; 31.12.2012
comment
У меня тоже работает. Спасибо! Думаю, это лучший способ. - person Fuhrmann; 27.04.2013
comment
Но если у вас много контента, то при прокрутке вниз боковая панель больше не будет заполнять всю высоту. - person TheYaXxE; 21.01.2014
comment
Верно, и я отметил это в конце своего ответа. - person Adam Grant; 21.01.2014
comment
Кроме того, чтобы облегчить это, вы можете разместить свой контент в собственном контейнере с абсолютным позиционированием, который также будет добавлен в верхнюю и нижнюю часть окна, чтобы страница никогда не прокручивалась, а только основной блок содержимого. В любом случае это все-таки взлом. Если ваши пользователи поддерживают flexbox, определенно используйте его! - person Adam Grant; 07.08.2015
comment
А как насчет упомянутого вами решения flexbox? - person wranvaud; 26.03.2019
comment
@wranvaud Вот это: stackoverflow.com/a/32639892/393243 - person Adam Grant; 30.03.2019
comment
У меня это тоже сработало. Спасибо - person kaleem; 13.01.2021

Я бы использовал таблицы css для достижения 100% высоты боковой панели.

Основная идея - обернуть боковую панель и основные блоки в контейнер.

Дайте контейнеру display:table

И присвойте двум дочерним элементам div (боковой и основной) display: table-cell

Вот так..

#container {
display: table;
}
#main {
display: table-cell;
vertical-align: top;
}
#sidebar {
display: table-cell;
vertical-align: top;
} 

Взгляните на эту ЖИВУЮ ДЕМО, где я изменил вашу первоначальную разметка с использованием описанной выше техники (я использовал цвета фона для разных div, чтобы вы могли видеть, какие из них какие)

person Danield    schedule 17.01.2013
comment
Ух ты, это потрясающе - макеты столов без столов! - person Dom; 27.02.2013
comment
Это здорово, спасибо. Многие из вышеперечисленных, казалось, работали для небольшого контента, но потом развалились. Это не так, спасибо. - person Michael Kennedy; 29.07.2014

Flexbox (http://caniuse.com/#feat=flexbox)

Сначала оберните нужные столбцы в div или раздел, например:

<div class="content">
    <div class="main"></div>
    <div class="sidebar"></div>
</div>

Затем добавьте следующий CSS:

.content {
    display: -webkit-box;
    display: -moz-box;
    display: -ms-flexbox;
    display: -webkit-flex;
    display: flex;
}
person 9ete    schedule 17.09.2015
comment
Похоже, это лучший ответ на сегодняшний день. - person MarkSkayff; 15.08.2018
comment
Вы также можете добавить flex-flow:wrap, если элементы вашей страницы перестают переноситься - person wranvaud; 26.03.2019

Могу ли я просто добавить свою адаптацию в дополнение к ответу @montrealmike?

Я сделал это:

.container { 
  overflow: hidden; 
  .... 
} 

#sidebar { 
  margin-bottom: -101%;
  padding-bottom: 101%; 
  .... 
} 

Я сделал "101%", чтобы учесть (очень редкую) вероятность того, что кто-то может просматривать сайт на огромном экране высотой более 5000 пикселей!

Отличный ответ, montrealmike. У меня это сработало отлично.

person Lloyd Jones    schedule 01.02.2014

Я сталкивался с этой проблемой несколько раз в разных проектах, но нашел решение, которое мне подходит. Вы должны использовать четыре тега div - один, содержащий боковую панель, основное содержимое и нижний колонтитул.

Сначала стилизуйте элементы в своей таблице стилей:

#container {
width: 100%;
background: #FFFAF0;
}

.content {
width: 950px;
float: right;
padding: 10px;
height: 100%;
background: #FFFAF0;
}

.sidebar {
width: 220px;
float: left;
height: 100%;
padding: 5px;
background: #FFFAF0;
}

#footer {
clear:both;
background:#FFFAF0;
}

Вы можете редактировать различные элементы, как хотите, только убедитесь, что вы не изменили свойство нижнего колонтитула «clear: both» - это очень важно оставить.

Затем просто настройте свою веб-страницу следующим образом:

<div id=”container”>
<div class=”sidebar”></div>
<div class=”content”></div>
<div id=”footer”></div>
</div>

Я написал более подробное сообщение об этом в блоге по адресу http://blog.thelibzter.com/how-to-make-a-sidebar-extend-the-entire-height-of-its-container. Пожалуйста, дай мне знать, если возникнут какие-либо вопросы. Надеюсь это поможет!

person TheLibzter    schedule 22.08.2010
comment
Три примечания: 1. Вы не можете использовать идентификатор «нижний колонтитул» в HTML 5 или 4.01 Transitional. Вы должны назвать это «столбцы-нижний колонтитул» или что-то в этом роде, чтобы оно появилось и очистилось. 2. Как поясняется в сообщении в блоге, на самом деле это не расширяет боковую панель, а просто помещает фон позади нее, который выглядит так же. Итак, если ваша боковая панель цветная, вам нужно вставить div этого цвета. 3. Ширина в пикселях меня портит, но ширина: 20% и ширина: 80% работают, если у вас включен box-sizing: border-box. - person Noumenon; 19.02.2013


Думаю, сегодня для этого, наверное, можно было бы использовать flexbox. См. пример Святого Грааля.

person Frank Lämmer    schedule 15.10.2013
comment
Вам нужно добавить больше деталей к своему ответу. Зачем для этого использовать flexbox? - person Miguel-F; 16.10.2013

Я столкнулся с той же проблемой, что и Джон. TheLibzter направил меня на правильный путь, но изображение, которое должно оставаться внизу боковой панели, не было включено. Итак, я внес некоторые коррективы ...

Важный:

  • Расположение блока div, содержащего боковую панель и контент (#bodyLayout). Это должно быть относительно.
  • Позиционирование div, который должен оставаться внизу sidbar (#sidebarBottomDiv). Это должно быть абсолютным.
  • Ширина содержимого + ширина боковой панели должны быть равны ширине страницы (#container)

Вот css:

    #container
    {
        margin: auto;
        width: 940px;
    }
    #bodyLayout
    {
        position: relative;
        width: 100%;
        padding: 0;
    }
    #header
    {
        height: 95px;
        background-color: blue;
        color: white;
    }
    #sidebar
    {
        background-color: yellow;
    }
    #sidebarTopDiv
    {
        float: left;
        width: 245px;
        color: black;
    }
    #sidebarBottomDiv
    {
        position: absolute;
        float: left;
        bottom: 0;
        width: 245px;
        height: 100px;
        background-color: green;
        color: white;
    }
    #content
    {
        float: right;
        min-height: 250px;
        width: 695px;
        background-color: White;
    }
    #footer
    {
        width: 940px;
        height: 75px;
        background-color: red;
        color: white;
    }
    .clear
    {
        clear: both;
    }

А вот HTML:

<div id="container">
    <div id="header">
        This is your header!
    </div>
    <div id="bodyLayout">
        <div id="sidebar">
            <div id="sidebarTopDiv">
                This is your sidebar!                   
            </div>
            <div id="content">                  
            This is your content!<br />
            The minimum height of the content is set to 250px so the div at the bottom of
            the sidebar will not overlap the top part of the sidebar.
            </div>
            <div id="sidebarBottomDiv">
                This is the div that will stay at the bottom of your footer!
            </div>
            <div class="clear" />
        </div>
    </div>
</div>
<div id="footer">
    This is your footer!
</div>
person Krizzz    schedule 06.10.2011

Я понимаю, что это старый пост, но я пытался что-то придумать, чтобы на моем сайте была боковая панель. Это сработает?

#sidebar-background
{
    position:fixed;
    width:250px;
    top:0;
    bottom:0;
    background-color:orange;
}

#content-background
{
    position:fixed;
    right:0;
    top:0;
    bottom:0;
    left:250px;
    background-color:pink;
}

#sidebar
{
    float:left;
    width:250px;
}

#content
{
    float:left;
    width:600px;
}

<div id="sidebar-background"></div>
<div id="content-background"></div>

<div id="sidebar">Sidebar stuff here</div>
<div id="content">Stuff in here</div>
person ChrisHigs    schedule 14.03.2014

Я думаю, ваше решение заключалось бы в том, чтобы обернуть ваш контейнер содержимого и боковую панель в родительский элемент, содержащий div. Переместите боковую панель влево и придайте ей фоновое изображение. Создайте широкое поле не менее ширины боковой панели для контейнера содержимого. Добавьте удаление хака с плавающей запятой, чтобы все это заработало.

person Bjorn    schedule 26.04.2009

используйте фон тела, если вы используете боковую панель с фиксированной шириной, чтобы получить изображение той же ширины, что и ваша боковая панель. также поместите background-repeat: repeat-y в свои коды css.

person Ajit Bhandari    schedule 31.01.2014

Абсолютное положение, верх: 0 и низ: 0 для боковой панели и относительное положение для оболочки (или контейнера), в которой содержатся все элементы, и готово!

person Vincent V.    schedule 25.06.2014

Попробуй это. Он заставляет навигационную панель расти по мере добавления контента и сохраняет центральную область в центре.

   <html>
        <head>
            <style>
                    section.sidebar {
          width: 250px;
          min-height:100vh;
          position: sticky;
          top: 0;
          bottom: 0;
          background-color: green;
        }

        section.main { position:sticky; top:0;bottom:0;background-color: red; margin-left: 250px;min-height:100vh; }
            </style>
            <script lang="javascript">
            var i = 0;
            function AddOne()
            {
                for(i = 0;i<20;i++)
                {
                var node = document.createElement("LI");
                var textnode = document.createTextNode(' Water ' + i.toString());

                node.appendChild(textnode);
                document.getElementById("list").appendChild(node);
                }


            }
            </script>
        </head>
        <body>
                <section class="sidebar">
                    <button id="add" onclick="AddOne()">Add</button>
                    <ul id="list">
                        <li>bullshit 1</li>
                    </ul>
                </section>
                <section class="main">I'm the main section.</section>
        </body>    
    </html>
person WebBoy    schedule 11.11.2019