Как сделать текст переносимым вокруг следующего плавающего элемента?

HTML:

<div class="heading">
  <h2 class="text">Lorem ipsum dolor sit amet, consectetur adipiscing elit.</h2>
  <a class="action" href="#">Print</a>
</div>

Желаемый вид по умолчанию:

| Lorem ipsum dolor sit      [Print] |
| amet, consectetur adipiscing elit. |

Желаемый вид на маленьком экране (с помощью медиа-запросов):

| Lorem ipsum dolor sit |
| amet, consectetur     |
| adipiscing elit.      |
| [Print]               |

Не желательно:

|                            [Print] |
| Lorem ipsum dolor sit amet,        |
| consectetur adipiscing elit.       |

Не желательно:

| Lorem ipsum dolor sit      [Print] |
| amet, consectetur                  |
| adipiscing elit.                   |

Примечания:

  • Текст может быть любой длины.
  • Элемент действия имеет постоянную высоту и переменную ширину.

Я не вижу способа сделать это, используя только CSS.

Прямо сейчас я использую JS (Harvey lib), чтобы поместить плавающий элемент DOM перед текстом на большом экране.

Есть идеи?

/// РЕДАКТИРОВАТЬ - перемещено в ответ (извините за беспорядок)


person lama    schedule 04.09.2013    source источник
comment
Извините за неправильный порядок тегов. Я не могу изменить это сейчас.   -  person lama    schedule 04.09.2013
comment
Неправильный порядок тегов? Теги HTML или теги переполнения стека?   -  person Steven V    schedule 04.09.2013
comment
Плавающий элемент должен быть либо первым в разметке, либо внутри h2. cssdeck.com/labs/mxwjhbbs   -  person cimmanon    schedule 04.09.2013
comment
Проблема здесь в том, что для достижения первого желаемого эффекта тег привязки должен быть перед заголовком. И для достижения второго желаемого эффекта якорь должен быть после заголовка.   -  person OdraEncoded    schedule 04.09.2013
comment
возможный дубликат Как лучше всего переместить элемент сверху вниз в адаптивном дизайне   -  person cimmanon    schedule 04.09.2013
comment
@StevenV, теги переполнения стека. Это проблема CSS, и я не знал, что первое будет использоваться в заголовке вопроса.   -  person lama    schedule 05.09.2013
comment
Теги @lama отображаются самыми популярными первыми. Вы не можете установить порядок их отображения, даже если вы добавите их в вопрос в другом порядке.   -  person Steven V    schedule 05.09.2013
comment
@cimmanon, вопрос, который вы упоминаете, похож, но определенно не один и тот же и может иметь другое решение. Особенно Felxbox не использует обтекание текстом. И, конечно же, я знаю, что floated должен стоять перед h2, но тогда семантика не работает. А может это не так важно?   -  person lama    schedule 05.09.2013
comment
Вы должны решить, что важнее: семантика или желаемый внешний вид. Эффект, который вы ищете с элементами динамического размера, невозможен с чистым CSS при сохранении чистой/семантической разметки. Ваш второй нежелательный пример - лучший компромисс между внешним видом и чистотой. Вот как будет выглядеть решение Flexbox, кстати: cssdeck.com/labs/9bntxaro   -  person cimmanon    schedule 05.09.2013
comment
@cimmanon, спасибо за ваше предложение о принятии решения. Я иногда страдаю из-за того, что слишком семантико-пуристичен, что делает меня слепым в отношении некоторых решений. Я внесу правку в данный момент.   -  person lama    schedule 05.09.2013
comment
Предпочтительно, чтобы вы отправили ответ, а не модифицировали вопрос, чтобы он содержал ваше решение.   -  person cimmanon    schedule 05.09.2013


Ответы (2)


Нет простого способа добиться обоих результатов, используя только CSS, не изменяя разметку. Однако есть несколько приемов, которые вы можете использовать, чтобы попытаться подражать желаемому поведению.

Прием 1. Используйте абсолютное позиционирование

Установите ссылку на position:absolute;top:0;right:0; (и контейнер на position:relative;, если необходимо). Затем используйте .text::before{display":block;content' ';float:right;}, чтобы поместить пробел, где появится ссылка для печати.

Прием 2: двойные ссылки

Вы можете поместить ссылку перед/в <h2>, чтобы плавать справа на больших дисплеях, затем скрыть ее и показать (ранее скрытую) вторую ссылку в виде блочного элемента под текстом на маленьких дисплеях.

person David Millar    schedule 04.09.2013
comment
Двойные ссылки - лучшее решение без javascript, которое я могу придумать для этого. - person OdraEncoded; 04.09.2013
comment
@David, для трюка 1 потребуется знать размер плавающего элемента, чтобы определить размер промежутка между псевдоэлементами. И трюк 2 становится проблематичным, когда плавающий элемент представляет собой нечто большее, чем просто ссылка. Ожидается, что я положу туда встроенные формы и т.д. - person lama; 05.09.2013
comment
Тогда, похоже, вам, вероятно, понадобится решение на основе JS. - person David Millar; 05.09.2013

Благодаря приведенным выше предложениям я, наконец, решил сломать структуру чистой семантики и поместить элемент .action перед .text, чтобы он легко плавал с правильным переносом текста. Добавить поведение, желаемое для меньшего экрана, было довольно просто с ограничениями на размер элемента .action:

cssdeck.com/labs/epcoxk7o

HTML:

<div class="heading">
  <a class="action" href="#">Print</a>
  <h2 class="text">Lorem ipsum dolor sit amet, consectetur adipiscing elit.</h2>
</div>

CSS:

.action {
  float: right;
  line-height: 20px;
  padding: 5px 70px;
  background: #eee;
}
.text {
  line-height: 30px;
}

@media (max-width: 30em) {
  .heading {
    position: relative;
    padding-bottom: 20px;
  }
  .action {
    position: absolute;
    bottom: 0;
    left: 0;
  }
}

Другим решением было бы то, что предложил @cimmanon: cssdeck.com/labs/9bntxaro

person lama    schedule 04.09.2013