Почему при добавлении отображения flex в контейнер дочерний div с таблицей отображения имеет другое поведение? [Дубликат]

Ответ Эдуардо правильный (и, как я писал это, появилось еще несколько хороших ответов), но я хотел бы объяснить, почему исходная команда терпит неудачу. Как обычно, set -x очень полезно видеть, что на самом деле происходит:

$ set -x
$ who | grep $(echo $(tty) | sed 's/\/dev\///')
+ who
++ sed 's/\/dev\///'
+++ tty
++ echo not a tty
+ grep not a tty
grep: a: No such file or directory
grep: tty: No such file or directory

Это не полностью явное из вышеизложенного, но то, что происходит, заключается в том, что tty выводит «не tty». Это связано с тем, что часть конвейера подается на выход who, поэтому его stdin действительно не является tty. Это настоящая причина, по которой все остальные ответы работают: они выходят из tty из-за конвейера, поэтому он может видеть ваш фактический терминал.

BTW, ваша предлагаемая команда в основном правильна (за исключением проблемы с конвейером) , но излишне сложный. Не используйте echo $(tty), это по сути то же самое, что только tty.

8
задан Michael_B 1 September 2016 в 02:59
поделиться

1 ответ

Единственным условием существования элемента flex является дочерний поток гибкого контейнера.

Обратите внимание: это означает, что непрерывный пробег текста может быть завернут внутри анонимный элемент гибкости, который не соответствует ни одному элементу, а дочерний элемент гибкого контейнера может не быть гибким элементом, если любой из следующих

  • Он абсолютно расположен абсолютно позиционированный дочерний элемент гибкого контейнера не участвует в гибком макете.
  • Он имеет display: contents . Сам элемент не генерирует никаких полей, но его дети и псевдоэлементы все равно генерируют ящики как обычно. Для создания и компоновки ящиков элемент должен обрабатываться так, как если бы он был заменен его дочерними элементами и псевдоэлементами в дереве документов. Его дети станут вместо этого элементами гибкости (если к ним не относится что-то из этого списка).
  • У него есть display: none Элемент и его потомки не генерируют никаких полей.
  • У этого есть box-suppress: discard Элемент вообще не генерирует никаких полей.
  • Он имеет box-suppress: hide . Элемент генерирует поля как обычно, но эти поля никак не участвуют в компоновке и не должны отображаться.
  • Раньше, если дочерний элемент гибкого контейнера имел значение display, сгенерировавшее анонимного родителя, этот родитель стал элементом гибкости, а не дочерним. Это изменилось, и теперь ребенок становится элементом гибкости, и родитель не генерируется.

Кроме того, да, значение display не должно препятствовать элементу быть гибким элементом.

Имейте в виду, что элементы гибкости заблокированы , поэтому, например, inline-block становится block, inline-table становится table, inline-flex становится flex и т. д. .

Это означает, что независимо от указанной внешней отображаемой роли элемент flex всегда будет блочным.

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

Элемент flex устанавливает новый контекст форматирования для его содержимого. Тип этого формата форматирования определяется его значением display , как обычно. Однако сами гибкие элементы представляют собой гибкие уровни , а не блочные блоки: они участвуют в контексте форматирования гибкости своего контейнера, а не в контексте форматирования блока.

(Терминология немного отличается, спецификация дисплея говорит, что элемент гибкости является блочным уровнем в смысле его внешней роли отображения, спецификация Flexbox говорит, что он не является блочным уровнем в том смысле, что контекст форматирования, в котором он участвует, не является блок-блок)

7
ответ дан Oriol 17 August 2018 в 10:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: