Проблемы с вычислением ширины родительского элемента Flexbox без переполнения: скрыто - PullRequest
0 голосов
/ 24 сентября 2018

По сути, я хочу реализовать повторно используемую библиотеку в React, которая берет список компонентов и отображает их как гибкий контейнер.Когда компонент монтируется или когда пользователь изменяет размер окна, компонент пересчитывает его ширину, и если сумма его дочерних элементов превышает его собственную ширину, он скрывает лишние дочерние элементы и добавляет кнопку в конец списка, который отображает избыточное количество.дети в вертикальном выпадающем меню.Компоненту предоставляется реквизит, который определяет его минимальную ширину, но в противном случае он вычисляет его ширину, ссылаясь на узел flex dom, содержащий все дочерние элементы.Сам по себе это также элемент flex, свойство flex которого равно 1 0 <value of minWidth property>.

. Суть проблемы в том, что все прекрасно работает, если я добавлю overflow: hidden в контейнер flex.Когда пользователь изменяет размеры окна, размер будет пересчитываться от X до предоставленной минимальной ширины.Без переполнения: скрытый, однако, его ширина имеет пол, равный сумме его дочерних элементов.Вы можете наблюдать это в демоверсии ниже.Если вы откроете devtools и измените размер окна, вы увидите значение clientWidth левого и правого контейнеров (каждый из которых будет отдельным экземпляром компонента, описанного выше).Предполагается, что при уменьшении размера окна левый и правый контейнер уменьшатся до 200 и 300 пикселей соответственно, в течение которых я смогу подсчитать количество детей, скрываемых в каждом (1 слева и1, а затем в конечном итоге 2 в правом контейнере).Если вы раскомментируете строку 9 в scss-файле codepen, вы можете наблюдать это точное поведение.

Причина, по которой overflow: hidden не является жизнеспособным решением, заключается в том, что в некоторых случаях один или несколько дочерних компонентов будут отображатьподкомпонент, такой как выпадающий / компонент выбора даты, который затем будет скрыт из-за родительского элемента overflow: hidden.В тех случаях, когда я хочу использовать это, подкомпонент абсолютно позиционируется (и привязывается к дочернему компоненту), и, таким образом, не влияет на ширину дочерних компонентов относительно родительского гибкого контейнера.

Я могу подумать о нескольких решениях, которые включают в себя работу с самими дочерними компонентами (с использованием решений, включающих position: fixed, etC), но так как это предназначается для многоразовой библиотеки, которая просто принимает список компонентов для отображения, я быхотел бы сохранить исправление для родительского контейнера, если это возможно.

.js файл

const left = document.querySelector('.left');

const right = document.querySelector('.right');

const handleWindowResize = event => {
  console.log('left: ', left.clientWidth);
  console.log('right: ', right.clientWidth);
};

window.addEventListener('resize', handleWindowResize);

.scss файл

.toolbar {
  display: flex;
  width: 100%;
  border: 1px solid black;
}

.left, .right {
  display: flex;
  // overflow: hidden;
}

.left {
  flex: 1 0 200px;

}

.right {
  flex: 1 0 300px;
  justify-content: flex-end;
}

.item {
  border: 1px solid black;
  width: 100px;
  height: 50px;
}

.html файл

<div class='toolbar'>
  <div class='left'>
    <div class='item'></div>
    <div class='item'></div>
    <div class='item'></div>
  </div>
  <div class='right'>
    <div class='item'></div>
    <div class='item'></div>
    <div class='item'></div>
    <div class='item'></div>
    <div class='item'></div>
  </div>
</div>

Демонстрация Codepen

1 Ответ

0 голосов
/ 25 сентября 2018

Причина, по которой overflow: hidden не является жизнеспособным решением, заключается в том, что в некоторых случаях один или несколько дочерних компонентов будут отображать подкомпонент, например компонент раскрывающегося списка / выбора даты, который затем будет скрыт, посколькуиз родителей overflow: hidden.В тех случаях, когда я хочу использовать это, подкомпонент абсолютно позиционируется (и привязывается к дочернему компоненту) ...

Это хорошо известная проблема, часто встречающаяся в модальных моделях.В вашей ситуации вы в основном должны использовать overflow: hidden.Вероятно, другого выбора нет.

Надежные библиотеки на основе «dropdown / datepicker» обычно предоставляют опцию «escape-штриховки», которая позволит вам добавить раскрывающуюся часть к выбранному элементу, обычно body.Если в библиотеке его еще нет, обычно это происходит потому, что никто еще не жаловался на это.

Чтобы подчеркнуть мою точку зрения, приведу несколько примеров:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...