Buộc chiều cao thanh bên 100% bằng cách sử dụng CSS (với hình ảnh dưới cùng cố định)?


76

Tôi đã đập đầu vào tường trong nhiều giờ để cố gắng tìm ra vấn đề này và nghĩ rằng đó phải là điều gì đó nhỏ nhặt mà tôi đang thiếu. Tôi đã tìm kiếm trực tuyến, nhưng không có gì tôi tìm thấy dường như hoạt động. HTML là:

<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 đầy đủ của tôi là:

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

Tôi muốn thanh bên kéo dài theo chiều cao với nội dung trang của tôi và để hình ảnh dưới cùng của thanh bên luôn ở dưới cùng của thanh bên.


Bạn cũng có thể cho biết đánh dấu của bạn được không?
Bjorn

Biệt phái, đánh dấu sẽ là một trợ giúp. Và sẽ cho phép chúng tôi cung cấp css hoặc đề xuất cụ thể.
David nói hãy phục hồi Monica vào

Câu trả lời:


27

CẬP NHẬT: Vì câu trả lời này vẫn đang nhận được phiếu bầu từ cả lên lẫn xuống, và ở thời điểm viết bài đã được tám năm tuổi: Có lẽ hiện tại có nhiều kỹ thuật tốt hơn. Câu trả lời gốc sau đây.


Rõ ràng là bạn đang tìm kiếm kỹ thuật cột Faux :-)

Theo cách tính toán thuộc tính chiều cao, bạn không thể đặt height: 100%bên trong thứ gì đó có chiều cao tự động.


Sử dụng kỹ thuật cột giả là kỹ thuật gần nhất mà tôi có thể đạt được. Các vấn đề tôi gặp phải là tôi không thể làm cho thanh bên chồng lên đầu thanh điều hướng và tôi không thể tìm ra cách đặt hình ảnh "dưới cùng của thanh bên" luôn ở dưới cùng của thanh bên.
Jon

Nếu bạn có một chính-container, trong đó bạn có nền tảng cho toàn bộ trang, bạn có thể sử dụng thanh bên đáy hình ảnh như thế này: background: url(blabla) no-repeat bottom;. Việc làm cho thanh bên chồng lên đầu thanh điều hướng cũng có thể được giải quyết bằng cách "mô phỏng" thanh bên trong nền điều hướng. Nếu điều này không có ý nghĩa gì đối với bạn, bạn có phác thảo những gì bạn đang cố gắng đạt được không? :)
Arve Systad

đặt hình ảnh dưới cùng của thanh bên trong chân trang của trang web nhưng sử dụng vị trí tương đối hoặc tuyệt đối, hoặc lề trên cùng ẩn ý, ​​tp nâng nó lên để nó xuất hiện trên đầu thanh bên.
wheresrhys

4
Câu trả lời có thể đắt, phải chăng hoặc rẻ và câu trả lời này là rẻ.
John

4
Chúng cũng có thể cũ và phù hợp với thời đại của chúng.
Arve Systad

96

Điều này đã làm việc cho tôi

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

#sidebar { 
  margin-bottom: -5000px; /* any large number will do */
  padding-bottom: 5000px; 
  .... 
} 

6
điều này là tuyệt vời, bất kỳ nhược điểm?
kinet

Hoàn hảo cho tôi là tốt! Cảm ơn!
Deekor

12
Tôi đã tìm thấy một nhược điểm của điều này. Nếu bạn thử liên kết đến một vị trí cụ thể bên trong .container bằng cách sử dụng <a href="#location">, .container sẽ cuộn đến vị trí đó, để ẩn bất kỳ thứ gì bên trên nó. Xem phần này: jsfiddle.net/PTvcS - bạn có thể thay đổi phần tràn thành tự động để có được cái nhìn tốt hơn.
Norbert

2
Tôi cảm thấy như tôi đã tìm thấy Chén Thánh. thủ thuật này là tuyệt vời, tôi đã có vấn đề với rất nhiều sidebars trở lại sau đó ..
nakajuice

1
Trong trường hợp bất kỳ ai khác cũng bị mù như tôi: Đừng quên overflow: hiddenmột phần nếu không những điều tồi tệ sẽ xảy ra.
Doodad

29

Cho đến khi flexbox của CSS trở nên phổ biến hơn, bạn luôn có thể hoàn toàn định vị thanh bên, dán nó bằng không pixel từ trên xuống dưới, sau đó đặt lề trên vùng chứa chính của bạn để bù đắp.

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

Lưu ý : Đây là một cách đơn giản über để thực hiện việc này nhưng bạn sẽ thấy bottomkhông có nghĩa là "cuối trang" mà là "cuối cửa sổ". Thanh bên có thể sẽ kết thúc hoàn toàn nếu nội dung chính của bạn cuộn xuống.


Rất vui vì điều đó đã làm việc cho bạn, hãy xem ghi chú của tôi về những thiếu sót của nó.
Adam Grant,

Làm việc cho tôi quá. Cảm ơn bạn! Tôi nghĩ đây là cách tốt nhất.
Fuhrmann

1
Nhưng nếu bạn có nhiều nội dung, thì khi bạn cuộn xuống, thanh bên sẽ không lấp đầy toàn bộ chiều cao nữa.
TheYaXxE

Đúng, và tôi đã lưu ý điều này ở cuối câu trả lời của mình.
Adam Grant

1
@wranvaud Có cái này: stackoverflow.com/a/32639892/393243
Adam Grant

12

Tôi sẽ sử dụng bảng css để đạt được chiều cao thanh bên 100%.

Ý tưởng cơ bản là bọc thanh bên và các div chính trong một vùng chứa.

Cung cấp cho thùng chứa một display:table

Và cho 2 div con (sidebar và main) a display: table-cell

Như vậy ..

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

Hãy xem LIVE DEMO này , nơi tôi đã sửa đổi đánh dấu ban đầu của bạn bằng cách sử dụng kỹ thuật trên (tôi đã sử dụng màu nền cho các div khác nhau để bạn có thể biết cái nào là cái nào)


1
Chà, thật tuyệt - bố cục bảng không có bảng!
Dom

1
Điều này là rất tốt, cảm ơn bạn. Nhiều người trong số những người khác ở trên dường như hoạt động cho nội dung nhỏ sau đó bị phá hủy. Cái này không, Cảm ơn.
Michael Kennedy,

9

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

Đầu tiên, hãy bọc các cột bạn muốn trong một div hoặc section, ví dụ:

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

Sau đó, thêm CSS sau:

.content {
    display: -webkit-box;
    display: -moz-box;
    display: -ms-flexbox;
    display: -webkit-flex;
    display: flex;
}

2
Có vẻ như đây là câu trả lời tốt nhất vào những ngày này.
MarkSkayff

1
Bạn cũng có thể muốn thêm flex-flow:wrapnếu các yếu tố trang của bạn dừng gói
wranvaud

5

Ngoài câu trả lời của @montrealmike, tôi có thể thêm bản thích ứng của mình không?

Tôi đã làm điều này:

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

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

Tôi đã làm điều "101%" để phục vụ cho khả năng (cực kỳ hiếm) là ai đó có thể đang xem trang web trên một màn hình lớn với chiều cao hơn 5000px!

Tuy nhiên, câu trả lời tuyệt vời, montrealmike. Nó làm việc hoàn hảo cho tôi.


4

Tôi đã gặp phải vấn đề này vài lần trong các dự án khác nhau, nhưng tôi đã tìm thấy giải pháp phù hợp với mình. Bạn phải sử dụng bốn thẻ div - một thẻ chứa thanh bên, nội dung chính và chân trang.

Đầu tiên, hãy tạo kiểu cho các phần tử trong biểu định kiểu của bạn:

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

Bạn có thể chỉnh sửa các phần tử khác nhau theo cách bạn muốn, chỉ cần đảm bảo rằng bạn không thay đổi thuộc tính footer "clear: both" - điều này rất quan trọng cần để lại.

Sau đó, chỉ cần thiết lập trang web của bạn như sau:

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

Tôi đã viết một bài đăng blog chuyên sâu hơn về điều này tại http://blog.thelibzter.com/how-to-make-a-sidebar-extend-the-entire-height-of-its-container . Hãy cho tôi biết nếu bạn có bất cứ thắc mắc nào. Hi vọng điêu nay co ich!


1
Ba lưu ý: 1. Bạn không thể sử dụng id 'footer' bây giờ trong HTML 5 hoặc 4.01 Chuyển tiếp. Bạn phải gọi nó là 'cột-chân trang' hoặc một cái gì đó để nó hiển thị và rõ ràng. 2. Như bài đăng trên blog đã nói rõ, điều này không thực sự mở rộng thanh bên, nó chỉ đặt một nền đằng sau nó trông giống nhau. Vì vậy, nếu thanh bên của bạn có màu, bạn phải đặt một div có màu đó. 3. Chiều rộng pixel làm mọi thứ phù hợp với tôi, nhưng chiều rộng: 20% và chiều rộng: 80% hoạt động, nếu bạn đã bật box-sizing: border-box.
Noumenon


2

tôi đoán, ngày nay người ta có thể sẽ sử dụng flexbox cho việc này. Hãy xem ví dụ về chén thánh .


Bạn cần bổ sung thêm chi tiết cho câu trả lời của mình. Tại sao người ta sử dụng flexbox cho việc này?
Miguel-F

1

Tôi đang đối mặt với vấn đề tương tự như Jon. TheLibzter đã đưa tôi đi đúng hướng, nhưng hình ảnh phải ở cuối thanh bên không được đưa vào. Vì vậy, tôi đã thực hiện một số điều chỉnh ...

Quan trọng:

  • Định vị div chứa thanh bên và nội dung (#bodyLayout). Điều này nên là tương đối.
  • Vị trí của div phải ở dưới cùng của thanh bên (#sidebarBottomDiv). Điều này nên được tuyệt đối.
  • Chiều rộng của nội dung + chiều rộng của thanh bên phải bằng chiều rộng của trang (#container)

Đây là 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;
    }

Và đây là 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>

1

Tôi nhận ra rằng đây là một bài đăng cũ nhưng tôi đang cố gắng tìm kiếm một thứ gì đó để trang web của mình có một thanh bên. Điều này sẽ hoạt động?

#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>

0

Tôi nghĩ rằng giải pháp của bạn sẽ là bao bọc vùng chứa nội dung và thanh bên của bạn trong một phụ có chứa div. Làm nổi thanh bên của bạn sang bên trái và cung cấp cho nó hình nền. Tạo lề rộng ít nhất bằng chiều rộng của thanh bên cho vùng chứa nội dung của bạn. Thêm xóa một bản hack float để làm cho tất cả hoạt động.


0

sử dụng nền nội dung nếu bạn đang sử dụng thanh bên có chiều rộng cố định, hãy cung cấp hình ảnh có cùng chiều rộng với thanh bên của bạn. cũng đặt background-repeat: repeat-y trong mã css của bạn.


0

Định vị tuyệt đối, trên cùng: 0 và dưới cùng: 0 cho thanh bên và vị trí tương đối cho nội dung phù thủy của trình bao bọc (hoặc vùng chứa) tất cả các phần tử và thế là xong!


0

Thử cái này. Nó buộc thanh điều hướng phát triển khi nội dung được thêm vào và giữ cho khu vực chính được làm trung tâm.

   <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>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.