Div вырастает за границы, если содержимого слишком много

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

Вот рабочий пример, чтобы вы могли видеть: https://jsfiddle.net/z6nbc75g/

Попробуйте нажать кнопку «Добавить столбцы» несколько раз, чтобы увидеть, как, когда вы добавляете слишком много столбцов, они начинают сжиматься, а не расширять таблицу.

Вот код:

.parent {
  width: 100%;
  max-width: 20rem;
}

.table .row {
  display: flex;
  border: 1px solid blue;
  padding: 4px;
}

.table .col {
  border: 1px solid red;
  padding: 2px;
}
<div class = "parent">
  <div class = "table">
    <div class = "row">
      <div class = "col">lorem ipsum</div>
      <div class = "col">lorem ipsum</div>
    </div>
    <div class = "row">
      <div class = "col">lorem ipsum</div>
      <div class = "col">lorem ipsum</div>
    </div>
    <div class = "row">
      <div class = "col">lorem ipsum</div>
      <div class = "col">lorem ipsum</div>
    </div>
    <div class = "row">
      <div class = "col">lorem ipsum</div>
      <div class = "col">lorem ipsum</div>
    </div>
  </div>
</div>

@Ingus нет, мой случай на самом деле противоположный и совершенно другой

nick 02.04.2019 14:58

Можно ли установить «мин. ширину» на .table .col?

Mark Baijens 02.04.2019 15:04

Каков желаемый результат? Горизонтальная прокрутка в родителях? Столбцы видны вне родителя?

Strelok 02.04.2019 15:06

Добавьте flex-shrink: 0; к своему правилу .table .col{}, и оно не уменьшится

Asons 02.04.2019 15:20

И обратите внимание, чтобы .parent рос вместе с контентом, его необходимо отображать inline-flex/block.

Asons 02.04.2019 15:31

И к вашему сведению, если предполагается, что элемент расширяется за пределы заданной ширины, не используйте max-width, вместо этого используйте min-width

Asons 02.04.2019 15:48
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Travel Booking Angular Template один из лучших Travel & Tour booking template in the world. 30+ валидированных HTML5 страниц, которые помогут...
0
6
471
4

Ответы 4

Вы можете внести изменения в стиль строки. Добавьте свойство flex-wrap.

.table .row {
  display: flex;
  border: 1px solid blue;
  padding: 4px;
  flex-flow: row wrap;
}

Для того, что вы ищете, способ справиться с этим состоит в том, чтобы сделать ваш элемент .parent как inline-block (чтобы он занимал только ширину дочерних элементов), а затем предотвратить перенос столбцов (при условии, что вы хотите, чтобы весь ваш контент внутри столбца, чтобы он находился на одной строке — если вы этого не сделаете, таблица все равно будет расширяться, пока не достигнет ширины страницы, а затем заставит текст переноситься внутри столбцов).

Фрагмент ниже — я добавил кнопку из вашего jsfiddle, чтобы вы могли проверить это :)

document.querySelector('button').addEventListener('click', () => {
	let rows = document.querySelectorAll('.row');
  
  rows.forEach(row => {
  	let col = document.createElement('div');
    col.classList.add('col');
    col.textContent = 'lorem ipsum';
    
    row.appendChild(col);
  });
});
.parent {
  display:inline-block;
}

.table .row {
  display: flex;
  border: 1px solid blue;
  padding: 4px;
}

.table .col {
  border: 1px solid red;
  padding: 2px;
}
<div class = "parent">
  <div class = "table">
    <div class = "row">
      <div class = "col">lorem ipsum</div>
      <div class = "col">lorem ipsum</div>
    </div>
    <div class = "row">
      <div class = "col">lorem ipsum</div>
      <div class = "col">lorem ipsum</div>
    </div>
    <div class = "row">
      <div class = "col">lorem ipsum</div>
      <div class = "col">lorem ipsum</div>
    </div>
    <div class = "row">
      <div class = "col">lorem ipsum</div>
      <div class = "col">lorem ipsum</div>
    </div>
  </div>
</div>

<button>Add columns</button>

Это работает, но ширина строки не меняется, она просто переполняется

nick 02.04.2019 15:18

Привет @nick, я вытащил white-space:nowrap - это больше, что ты ищешь?

DKyleo 02.04.2019 15:19

Вы можете использовать min-width: max-content: https://developer.mozilla.org/en-US/docs/Web/CSS/width#max-content

Рабочий пример: https://jsfiddle.net/r84q7nvj/

Это работает, но поддержка браузера ужасна :/

nick 02.04.2019 15:17

@ник понятно. Я добавил альтернативный ответ.

Jesper Johansson 02.04.2019 15:26

Вы также можете решить эту проблему, используя display: inline-flex для родителя вместе с min-width: 200px и flex-basis для его дочерних элементов: https://jsfiddle.net/cnxgruzt/

Другие вопросы по теме