Зупиніть обтікання плаваючих div


84

Я хочу мати рядок div (комірок), які не обертаються, якщо браузер занадто вузький, щоб вмістити їх.

Я шукав Stack і не міг знайти робочу відповідь на те, що, на мою думку, має бути простим запитанням css.

Клітинки вказали ширину. Однак я не хочу вказувати ширину рядка, ширина повинна автоматично бути шириною його дочірніх комірок.

Якщо область перегляду занадто вузька для розміщення рядків, тоді div повинен переповнюватися смугами прокрутки.

Будь ласка, надайте свою відповідь як робочий фрагмент коду, оскільки я спробував багато рішень, які я бачив в інших місцях (наприклад, вкажіть ширину: 100%, і вони, схоже, не працюють).

Я шукаю рішення лише для HTML / CSS, без 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>

На даний момент я насправді важко кодую ширину рядка до справді великого числа.


1
чи працювала для вас одна з наведених нижче відповідей? Я не маю жодного успіху з жодною з них.
Джон Фіцпатрік,

Я просто спробував усі відповіді, і жоден не працював у мене. Проблема полягала в тому, що мені потрібно було відцентрувати два плаваючі ліві div і не допустити того, щоб той, що знаходиться праворуч, був зрушений нижче вліво після зміни розміру вікна.
Башевіс

@Nicholas Я думаю, що мій приклад - це саме те , що ти шукаєш. Я зіткнувся з цією ж проблемою сьогодні. Випадаюче меню переповнюється, але перший рівень не обертається.
Джон

Відповіді:


107

Властивість CSS display: inline-blockбуло розроблено для задоволення цієї потреби. Ви можете трохи прочитати про це тут: http://robertnyman.com/2010/02/24/css-display-inline-block-why-it-rocks-and-why-it-sucks/

Нижче наведено приклад його використання. Ключовими елементами є те, що rowелемент має white-space: nowrapі cellелементи мають display: inline-block. Цей приклад повинен працювати на більшості основних браузерів; таблиця сумісності доступна тут: 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
Додайте <!DOCTYPE html>або <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">вгорі HTML, щоб IE не використовував режим дивовижностей за замовчуванням.
Cees Timmerman

4
Примітка: У мене були встановлені мої div-клітинки типу float: left, і це змусило обчислюваний стиль бути block, а не inline-block. Щоб розібратися, знадобився деякий час, тому я вважав, що краще поділитися цим.
Стів Хібберт,

Це не працює з останньою істотою комірки float: right, правда?
Енді,

3
Це на самому ділі не є прикладом того , як тримати плавали діви з упаковки - просто unfloated клітини. У мене є макет з деяким лівим і правим поплавцями, тому я не можу покінчити з поплавцями, щоб вирішити проблему обтікання.
Енді,

Ха-ха, досить справедливо. Це педантична відмінність, але ти маєш рацію. Я не вирішив "зупинити плаваючі divs з обтікання", я вирішив справжнє запитання автора запитання "як мені змусити макет працювати". Щоб відповісти на перше: Я досить впевнений, що жоден спосіб не може запобігти обтіканню плаваючих div. Подібно до запитувача, вам потрібно буде знайти інший спосіб кодування макета, який ви описуєте.
Кальвін,

32

Ви хочете визначити min-widthрядок, щоб, коли його браузер буде змінено за розміром, він не опускався б нижче цього і не обгортався.


1
Це працює навіть з поплавками. Я думаю, що це справжня відповідь.
Данон

2
Погодьтеся з @Danon - це працює, тоді як вбудований блок ввів проблеми вертикального вирівнювання.
dlchambers

1
Залежить від ваших потреб. Це зупиняє обтікання плаваючих div, коли розмір сторінки змінюється, але автор запиту заявив: "Я не хочу задавати ширину рядка, ширина повинна автоматично бути шириною його дочірніх комірок". Вказівка ​​ширини вручну вимагає певної дубльованої роботи, оскільки потрібно обчислити загальну ширину рядка. Навіть гірше, якщо клітинки мають змінну ширину (скажімо, тому, що вони розміром до рядка тексту всередині них), тоді обчислення загальної суми може бути недоцільним або неможливим.
Кальвін,

-1; Це суперечить тому, що ОП конкретно зазначив у своєму питанні, а саме НЕ потрібно вказувати ширину. +1 до коментаря Кальвіна вище.
Теодор Санду

4

Прочитавши відповідь Джона, я виявив, що, здається, для нас працює наступне (не потрібно вказувати ширину):

<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>

Це виправило проблему, яку я мав із перетягуваними div на iphone. Коли в div було більше одного слова, і їх перетягували до краю екрана, div обгортав так, щоб у кожному рядку було слово. У будь-якому разі overflow: visible; white-space: nowrap;зробив для мене фокус. Дякую!
TryHarder

4
Це спрацювало, бо він розплив клітини. Насправді це не рішення, щоб уникнути фактичного плавання divs від загортання
Енді,

1

Єдиний спосіб, яким мені вдалося це зробити, - це використання overflow: visible;і width: 20000px;на батьківському елементі. Немає способу зробити це з CSS рівня 1, про який мені відомо, і я відмовився думати, що мені доведеться переходити все на рівні CSS рівня 3. У наведеному нижче прикладі є 18 меню, які виходять за рамки мого РК-дисплея з роздільною здатністю 1920x1200. , якщо ваш екран більше, просто продублюйте елементи меню першого рівня або просто змініть розмір браузера. Крім того, і з трохи нижчим рівнем сумісності браузера, ви можете використовувати медіа-запити CSS3.

Ось повна демонстрація прикладу копіювання / вставки ...

<?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>

Коли я використовую upvoted відповідь і замінити width:100%з width:1000pxним працює для мене
Nick.McDermaid

@ Nick.McDermaid Я використав 20 тисяч пікселів не дарма, коли виходять екрани 4K, ви знаєте, що в кінцевому підсумку буде 8K і так далі, тому найкраще працювати з шалено великим числом, щоб продовжувати працювати в ці додаткові роки, поки екрани не стануть більш високими -рішення, ніж саме життя. ;-)
Джон

Зрозуміло ... Я просто щасливий, що змусив його перестати загортати. CSS - це зводить мене з розуму навіть за допомогою інструментів F12. Не знаю, як хтось щось робив без них.
Nick.McDermaid

1
Для подальшого використання: використання величезної ширини / висоти є дуже неефективним, оскільки браузер все ще зберігає непотрібний великий ящик у пам’яті. Встановіть контейнер white-space: nowrap;і дітям так, display: inline-block;як уже було сказано в інших відповідях (або поверніться до display: table;та display: table-cell;).
gyo

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

0

Для мене ( з використанням початкового завантаження), єдине , що працював , була установка display:absolute;z-index:1на останній клітинці.


1
display:absoluteнедійсний CSS
caiosm1005

-1

У мене була дещо подібна проблема, коли обмежена область складалася із зображення у поплавці: лівий блок та неплаваючий текстовий блок. Площа має ширину рідини. За задумом текст обертається вздовж правої сторони зображення. Проблема полягала в тому, що текст починався з тегу <h2>, першим словом якого є крихітне слово «Від». Оскільки я зменшив розмір вікна до меншої ширини, неплаваючий текст для певного діапазону ширини залишав би лише слово «Від» у верхній частині області обгортання, а решта тексту була стиснута під поплавцем блок. Моє рішення було збільшити перше слово тегу, замінивши простір, що слідував за ним, цим кодом <span style = "opacity: 0;"> x </span>. Ефектом було зробити перше слово, замість "Від", "FromxNextWord", де "х", будучи невидимим, виглядало як простір. Тепер моє перше слово було досить великим, щоб не залишити його решта текстового блоку.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.