Dừng các div nổi khỏi gói


84

Tôi muốn có một hàng div (ô) không bao bọc nếu trình duyệt quá hẹp để phù hợp với chúng.

Tôi đã tìm kiếm Stack và không thể tìm thấy câu trả lời phù hợp cho những gì tôi nghĩ phải là một câu hỏi css đơn giản.

Các ô có chiều rộng được chỉ định. Tuy nhiên, tôi không muốn chỉ định chiều rộng của hàng, chiều rộng sẽ tự động là chiều rộng của các ô con của nó.

Nếu chế độ xem quá hẹp để chứa các hàng, thì div sẽ tràn các thanh cuộn.

Vui lòng cung cấp câu trả lời của bạn dưới dạng đoạn mã đang hoạt động, vì tôi đã thử rất nhiều giải pháp mà tôi đã thấy ở những nơi khác (như chỉ định chiều rộng: 100% và chúng dường như không hoạt động).

Tôi đang tìm kiếm một giải pháp chỉ HTML / CSS, không có JavaScript.

.row {
  float: left;
  border: 1px solid yellow;
  width: 100%;
  overflow: auto;
}
.cell {
  float: left;
  border: 1px solid red;
  width: 200px;
  height: 100px;
}
<div class="row">
  <div class="cell">a</div>
  <div class="cell">b</div>
  <div class="cell">c</div>
</div>

Hiện tại, tôi thực sự khó mã hóa chiều rộng của hàng thành một con số thực sự lớn.


1
một trong những câu trả lời dưới đây có phù hợp với bạn không? Tôi không thành công với bất kỳ người nào trong số họ.
John Fitzpatrick

Tôi chỉ thử tất cả các câu trả lời và không có câu trả lời nào phù hợp với tôi. Vấn đề là tôi cần căn giữa hai div nổi bên trái và ngăn div ở bên phải bị đẩy xuống bên dưới sang trái sau khi cửa sổ được thay đổi kích thước.
Bashevis

@Nicholas Tôi nghĩ ví dụ của tôi chính xác là những gì bạn đang tìm kiếm, hôm nay tôi cũng gặp phải vấn đề này. Các menu thả xuống tràn nhưng tầng đầu tiên không bao bọc.
John

Câu trả lời:


107

Thuộc tính CSS display: inline-blockđược thiết kế để giải quyết nhu cầu này. Bạn có thể đọc một chút về nó tại đây: http://robertnyman.com/2010/02/24/css-display-inline-block-why-it-rocks-and-why-it-sucks/

Dưới đây là một ví dụ về việc sử dụng nó. Các yếu tố quan trọng là rowyếu tố có white-space: nowrapvà các cellyếu tố có display: inline-block. Ví dụ này sẽ hoạt động trên hầu hết các trình duyệt chính; bảng tương thích có sẵn tại đây: http://caniuse.com/#feat=inline-block

<html>
<body>
<style>

.row {
    float:left;
    border: 1px solid yellow;
    width: 100%;
    overflow: auto;
    white-space: nowrap;
}

.cell {
    display: inline-block;
    border: 1px solid red;
    width: 200px;
    height: 100px;
}
</style>

<div class="row">
    <div class="cell">a</div>
    <div class="cell">b</div>
    <div class="cell">c</div>
</div>


</body>
</html>

1
Thêm <!DOCTYPE html>hoặc <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">vào đầu HTML để IE không mặc định ở chế độ quirks.
Cees Timmerman

4
Lưu ý: Tôi đã thiết lập div kiểu ô của mình với float: left và điều này buộc kiểu tính toán phải là khối, thay vì khối nội tuyến. Mất một thời gian để tìm ra, vì vậy tốt nhất là bạn nên chia sẻ điều đó.
Steve Hibbert

Điều này không hoạt động với ô cuối cùng float: right, phải không?
Andy

3
Đây không thực sự là một ví dụ về cách giữ cho các div nổi không bị quấn - bạn chỉ giải phóng các ô. Tôi có một bố cục với một số phao bên trái và bên phải, vì vậy tôi không thể loại bỏ các phao nổi để giải quyết vấn đề bao bọc.
Andy

Haha, đủ công bằng. Đó là một sự khác biệt lớn, nhưng bạn đã đúng. Tôi đã không giải quyết "dừng các div nổi từ gói", tôi đã giải quyết câu hỏi thực sự của người hỏi "làm cách nào để bố trí của tôi hoạt động". Để trả lời câu hỏi trước: Tôi chắc chắn một cách hợp lý rằng không có cách nào để ngăn các div nổi đóng gói. Cũng giống như người hỏi, bạn sẽ cần tìm một cách khác để mã hóa bố cục mà bạn đang mô tả.
Calvin

32

Bạn muốn xác định min-widthtrên hàng để khi trình duyệt được định lại kích thước, nó không nằm dưới hàng đó và quấn.


1
Điều này sẽ hoạt động ngay cả với phao. Tôi nghĩ đó là câu trả lời thực sự.
Danon

2
Đồng ý với @Danon - điều này hoạt động trong khi khối nội tuyến đưa ra các vấn đề về căn chỉnh dọc.
dlchambers

1
Tùy thuộc vào nhu cầu của bạn. Điều này không ngăn các div nổi đóng gói khi trang được thay đổi kích thước, nhưng người hỏi cho biết "Tôi không muốn chỉ định chiều rộng của hàng, chiều rộng sẽ tự động là chiều rộng của các ô con của nó". Đặc tả chiều rộng thủ công yêu cầu một số công việc trùng lặp, vì bạn cần tính tổng chiều rộng của hàng. Thậm chí tệ hơn, nếu các ô của bạn có chiều rộng thay đổi (giả sử, vì chúng có kích thước bằng một dòng văn bản bên trong chúng) thì việc tính toán tổng số có thể không thực tế hoặc không thể.
Calvin

-1; Điều này đi ngược lại những gì OP đã nêu cụ thể trong câu hỏi của mình, cụ thể là KHÔNG phải chỉ định chiều rộng. +1 cho nhận xét của Calvin ở trên.
Teodor Sandu

4

Sau khi đọc câu trả lời của John, tôi phát hiện ra rằng những điều sau dường như phù hợp với chúng tôi (không yêu cầu chỉ định chiều rộng):

<style>
.row {
    float:left;
    border: 1px solid yellow;
    overflow: visible;
    white-space: nowrap;
}

.cell {
    display: inline-block;
    border: 1px solid red;
    height: 100px;
}
</style>

<div class="row">
    <div class="cell">hello hello hello hello hello hello hello hello hello hello hello hello hello hello hello hello </div>
    <div class="cell">hello hello hello hello hello hello hello hello hello hello hello hello hello hello hello hello </div>
    <div class="cell">hello hello hello hello hello hello hello hello hello hello hello hello hello hello hello hello </div>
</div>

Điều này đã khắc phục sự cố mà tôi gặp phải với các div có thể kéo trên iPhone. Khi các div có nhiều hơn một từ trong đó và chúng được kéo đến cạnh màn hình, div sẽ bao bọc để có một từ trên một trong hai dòng. Dù sao overflow: visible; white-space: nowrap;đã lừa cho tôi. Cảm ơn!
TryHarder

4
Nó hoạt động vì anh ấy đã giải phóng các tế bào. Không thực sự là một giải pháp để giữ cho divs nổi thực sự không bị quấn
Andy

1

Cách duy nhất tôi quản lý để làm điều này là sử dụng overflow: visible;width: 20000px;trên phần tử mẹ. Không có cách nào để làm điều này với CSS cấp độ 1 mà tôi biết và tôi đã từ chối nghĩ rằng mình sẽ phải làm tất cả những điều này với CSS cấp độ 3. Ví dụ dưới đây có 18 menu mở rộng ngoài màn hình LCD độ phân giải 1920x1200 của tôi , nếu màn hình của bạn lớn hơn, chỉ cần sao chép các phần tử menu tầng đầu tiên hoặc chỉ thay đổi kích thước trình duyệt. Ngoài ra, với mức độ tương thích của trình duyệt thấp hơn một chút, bạn có thể sử dụng các truy vấn phương tiện CSS3.

Đây là một ví dụ minh họa đầy đủ về sao chép / dán ...

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<title>XHTML5 Menu Demonstration</title>
<style type="text/css">
* {border: 0; box-sizing: content-box; color: #f0f; font-size: 10px; margin: 0; padding: 0; transition-property: background-color, background-image, border, box-shadow, color, float, opacity, text-align, text-shadow; transition-duration: 0.5s; white-space: nowrap;}
a:link {color: #79b; text-decoration: none;}
a:visited {color: #579;}
a:focus, a:hover {color: #fff; text-decoration: underline;}
body {background-color: #444; overflow-x: hidden;}
body > header {background-color: #000; height: 64px; left: 0; position: absolute; right: 0; z-index: 2;}
body > header > nav {height: 32px; margin-left: 16px;}
body > header > nav a {font-size: 24px;}
main {border-color: transparent; border-style: solid; border-width: 64px 0 0; bottom: 0px; left: 0; overflow-x: hidden !important; overflow-y: auto; position: absolute; right: 0; top: 0; z-index: 1;}
main > * > * {background-color: #000;}
main > section {float: left; margin-top: 16px; width: 100%;}
nav[id='menu'] {overflow: visible; width: 20000px;}
nav[id='menu'] > ul {height: 32px;}
nav[id='menu'] > ul > li {float: left; width: 140px;}
nav[id='menu'] > ul > li > ul {background-color: rgba(0, 0, 0, 0.8); display: none; margin-left: -50px; width: 240px;}
nav[id='menu'] a {display: block; height: 32px; line-height: 32px; text-align: center; white-space: nowrap;}
nav[id='menu'] > ul {float: left; list-style:none;}
nav[id='menu'] ul li:hover ul {display: block;}
p, p *, span, span * {color: #fff;}
p {font-size: 20px; margin: 0 14px 0 14px; padding-bottom: 14px; text-indent: 1.5em;}
.hidden {display: none;}
.width_100 {width: 100%;}
</style>
</head>

<body>

<main>
<section style="height: 2000px;"><p>Hover the first menu at the top-left.</p></section>
</main>

<header>
<nav id="location"><a href="">Example</a><span> - </span><a href="">Blog</a><span> - </span><a href="">Browser Market Share</a></nav>
<nav id="menu">
<ul>
<li><a href="" tabindex="2">Menu 1 - Hover</a>
<ul>
<li><a href="" tabindex="2">Menu 1 B</a></li>
<li><a href="" tabindex="2">Menu 1 B</a></li>
<li><a href="" tabindex="2">Menu 1 B</a></li>
<li><a href="" tabindex="2">Menu 1 B</a></li>
<li><a href="" tabindex="2">Menu 1 B</a></li>
<li><a href="" tabindex="2">Menu 1 B</a></li>
<li><a href="" tabindex="2">Menu 1 B</a></li>
<li><a href="" tabindex="2">Menu 1 B</a></li>
</ul>
</li>
<li><a href="" tabindex="2">Menu 2</a></li>
<li><a href="" tabindex="2">Menu 3</a></li>
<li><a href="" tabindex="2">Menu 4</a></li>
<li><a href="" tabindex="2">Menu 5</a></li>
<li><a href="" tabindex="2">Menu 6</a></li>
<li><a href="" tabindex="2">Menu 7</a></li>
<li><a href="" tabindex="2">Menu 8</a></li>
<li><a href="" tabindex="2">Menu 9</a></li>
<li><a href="" tabindex="2">Menu 10</a></li>
<li><a href="" tabindex="2">Menu 11</a></li>
<li><a href="" tabindex="2">Menu 12</a></li>
<li><a href="" tabindex="2">Menu 13</a></li>
<li><a href="" tabindex="2">Menu 14</a></li>
<li><a href="" tabindex="2">Menu 15</a></li>
<li><a href="" tabindex="2">Menu 16</a></li>
<li><a href="" tabindex="2">Menu 17</a></li>
<li><a href="" tabindex="2">Menu 18</a></li>
</ul>
</nav>
</header>

</body>
</html>

Khi tôi sử dụng câu trả lời được width:100%width:1000px
ủng hộ

@ Nick.McDermaid Tôi đã sử dụng 20K pixel vì một lý do, với màn hình 4K sắp ra mắt, bạn biết rằng cuối cùng sẽ có 8K, v.v., vì vậy tốt nhất hãy làm việc với một con số cực kỳ cao để giữ cho nó hoạt động trong những năm thêm đó cho đến khi màn hình cao hơn -giải pháp hơn chính cuộc sống. ;-)
John

Hiểu rồi ... Tôi rất vui vì tôi đã ngừng quấn. CSS-nó khiến tôi phát điên ngay cả với các công cụ F12. Tôi không biết làm thế nào mà bất cứ ai đã hoàn thành bất cứ điều gì mà không có họ.
Nick.McDermaid

1
Để tham khảo trong tương lai: sử dụng chiều rộng / chiều cao khổng lồ rất kém hiệu quả vì trình duyệt vẫn lưu một hộp lớn không cần thiết vào bộ nhớ. Đặt vùng chứa thành white-space: nowrap;và đặt trẻ em display: inline-block;như đã nói trong các câu trả lời khác (hoặc quay lại display: table;display: table-cell;).
gyo

main > * > * {background-color: #000;}O_o
theflowersoftime

0

Đối với tôi (sử dụng bootstrap), điều duy nhất hoạt động là thiết lập display:absolute;z-index:1trên ô cuối cùng .


1
display:absolutekhông phải là hợp lệ CSS
caiosm1005

-1

Tôi đã gặp sự cố hơi tương tự trong đó một vùng giới hạn bao gồm một hình ảnh trong khối float: left và khối văn bản không float. Khu vực có chiều rộng chất lỏng. Theo thiết kế, văn bản sẽ bao bọc dọc theo bên phải của hình ảnh. Rắc rối là, văn bản bắt đầu bằng thẻ <h2>, từ đầu tiên trong số đó là từ nhỏ "Từ". Khi tôi thay đổi kích thước cửa sổ thành chiều rộng nhỏ hơn, văn bản không trôi nổi, đối với một phạm vi chiều rộng nhất định, chỉ để lại từ "Từ" ở đầu vùng bọc, phần còn lại của văn bản đã được ép bên dưới dấu nổi khối. Giải pháp của tôi là làm cho từ đầu tiên của thẻ lớn hơn, bằng cách thay thế khoảng trắng theo sau nó bằng mã này, <span style = "opacity: 0;"> x </span>. Hiệu quả là tạo ra từ đầu tiên, thay vì "Từ", "TừxNextWord", trong đó "x", không thể nhìn thấy, trông giống như một khoảng trắng. Bây giờ từ đầu tiên của tôi đủ lớn để không bị phần còn lại của khối văn bản bỏ rơi.

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.