Đã sửa lỗi đầu trang, chân trang với nội dung có thể cuộn


83

Làm cách nào để có được đầu trang cố định, chân trang có nội dung cuộn được? Một cái gì đó giống như trang này . Tôi có thể xem nguồn để lấy CSS, nhưng tôi chỉ muốn biết CSS và HTML tối thiểu mà tôi cần để làm việc này.

nhập mô tả hình ảnh ở đây


cùng câu hỏi với những vòng loại này: góc cạnh, hiện thực hóa ...
mobibob

Câu trả lời:


130

Một cái gì đó như thế này

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

Không liên quan đến phiếu phản đối, nhưng tôi đã đến đây và điều này không phù hợp với tôi (và tôi đã sao chép phong cách theo nghĩa đen). Có lẽ jQuery Mobile đang gây rối. Nhưng ngay cả khi nó hoạt động, tôi không thích khai thác các kích thước cố định. Tôi đoán HTML / css là một bước sau so với các thành phần giao diện người dùng gốc. Trong mọi nền tảng gốc mà tôi đã làm việc, việc tạo ra các vùng chứa có thể cuộn được là một miếng bánh.
Mister Smith

@MisterSmith Xin lỗi, rõ ràng là tôi đã quên thêm kiểu khóa bên phải của hộp đựng. Ngoài ra, mã này sẽ chỉ hiển thị theo kích thước của vùng chứa của nó. Nếu nó nằm dưới thẻ body và bạn muốn toàn màn hình thì bạn cần đặt chiều cao và chiều rộng thành 100%. Cuối cùng, đối với các kiểu mã cứng, đây chỉ là một ví dụ và không phải để phát hành sản xuất, tôi không có cách nào để phát hành các kiểu nội tuyến như thế này nhưng nó có vẻ là một cách thích hợp hơn để giải thích câu trả lời.
John Hartsock

@JohnHartsock Chắc chắn đó là JQM đang làm những điều xấu. Đối với kích thước được mã hóa cứng, điều tôi không thích là đặt chiều cao tuyệt đối bằng pixel. Trong các nền tảng khác mà tôi đã làm việc, có thể tạo một vùng chứa và yêu cầu nó sử dụng tất cả chiều cao mà nó cần.
Mister Smith,

@ Ông Smith. Bạn không cần phải mã hóa các kích thước bằng px. Bạn có thể sử dụng tỷ lệ phần trăm nếu muốn, ngoài ra bạn không cần thiết lập kiểu thông qua thuộc tính style trên thẻ, mà thay vào đó chỉ cần thiết lập bảng định kiểu css tham chiếu đến id. Tôi chỉ đơn giản làm những điều theo cách này trong câu trả lời để làm cho nó rất dễ hiểu.
John Hartsock

2
@JohnHartsock downvotes lẽ vì nó css inline và không giải thích lý do tại sao là nó chỉ là một sao chép và dán câu trả lời
treyBake

61

Nếu bạn đang nhắm mục tiêu các trình duyệt hỗ trợ hộp linh hoạt, bạn có thể làm như sau .. 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;
}

Cập nhật:
Xem "Tôi có thể sử dụng" để biết trình duyệt hỗ trợ các hộp linh hoạt .


Tôi đang sử dụng đầu trang và chân trang có chiều cao thay đổi và tôi tin rằng điều này sẽ giúp ích cho tôi. May mắn thay, tôi cũng đang nhắm mục tiêu các trình duyệt mới nhất. Cảm ơn bạn!
Jimmie Tyrrell

Tuyệt quá! Có cách nào để đưa một công trình khác như vậy vào .bodykhu vực này không? Khi tôi làm điều đó, bên ngoài sẽ .containercuộn ra khỏi chế độ xem ngay khi bên trong .body .bodyđược cuộn xuống hết cỡ.
philk

1
Đây là câu trả lời tốt nhất theo ý kiến ​​của tôi và đây phải là câu trả lời tốt nhất! Cảm ơn bạn!
Kết hợp

Nếu tôi không nhầm thì đây là câu trả lời cho một câu hỏi khác? Ở đây thanh cuộn xuất hiện trên toàn trang, ngược lại trong câu trả lời của John thanh cuộn chỉ xuất hiện trên nội dung chính (câu hỏi yêu cầu gì)? Ít nhất thì đó là những gì tôi đang thấy trong trò chơi.
bersling

49

Phương pháp 1 - flexbox

Nó hoạt động tốt cho cả yếu tố chiều cao đã biết và chưa biết. Đảm bảo đặt div bên ngoài thành height: 100%;và đặt lại mặc định margintrên body. Xem các bảng hỗ trợ trình duyệt .

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>

Phương pháp tiếp cận 2 - Bảng CSS

Đối với cả phần tử chiều cao đã biết và chưa biết. Nó cũng hoạt động trong các trình duyệt kế thừa bao gồm IE8.

jsFiddle

Cách tiếp cận 3 - calc()

Nếu đầu trang và chân trang có chiều cao cố định, bạn có thể sử dụng CSS calc().

jsFiddle

Tiếp cận 4 -% cho tất cả

Nếu đầu trang và chân trang đã biết chiều cao, và chúng cũng là tỷ lệ phần trăm, bạn có thể thực hiện phép toán đơn giản ghép chúng với chiều cao 100%.

jsFiddle


6

Bây giờ chúng ta đã có lưới CSS. Chào mừng đến với năm 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
Bạn không cần chiều cao cơ thể. Chỉ cần đặt chiều cao trình bao bọc thành 100vh và nó sẽ hoạt động cả ở đây và tự nhiên.
Henrique Erzinger

5

Tính đến năm 2013: Đây sẽ là cách tiếp cận của tôi. 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>


SCSS

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

Tôi có thể sẽ sử dụng flex-box vào năm 2016. Tuy nhiên, nó luôn phụ thuộc vào ngữ cảnh. Những tình huống éo le! :)
sheriffderek

5

Đây là những gì đã làm việc cho tôi. Tôi đã phải thêm một lề cuối để chân trang không ăn hết nội dung của tôi:

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