2013-02-07 61 views
13

Làm cách nào để div của bạn tiếp cận tất cả các con đường? Làm cách nào để lấp đầy không gian dọc của div mẹ? Cách lấy các cột có chiều dài bằng nhau mà không sử dụng hình nền?Cách tạo các cột có độ cao bằng nhau trong CSS tinh khiết

Tôi đã dành một vài ngày googling và phân tích mã để hiểu cách thực hiện các cột có độ dài bằng nhau dễ dàng và hiệu quả nhất có thể. Đây là câu trả lời tôi đã đưa ra và tôi muốn chia sẻ kiến ​​thức này với cộng đồng sao chép và dán phong cách trong một hướng dẫn nhỏ.

Đối với những người cho rằng đây là bản sao, nó không phải là. Tôi đã được truyền cảm hứng từ một số trang web, trong số đó là http://matthewjamestaylor.com/blog/equal-height-columns-cross-browser-css-no-hacks nhưng mã bên dưới là duy nhất.

+0

Quentin, KHÔNG PHẢI là bản sao. Mã của tôi được INSPIRED bởi (trong số những người khác) http://matthewjamestaylor.com/blog/equal-height-columns-cross-browser-css-no-hacks nhưng nó đơn giản hơn và được thay đổi, mặc dù tôi không nhớ chính xác những gì sự khác biệt là, thời gian dài trước đây tôi đã viết nó. – Paul

+0

Sử dụng trang web này cho loại sự cố này: http://callmenick.com/post/css-equal-height-columns-three-different-ways –

Trả lời

7

Một trong những điều khó khăn trong thiết kế web hiện đại là tạo bố cục cột hai (hoặc nhiều hơn) trong đó tất cả các cột có chiều cao bằng nhau. Tôi đặt ra một nhiệm vụ để tìm cách làm điều này trong CSS thuần túy.

Bạn có thể dễ dàng thực hiện việc này bằng cách sử dụng hình nền trong gói bọc-div chứa cả hai cột của bạn (hoặc nền của trang).

Bạn cũng có thể thực hiện việc này bằng cách sử dụng các ô bảng CSS, nhưng tiếc là trình duyệt hỗ trợ cho điều này vẫn còn râm, vì vậy nó không phải là giải pháp ưu tiên. Đọc tiếp, có một cách tốt hơn.

Tôi tìm thấy nguồn cảm hứng từ hai trang trên web, mặc dù tôi thích giải pháp hơn vì nó cho phép tôi tự do sử dụng góc tròn và chiều rộng hoặc bố cục phần trăm chính xác hơn và dễ chỉnh sửa hơn không buộc bạn phải làm số crunching âm.

== Bí quyết: ==

Trước tiên, bạn tạo ra các cols thiết kế nền, sau đó bạn đặt một div toàn bộ chiều rộng có thể chứa nội dung thường xuyên của bạn. Bí quyết là tất cả các cột nổi trong các cột, tạo hiệu ứng đẩy trên tất cả các cột cha khi nội dung mở rộng theo chiều dài, bất kể cột kết thúc dài nhất là bao lâu.

Trong ví dụ này, tôi sẽ sử dụng lưới 2 cột trong tâm quấn-div được căn giữa với các góc bo tròn. Tôi đã cố gắng để giữ cho fluff ra cho dễ dàng sao chép-dán.

== Bước 1 ==

Tạo trang web cơ bản của bạn.

<!DOCTYPE HTML> 
<html> 
<head> 
</head> 
<body> 
</body> 
</html> 

== Bước 2 ==

Tạo một tài khoản nổi div bên trong một nổi div. Sau đó, áp dụng một lề âm trên div bên trong để bật nó ra khỏi khung của nó một cách trực quan. Tôi đã thêm đường viền chấm cho mục đích minh họa. Biết rằng nếu bạn thả div bên ngoài sang bên trái và cung cấp cho div bên trong một lề âm ở bên trái, div bên trong sẽ đi theo cạnh trang mà không cho bạn một thanh cuộn.

<!DOCTYPE HTML> 
<html> 
<head> 
<style> 
#rightsideBG{ 
    float:right; 
    background:silver; 
    width:300px; 
    border: 3px dotted silver; /*temporary css*/ 
} 
#leftsideBG{ 
    float:left; 
    background:gold; 
    width:100px; 
    margin-left:-100px; 
    border: 3px dotted gold; /*temporary css*/ 
} 
</style> 
</head> 
<body> 
<div id="rightsideBG"> 
    <div id="leftsideBG"> 
     this content obviously only fits the left column for now. 
    </div> 
</div> 
</body> 
</html> 

== Bước 3 ==

Trong div bên trong: Tạo một div mà không có nền mà có với tất cả các cột cộng lại. Nó sẽ đẩy qua các cạnh của div bên trong. Tôi đã thêm đường viền chấm chấm để minh họa các mục đích.Đây sẽ là canvas cho nội dung của bạn.

<!DOCTYPE HTML> 
<html> 
<head> 
<style> 
#rightsideBG{ 
    float:right; 
    background:silver; 
    width:300px; 
    border: 3px dotted silver; /*temporary css*/ 
} 
#leftsideBG{ 
    float:left; 
    background:gold; 
    width:100px; 
    margin-left:-100px; 
    border: 3px dotted gold; /*temporary css*/ 
} 
#overbothsides{ 
    float:left; 
    width:400px; 
    border: 3px dotted black; /*temporary css*/ 
} 
</style> 
</head> 
<body> 
<div id="rightsideBG"> 
    <div id="leftsideBG"> 
     <div id="overbothsides"> 
      this content spans over both columns now. 
     </div> 
    </div> 
</div> 
</body> 
</html> 

== Bước 4 ==

Thêm nội dung của bạn. Trong ví dụ này, tôi đặt hai div được định vị trên layout. Tôi cũng lấy đi các đường viền chấm chấm. Presto, đúng vậy. Bạn có thể sử dụng mã này nếu bạn muốn.

<!DOCTYPE HTML> 
<html> 
<head> 
<style> 
#rightsideBG{ 
    float:right; 
    background:silver; 
    width:300px; 
} 
#leftsideBG{ 
    float:left; 
    background:gold; 
    width:100px; 
    margin-left:-100px; 
} 
#overbothsides{ 
    float:left; 
    width:400px; 
} 
#leftcol{ 
    float:left; 
    width:80px; 
    padding: 10px; 
} 
#rightcol{ 
    float:left; 
    width:280px; 
    padding: 10px; 
} 
</style> 
</head> 
<body> 
<div id="rightsideBG"> 
    <div id="leftsideBG"> 
     <div id="overbothsides"> 
      <div id="leftcol">left column content</div> 
      <div id="rightcol">right column content</div> 
     </div> 
    </div> 
</div> 
</body> 
</html> 

== Bước 5 ==

Để làm cho nó đẹp hơn bạn có thể làm trung tâm thiết kế toàn bộ trong một div bọc và cung cấp cho nó tròn góc. Các góc tròn sẽ không hiển thị trong IE cũ trừ khi bạn sử dụng một sửa chữa đặc biệt cho điều đó.

<!DOCTYPE HTML> 
<html> 
<head> 
<style> 
#wrap{ 
    position:relative; 
    width:500px; 
    margin:20px auto;  
    -webkit-border-bottom-right-radius: 20px; 
    -moz-border-radius-bottomright: 20px; 
    border-bottom-right-radius: 20px; 
} 
#rightsideBG{ 
    float:right; 
    background:silver; 
    width:300px; 
} 
#leftsideBG{ 
    float:left; 
    background:gold; 
    width:100px; 
    margin-left:-100px; 
} 
#overbothsides{ 
    float:left; 
    width:400px; 
} 
#leftcol{ 
    float:left; 
    width:80px; 
    padding: 10px; 
} 
#rightcol{ 
    float:left; 
    width:280px; 
    padding: 10px; 
} 
</style> 
</head> 
<body> 
<div id="wrap"> 
    <div id="rightsideBG"> 
     <div id="leftsideBG"> 
      <div id="overbothsides"> 
       <div id="leftcol">left column content</div> 
       <div id="rightcol">right column content</div> 
      </div> 
     </div> 
    </div> 
</div> 
</body> 
</html> 

nguồn cảm hứng == ==

24

Đối với một giải pháp đơn giản hơn, bạn có thể cung cấp cho phụ huynh display: table và con của nó display: table-cell, như thế này :

.parent { 
    display: table; 
} 
.child { 
    display: table-cell; 
} 

Xem DEMO.

Xin lưu ý rằng điều này không hoạt động trong IE7, vì vậy nếu cần hỗ trợ IE7, cần có giải pháp phức tạp hơn.

+0

Như tôi đã nói trong câu trả lời ban đầu của tôi: "Bạn cũng có thể thực hiện việc này bằng cách sử dụng Các ô bảng CSS, nhưng tiếc là trình duyệt hỗ trợ cho điều này vẫn còn râm, vì vậy nó không phải là một giải pháp ưu tiên. " Nhưng cảm ơn bạn đã thêm, nó làm cho tôi nhận ra rằng IE7 không được nhiều người sử dụng nữa, tôi chỉ kiểm tra các số liệu thống kê trên [Statcounter - http://gs.statcounter.com] (http: //gs.statcounter. com) Cho đến nay tôi đã tiếp tục kiểm tra mọi thứ tôi làm trong IE7 vì nó là con phiền của phát triển web, vẫn còn sống. – Paul

+0

Ngoài ra, ví dụ về ô bảng của bạn hiển thị chiều cao đã đặt. Hầu hết các lần bạn không biết chiều cao nó sẽ là gì, hoặc không muốn đặt chiều cao, chỉ chiều rộng. Mã do đó nên hơi khác nhau. [Giống như trong ví dụ này.] (Http://jsfiddle.net/vtajZ/2/) – Paul

+0

Điểm tốt. Nếu bạn không cần chiều cao được đặt, bạn có thể chỉ cần loại bỏ chiều cao của cha mẹ. Điều này sẽ thiết lập chiều cao của mỗi đứa trẻ với chiều cao của đứa trẻ cao nhất. – zakangelle

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