2011-11-05 31 views
5

Tôi đang xem xét toàn bộ thiết kế đáp ứng và tìm lưới chất lỏng tuyệt vời cho điều đó - vấn đề duy nhất là chúng dường như vỡ khi cố gắng đưa chiều rộng cố định cho bất kỳ cột nào. Khi bạn thu nhỏ màn hình, các cột bật ra khỏi phao. Tôi đã mong đợi một cột chất lỏng với một tỷ lệ phần trăm chiều rộng (hoặc không có chiều rộng) chỉ để thu nhỏ, để lại các cột chiều rộng cố định tại chỗ. Làm thế nào dễ dàng để tạo ra một chất lỏng lai/cố định lưới như thế này? Tôi đã nhìn thấy một giải pháp với inline-block thay vì khối nổi, nhưng làm thế nào tốt là trên các trình duyệt, và nó là một cách sạch sẽ làm việc?Bố trí chất lỏng với một số cột có chiều rộng cố định

Đây là ví dụ về sự cố: http://jsfiddle.net/andfinally/nJ97q/2/

Cảm ơn! Fred

+0

bạn có dự định sử dụng cột "chào thế giới" hoặc chiều rộng cố định làm người giữ chỗ cho biểu trưng hay không? Tôi đã gặp vấn đề này bằng cách sử dụng truy vấn phương tiện nhưng lại không được hỗ trợ trong tất cả các phương tiện. – Xavier

+0

Tôi nên giải thích - cột "Hello world" sẽ chứa cột lớn nhất - ví dụ: văn bản nội dung của bài đăng. Hai cột còn lại là dành cho nội dung thanh bên. Tôi dự định sử dụng truy vấn phương tiện, nhưng tôi đang hướng đến một bố cục chất lỏng sẽ thay đổi kích thước mượt mà lên và xuống, muốn tránh nhảy giữa các kích thước nếu tôi có thể. –

Trả lời

5

Đặt chiều rộng tối thiểu trên div trình bao bọc thành chiều rộng tối thiểu của hai cột cố định + một chút cho cột tiếp theo. Điều này làm cho nó để nó không đẩy.

#row { min-width: 400px; } 

Thông báo trước là nó không được hỗ trợ bởi IE6 trở xuống và có thể bị lỗi trong IE7.

--------- EDIT -------------

Điều gì sẽ làm việc tốt nhất cho bạn trong tình huống này tôi nghĩ sẽ là một display: table-cell thiết lập. Điều này sẽ cho phép tất cả mọi thứ được khóa vào các vị trí mà bạn đang tìm kiếm.

.main { 
    padding: 10px; 
    background: #efefef; 
    display: table-cell; //this locks to #sideNav 
} 

#sideNav { 
    display: table-cell; //this wraps the sidebar and middle and locks to main 
    width: 280px; 
    verticle-align: top; 
} 

.middle { 
    display: table-cell; //this locks with .sidebar 
    width: 140px; 
    padding: 10px;  
    background: #bbb; 
} 

.sidebar { 
    display: table-cell; //this locks with .middle 
    width: 100px; 
    padding: 10px;  
    background: #555; 
} 

http://jsfiddle.net/nJ97q/73/

+0

Cảm ơn CBRRacer, đây là một gợi ý hợp lý mà dường như giải pháp tốt nhất cho câu hỏi hóc búa. –

+0

Bah! Điều này làm việc độc đáo cho đến khi tôi đặt một số nội dung vào cột "Hello World". http://jsfiddle.net/andfinally/nJ97q/ Quay lại bản vẽ tôi đoán. –

+0

@AndFinally Những gì bạn đang tìm kiếm hoạt động tốt hơn nhiều với thiết lập bảng hiển thị. Một lần nữa lỗi các vấn đề với IE7 nếu nó thậm chí còn được hỗ trợ. – CBRRacer

0

Tôi nghĩ giải pháp dưới đây có thể giúp ích cho bạn.

Vì bạn đang cho tỷ lệ phần trăm div "hàng" theo tỷ lệ phần trăm, nên kích thước của nó tự thay đổi mỗi khi bạn thu nhỏ cửa sổ. Cung cấp cho nó một chiều rộng bằng pixel nếu bạn có thể, nếu bạn không thể sau đó sử dụng min-width để nó sẽ không tái kích thước dưới min-width và do đó bảng điều khiển của bạn sẽ vẫn còn nguyên vẹn.

Để làm cho nó mịn: Bạn có thể thêm javascript để làm cho nó trơn tru. Sử dụng sự kiện window.onresize để gọi một hàm bao gồm mã để làm cho "hàng" thay đổi kích thước chậm bằng cách sử dụng chức năng hẹn giờ làm tăng chiều rộng của "hàng" 10 pixel hoặc cứ 10 miliseconds cho đến độ dài tối đa, trong trường hợp này cửa sổ chiều dài đạt được. Nhưng bạn có thể thực hiện điều này một cách hiệu quả nếu bạn đặt chiều rộng tính bằng pixel, hoặc nếu không có thu nhỏ xấu xí, hiệu ứng phóng to sẽ được tạo.

Hy vọng rằng sẽ giúp, Ashwin

+0

Cảm ơn Ashwin, ý tưởng thú vị, tôi sẽ có một cái nhìn khác. –

+0

Đừng quên trả lời câu hỏi của bạn, nếu vấn đề của bạn được giải quyết. –

1

Không có cách nào sạch để làm điều này. Nhưng ai cần sạch?

Tôi sẽ không khuyên bạn nên trộn chiều rộng cố định và chất lỏng, nhưng nếu bạn đang có, bạn có thể cần truy vấn phương tiện (nhiều polyfills có sẵn cho IE). Sau đó, bạn có thể kiểm tra xem vùng chứa có nhỏ hơn X hay không, trong trường hợp này bạn sắp xếp lại bố cục (1/3 cho tất cả các cột hoặc chỉ mọi thứ dọc, v.v.).

Ví dụ này hơi lạ một chút. Có gì trong tất cả các khoảng trắng ở giữa? Nội dung nào?

PS. Không sử dụng min-width. Điều đó làm mất hiệu lực toàn bộ sự đáp ứng.

+0

Cảm ơn Rudie, tôi vẫn đang học .. Tôi có kế hoạch sử dụng các phần tử HTML5 khi tôi thực hiện bố cục thực sự. –

+0

Tôi nên làm ví dụ của mình rõ ràng hơn, đang vội vàng .. Cột "Hello World" được cho là cột nội dung chính. –

+0

@AndFinally HTML5 yếu tố thực sự không phải là quan trọng. Nghĩa đen không ai và không có gì quan tâm: http://coding.smashingmagazine.com/2011/11/11/our-pointless-pursuit-of-semantic-value/ – Rudie

0

Tôi đã có một vấn đề tương tự mà tôi cần phải có một chiều rộng cố định cột bên trái (cấu trúc menu) nhưng có cột bên phải thay đổi kích thước một cách đáp ứng như trình duyệt đã được giảm xuống.

Tôi đã kết thúc triển khai một vài truy vấn phương tiện bổ sung (chúng đã tồn tại để xử lý các trường hợp cạnh khác) và tìm chiều rộng phần trăm của cột bên phải làm việc cho truy vấn phương tiện đó. Điều này không "nhảy" một chút (tôi chỉ sử dụng 2 "truy vấn phương tiện bổ sung" trên thiết bị cầm tay/máy tính bảng/máy tính để bàn tiêu chuẩn) nhưng ở tất cả các độ phân giải ở giữa nó sẽ không vi phạm dòng tiếp theo. Trong thực tế bạn đang điều chỉnh ngữ cảnh trong mỗi truy vấn phương tiện trước khi nó có thể phá vỡ. Các truy vấn phương tiện khác sẽ bằng các ngắt nhỏ hơn khi trình duyệt được thay đổi kích thước.

Tôi ổn với các bước nhảy vì tôi không xây dựng cho trường hợp sử dụng của ai đó thay đổi kích thước trình duyệt của họ, mà là đảm bảo nó hoạt động được chấp nhận trên các thiết bị có độ phân giải khác nhau.

Một báo trước, khi tìm chiều rộng phần trăm của cột bên phải, chiều rộng cơ sở được sử dụng là chiều rộng của truy vấn phương tiện bạn đang ở, không phải chiều rộng đầy đủ ban đầu. Ngoài ra, bạn phải sử dụng chiều rộng tối thiểu và sử dụng kích thước hoạt động ở độ phân giải nhỏ nhất cho mỗi phần truy vấn phương tiện.

/* 641+ */ 
@media all and (min-width:641px) { 
    .itemDetailLanding { 
     width: 58.81435257410296%; /* 377/641 */ 
    } 
} 
/* 725-768 */ 
@media all and (min-width: 725px) { 
    .itemDetailLanding { 
     width: 63.44827586206897%; /* 460/725 */ 
    } 
} 
/* 769+ */ 
@media all and (min-width: 768px) { 
    .itemDetailLanding { 
     width: 65.625%; /* 504/768 */ 
    } 
} 
/* 860-990 */ 
@media all and (min-width: 860px) { 
    .itemDetailLanding { 
     width: 69.18604651162791%; /* 595/860 */ 
    } 
}  
/* 990+ */ 
@media all and (min-width:990px) { 
    .itemDetailLanding { 
     width: 74.04040404040404%; 
    } 
} 
1

Tôi tự hỏi tại sao không sử dụng bảng?

Giống như:

<table class="row"> 
    <tr> 
     <td class="main"> 
     </td> 
     <td class="middle"> 
     </td> 
     <td class="sidebar"> 
     </td> 
    </tr> 
</table> 

Nó trở nên rất đơn giản bằng cách bố trí bảng, không có JS, cùng chiều cao cột, tương thích hoàn toàn với bất kỳ trình duyệt.

Dưới đây là ví dụ: http://jsfiddle.net/nJ97q/162/

Tôi biết tất cả mọi người nói rằng việc sử dụng bảng là xấu thực hành, nhưng nó thực sự giải quyết tất cả các vấn đề này.

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