flexbox добавляет новую строку в буфер обмена

Я работаю с макетом, который использует flexbox. Пока работает хорошо, но у меня проблема с копированием текста в буфер обмена.

По-видимому, использование flexbox, кажется, добавляет символ новой строки после каждого дочернего узла

Это видно в демонстрационной версии ниже, копия текста "LabelMessage" работает нормально (вставьте его и останется в одной строке). Но если вы добавите display:flex в контейнер, добавляется новая строка после "Ярлык" при копировании в буфер обмена

Чем это вызвано? Есть ли способ обойти это?

Скрипт: http://jsfiddle.net/zv4mamtm/

$('.toggleFlex').on('click', function() {
  $('.container').toggleClass('flex')
})
.container.flex {
  display: flex;
  color: red;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<span class="toggleFlex">toggle</span>
<hr>
<div class="container">
  <span class="label">Label</span>
  <span class="label">Message</span>
</div>
<hr>
<textarea></textarea>

Ответы

Ответ 1

Как указано в предыдущем ответе и этом сообщении:

В гибком контейнере дочерние элементы ("гибкие элементы") автоматически "блокируются" (более подробная информация)

в зависимости от вашего использования, использование дисплея: содержимое может быть полезно, если вы хотите только скопировать/вставить текст,

см.: как работает содержимое дисплея

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

и из спецификации:

Для создания и компоновки ящиков элемент должен обрабатываться так, как если бы он был заменен в дереве элементов его содержимым

(вы можете проверить совместимость этого, поскольку он не будет работать в IE и Edge)

enter image description here

$('.toggleFlex').on('click', function() {
  $('.container').toggleClass('flex')
})
.container.flex {
  display: flex;
  color: red;
}

.container.flex span {
  display: contents;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<span class="toggleFlex">toggle</span>
<hr>
<div class="container">
  <span class="label">Label</span>
  <span class="label">Message</span>
</div>
<hr>
<textarea></textarea>

Ответ 2

Я думаю, это связано с вычисленным стилем ваших элементов. Когда вы не устанавливаете flex ваш диапазон является встроенным элементом:

enter image description here

Но когда вы устанавливаете display:flex они становятся блочным элементом:

enter image description here

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

Вы можете обратиться к спецификации за дополнительной информацией


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

.container{
    display: flex;
    color: red;
}
span {
  display:inline!important; /*will have no effect*/
}
<div class="container">
    <span class="label">Label</span>
    <span class="label">Message</span>
</div>