Làm cách nào để giữ CSS nổi trong một dòng?


216

Tôi muốn có hai mục trên cùng một dòng sử dụng float: leftcho mục bên trái.

Tôi không có vấn đề đạt được điều này một mình. Vấn đề là, tôi muốn hai mục để nghỉ trên cùng một dòng ngay cả khi bạn thay đổi kích thước trình duyệt rất nhỏ . Bạn biết ... như thế nào với bảng.

Mục tiêu là để giữ cho các mục bên phải khỏi gói bất kể điều gì .

Làm thế nào để tôi nói với trình duyệt bằng CSS rằng tôi thà kéo dài phần chứadiv hơn là bọc nó để float: right;div nằm bên dưới float: left; div?

những gì tôi muốn:

                                   \
 +---------------+  +------------------------/
 | float: left;  |  | float: right;          \
 |               |  |                        /
 |               |  |content stretching      \   Screen Edge
 |               |  |the div off the screen  /  <---
 +---------------+  +------------------------\
                                             /

54
Sẽ tuyệt vời thế nào nếu StackOverlow thêm một tiện ích vẽ nhỏ để chúng ta có thể tạo các sơ đồ này bằng chuột? Có thể phù hợp hơn cho các trang web SE định hướng thiết kế ... tuy nhiên nó sẽ rất tuyệt vời.
JoeCool

5
@JoeCool Trang web UX SE thực sự đã có một công cụ để tạo ra các mockup trong đó. meta.ux.stackexchange.com/questions/1291/ Mạnh
thẳng thắn ngày

Câu trả lời:


77

Gói <div>s nổi của bạn trong một thùng chứa <div>sử dụng hack chiều rộng tối thiểu trên trình duyệt này:

.minwidth { min-width:100px; width: auto !important; width: 100px; }

Bạn cũng có thể cần phải đặt "tràn" nhưng có thể không.

Điều này hoạt động vì:

  • Các !importanttuyên bố, kết hợp với min-widthnguyên nhân tất cả mọi thứ để ở trên cùng một dòng trong IE7 +
  • IE6 không triển khai min-width, nhưng nó có một lỗi như vậy width: 100pxsẽ ghi đè !importantkhai báo, khiến chiều rộng vùng chứa là 100px.

Điều này làm việc tuyệt vời cho hai phao, nhưng không phải ba. Nó có thể làm việc cho ba ??
tylerthemiler

15
Vấn đề duy nhất là nó buộc một chiều rộng tối thiểu cố định.
Matt Montag

6
Đây không phải là một giải pháp, nó chỉ là một chiều rộng tối thiểu, khi nội dung của bạn thực sự nhỏ (xem câu hỏi) vì vậy dưới 100px bạn có cùng một vấn đề. Đặc biệt với các ô của bảng, điều này vẫn là một vấn đề.
Sanne

Hoàn toàn gây sốc - giải quyết vấn đề của tôi ngay lập tức. Tôi đã phải vật lộn với vấn đề này trong một bố cục bootstrap hai cột đơn giản với nhiều hack hộp hơn tôi có thể đặt tên, nhưng điều này đã hoạt động hoàn hảo. Cảm ơn bạn đã giải thích lý do tại sao công việc này - công cụ hấp dẫn, dom là.
nocarrier

Điều này có thể hoạt động với div, nhưng tôi chỉ thử nghiệm nó với ul / li và nó không hoạt động :(
AsoodAsItGets

132

Một tùy chọn khác là, thay vì nổi, để đặt thuộc tính khoảng trắng ngay bây giờ thành div cha:

.parent {
     white-space: nowrap;
}

và đặt lại khoảng trắng và sử dụng màn hình khối nội tuyến để các div nằm trên cùng một dòng nhưng bạn vẫn có thể cho nó một chiều rộng.

.child {
    display:inline-block;
    width:300px;
    white-space: normal;
}

Đây là một JSFiddle: https://jsfiddle.net/9g8ud31o/


4
Chắc chắn là giải pháp tốt nhất tôi từng thấy. Nó hoạt động cho trường hợp sử dụng của tôi nhưng tôi tự hỏi nó được hỗ trợ tốt như thế nào. May mắn thay, sử dụng phao cho MỌI THỨ đang dần trở thành quá khứ.
Ryan Ore

1
Bạn có thể giải thích làm thế nào điều này hoạt động? hoặc bất kỳ liên kết ít nhất?
Anirudhan J

4
@AnirudhanJ Nó không quá khó. Khối nội tuyến làm cho các phần tử chảy bình thường với văn bản nội tuyến (nhưng vẫn giữ một số khả năng đệm / lề của khối) và theo nghĩa đen bạn chỉ cần nói CSS không bao bọc văn bản với tùy chọn khoảng trắng: nowrap (áp dụng "bình thường" "Một lần nữa cho đứa trẻ, để tránh nó lan truyền vào mọi thứ)
Brian

Làm thế nào để bạn có được div bên phải để nổi bên phải màn hình, mặc dù? Điều này chỉ đặt hai khối nội tuyến cạnh nhau mà không ngắt dòng.
addMitt

bạn cũng có thể sử dụng khoảng cách chữ: -3px (hoặc bất kỳ giá trị nào phù hợp với bạn) để xóa khoảng trắng giữa các thành phần khối nội tuyến. PS: tốt hơn câu trả lời được chấp nhận ;
Claudiu

15

Bọc phao của bạn trong div với chiều rộng tối thiểu lớn hơn chiều rộng kết hợp + lề của phao.

Không có hack hoặc bảng HTML cần thiết.


10

Giải pháp 1:

display: cell-cell (không được hỗ trợ rộng rãi)

Giải pháp 2:

những cái bàn

(Tôi ghét hack.)


8

Một lựa chọn khác: Không nổi cột bên phải của bạn; chỉ cần cho nó một lề trái để di chuyển nó vượt ra ngoài float. Bạn sẽ cần một hoặc hai hack để sửa IE6, nhưng đó là ý tưởng cơ bản.


4

Bạn có chắc chắn rằng các yếu tố cấp khối nổi là giải pháp tốt nhất cho vấn đề này?

Thông thường với những khó khăn về CSS trong trải nghiệm của tôi, hóa ra lý do tôi không thể thấy cách làm điều tôi muốn là tôi đã bị cuốn vào một tầm nhìn đường hầm liên quan đến đánh dấu của tôi (nghĩ rằng "làm thế nào tôi có thể thực hiện những điều này các yếu tố làm điều này ? ") thay vì quay lại và xem chính xác những gì tôi cần phải đạt được và có thể làm lại html của mình một chút để tạo điều kiện cho điều đó.


nó hoạt động tốt với mọi thứ và bố cục hiện có dựa trên nó, tôi chỉ cố gắng khắc phục sự cố với việc phá vỡ bố cục khi bạn tăng kích thước văn bản quá nhiều HOẶC thay đổi kích thước cửa sổ trình duyệt rộng hơn 700px
Jiaaro

2

Tôi khuyên bạn nên sử dụng bảng cho vấn đề này. Tôi đang có một vấn đề tương tự và miễn là bảng chỉ được sử dụng để hiển thị một số dữ liệu và không phải cho bố cục trang chính thì nó vẫn ổn.


2

Thêm dòng này vào bộ chọn phần tử nổi của bạn

.floated {
    float: left;
    ...
    box-sizing: border-box;
}

Nó sẽ ngăn chặn phần đệm và đường viền được thêm vào chiều rộng, do đó phần tử luôn ở trong hàng, ngay cả khi bạn có ví dụ. ba yếu tố với chiều rộng 33.33333%


0

Khi người dùng giảm kích thước cửa sổ theo chiều ngang và điều này khiến cho các float nổi theo chiều dọc, hãy xóa các float và trên div thứ hai (đó là float), sử dụng lề-top: -123px (giá trị của bạn) và lề trái: 444px (giá trị của bạn) để định vị các div khi chúng xuất hiện với phao. Khi thực hiện theo cách này, khi cửa sổ thu hẹp, div bên phải giữ nguyên vị trí và biến mất khi trang quá hẹp để bao gồm nó. ... Mà (với tôi) tốt hơn là có div bên phải "nhảy" xuống bên dưới div bên trái khi cửa sổ trình duyệt bị thu hẹp bởi người dùng.


-3

Cách tôi khắc phục điều này là sử dụng một số jQuery. Lý do tôi làm theo cách này là vì A và B có độ rộng phần trăm.

HTML:

<div class="floatNoWrap">
    <div id="A" style="float: left;">
        Content A
    </div>
    <div id="B" style="float: left;">
        Content B
    </div>
    <div style="clear: both;"></div>
</div>

CSS:

.floatNoWrap
{
    width: 100%;
    height: 100%;
}

jQuery:

$("[class~='floatNoWrap']").each(function () {
    $(this).css("width", $(this).outerWidth());
});

1
Một khung cho CSS? Tôi phải -jquery cho TẤT CẢ các tìm kiếm JavaScript và vì sự coi thường hoàn toàn và hoàn toàn không quan tâm đến chất lượng, chúng tôi cũng phải bắt đầu tìm kiếm CSS một cách rõ ràng? Làm đúng hoặc không làm gì cả.
Giăng
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.