Представьте, что контент-менеджер добавляет статью, содержащую изображение с использованием свойства float: left/right. Размер изображения может варьироваться, и при определенных ширинах контейнера возникает ситуация, когда текст сбоку от изображения занимает всего 1-2 слова, что выглядит не эстетично. <br/> Я искал решение этой проблемы и наткнулся на вариант, представленный в статье <a href="https://css-tricks.com/minimum-paragraph-widths/#aa-general-case-solution-using-pseudo-element" rel="nofollow">https://css-tricks.com/minimum-paragraph-widths/</a>. Однако у данного подхода есть два недостатка: у следующего элемента после изображения может быть свой псевдоэлемент, и само изображение остается прижатым к краю контейнера. В идеале после переноса текста вниз его нужно центрировать. <br/> У меня возникла идея создать обертку вокруг изображения и при определенных условиях задать ей ширину 100%, чтобы сдвинуть текст вниз. При этом само изображение можно отцентрировать с помощью text-align: center у обертки. Но я не нашел способа реализовать это только с использованием CSS, без JavaScript. Я надеялся на контейнерные запросы и другие современные свойства, но результаты не оправдали ожиданий. <br/> Как вы решаете эту проблему? <br/> Хочу отметить, что простое отменение float на определенных брейкпоинтах не является вариантом, поскольку некоторые изображения могут быть очень маленькими, и это будет неуместно, или, наоборот, очень большими, что подразумевает отсутствие обтекания даже без медиазапросов. Также не рассматриваю варианты с использованием JavaScript.
Проблема с обтеканием текста вокруг изображений и ограниченной шириной текста может быть довольно сложной, особенно если требуется добиться эстетически приятного отображения без использования JavaScript. Однако, есть несколько подходов, которые могут помочь решить данную проблему. ### Использование Flexbox Один из способов — использовать Flexbox для управления расположением изображения и текста. Вот пример кода: ```css .article { display: flex; flex-wrap: wrap; /* Позволяет переносить элементы */ } .image-wrapper { flex: 0 0 auto; /* Пропускаем размеры, заданные изображению */ margin: 10px; /* Отступ вокруг изображения */ } .text { flex: 1; /* Позволяет тексту заполнять оставшееся пространство */ min-width: 200px; /* Устанавливаем минимальную ширину текста */ } ``` ```html <div class="article"> <div class="image-wrapper"> <img src="image.jpg" alt="Описание изображения"> </div> <div class="text"> <p>Ваш текст, который будет обтекать изображение и имеет минимальную ширину.</p> </div> </div> ``` ### Использование `grid` Другой подход — использование CSS Grid: ```css .article { display: grid; grid-template-columns: auto 1fr; /* Автоширина для изображения и оставшееся пространство для текста */ gap: 10px; /* Пробел между изображением и текстом */ } .image-wrapper { justify-self: center; /* Центрируем изображение по горизонтали */ } ``` ```html <div class="article"> <div class="image-wrapper"> <img src="image.jpg" alt="Описание изображения"> </div> <div class="text"> <p>Ваш текст, который будет обтекать изображение и иметь минимальную ширину.</p> </div> </div> ``` ### Еще один подход — псевдоэлемент Если вы хотите использовать псевдоэлемент (например, если у вас есть другие элементы после изображения), вы можете использовать псевдоэлемент для создания "отступа", который будет управлять шириной текста. ```css .text::before { content: ''; /* Создаем псевдоэлемент */ display: block; height: 0; margin-top: -1em; /* Негативный отступ для перемещения текста вниз */ } .image-wrapper { display: inline-block; text-align: center; /* Центрируем изображение */ } ``` ### Подытожив Каждый из этих подходов позволяет управлять расположением текста относительно изображения и минимизировать открытое пространство. Использование Flexbox или Grid позволяет более точно контролировать макеты без необходимости прибегать к JavaScript. Выбор конкретного метода будет зависеть от структуры вашего HTML и предпочтений в дизайне.
Можно попробовать использовать комбинацию float с псевдоклассом :has() для проверки ширины контейнера или текста, рядом с которым располагается изображение.
.container:has(.image) { display: block; } .container:has(.image:only-child) { text-align: center; } .container:has(.image) p { display: inline-block; min-width: 150px; width: calc(100% - 200px); } .image { float: left; max-width: 150px; margin: 0 10px 10px 0; } .container:has(.image) p:not(:only-child) { clear: both; display: block; text-align: center; }
Как вы решаете эту задачу?
Вправляем мозги менеджеру-контентщику.
Если он видит, что картинка криво смотрится, то пусть будет любезен в редакторе админки выставить ей центрирование вместо обтекания.