Как сделать так, чтобы пустой div занимал место


105

Это мой случай с сеткой 960:

<div class="kundregister_grid_full">
    <div class="kundregister_grid_1">ID</div>
    <div class="kundregister_grid_1">Namn</div>
    <div class="kundregister_grid_1">Anv.Namn</div>
    <div class="kundregister_grid_1">Email</div>
    <div class="kundregister_grid_1">Roll</div>
    <div class="kundregister_grid_1">Aktiv</div>
</div>

Это мой набор div, используемых в качестве структуры таблицы.

CSS говорит следующее:

.kundregister_grid_1 {
    display: inline-block;
    float: left;
    margin: 0; 
    text-align: center;
}
.kundregister_grid_1 {
    width: 140px;
}

Не обращайте внимания на шведское название. Я хочу, чтобы блоки отображались, даже если у них нет значений.

<div class="kundregister_grid_full">
 <div class="kundregister_grid_1">ID</div>
 <div class="kundregister_grid_1"></div>
 <div class="kundregister_grid_1"></div>
 <div class="kundregister_grid_1">Email</div>
 <div class="kundregister_grid_1">Roll</div>
 <div class="kundregister_grid_1">Aktiv</div>
</div>

Таким образом, в этом случае в двух столбцах нет «Namn» и «Avn.Namn». Однако при запуске этого в chrome они удаляются и больше не подталкивают другие div по порядку float:left. Поэтому, если у меня есть категории в тех же блоках выше, значения будут помещены в неправильную категорию.

Ответы:


65

работает, если убрать плавающие. http://jsbin.com/izoca/2/edit

с поплавками он работает, только если есть некоторый контент, например &nbsp;


5
Другой ответ говорит, что установка минимальной высоты заставит его работать при плавании, и, конечно же, в моем собственном случае это сработало. Если это всегда так (сейчас, в 2016 году), то этот ответ неверен. Вы можете просто добавить min-height: 1px; по ширине: 140 пикселей; без необходимости удалять поплавок или добавлять содержимое.
Ник Райс,

Пробовал element.text("&nbsp;");в jQuery и &nbsp;появляется на странице.
Lori

56

Попробуйте добавить &nbsp;к пустым элементам.

Я не понимаю, почему вы не используете <table>здесь? Они будут делать такие вещи автоматически.


9
Согласовано. Если это табличные данные, используйте таблицу - вот для чего они нужны.
Дэн Дипло

5
По прошествии всего этого времени люди все еще считают <table>== ПЛОХО.
saluce

4
Использование столь &nbsp;популярного решения может вызвать проблемы в некоторых сценариях. Например, когда вы вычеркиваете ( text-decoration: line-through;) текст, штрих будет отображаться поверх &nbsp;, тогда как на самом деле вам нужен просто пустой div.
Ижаки

1
@Pekka 웃, не всегда можно «пользоваться таблицами». У меня такая же проблема («Как сделать так, чтобы пустой div занимал место») для адаптивного дизайна, когда я превращаю горизонтальную таблицу в вертикальную при небольшой ширине. Я уже использую таблицы ...
Анвес считает, что SE - это зло

@ANeves в этом случае таблица всегда будет правильно размещать ширину, не так ли? Не уверен, что понимаю ....
Пекка

25

Небольшое обновление ответа @ no1cobla. Это скрывает период. Это решение работает в IE8 +.

.class:after
{
    content: '.';
    visibility: hidden;
}

5
Если вы хотите использовать это как запасной вариант для работы, когда ваш элемент пуст, добавьте что-то вроде:.class:after:empty
Miguel Garrido

1
@Miguel Garrido - мне пришлось использовать .class: empty: after, чтобы это сработало.
второе лицо

24

Простое решение для пустых плавающих div - это добавить:

  • ширина (или минимальная ширина)
  • мин-высота

таким образом вы можете сохранить функциональность float и заставить его заполнять пустое пространство.

Я использую этот метод в столбцах макета страницы, чтобы каждый столбец оставался на своем месте, даже если другие столбцы пусты.

Пример:

.left-column
{
   width: 200px;
   min-height: 1px;
   float: left;
}

.right-column
{
    width: 500px;
    min-height: 1px;
    float: left;
}

4
min-heightэто лучшее решение
Vall3y

Мин-высота только устраняет проблему с width. Однако это не мешает div иметь нулевую высоту. (попробуйте установить фон div, чтобы увидеть проблему). Поэтому & nbsp; это более общее решение. Также содержание: "." устраняет проблему нулевой высоты.
Джон Хенкель

1
Min-height = 1px не равно 0! это будет 1 пиксель, если вы хотите высоту по умолчанию, вы можете просто сказать min-height = 100px и min width = 100px, div всегда будет 100x100, ни в коем случае это не будет 0
Engineeroholic

А использовать "& nbsp" - очень плохая практика, что, если у вас большой веб-сайт с множеством файлов, и каждый файл содержит 10 КБ строк HTML? Если я буду следовать вашему подходу, я буду вставлять "& nbsp" внутри каждого файла в каждом файле !! Что за трата времени!? что, если у вас есть веб-сайт с пользовательским контентом? например, пользователь отправляет пустой комментарий .. на основе вашего решения мне нужно создать код, чтобы проверить, пуст ли комментарий, затем добавить "& nbsp" (усложняя без уважительной причины) min-height и min-width - лучшее решение потому что я напишу это один раз и больше не буду об этом беспокоиться, даже если я добавлю больше контента в будущем
Engineeroholic

22

Просто добавьте символ пробела нулевой ширины внутри псевдоэлемента

.class:after {
    content: '\200b';
}

Ооо, мне нравится эта идея, поскольку она означает, что пользователь не сможет случайно скопировать и вставить ее, поскольку по умолчанию псевдоэлементы нельзя выбрать.
Domino

3

Это один способ:

.your-selector:empty::after {
    content: ".";
    visibility: hidden;
}

1
Я рекомендую content: "\200b";использовать пространство нулевой ширины . Дополнительным преимуществом является то, что браузер не будет выбирать этот символ (например, CTRL+A CTRL+Cбудет вести себя так же).
yyny 02

3

Ты можешь:

o Установите .kundregister_grid_1на:

  • width(или width-min) с height(илиmin-height )
  • или padding-top
  • или padding-bottom
  • или border-top
  • или border-bottom

o Или используйте псевдоэлементы : ::beforeили ::afterс:

  • {content: "\200B";}
  • или {content: "."; visibility: hidden;}.

o Или поместите &nbsp;внутрь пустой элемент, но это иногда может привести к неожиданным последствиям, например. в комбинации сtext-decoration: underline;


2

Почему бы просто не добавить «минимальную ширину» к вашему CSS-классу?



1

При использовании встроенного блока он будет вести себя как встроенный объект. поэтому нет необходимости размещать их рядом друг с другом на одной строке. И действительно, как сказал Рито, поплавкам нужно «тело», как им нужны размеры.

Я полностью согласен с Пеккой в ​​использовании таблиц. Все, кто создает макеты с использованием div, избегают таблиц, как будто это болезнь. Но используйте их для табличных данных! Вот для чего они нужны. А в вашем случае я думаю они вам нужны :)

НО если вы действительно хотите того, чего хотите. Есть способ взлома css. То же, что и хак с плавающей запятой.

.kundregister_grid_1:after {  content: ".";  }

Добавьте его, и вы тоже настроены: D (Примечание: не работает в IE, но это поправимо)


1

Если их нужно переместить, вы всегда можете просто установить минимальную высоту на 1 пиксель, чтобы они не рухнули.


0

Создавая собственный набор тегов макета, я нашел другой ответ на эту проблему. Здесь предоставляется настраиваемый набор тегов и их классы CSS.

HTML

<layout-table>
   <layout-header> 
       <layout-column> 1 a</layout-column>
       <layout-column>  </layout-column>
       <layout-column> 3 </layout-column>
       <layout-column> 4 </layout-column>
   </layout-header>

   <layout-row> 
       <layout-column> a </layout-column>
       <layout-column> a 1</layout-column>
       <layout-column> a </layout-column>
       <layout-column> a </layout-column>
   </layout-row>

   <layout-footer> 
       <layout-column> 1 </layout-column>
       <layout-column>  </layout-column>
       <layout-column> 3 b</layout-column>
       <layout-column> 4 </layout-column>
   </layout-footer>
</layout-table>

CSS

layout-table
{
    display : table;
    clear : both;
    table-layout : fixed;
    width : 100%;
}

layout-table:unresolved
{
    color : red;
    border: 1px blue solid;
    empty-cells : show;
}

layout-header, layout-footer, layout-row 
{
    display : table-row;
    clear : both;   
    empty-cells : show;
    width : 100%;
}

layout-column 
{ 
    display : table-column;
    float : left;
    width : 25%;
    min-width : 25%;
    empty-cells : show;
    box-sizing: border-box;
    /* border: 1px solid white; */
    padding : 1px 1px 1px 1px;
}

layout-row:nth-child(even)
{ 
    background-color : lightblue;
}

layout-row:hover 
{ background-color: #f5f5f5 }

Ключевым моментом здесь является размер и заполнение блока.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.