Как я могу обернуть текст вокруг подвижного изображения? - PullRequest
16 голосов
/ 29 сентября 2011

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

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

Как я мог это сделать? Я просмотрел некоторые jquery-скрипты, а также просмотрел возможности HTML5-холста, но не смог найти решения.

Спасибо за ваше время.

РЕДАКТИРОВАТЬ: Это видео показывает эффект, который я хочу получить:

http://www.youtube.com/watch?v=mYnj4Mz9g9g

Ответы [ 3 ]

17 голосов
/ 14 марта 2012

TL; DR

Это общая и желательная функция, которая неоднократно обсуждалась в истории CSS, и в настоящее время разрабатывается спецификация, позволяющая сделать это возможным. К сожалению, реализации мало, и далеко друг от друга, и некоторые разработчики не хотят работать над этим. Делать это с помощью JavaScript - сложная проблема для любого нетривиального макета; такое решение вряд ли будет достаточно быстрым для ваших целей, и вы быстро приблизитесь к разметке, которую вы ожидаете от конвертера PDF в HTML.

Фон

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

Это не первый случай, когда эта функция обсуждалась для CSS. В частности, текучий текст вокруг нерегулярных плавающих фигур был упомянут в рабочем проекте CSS уровня 1 еще в 1996 году, а демо Эрик Майер рваный плавающий датируется как минимум 2002 годом. просроченная функция!

В июне 2007 года Джеймс Элмор предложил добавить значения position к свойству float, позволяя произвольно размещать элементы на странице, исключая при этом движение других элементов под ним.

SVG 1.2 первоначально определил модель для областей потокового текста и подробно расскажет, как это будет реализовано. К сожалению, последняя версия спецификации (которая все еще находится в разработке) делает это из воды, отметив, что предыдущая работа будет заменена на «расширенный набор возможностей SVG 1.2 Tiny textArea».

Текущий статус (пересмотрен в августе 2012 г.)

В последнее время у нас есть спецификация CSS Exclusion , предложение от Adobe и то, что вы видите в этом видео. По состоянию на август 2012 года они были реализованы в IE 10 RTM и постепенно внедряются в WebKit, но разработчики, работающие на других поставщиков, выразили смешанные чувства по поводу предложения. *

Adobe поддерживает удобную матрицу поддержки для удобства.

Взломать Кашель"Полифиллинг"?

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

  1. «блокировать» пространство для элемента, используя стратегически вставленные строки span s; или
  2. окружите каждое слово элементом span и стилизуйте каждое слово индивидуально, чтобы освободить место для исключенного элемента с помощью отступов.

Я взломал очень сломанную демонстрацию того, как может работать второй подход. Это ужасно, глючит и легко ломается. Я действительно потратил несколько недель после ответа на этот вопрос, работая над полифилом для спецификации Исключения, но сдался, потому что было слишком много ошибок и проблем с производительностью.

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

Проблемы производительности могут быть несколько улучшены; например, я использовал elementFromPoint, чтобы попытаться получить span, содержащий непосредственно первое перекрывающееся слово, а некоторые браузеры даже поддерживают caretPositionFromPoint, что также может помочь. Я думаю, что, проделав большую работу, вы могли бы сделать что-то, что довольно хорошо работает для статического контента; но сделать это достаточно быстро, чтобы вы могли перетащить его с помощью мыши? Моя демонстрационная страница содержит очень мало полезного контента и не решает ни одной из сложнейших проблем, с которыми вам придется столкнуться, чтобы сделать эту работу на реальных веб-страницах. Даже если вы сможете обойти все эти проблемы, сделать его достаточно быстрым, чтобы плавно перемещаться, было бы очень сложно.


* Я очень надеюсь, что поставщики будут внедрять исключения CSS. Люди просят об этих функциях с самых ранних дней CSS, и это общая и законная цель визуального дизайна как на экране, так и в печати. ​​

6 голосов
/ 11 марта 2012

Ну, по крайней мере, для переноса, если вы хотите использовать jQuery, вы можете использовать этот плагин jQSlickWrap , чтобы текст обернулся вокруг изображения неправильной формы.Он использует приятную технику HTML5 canvas.

См. Пример переноса текста здесь: http://www.jwf.us/projects/jQSlickWrap/example2.html

Надеюсь, это поможет!

6 голосов
/ 29 сентября 2011

Это возможно в IE10, используя позиционные значения с плавающей точкой: http://ie.microsoft.com/testdrive/HTML5/PositionedFloats/Default.html

Другие браузеры еще не поддерживают это.

...