2010-03-29 37 views
7

Tôi đang cố gắng thực hiện bố cục trang web có vẻ đơn giản, nhưng tôi đang nhấn vào một bức tường.Bố cục CSS lấp đầy không gian có sẵn

tôi muốn như để làm tất cả mọi thứ hoàn toàn với CSS (không có bàn muck mọi thứ lên, và không javascript điều động thay đổi kích thước)

Tôi muốn có:

  • Tiêu đề có chiều cao cố định
  • Chân trang có chiều cao cố định
  • Thanh bên trái có chiều rộng cố định
  • Thanh bên phải có chiều rộng cố định
  • Toàn bộ bố cục luôn lấp đầy toàn bộ chế độ xem (tức là nếu người dùng thay đổi kích thước cửa sổ, cách bố trí phát triển đến kích thước mới)

Nói cách khác:

 

|<    Total width is 100% of viewport    >| 

+--------------------------------------------------------------+ --- 
|     Header with a fixed height     | ^
|--------+-------------------------------------------+---------+  
|  |           |   |  
|  |           |   |  
| Left |           | Right | Total 
| with |  Center grows in height/width  | with | height 
| fixed |  and has scrollbars if necessary  | fixed | is 
| width |           | width | 100% 
|  |           |   | of 
|  |           |   | viewport 
|  |           |   | 
|--------+-------------------------------------------+---------| 
|     Footer with a fixed height     | v 
+--------------------------------------------------------------+ --- 

Các bộ phận được đem lại cho tôi những rắc rối nhất là

  • Có sidebars và center có chiều cao bằng chiều cao của chế độ xem trừ đi chiều cao của đầu trang và chân trang
  • Có trung tâm có chiều rộng bằng chiều rộng của chế độ xem trừ đi độ rộng của hai thanh bên

Tôi không có vấn đề gì yêu cầu người dùng phải có trình duyệt hiện đại.

Tôi biết rằng câu hỏi tương tự như sau đã được hỏi trước, chẳng hạn như

  • Tạo một không gian còn lại div lấp đầy (http://stackoverflow.com/questions/1717564)
  • Ba hàng bố trí Tableless CSS với hàng trung lấp đầy còn lại không gian (http://stackoverflow.com/questions/1703455)
  • Tạo 2 divs, một chiếm không gian còn lại (http://stackoverflow.com/questions/1717564)

... và kết luận dường như không có giải pháp tốt. Những câu trả lời đó hơi cũ, vì vậy tôi hy vọng rằng ai đó biết được mẹo đó ngay bây giờ.


Vâng, tôi biết rằng điều này dường như là tầm thường để thực hiện bằng một <table>, và sau khi "đập đầu tôi vào tường" Tôi đã thực sự cố gắng để đạt được bố trí sử dụng một bảng. Thật không may, với cách tiếp cận này, tôi đã không thể có được phần trung tâm để hiển thị thanh cuộn (sử dụng overflow: auto) khi nội dung phát triển quá lớn.)

+0

Bạn không thể thực hiện việc này theo cách mà không cần sử dụng bảng. Bàn có thể làm điều này một cách tầm thường. Bạn sẽ dành rất nhiều thời gian bashing đầu của bạn chống lại một bức tường. Bàn là một công cụ và nếu CSS "tinh khiết" không thể làm những gì bạn muốn (mà nó không thể trong trường hợp này), bạn cần phải vượt qua nó và sử dụng các công cụ có thể. – cletus

+0

@cletus: Về "Bảng có thể làm điều này tầm thường" ... nó cũng có thể cho phép thanh cuộn một phần cho khu vực trung tâm? Tôi thực sự đã cố gắng để làm toàn bộ điều với các bảng, và nó gần như làm việc, ngoại trừ phần cuộn (chỉ chrome dường như tôn trọng 'overflow: auto' khi được sử dụng bên trong' td') –

+0

Làm điều này tương đối đơn giản với CSS, trình duyệt chéo và bạn không cần bảng. Tôi sẽ thử và đặt một liên kết cùng với một mẫu đánh dấu nhưng tôi sẽ ra khỏi thị trấn vào tối thứ Hai trong một tuần vì vậy tôi không biết liệu tôi có thể làm điều đó vào lúc đó hay không. – Rob

Trả lời

8

làm thế nào về THIS?
nó hoạt động với konqueror (KHTML), chrome (webkit) và firefox (gecko). giống như bất cứ điều gì gần đây, nó có lẽ sẽ barf theo IE6.

<html><body style="margin: 0; padding: 0;"> 
    <div style="position: absolute; background: #faa; 
       height: 100px; top: 0px; width: 100%;">header</div> 
    <div style="position: absolute; background: #afa; 
       top: 100px; bottom: 100px; left: 0; width: 100px;">left</div> 
    <div style="position: absolute; background: #afa; 
       top: 100px; bottom: 100px; right: 0; width: 100px;">right</div> 
    <div style="position: absolute; background: #faa; 
       height: 100px; bottom: 0px; width: 100%;">footer</div> 
    <div style="position: absolute; background: #aaf; 
       bottom:100px; left: 100px;top: 100px;right: 100px; overflow: auto;"> 
    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam tincidunt tempor 
velit quis volutpat. Nulla pharetra pulvinar arcu sed lacinia. Nulla ultrices aliquet sem, 
vitae commodo elit condimentum ut. Nulla consectetur facilisis nibh, et tempus purus 
pellentesque nec. Ut eu nibh ut arcu mattis luctus. Cras at interdum quam. Pellentesque 
imperdiet mi vitae felis sollicitudin iaculis. Maecenas accumsan tortor neque, at posuere 
felis. Quisque ultricies mi quis dolor pellentesque elementum. Maecenas quis nunc tortor. 
Cras eu velit faucibus nulla volutpat mollis. Aliquam fermentum lobortis diam ut pharetra. 
Duis mattis posuere fringilla. Morbi consectetur mauris vel libero pellentesque varius. 
Aenean leo enim, placerat a feugiat nec, ultrices et nulla. Etiam tincidunt urna id justo 
molestie faucibus. Cras neque enim, semper et sodales eu, volutpat nec urna. Vestibulum 
interdum arcu et ante egestas ut lacinia dui semper. Cras ligula lacus, aliquet nec dapibus 
ac, commodo vitae libero. In gravida venenatis sapien a convallis.</p> 


    <p>Nulla ac risus eu velit pulvinar pretium. Etiam porttitor viverra sollicitudin. 
Donec lectus mi, posuere quis luctus facilisis, lacinia non ante. Sed sed mi neque. Etiam 
neque risus, bibendum et tincidunt vel, pharetra nec risus. In hac habitasse platea 
dictumst. Nam sollicitudin condimentum lorem, quis dignissim turpis sagittis nec. 
Pellentesque diam nunc, rhoncus quis lobortis id, lacinia quis lorem. Maecenas tempor metus 
nec velit facilisis in rhoncus lectus varius. Integer mollis, odio ut pharetra varius, elit 
nulla pellentesque neque, a egestas est justo dapibus neque. Vivamus a mauris massa, sit 
amet commodo orci. Aliquam nec iaculis sapien. Suspendisse ornare, tortor eget mattis 
tempus, nulla ligula fermentum elit, vitae euismod odio metus ac risus. Etiam iaculis 
dignissim consectetur. Nunc molestie lorem ac neque pulvinar vitae eleifend justo 
facilisis.</p> 

    <p>Duis a sem turpis, et cursus arcu. Suspendisse potenti. Sed eu risus orci, eget 
bibendum justo. Praesent dapibus porttitor mauris, ac sollicitudin eros pretium quis. 
Curabitur mi eros, aliquam et ultrices et, adipiscing ut mauris. Nunc pretium malesuada nisi 
laoreet consectetur. Phasellus mi arcu, rutrum in blandit in, consectetur non risus. 
Vestibulum enim lacus, aliquam eu ultrices a, tempor ut turpis. Lorem ipsum dolor sit amet, 
consectetur adipiscing elit. Curabitur rhoncus faucibus sapien, quis vulputate eros tempus 
consequat. Vivamus id metus massa. Vivamus aliquet enim quis sem viverra eu molestie elit 
cursus.</p> 

    <p>Mauris at lorem massa. Aliquam risus ligula, vestibulum et placerat condimentum, 
pellentesque sit amet justo. Cras tempor sollicitudin ultrices. Aliquam sed elit sapien. 
Praesent consectetur molestie vehicula. Pellentesque quis lectus et nunc accumsan feugiat. 
Ut rhoncus aliquet libero sed rhoncus. Fusce egestas nunc eu elit vestibulum placerat. Class 
aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. 
Phasellus vitae nisi ante, id fermentum justo.</p> 

    <p>Donec iaculis magna nec elit fringilla imperdiet. Proin mauris sem, pellentesque sed 
ultrices ac, luctus ac elit. Donec blandit, orci ac volutpat luctus, turpis sem malesuada 
tellus, eget porta magna nisi vitae quam. In vitae scelerisque urna. Proin ante odio, 
ultrices lobortis scelerisque at, dictum non justo. Pellentesque tincidunt congue leo 
malesuada ullamcorper. Quisque dapibus, massa dignissim gravida blandit, augue felis 
vehicula urna, et ullamcorper turpis orci sit amet nibh. Ut vitae consequat nibh. 
Pellentesque turpis justo, ultrices ac porta in, pretium quis quam. Donec purus nisi, 
dignissim vitae hendrerit vel, hendrerit ac sapien. Fusce facilisis purus a libero elementum 
ultrices. Nunc in libero congue ipsum tempor suscipit. Pellentesque pharetra pretium 
volutpat. Nam sapien arcu, viverra vitae euismod sit amet, mollis nec arcu. Phasellus at 
elit metus, sit amet tempus turpis. Phasellus mattis justo ut est varius facilisis ut et 
leo. Phasellus congue cursus est eget luctus. In eleifend diam at enim ultricies a lacinia 
mauris molestie. Nunc porttitor bibendum vulputate. Pellentesque quis risus vel mi 
pellentesque imperdiet vitae ac nunc.</p> 

    </div> 
    </body></html> 
+0

Ồ, tốt lắm! Ý nghĩ về vị trí tuyệt đối cho việc thiết lập kích thước của một nguyên tố bị vượt qua bởi tâm trí trong khi tôi đang viết của tôi, nhưng tôi không nghĩ nó là một giải pháp cho vấn đề ở bàn tay - rất tốt đẹp! –

+0

Hoàn hảo! Tôi biết có một cách hợp lý để làm điều này ... –

2

Tôi nghĩ rằng đây là một điều kỳ lạ để cố gắng làm. Tuy nhiên, tôi đã chụp một bức ảnh, và tôi có thể chỉ nhận được như xa như bạn có, nhưng có lẽ tôi đã sử dụng một phương pháp khác có thể hữu ích. Tôi rất quan tâm để xem nếu Rob có một cách tốt hơn.Phương pháp của tôi hoạt động, với một vấn đề: nội dung có thể cuộn được, nhưng bạn không thể thấy các thanh cuộn. Tôi dường như không thể nghĩ ra một cách để sửa lỗi này. Dù sao, đây là những gì tôi đã đưa ra: http://www.happyspork.com/layout_test.html

0

Nếu có ai quan tâm tôi phát triển một cách bố trí sử dụng css bắt chước hành vi table động [sử dụng div s]. Nó hoạt động trong Chrome, Firefox và IE> 7.

DEMO, có một đi vào thay đổi kích thước cửa sổ

Khi đứng tất cả năm thành phần phát triển như nội dung tương ứng của họ làm, tuy nhiên, nếu bạn thực sự muốn hai bên trái và phải của bạn cố định chỉ áp dụng một quy tắc width-.east.west.

Có một số fiddle.

Code:

<div class="view" style="height:100%; width:100%"> 
    <div class="north"> 
     n 
    </div> 

    <div class="middle"> 
     <div class="west"> 
      w 
     </div> 

     <div class="centre"> 
      c 
     </div> 

     <div class="east"> 
      e 
     </div> 
    </div> 

    <div class="south"> 
     s 
    </div> 
</div> 
html, body { 
    height : 100%; 
    margin : 0; 
} 

.view, 
.view > .middle { 
    display : table; 
} 

.view > .north, 
.view > .south { 
    height : 1px; 
    display : table-row; 
} 
.view > .north { vertical-align : top; } 
.view > .south { vertical-align : bottom; } 

.view > .middle > div { 
    display : table-cell; 
} 
.view > .west, 
.view > .east { 
    width : 1px; 
} 

/*div { border : 1px solid black; }*/ 

đánh dấu đơn giản, không JS, và cách bố trí động. Bỏ ghi chú số border css để xem điều gì đang diễn ra.
Ở cuối câu hỏi của bạn, tôi thấy bạn đã thử sử dụng các bảng nhưng có vấn đề. Đặt max-height trên centre hoặc middle có thể là những gì bạn muốn (đối với điều cuộn). Có lẽ điều này có thể giúp bạn.

Các vấn đề liên quan