2011-12-16 36 views
8

Tôi tự coi mình là một trình mã hóa CSS/HTML trung gian/nâng cao nhưng tôi bị bối rối về cách thực hiện kịch bản sau .. Tôi bắt đầu nghĩ điều đó là không thể nhưng tôi thực sự muốn tin rằng đó là ..Tự động điều chỉnh hai cột bên ngoài thành độ rộng biến của cột giữa

Giả sử chiều rộng trình bao bọc là 1000px.

Trong đó có ba cột. Hai cột bên ngoài có cùng chiều rộng, chiều rộng này được cột trung tâm quyết định. Cột trung tâm là cột duy nhất có nội dung, chỉ một dòng văn bản có phần đệm là 30px ở hai bên. Vì vậy, nếu dòng nội dung là 100px với đệm, hơn hai cột khác sẽ là (1000-100)/2 mỗi ..

Có cách năng động để có hai cột bên ngoài điều chỉnh theo chiều rộng khác nhau của trung tâm cột được xác định bởi nội dung khác nhau của nó, một dòng văn bản?

đồ họa về những gì tôi đang cố gắng để hoàn thành:

http://i.stack.imgur.com/cMuBP.png

+0

hmm .. Tôi vừa nghĩ ra một cách để làm điều đó với hai div, một bên kia .. có lẽ thậm chí là một chút neater hơn ý tưởng ba cột .. trong mọi trường hợp, là nó có thể với ba cột? – deflime

+0

Đây có phải là sự cố lập trình thực tế mà bạn đang gặp phải không? Nếu vậy, hãy cân nhắc lặp lại câu hỏi của bạn như vậy, cũng như hiển thị cho chúng tôi bất cứ điều gì bạn có thể đã thử (ví dụ: bạn có một số đánh dấu cơ bản để chúng tôi làm việc cùng không?). Chúng tôi thường thích các câu hỏi về các vấn đề thực tế cho các câu hỏi về các câu đố mã hóa. – BoltClock

+0

Tôi tin rằng bài viết này đề cập đến những gì bạn đang tìm kiếm: http://www.alistapart.com/articles/holygrail/ – David

Trả lời

2

Tốt 'bảng ole để giải cứu:

http://jsfiddle.net/hgwdT/

Thật sự tôi nghĩ bàn là ma quỷ, nhưng hoạt động này như bạn mô tả. Và như vậy ở đây nó được sử dụng display: table-cell trên các div con, vì vậy nó có chức năng tương tự sử dụng đánh dấu đẹp hơn:

http://jsfiddle.net/XXXdB/

Yếu tố trung tâm thực sự có thể có chiều rộng năng động; để ngăn nội dung không bị phân loại, tôi chỉ cần thêm white-space: nowrap vào số p chứa văn bản.

Tôi cũng xác nhận rằng giải pháp này hoạt động trong IE8 và FF, ngoài Chrome.

+0

Tôi không thể nói rằng tôi ngạc nhiên .. Tôi nghĩ sâu bên dưới tôi nghĩ có một cách hài hước mà một cái bàn có thể làm được. Tôi đã thực hiện cách bảng và nó hoạt động, sẽ thay thế bằng div nhưng bạn cũng đánh bại tôi, cảm ơn! – deflime

+0

Tôi nghĩ rằng các bảng ở đó khi chúng ta cần một thứ gì đó để giữ liên tục ngay cả khi độ rộng không tăng lên (như cách chúng ta có 50% + 50% + trung tâm động = 100%), hoặc khi chúng ta cần nội dung động tập trung theo chiều dọc và không muốn sử dụng Javascript. Nếu không, tôi biết tôi sẽ hoàn thành chúng hoàn toàn. – justis

+0

Hoặc bạn biết đấy, để hiển thị nội dung dạng bảng, tôi đoán vậy. – justis

3

Các rất gần nhất tôi có thể đưa ra là sử dụng display: table; và ô bảng. Điều này tạo ra hiệu ứng động mà bạn đang tìm kiếm, nhưng tôi không nghĩ rằng bạn có thể có được hiệu ứng mong muốn của mình mà không đặt chiều rộng rõ ràng cho phần tử trung tâm.

HTML:

<div id="wrap"> 
    <div id="left"> 
     Left 
    </div> 
    <div id="center"> 
     center 
    </div> 
    <div id="right"> 
     Right 
    </div> 
</div> 

CSS:

#wrap 
{ 
    width: 1000px; 
    display: table; 
} 

#wrap div 
{ 
    display: table-cell; 
    border: 1px solid #000; 
    width: auto; 
} 

#center 
{ 
    padding: 0 30px; 
    text-align: center; 
} 

Bạn có thể check out my attempt here, nó có một số nút để bạn có thể xem các tiểu bang khác nhau, chiều rộng on/off và thêm văn bản vv (jQuery không liên quan gì đến giải pháp này)

Tôi nghĩ điều này gần giống như bạn sẽ nhận được với CSS thuần túy.

+0

gần, nhưng tôi nghĩ jblasco có bạn đánh bại .. cảm ơn – deflime

+1

Bạn đang đùa? Bảng đánh bại bố cục dựa trên div được cấu trúc tốt? Tôi từ bỏ SO. – Kyle

+1

Tôi ghét phải nói điều đó nhưng tôi nghĩ ngay cả trong trường hợp này, vâng. Bảng ghét là sooo 2005, miễn là bạn không sử dụng bảng làm wrapper hoặc lồng bảng bên trong bảng bên trong bảng .. sử dụng bảng ở đây và chắc chắn là hợp lý trong ngày và tuổi này khi mọi người sử dụng anyways reset. Bên cạnh đó, tôi đã thay thế bảng đánh dấu bằng div theo, nhưng jblasco đủ loại để làm điều đó cho tôi. Đừng băn khoăn, bạn chắc chắn đã trợ giúp trong việc chỉ đạo chúng tôi xuống con đường bên phải! – deflime

1

Đây không phải là giải pháp thanh lịch nhất, nhưng nó hoạt động. Tôi muốn đi đường CSS tinh khiết, nhưng không thể tìm ra được. Làm tốt lắm, jblasco và Kyle Sevenoaks, để tìm ra điều đó!

Đây là số jsFiddle demo của tôi.Nếu bạn không nhớ sử dụng một chút JavaScript dù (sử dụng jQuery trong ví dụ của tôi):

HTML:

<div id="wrapper"> 
    <div class="side"></div> 
    <div id="middle">One line of text.</div> 
    <div class="side"></div> 
</div> 

CSS:

#wrapper { 
    margin: 0 auto; 
    width: 1000px;  
} 

#wrapper div { 
    float: left; 
    height: 300px; 
} 

.side { 
    background: #ddd; 
} 

#middle { 
    background: #eee; 
    padding: 0 30px; 
    text-align: center; 
} 

JavaScript:

var adjustSize = function(){ 
    // Declare vars 
    var wrapper = $('#wrapper'), 
     middle = $('#middle'), 
     totalWidth = wrapper.width(), 
     middleWidth = middle.width(), 
     middleOuterWidth = middle.outerWidth(), 
     remainingWidth = totalWidth - middleOuterWidth, 
     sideWidth; 

    if(remainingWidth % 2 === 0){ 
     // Remaining width is even, divide by two 
     sideWidth = remainingWidth/2; 
    } else { 
     // Remaining width is odd, add 1 to middle to prevent a half pixel 
     middle.width(middleWidth+1); 
     sideWidth = (remainingWidth-1)/2; 
    } 

    // Adjust the side width 
    $('.side').width(sideWidth); 
} 
Các vấn đề liên quan