Картинка по размеру блока. CSS свойство object-fit
Часто возникает необходимость растянуть картинку по размеру блока с сохранением пропорций, чтобы изображение не искажалось. При этом результат бывает нужен разный. Иногда нужно обязательно заполнить всё пространство блока. А иногда важно отобразить всю картинку. Для этого в CSS есть свойство object-fit. Оно может иметь такие значения:
object-fit: fill — картинка просто заполняет блок без сохранения пропорций (по умолчанию)
object-fit: cover — картинка полностью заполняет всё пространство блока. Края изображения могут быть обрезаны из за того, что форма блока не совпадает с формой картинки.
object-fit: contain — вся картинка отображается в блоке. Часть блока может быть не заполнена из за того, что форма блока не совпадает с формой картинки.
object-fit: none — картинка отображается в своём реальном масштабе
object-fit: scale-down — соответствует либо contain либо none. Из этих вариантов выбирает тот, который меньше.
object-fit: initial — возвращает значение по умолчанию, если ранее изображению было установлено другое значение
object-fit: inherit — значение принимается от родительского элемента
Результат использования свойства object-fit выглядит так:
fill
cover
contain
none
scale-down
Каждое значение свойства object-fit используется для своих целей:
- cover применяется чтобы картинка заполнила весь блок и в нём не было пустых пространств. Например, это нужно когда на странице несколько картинок и они должны отображаться в одном стиле. У всех изображений одинаковая форма и размеры. Но нужно учитывать, что часть картинки может быть не видна.
- contain полезно, если нужно обязательно показать всю картинку. Но форма блока отличается от формы изображения. Часть блока остаётся пустой. Зато изображение растягивается максимально, насколько позволяет блок, чтобы пользователь мог его рассмотреть.
- none нужна для специфических ситуаций, когда нельзя менять реальный размер картинки, но для неё выделено конкретное пространство на странице.
- scale-down используется для тех же целей, что contain. Но мы учитываем, что изображение может оказаться меньше блока. contain в этом случае растянет картинку по размеру блока и изображение получится размытым. А вот scale-down не будет увеличивать изображение. И получится маленькая картинка в большом блоке.
Чтобы свойство object-fit работало, изображению нужно указать размеры. Когда картинка в блоке, указываем размеры: 100%. На самом деле, картинка не обязательно должна быть внутри блока. Просто чаще всего свойство используется именно когда нужно растянуть картинку по размеру блока. Но работа object-fit зависит от размеров изображения а не от внешнего блока.
Создадим блок, добавим в неё картинку и растянем её по ширине блока:
Стиль:
+
7 | div { width: 100px; height: 130px; border: 1px solid Red; } img { width: 100%; height: 100%; object-fit: contain; } |
HTML код:
22 | <div><img src="sizeimage.jpg"></div> |
По умолчанию изображение позиционируется по центру. Свойство object-position позволяет установить позиционирование изображения и сдвинуть его внутри блока. В значении указывается горизонтальное позиционирование и через пробел вертикальное позиционирование. Горизонтальное бывает: left, center, right, а вертикальное бывает: top, center, bottom. Также можно указать смещения в единицах измерения CSS. Тогда они отсчитываются от левого верхнего угла картинки.
Пример:
18 | object-position: left top; |
Как растянуть элементы, находящиеся в блоках
Как растянуть элементы, находящиеся в блоках, на полную ширину окна браузера, используя при этом CSS? Эта проблема часто встречается в разметке CSS. Нередко нужно, чтобы элемент растягивался за пределы центрального блока страницы и занимал всю ширину окна браузера. На картинке слева вы видите распространенный дизайн страницы.
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <title>SiteName</title> </head> <body> <article> <header></header> <nav></nav> …content… <footer></footer> </article> </body> </html>
Внешний элемент страницы отцентрирован с помощью, например, следующего кода CSS:
article { width: 70%; margin: 0 auto; }
Так как же применить повторяющийся горизонтальный фон, заполняющий все окно браузера? Это легко сделать для элементов, находящихся сверху на странице, так как можно задать фоновое изображение тегу body, например:
body { background: url(header.png) 0 0 repeat-x; }
Но этот способ не подойдет для блока footer, так как он находится в блоке article и его расположение определяется размером его содержимого. Наиболее очевидное решение — использование дополнительных элементов, т. е., мы передвинем блок footer из блока article и добавим внутренний блок:
…content… </article> <footer> <div> <p>Footer content.</p> </div> </footer>
После этого нужно добавить соответствующие стили в код CSS:
footer { width: 100%; background: url(footer.png) 0 0 repeat-x; } div.content { width: 70%; margin: 0 auto; }
Это наиболее часто используемое решение, хотя оно и не изящное. Внутренний блок нужен только для задания стилей CSS, а не для структуры.
К счастью, есть решение, работающее во всех современных браузерах и не требующее дополнительных блоков. Нужно добавить свойство внутреннего отступа с большим значением, затем сдвинуть элемент назад в его начальное положение с помощью отрицательного внешнего отступа. Этот способ часто используется для создания столбцов равной высоты, а в этом случае он применяется к ширине:
body { overflow-x: hidden; } .extendfull, .extendleft { padding-left: 3000px; margin-left: -3000px; } .extendfull, .extendright { padding-right: 3000px; margin-right: -3000px; }
Когда класс .extendleft применяется к элементу, элемент растягивается до левого края окна браузера. Подобным образом класс .extendright растягивает элемент до правого края окна браузера, а класс .extendfull растягивает в обе стороны. Чтобы не появилась горизонтальная прокрутка, нужно задать тегу body свойство overflow-x: hidden, скрывающее содержимое, выходящее за пределы окна браузера.
Посмотрите демонстрацию работы
Это решение работает в браузерах Internet Explorer от версии 8, Firefox, Chrome, Safari и Opera. Оно не может полностью заменить способ с дополнительными элементами, но в некоторых случаях это альтернативное решение может быть полезно. Но не стоит забывать, что это решение уменьшает быстродействие сайта.
Автор урока Craig Buckler
Перевод — Дежурка
Смотрите также:
Верстка слоя-подкладки во всю ширину viewport
В лендинговой верстке дизайнеры часто прибегают к следующему приему — фон одного или нескольких блоков растягивается на всю ширину документа. При этом максимальная ширина содержимого блоков чаще всего ограничена.
Если шаблон изначально верстается с учетом таких особенностей шаблона, то максимальная ширина контентной области ограничивается внутри каждого wrapper-контейнера. Каждый отдельный горизонтальный блок при этом имеет ширину равную 100% ширины документа.
<div> <div> … </div> </div> <div> <div> … </div> </div> … <div> <div> … </div> </div> <style> .wrapper { width: 100%; } .content { max-width: 1000px; margin: 0 auto; } </style>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<div> <div> … </div> </div> <div> <div> … </div> </div> … <div> <div> … </div> </div> <style> .wrapper { width: 100%; } .content { max-width: 1000px; margin: 0 auto; } </style> |
Такая верстка позволит определить настройки фона индивидуально для каждого контейнера, задавая стили для выбранной секции.
Если же изначально использовался общий wrapper с ограничением ширины, а разбивка на отдельные контейнеры трудоёмка (влечет за собой рефакторинг большого числа шаблонов), то есть имеет структуру подобную следующей:
<div> <div> <div> … </div> </div> <div> <div> … </div> </div> … <div> <div> … </div> </div> </div> <style> .wrapper { max-width: 1000px; margin: 0 auto; } </style>
1 2 3 4 5 6 7 8 10 11 12 13 14 15 16 17 18 |
<div> <div> <div> … </div> </div> <div> <div> … </div> </div> … <div> <div> … </div> </div> </div> <style> .wrapper { max-width: 1000px; margin: 0 auto; } </style> |
То растянуть фон на всю ширину документа для выбранной секции можно используя следующую технику (добавляем в CSS):
#sectionN { position: relative; } #sectionN:before { position: absolute; top: 0; bottom: 0; left: 0; right: 0; content: «»; // укажите параметры вашего фона background: url(…) top center repeat; // продляем фон за границы контейнера padding-right: 9999px; margin-right: -9999px; padding-left: 9999px; margin-left: -9999px; } #sectionN .content { position: relative; } body { // чтобы избежать появления горизонтального scrollbar overflow-x: hidden; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
#sectionN { position: relative; } #sectionN:before { position: absolute; top: 0; bottom: 0; left: 0; right: 0; content: «»; // укажите параметры вашего фона background: url(…) top center repeat; // продляем фон за границы контейнера padding-right: 9999px; margin-right: -9999px; padding-left: 9999px; margin-left: -9999px; } #sectionN .content { position: relative; } body { // чтобы избежать появления горизонтального scrollbar overflow-x: hidden; } |
Я использовал псевдо-контейнер, но это может быть и специальный слой в верстке. Смысл в том, что он повторяет размеры секции, но по краям выходит за границы на 9999 пикс, заливая фоном всю горизонталь.
Написать комментарийДанная запись опубликована в 16.04.2019 12:50 и размещена в Танцы с CSS. Вы можете перейти в конец страницы и оставить ваш комментарий.
Мало букафф? Читайте есчо !
Вставка переменной в инлайновое изображение в LESS
Август 29, 2019 г.
Небольшие векторные элементы очень удобно вставлять как часть CSS кода. Хочу показать пример, как сделать их еще и параметрически зависимыми, при компиляции из LESS. К примеру, при ребрендинге или использовании кусочка стилей на другом сайте, вы …
Читатькак в html сделать фон картинкой
Многие начинающие верстальщики, только вникающие в суть создания сайтов, часто задаются вопросом, как в html сделать фон картинкой. И если некоторые и могут разобраться с этой задачей, то все равно возникают проблемы во время растягивания изображения на всю ширину монитора. При этом хотелось бы, чтобы сайт одинаково отображался на всех браузерах, поэтому должно выполняться требование кроссбраузерности. Можно установить фон двумя способами: с помощью HTML тегов и CSS стиля. Каждый сам для себя выбирает наиболее оптимальный вариант. Конечно, CSS стиль гораздо удобнее, ведь его код хранится в отдельном файле и не занимает лишние колонки в основных тегах сайта, но прежде рассмотрим простой метод установки изображения на фон сайта.
Основные теги HTML для создания фона
Итак, переходим к вопросу, как сделать картинку фоном в html на весь экран. Для того чтобы сайт красиво выглядел, необходимо понимать одну достаточно важную деталь: достаточно просто сделать градиентный фон или закрасить его однотонным цветом, но если вам необходимо вставить на задний план картинку, она не будет растягиваться на всю ширину монитора. Изображение изначально нужно подобрать или самостоятельно сделать дизайн с таким расширением, в котором у вас будет отображаться страница сайта. Только после того как фоновое изображение готово, переносим его в папку с названием «Images». В ней мы будем хранить все используемые картинки, анимации и другие графические файлы. Эта папка должна находиться в корневом каталоге со всеми вашими файлами html. Теперь можно переходить и к коду. Существует несколько вариантов записи кода, с помощью которого фон будет меняться на картинку.
- Написать атрибутом тега.
- Через CSS стиль в HTML коде.
- Написать CSS стиль в отдельном файле.
Как в HTML сделать фон картинкой, решать вам, но хотелось бы сказать пару слов о том, как было бы наиболее оптимально. Первый метод с помощью написания через атрибут тега уже давно устарел. Второй вариант используется в очень редких случаях, только потому что получается много одинакового кода. А третий вариант самый распространенный и эффективный. Вот HTML примеры тегов:
- Первый способ записи через атрибут тега (body) в файле index.htm. Он записывается в таком виде: (body background= «Название_папки/Название_картинки.расширение»)(/body). То есть если у нас картинка с названием «Picture» и расширением JPG, а папку мы назвали как «Images», тогда запись HTML-кода будет выглядеть так: (body background=»Images/Picture.jpg»)… (/body).
- Второй метод записи затрагивает CSS стиль, но записывается в том же файле с названием index.htm. (body).
- И третий способ записи производится в двух файлах. В документе с названием index.htm в теге (head) записывается такая строчка: (head)(link rel=»stylesheet» type=»text/css» href=»Путь_к CSS_файлу»)(/head). А в файле стилей с названием style.css уже записываем: body {background: url(Images/Picture.jpg’)}.
Как в HTML сделать фон картинкой, мы разобрали. Теперь необходимо понять, как растянуть картинку по ширине всего экрана.
Способы растягивания фоновой картинки на ширину окна
Представим наш экран в процентном виде. Получается, что вся ширина и длина экрана будет составлять 100% х 100%. Нам необходимо растянуть картинку на эту ширину. Добавим к записи изображения в файл style.css строку, которая и будет растягивать изображение на всю ширину и длину монитора. Как это записывается в CSS стиле? Все просто!
body
{
background: url(Images/Picture.jpg’)
background-size: 100%; /* такая запись подойдет для большинства современных браузеров */
}
Вот мы и разобрали, как сделать картинку фоном в html на весь экран. Есть еще способ записи в файле index.htm. Хоть этот метод и устаревший, но для новичков необходимо его знать и понимать. В теге (head)(style) div { background-size: cover; } (/style) (/head) эта запись означает, что мы выделяем специальный блок для фона, который будет позиционироваться по всей ширине окна. Мы рассмотрели 2 способа, как сделать фон сайта картинкой html, чтобы изображение растягивалось на всю ширину экрана в любом из современных браузеров.
Как сделать фиксированный фон
Если вы решили использовать картинку в качестве фона будущего веб-ресурса, тогда вам просто необходимо узнать, как его сделать неподвижным, чтобы он не растягивался в длину и не портил эстетичный вид. Достаточно просто с помощью HTML кода прописать это небольшое дополнение. Вам необходимо в файле style.css дописать одну фразу после background: url(Images/Picture.jpg’) fixed; или вместо нее добавить после точки с запятой отдельную строчку — position: fixed. Таким образом, ваш фоновый рисунок станет неподвижным. Во время прокрутки контента на сайте, вы увидите, что текстовые строки двигаются, а фон остается на месте. Вот вы и научились, как в html сделать фон картинкой, несколькими способами.
Работа с таблицей в HTML
Многие неопытные веб-разработчики, сталкиваясь с таблицами и блоками, часто не понимают, как в html сделать картинку фоном таблицы. Как и все команды HTML и CSS стиля, этот язык веб программирования достаточно простой. И решением такой задачи будет написание пары строк кода. Вы уже должны знать, что написание табличных строк и столбцов обозначается соответственно как теги (tr) и (td). Чтобы фон таблицы сделать в виде изображения, необходимо дописать к тегу (table), (tr) или (td) простую фразу с указанием ссылки на картинку: background = URL картинки. Для наглядности приведем пару примеров.
Таблицы с картинкой вместо фона: HTML примеры
Нарисуем таблицу 2х3 и сделаем ее фоном картинку, сохраненную в папке “Images”: (table background = “Images/Picture.jpg”) (tr) (td)1(/td) (td)2(/td) (td)3)(/td)(/tr) (tr)(td)4(/td) (td)5(/td) (td)6(/td)(/tr) (/table). Так наша таблица будет закрашена в фон картинки.
Теперь нарисуем эту же табличку размерами 2х3, но вставим картинку в столбики под номером 1, 4, 5 и 6. (table)(tr)(td background = “Images/Picture.jpg”)1(/td) (td)2(/td) (td)3(/td)(/tr) (tr)(td background = “Images/Picture.jpg”)4(/td) (td background = “Images/Picture.jpg”)5(/td) (td background = “Images/Picture.jpg”)6(/td) (/tr) (/table). После просмотра видим, что фон появляется только в тех ячейках, в которых мы прописали, а не во всей таблице.
Кроссбраузерность сайта
Существует еще такое понятие, как кроссбраузерность веб-ресурса. Это означает, что страницы сайта будут одинаково правильно отображаться в разных типах и версиях браузеров. При этом нужно HTML код и CSS стиль подгонять под необходимые браузеры. Кроме того, в современное время развития смартфонов многие веб-разработчики стараются создать сайты, адаптированные и под мобильные версии и под компьютерный вид.
Css растянуть изображение на всю ширину
Internet Explorer | Chrome | Opera | Safari | Firefox | Android | iOS |
9.0+ | 3.0+ | 9.6+ | 3.1+ | 3.6+ | 2.0+ | 1.0+ |
Задача
Растянуть фоновую картинку на всю ширину окна браузера с помощью CSS3.
Решение
Для масштабирования фона предназначено свойство background-size , в качестве его значения указывается 100%, тогда фон будет занимать всю ширину окна браузера. Для старых версий браузеров следует использовать специфические свойства с префиксами, как показано в примере 1.
Пример 1. Растягиваемый фон
HTML5 CSS 2.1 IE Cr Op Sa Fx
Результат данного примера показан на рис. 1.
Рис. 1. Вид фона при уменьшенном размере окна
При увеличении размера окна браузера фон также начнёт расширяться, это приведет к ухудшению вида картинки (рис. 2).
Рис. 2. Вид фона при увеличенном размере окна
Где будем растягивать картинку, так чтоб она смотрелось корректно, так как если идет фон под одним оттенком цвета, с ним легче работать. Не забываем про соответствие картинка на ее пропорций. И обязательно должно получится, что изображение установилось по центру. Что главное, все должно быть максимально кроссбраузерно и понятное дело, без различных махинаций с flash.
Метод CSS3 background
Это метод самый распространенный, что может растянуть background на чистом CSS, и все благодаря одному свойству, под названием background-size, что только будет присутствовать в CSS3.
Здесь изначально создадим background фиксированным и выставим его по центру, что останется его только растянуть, где подключаем свойства background-size, это все идет под ссылку на фон.
В общим ориентируемся с блоком которому присваиваем стили и дописываем в файле стилей этому блоку, следующий код:
Как можно заметить, что параметр background, где изначально добавляем путь на картину, где происходит установка положение изображение в соответствие окна экрана. Если разбирать, то значение center и top отвечает за центр и прижатие по всем сторонам, чтоб не было пробелов. Чтоб понятно было, то значение fixed — отвечает за функцию фиксаций.
Метод совсем обычный, что применяю постоянно и он меня устраивает на все 100% процентов.
Еще один способ :
Еще один обычный метод воплотить наверное, вставить картину на страницу. Она станет обладать фиксированную позицию и будет размещена в верхнем левом углу. Мы присвоим ей min-width и min-height 100%. Еще необходимо заблаговременно приготовить картину, в намерении пропорциональности сторон.
Здесь как можно заметить, что этот код не центрирует background image, что можно быстро все сделать как нужно, а точнее фиксировать изображение с помощью взятия ее в div.
На этом все, здесь представлены не все способы, а те, которые больше пременяют.
Также небольшое видео, где все понятно объясняют по как при помощи CSS растянуть фон на весь экран.
Доброго времени суток. 🙂
Когда-то искал способ, как растянуть фон блока или всего сайта на всю ширину и высоту. Причем сделать это так, чтобы происходило автоматическое масштабирование фона. То есть, не просто растянуть и потерять пропорции изображения, а чтобы все выглядело правильно без искажения.
Помню перерыл много информации и испробовал не мало способов, пока не нашел именного того решения, что нужно было именно в тот момент.
Ниже я покажу 3 способа, которые растягивают фон на всю ширину экрана.
Способ №1
Первый способ использует чистый CSS3. Все получается благодаря свойству background-size. В моем случаи я буду растягивать картинку на всю ширину экрана, то есть присвою свойства к тегу body. Вы можете применить по надобности к блоку например.
Растягивать на весь экран будем вот эту картинку с милой девушкой 🙂
В общим определяемся с блоком которому присваиваем стили и дописываем в файле стилей данному блоку, следующий код:
Как видите, в параметре background добавляем путь к изображению и устанавливаем положение картинки относительно экрана. В нашем случаи это center и top. Это означает что картинка будет в центре экрана, и прижата своим верхом к верху экрана. Это для того, чтобы всегда было видно лицо девушки. Если у Вас например абстрактный фон или природа, где видно небо, поле, горизонт, то можно поставить значения center и center. В общим если вы знакомы с CSS, то думаю разберетесь. Также установлено значение fixed, которое фиксирует изображение.
Способ очень простой, я его использую всегда и он меня устраивает на все 100%. Есть лишь одно но. Старые браузеры, не знакомы с CSS3, поэтому те кто используют древние версии не увидят должного результата.
Способ №2
Данный способ использует обычный CSS. По сути тоже простой. Выводим в теле сайта изображение присвоив id — bg:
И прописываем стили:
Позиционирование фиксированное и проходит растяжение на весь экран.Вот так просто :).
Способ №3
Тут применяется jQuery. Поэтому сначала нужно подключить библиотеку, если она не подключена ранее.
После библиотеки подключаем скрипт, который и будет масштабировать наш фон
Далее уже как и во втором способе, в теле сайта выводим картинку и присваиваем ей id, например bg.
И в конце добавляем стилей, чтобы все работало. Открываете файл стилей и добавляете в него следующий код:
По стилям видно, что мы добавили позиционирование. В данном случаи это fixed. Изображение при прокрутке будет оставаться фиксированным фоном, если же изменить позиционирование на absolute, то фон можно прокрутить. Кстати, так же можно сделать и с первыми двумя способами.
Также указан параметр — z-index: -1, для того чтобы картинка была за текстом. Если у Вас нет текста, который должен быть спереди, можете убрать этот параметр.
Какой способ использовать, решать Вам. Как и писал Выше, мне более близок первый способ. Он самый простой и не хуже других.
На этом все, спасибо за внимание. 🙂
Если Вам был полезным мой труд, можете поддержать сайт, обменяться со мной текстовыми ссылками или посмотреть рекламку, что займет 2 минуты 🙂
Как растянуть SVG картинку только по высоте при фиксированной ширине — Блого-дарю
Тема справедлива так же для растягивания ширины при неизменной высоте. На самом деле задача немного специфичная, ведь зачем сознательно искажать картинку/иконку, тем не менее случаи бывают разные. В моем случае нужно было сделать блок, который при наличии контента растягивался бы по высоте и его «уголок» был адаптивным. Саму рабочую конструкцию вставлять не буду, т.к. запись не об этом, а о самом вопросе растягивания svg по одной из сторон, поэтому в качестве предполагаемого результат добавлю только изображение:
Кратко общими словами: конструкция состоит из прямоугольного div’a и svg — уголка справа. Так вот при первичном решении svg никак не удавалось растянуть исключительно по высоте, оставив фиксированную ширину. Решение нашлось в атрибуте:
preserveAspectRatio=»none»
preserveAspectRatio=»none» |
указав который к тегу svg, изображением стало возможным управлять, устанавливая различную ширину и высоту картинки.
See the Pen OvZJrP by Sergey (@norzserge) on CodePen.
Надеюсь, что моя запись натолкнет кого-нибудь на решение своей не тривиальной задачи. Всем удачи!
P.S. К слову сказать, до решения с растягиванием SVG были предприняты попытки:
— добавить блок с background картинкой-уголком, но при растягивании бэкграунда, картинка заметно искажалась — fail
— нарисовать в background этот треугольник градиентом, но при растягивании сторона треугольника превращалась в лесенку — fail
— вариант с псевдо элементами подходит только при фиксированной высоте блока, в котором находится контент, так что тоже не прокатило
— еще пара извращений, о которых даже писать не хочу
В общем самым действенным оказалось использование svg с атрибутом preserveAspectRatio=»none»
Равномерное выравнивание блоков по ширине — CSS-LIVE
В задачах вёрстки периодически возникают моменты, когда появляется необходимость выровнять какой-нибудь список по ширине экрана. При этом пункты этого списка должны выравниваться равномерно, прижимаясь своими крайними элементами к границам контейнера, а расстояние между ними должно быть одинаковым.
Чтобы было более понятно, о чём идёт речь, приведу пару изображений.
На рисунках видно, что при разном разрешении экрана пункты всё равно продолжают выравниваться по ширине, примыкая к боковым стенкам и делая отступы между собой — равнозначными.
В этой статье я хочу подробнее разобрать разные варианты решения данной задачи, а также рассмотреть все плохие и хорошие стороны этих методов.
Как это работает?
Перед тем, как рассматривать каждое решение в отдельности, давайте немного углубимся в тонкости механизма и поразмыслим, как он работает.
По сути мы должны получить то, что делает text-align: justify с текстом. Так как поведение наших блоков уж очень напоминает результат выравнивания слов в строке с помощью именно этого свойства. Немного углубившись в процесс работы text-align: justify, мы можем наблюдать следующий алгоритм.
Этап первый
Сначала в строке текста ищутся минимальные, неразрывные «кирпичики». Это могут быть отдельные слова в тексте, картинки, инлайн-блоки, инлайн-таблицы и т.д. В общем всё то, что в случае необходимости перенесется на новую строку как единое целое.
Цифрой 1 на картинке отмечены обычные инлайн-боксы, т.е. попросту текст или инлайн элементы, такие, например, как < span> или <em>.
Под цифрой 2 у нас находится элемент строчно-блочного уровня, т.е inline-block. Как можно заменить, алгоритм отступов внутри него рассчитывается заново. Причина в том, что внутри себя inline-block генерирует свой собственный контекст форматирования. Что нельзя сказать об обычном inline элементе, внутри которого межсловное расстояние распределялось бы, по общему, внешнему алгоритму.
Цифрой 3 отмечена обычная картинка. Так же, как и остальные, она является строчным, целым элементом.
Для нашей строки все эти вещи представляют из себя отдельные сущности, неразделимые слова, единые целые. А расстояния между ними как раз и регулируется нашим механизмом, под названием text-align: justify
*Последняя же строка не попадает в поле зрения justify, так как он работает только для целиком заполненных строк, а в последней строке пробелы всегда остаются своего обычного размера.
Этап второй
Вторым этапом алгоритм высчитывает ширины всех наших «кирпичей» в строке, складывает их, а полученный результат отнимает от общей ширины самой строки.
Отсюда можно сделать вывод, что сейчас мы имеем общую сумму всех пробельных зон в строке, которая равна 116px.
Этап третий — завершающий
Третьим и последним этапом алгоритма будет деление полученной цифры (в данном случае 116) на количество пробелов в строке (в нашей строке их 7). Из полученного результата (16.571) вычитается ширина одного пробела и уже это значение добавляется к каждому из них. Что в итоге даёт равномерное распределение отступов во всей строке.
Итог
Как мы можем видеть, алгоритм работы text-align: justify не так уж и сложен на самом деле, всё вроде бы понятно и логично. Я уверен, что каждый из нас, решая подобную задачу, высчитывал бы результат, по точно такому же сценарию. Сложность заключается только в том, чтобы написать хорошее, красивое, а главное качественное решение, затратив при этом минимум материала. Ведь существует много подводных камней, в виде последней (не попадающей под алгоритм) строки, которую нужно прятать, или каким либо образом выравнивать точно так же, как и все остальные. Ну и естественно нельзя забывать об интерпретации кода, таких браузеров, как Opera, IE6-7, которые любят преподносить неожиданные сюрпризы.
Наша задача
Наша задача состоит в том, чтобы построить решение на базе этого алгоритма. Применить, симулировать, заменить, сделать всё что угодно, главное в итоге получить то, что мы хотим. А именно — равномерно выровненные элементы в строке, боковые из которых прижаты к своим границам. Ну и конечно же расстояния (пробелы) между элементами должны быть абсолютно одинаковыми при любой ширине контейнера.
Вариант 1
Самое первое, что пришло мне на ум, это взять список из пяти пунктов, сделать 4 из них обтекаемыми, а у последнего отменить float и растянуть на всю оставшуюся ширину. Чтобы было понятнее, о чём идёт речь, привожу код.
Структура будет таковой
<ul> <li> <div></div> </li> <li> <div></div> </li> <li> <div></div> </li> <li> <div></div> </li> <li> <div></div> </li> </ul>
А CSS таким
ul { font: 14px Verdana, Geneva, sans-serif; overflow: hidden; } ul li { } ul li.left { width: 20%; float: left; } ul li.right { width: 20%; float: right; text-align: right; } ul li.center { text-align: center; } ul li .content { background: #E76D13; width: 98px; height: 98px; display: inline-block; text-align: left; border: 1px solid #000; /* эмуляция inline-block для IE6-7*/ //display : inline; //zoom : 1; }
Что мы собственно сделали? А сделали мы следующее. Два левых и два правых пункта мы раскидали по разным сторонам с помощью float : left и float : right соответственно, при этом назначив им по 20% ширины каждому, что в сумме дало 80% от всей ширины контейнера. Последний пункт, я решил не делать обтекаемым, так как его содержимое само по себе занимает всё оставшиеся пространство после float-блоков.
Соответственно для такого решения пришлось пожертвовать разметкой, а точнее дополнительными классами + внутренними контейнерами для контента. Как вы могли заметить, каждый из этих контейнеров я сделал строчно-блочным, повесив на них display : inline-block, благодаря чему мой контент смог выравниваться в любую сторону с помощью text-align у родителя. Эти «жертвы» с большой натяжкой можно было бы отнести к хорошему решению, если бы не некоторые, весомые «но».
Во-первых, как видно из скриншотов, равномерные отступы имеют только боковые пункты, а между средним и остальными есть явная разница. И чем больше ширина контейнера, тем заметнее это становится.
Во-вторых, ради эксперимента, я назначил второму пункту ширину, равную 200px.
И второй элемент сразу же оказался под третьим. Конечно же можно было бы поставить минимальную ширину контейнеру и такого бы не произошло, но разве можно считать это действие отговоркой или решением? Конечно же нет! Я хочу, чтобы наши пункты могли иметь любую ширину и при этом чтобы наш алгоритм идеально работал.
Ну и в-третьих, все эти дополнительные обёртки, классы, рассчитывание кол-ва элементов, их ширины, а так же и ширины контейнера ставят абсолютную точку на этот варианте, заставляя нас идти дальше, в поисках настоящего решения.
Выкладываю этот вариант на всеобщий суд и перехожу к следующему способу.
Вариант с разносторонним выравниванием
Вариант 2
Второй вариант напоминает первый, но только отчасти. Дело в том, что в нём мы выравниваем по левому краю только один, левый блок, а остальные находятся уже в своём, собственном контейнере. Но перейдём от слов к делу.
<ul> <li> <div>1</div> </li> <li> <ul> <li> <div>2</div> </li> <li> <div>3</div> </li> <li> <div>4</div> </li> <li> <div>5</div> </li> </ul> </li> </ul>
ul { font: 14px Verdana, Geneva, sans-serif; overflow: hidden; } ul li.one { float: left; } ul li.two { overflow : hidden; float : none; } ul li.two li { width: 25%; text-align: right; float: left; /* Лекарство для IE6-7*/ //width: 24.9%; } ul li .content { background: #E76D13; width: 98px; height: 98px; display: inline-block; text-align: left; border: 1px solid #000; /* эмуляция inline-block для IE6-7*/ //display : inline; //zoom : 1; }
Если вы скажите, что в данной ситуации мы по сути имеем две разных колонки, то будете абсолютно правы. Ведь наша структура поделена на две части, левая из которых представляет из себя контейнер с одним блоком, а правая соответственно содержит в себе все остальные. Выглядит это примерно так:
Левая колонка прижата к левому краю и содержит в себе самый первый, одиночный блок. Это нужно для того, чтобы правая часть прижималась вплотную с правой стороны и растягивалась на всё оставшееся место. Растяжка правой части происходит благодаря overflow : hidden, который создаёт свой контекст форматирования, т.е. по сути свой собственный, независимый контейнер. Для всех дочерних элементов этого контейнера его ширина составляет 100% и поэтому блоки внутри него мы растягиваем в соответствии с этим правилом. Четыре блока имеют ширину 25%, что в сумме даёт 100. На изображении можно увидеть, как расположены эти блоки. Видно, что строчно-блочные элементы с контентом внутри них выровнены по правому краю с помощью text-align : right, благодаря чему самый правый блок прижат к своей боковой стенке, так же как и левый.
Благодаря таким «жертвам» с двумя колонками, мы получили отличный результат, и как видно из первых рисунков, при разных разрешениях, расстояние отступов между блоками остаётся абсолютно одинаковым. Это происходит за счёт равнозначных блоков в правой части. Ширина каждого из них составляет 25%, а элемента внутри них — 100px. Что и даёт равные отступы слева от каждого «кирпичика» в отдельности.
На данный момент можно смело заявить, что при фиксированной ширине блоков у нас получилось именно то, что мы хотели.
Но всё же интересно узнать, что будет, если мы поменяем ширину сначала у первого, а потом и у любого блока из правой части. Давайте для начала поставим левому… ну допустим 150px.
ul li.one .content { width: 150px;}
Всё здорово! Пока работает всё та же идея с правым, самостоятельным контейнером. А теперь перенесём нашу ширину на первый блок в правой части.
Эх, а вот этот эксперимент потерпел неудачу. Правый отступ у самого левого блока оказался меньше, чем все остальные. Всё легко объясняется тем, что контент первого элемента в правой части, стал больше на 50px, а так как он выровнен по правой стороне, то ширина визуально прибавилась к его левой части и соответственно стала отличаться от ширины соседних блоков. Ну и естественно поменялся отступ, который стал меньше ровно на 50px.
Из всего этого можно сделать вывод, что данный метод явно лучше, чем его предшественник и то, что он имеет право на жизнь. Единственный его недостаток связан с тем, что мы не может задать разную ширину блокам, и должны придерживаться одинаковой. Так что, если у вас есть список, в котором все пункты имеют равную ширину, то вы вполне можете применять этот подход. Конечно же, нужно понимать, что без двухколоночной структуры тут не обойтись + нужна обязательная минимальная ширина у контейнера (min-width), иначе при маленькой ширине экрана блоки будут наезжать друг на друга.
* Кстати, у себя в примере, в правом контейнере я использовал четыре блока по 25%, и их общая сумма составила 100%. Поэтому нужно помнить, что если блоков будет, ну скажем 6, то ширина каждого из них, будет равна 16.666, что говорит о дробных процентах, которые, например, не поддерживаются в браузере Opera.
Соответственно результат в этом случае будет немного не тем, чем вам хотелось бы.
Вариант с двумя колонками
Вариант 3 — text-align: justify
Стоит отметить, что до этого момента, ни в одном примере, мы ни разу не воспользовались text-align: justify, даже не смотря на то, что именно на основе его алгоритма и строятся все наши решения. Я предлагаю нарушить эту традицию и, наконец, пустить уже в дело этого зверя.
В первой части статьи мы выяснили, что text-align: justify влияет на все строки, кроме последней, а значит нужно построить наш список с учётом этого поведения, добавив в конец меню дополнительный, вспомогательный элемент.
<ul> <li>1</li> <li>2</li> <li>3</li> <li>4</li> <li>5</li> <li></li> </ul>
ul { font: 14px Verdana, Geneva, sans-serif; text-align: justify; } ul li { background: #E76D13; width: 98px; height: 98px; display: inline-block; text-align: left; border: 1px solid #000; /* эмуляция inline-block для IE6-7*/ //display : inline; //zoom : 1; } ul li.helper { width: 100%; height: 0; visibility: hidden; }
Из кода ясно, что мы создали список с пятью основными и одним элементом — помощником. text-align: justify на главном элементе-родителе (ul), заставляет своих потомков подчиняться своему алгоритму. Ведь, как известно, это свойство работает с текстом, а так как наши строчно-блочные (display: inline-block) пункты, по сути и являются неразрывными словами в строке, то это поведение вполне закономерно. Кстати, стоит учесть, что text-align: justify наследуемое свойство, поэтому text-align: left на ближайших потомках — необходимая мера. Этим самым мы как бы возвращаем выравнивание содержимого наших блоков в прежнее состояние.
В первой части статьи я упоминал, что наш алгоритм не распространяется на последнюю строку, а работает со всеми строками кроме неё. Поэтому я добавил в конец ещё один элемент, пустышку, и растянул его на 100% по ширине, тем самым заставив его растянуться на самую последнюю строчку в списке. С помощью нехитрых приёмов (height: 0, visibility: hidden) я, можно сказать, почти что спрятал его. Почему я сказал «Почти что»? Об этом чуть позже, для начала давайте взглянем на то, что у нас вышло.
Первое, что бросается в глаза, это то, что при разной ширине наш алгоритм работает так, как и должен. При пунктах с одинаковой шириной расстояние между ними сохраняется одинаковым, что не может не радовать. Но всё таки интересно узнать, будет ли всё так же хорошо при разной ширине блоков. Назначим паре пунктам классы и проверим это.
<ul> <li>1</li> <li>2</li> <li>3</li> <li>4</li> <li>5</li> <li></li> </ul>
Добавим для них свои правила.
.first { width: 150px;} .third { width: 200px;}
Проверяем.
Я специально увеличил ширину экрана, чтобы при маленькой ширине блоки не перескакивали на другую строку, как обычные слова в тексте. Но, если посмотреть на результаты алгоритма, то он работает! Пробелы между элементами остаются равнозначными, даже не смотря на то, что у двоих из них, мы увеличили ширину.
Т.е. можно с лёгкостью заявлять, что этот метод, с дополнительным элементом в конце — даёт отличный результат и, если ограничить экран по ширине, то его применение на практике нас не разочарует.
Так, ну а теперь, пожалуй, настало время подлить ложку дёгтя.
Во-первых, как вы могли заметить, во всех примерах я перечислял все браузеры, кроме IE6-7.
Во-вторых, опять же, как вы, наверное могли видеть на рисунках, внизу нашей строки, где дополнительный элемент, есть большие, непонятные отступы.
Давайте разбираться по порядку.
Первая проблема — это проблема IE6-7. Не приводя скриншоты, скажу сразу, что наш метод там не работает. Пункты в этих браузерах прижаты друг к другу вплотную и не растягиваются в строке. Дело в том, что парсер IE6-7 полностью игнорирует закрывающие теги у элементов <li>. А нет тегов — значит нет пробелов между ними, и, следовательно text-align: justify пропускает нашу строку, состоящую по сути из одних «строчно-блочных» слов, прижатых друг к другу.
За решением данной проблемы мы отправляемся на самую высокую гору… на MSDN. Мда… найти что либо на этом сайте, представляет большую трудность. Но, всё же повозившись, некоторое время, решение было найдено! text-justify: newspaper — свойство для увеличения или уменьшения интервалов между буквами и между словами. MSDN заявляет, что эта вещь «Самая навороченная форма выравнивания для латинского алфавита», а вот в этой статье ещё есть и дополнение, что для арабских текстов это свойство вытягивает и сами буквы.
Отлично, нам как раз нужно что-нибудь наподобие. Давайте-ка проверим их слова на деле.
ul { font: 14px Verdana, Geneva, sans-serif; text-align: justify; /* Лекарство для IE6-7*/ text-justify: newspaper; } ul li { background: #E76D13; width: 98px; height: 98px; display: inline-block; text-align: left; border: 1px solid #000; /* эмуляция inline-block для IE6-7*/ //display : inline; //zoom : 1; } ul li.helper { width: 100%; height: 0; visibility: hidden; } .first { width: 150px;} .third { width: 200px;}
А вот и результат.
Победа! IE6-7 были побеждены их же оружием. Здорово. Теперь во всех браузерах, начиная с IE6, наш способ работает идеально. Выходит, что MSDN не подвели и их слова подтвердились на деле. Так что text-align: justify выручил нас, поэтому берём его на заметку и переходим к решению второй проблемы.
Вторая проблема связана с непонятным отступом между низом списка и нашей строкой с элементами. В чём же дело? А дело в том, что всё вполне закономерно и этими странными отступами являются ни кто иные, как межстрочный интервал (line-height) и размер шрифта (font-size), которые априори присутствуют у строк и букв в тексте. Наши элементы — блочные только внутри, а строчные снаружи, поэтому они и попадают под эти правила.
Как быть? А легко! Мы можем повесить на контейнер обнуление этих стилей, а уже у потомков восстановить их в прежнее состояние. Пробуем.
ul { font: 14px Verdana, Geneva, sans-serif; text-align: justify; /* Обнуляем для родителя*/ line-height: 0; font-size: 1px; /* 1px для Opera */ /* Лекарство для IE6-7*/ text-justify: newspaper; } ul li { background: #E76D13; width: 98px; height: 98px; display: inline-block; text-align: left; border: 1px solid #000; /* Востанавливаем у потомков, кроме последнего*/ line-height: normal; font-size: 14px; /* Без него в Opera будет отступ под элементами */ vertical-align: top; /* эмуляция inline-block для IE6-7*/ //display : inline; //zoom : 1; } ul li.helper { width: 100%; height: 0px; visibility: hidden; overflow: hidden; } .first { width: 150px;} .third { width: 200px;}
Результат.
До обнуления
После обнуления
Отлично! Всё получилось. Обнуление стилей у главного контейнера помогло нам. Единственное, что теперь стоит помнить, это то, что в связи с обнулением размера шрифта мы не сможем задать нашим пунктам шрифт в таких единицах длины, как em, а так же % для <body> не принесут желаемого результата. Но, а целом, наш метод работает идеально, так что можно подводить итоги и идти дальше, ведь нам же мало одного решения, нам же нужно больше и лучше, не правда ли?
Подводя промежуточные итоги, скажу, что данный подход пока что лидер среди присутствующих до сей поры решений, и что, я лично, не вижу в нём ни одного изъяна, правда, кроме… Кроме дополнительного элемента в конце строки, плюс, как мне кажется, неактуальные проблемы с % и em. Но, эти натянутые минусы, никак не могут быть причиной отказа от представленного варианта. Так что смотрим результат и идём дальше.
Вариант дополнительным элементом
Вариант 4 — Избавление от дополнительного элемента
В предыдущем варианте для нашей цели мы использовали дополнительный элемент, ставя его в конец списка. С одной стороны, конечно же, этот маневр принес свои плоды, но с другой… но с другой стороны создал некие неудобства. Например, при динамическом добавлении пунктов, вспомогательный блок будет только мешать, да и потом этот «хвост» портит нашу структуру, засоряя её. В этом варианте, я предлагаю избавиться от него, не испортив при этом решение.
В CSS2.1 уже давно есть такие вещи, как псевдоэлементы. Это такие абстрактные сущности, которые могут быть сгенерированы каким нибудь элементом и вставлены в его начало или конец. Почему бы не заменить таким псевдоэлементом наш лишний вспомогательный блок? Давайте попробуем…
<ul> <li>1</li> <li>2</li> <li>3</li> <li>4</li> <li>5</li> </ul>
ul { font: 14px Verdana, Geneva, sans-serif; text-align: justify; /* Обнуляем для родителя*/ line-height: 0; font-size: 1px; /* 1px для Opera */ /* Лекарство для IE6-7*/ text-justify: newspaper; zoom:1; } ul:after { width: 100%; height: 0; visibility: hidden; overflow: hidden; content: ''; display: inline-block; } ul li { background: #E76D13; width: 98px; height: 98px; display: inline-block; text-align: left; border: 1px solid #000; /* Востанавливаем у потомков, кроме последнего*/ line-height: normal; font-size: 14px; /* Без него в Opera будет отступ под элементами */ vertical-align: top; /* эмуляция inline-block для IE6-7*/ //display : inline; //zoom : 1; }
В данной ситуации мы воспользовались псевдоэлементом :after, который сгенерировали в конце нашего списка. Выставив ему те же значения, что и бывшему, вспомогательному блоку, мы, по сути сделали тоже самое, но не залезая в разметку. Т.е. создали такой же, пустой, но полезный элемент. И вот результаты.
Здорово! Трюк с псевдоэлементом сработал. Теперь наша разметка чистая, аккуратная и без лишнего «мусора». Нам удалось избавиться от дополнительного элемента, полностью заменив его сгенерированным.
Но, как обычно, не обошлось без IE6-7 приключений. К сожалению, в браузерах IE6-7 нет поддержки :after и :before. А если нет поддержки, следовательно и нет никаких вспомогательных блоков, а значит и растягивать попросту нечего. Поэтому картина в этих браузерах такова.
Как видно из скриншота, IE6-7 полностью игнорирует пробелы между блоков, прижимая их вплотную друг к другу. Даже не смотря на то, что мы уже задействовали тяжёлую артиллерию в виде text-justify: newspaper. Почему же это происходит? Давайте выясним.
Оказывается всё дело в том, что text-justify: newspaper лишь даёт возможность растягивать наши буквы (inline-block), но не команду. Проще говоря, он рассказывает строке, как бы он хотел, чтобы она была растянута, а text-align: justify является растягивающей силой. Т.е. text-align: justify отвечает за растяжение строки, а text-justify: newspaper лишь уточняет, как именно это растяжение будет происходить.
Да, но тогда возникает вопрос: «Если есть и возможность и сила, которая может её исполнить, то почему же тогда ничего не происходит?». Ответ кроется в самом свойстве text-align: justify. Если вы помните, в обсуждении его алгоритма я упомянул о том, что он не распространяется на последнюю строку в тексте. А так как мы убрали вспомогательный элемент в конце списка, то соответственно наша строка (пускай даже она одна) с блоками — стала уже последней, и следовательно алгоритм отказался с ней работать.
Как же быть? Есть ли выход?
К счастью мир не без добрых людей, и один такой добрый человек направил меня на верный путь. Оказывается решение было у меня под носом. text-align-last — свойство, которое включает алгоритм text-align: justify в самой последней строке текста, если к ней применён этот самый text-align: justify. Проще говоря, когда мы применяем к тексту обычный text-align: justify, то, видя это, text-align-last указывает первому на то, что он поступает плохо и что ему придётся теперь работать и в последней строчке тоже.
Самое интересное, что это свойство считается ориентированным именно на Internet Explorer, в котором он нам как раз и нужен). В общем пора переходить к делу.
ul { font: 14px Verdana, Geneva, sans-serif; text-align: justify; /* Обнуляем для родителя*/ line-height: 0; font-size: 1px; /* 1px для Opera */ /* Лекарство для IE6-7*/ text-justify: newspaper; zoom:1; /* Включаем в работу последнюю строку*/ text-align-last: justify; } ul:after { width: 100%; height: 0px; visibility: hidden; overflow: hidden; content: ''; display: inline-block; } ul li { background: #E76D13; width: 98px; height: 98px; display: inline-block; text-align: left; border: 1px solid #000; /* Востанавливаем у потомков, кроме последнего*/ line-height: normal; font-size: 14px; /* Без него в Opera будет отступ под элементами */ vertical-align: top; /* эмуляция inline-block для IE6-7*/ //display : inline; //zoom : 1; }
Да! У нас получилось. text-align-last: justify сделал то, что от него требовалось, и сделал это на 5 баллов. Алгоритм включился в работу, в нашей последней и единственной строке. Так что празднуем победу и подводим итоги этого способа.
Ну что ж, я доволен. Доволен тем, что нам удалось найти действительно достойное решение. Причём не просто найти, а разобраться во всём и довести его до абсолютной кроссбраузерности, затратив минимум кода и не засоряя разметки. На лицо одни плюсы, а что же с минусами? Как по мне, так их попросту — нет. По сравнению с предыдущим вариантом, в этом мы только улучшили результаты. Разве что…
Единственное, что теперь стоит помнить, это то, что в связи с обнулением размера шрифта мы не сможем задать нашим пунктам шрифт в таких единицах длины, как em, а так же % для <body> не принесут желаемого результата.
Но, опять же, эти «минусы» с большой натяжкой можно назвать таковыми. Их неактуальность говорить о том, что про них можно практически забыть, если это не принципиально.
Так что в целом решение отличное, надёжное и действительно качественное.
Вариант с псевдо-элементом
Резюме
В этой статье мы рассматривали не только методы, которые могут помочь нам в равномерном выравнивании блоков по ширине, но и так же очень подробно разобрали механизмы работы всех свойств и деталей, участвующих в процессе. Всё это важно для понимания вещей, с которыми мы имеем дело. Поэтому я настоятельно рекомендую перечитать статью, и не один раз.
Я безумно рад, что нам удалось добиться своей цели и найти достойное и качественное решение.
Все варианты воедино
1. Вариант с разносторонним выравниванием (К сожалению неработающее решение. Надеюсь, что в комментариях кто нибудь натолкнёт на верный путь)
2. Вариант с двумя колонками (Работающее решение, но только с фиксированными по ширине блоками)
3. Вариант дополнительным элементом (Работающее решение)
4. Вариант с псевдо-элементом (Работающее решение)
Обновление от 08.10.2014
Вариант 5 — используем новые технологии
5. Вариант с использованием флексбоксов и постепенным улучшением
См. отдельную статью
P.S. Это тоже может быть интересно:
Растянуть и масштабировать изображение CSS в фоновом режиме — только с CSS
Я согласен с изображением в абсолютном div со 100% шириной и высотой. Убедитесь, что вы установили 100% ширину и высоту для тела в CSS и установили поля и отступы равными нулю. Другая проблема, с которой вы столкнетесь с этим методом, заключается в том, что при выделении текста область выбора может иногда включать фоновое изображение, что приводит к неудачному эффекту, когда вся страница имеет выбранное состояние. Вы можете обойти это, используя правило CSS user-select: none
, например:
содержание здесь
Опять же, Internet Explorer — плохой парень, потому что он не распознает параметр выбора пользователя — его не поддерживает даже предварительная версия Internet Explorer 10, поэтому у вас есть возможность использовать JavaScript для предотвращения выбора фонового изображения (например, http://www.felgall.com/jstip35.htm) или используя метод CSS 3 background-stretch.
Кроме того, для SEO я бы поместил фоновое изображение внизу страницы, но если фоновое изображение загружается слишком долго (то есть изначально с белым фоном), вы можете переместиться в верхнюю часть страницы.
Соответствие объекта CSS Свойство
Свойство CSS object-fit
используется для указания того, как
Размер или
Соответствие объекта CSS Свойство
Свойство CSS object-fit
используется для указания того, как или
Это свойство указывает содержимому заполнить контейнер различными способами; такой как «сохранить это соотношение сторон» или «растянуть и занять столько места, сколько возможный».
Посмотрите на следующее изображение из Парижа. Это изображение имеет ширину 400 пикселей и высоту 300 пикселей:
Однако, если мы стилизуем изображение выше на половину его ширины (200 пикселей) и такой же высоты (300 пикселей), это будет выглядеть так:
Мы видим, что изображение сжимается, чтобы поместиться в контейнер размером 200×300 пикселей. (его исходное соотношение сторон уничтожено).
Здесь появляется свойство object-fit
in. Свойство объектно-подходящего объекта
может принимать одно из
следующие значения:
-
заполнить
— это значение по умолчанию.Размер изображения изменяется, чтобы заполнить данное измерение. При необходимости изображение будет растянуто или сжато, чтобы соответствовать . -
содержат
— Изображение сохраняет свое соотношение сторон, но его размер изменяется в соответствии с заданным размером -
крышка
— Изображение сохраняет свое соотношение сторон и заполняет данное измерение. Изображение будет обрезано по размеру -
нет
— Размер изображения не изменен -
в уменьшенном масштабе
— изображение уменьшено до самой маленькой версиинет
илисодержать
Использование объектной посадки: крышка;
Если использовать object-fit: cover;
изображение сохраняет свое соотношение сторон
и заполняет данное измерение.Изображение будет обрезано по размеру:
Использование object-fit: contain;
Если мы используем object-fit: contain;
изображение
сохраняет свое соотношение сторон, но его размер изменяется в соответствии с заданным размером:
Использование подгонки объекта: заливка;
Если мы используем object-fit: fill;
изображение
изменен, чтобы заполнить заданный размер. При необходимости изображение будет
растянуты или сжаты, чтобы соответствовать:
Использование подгонки объекта: нет;
Если мы используем object-fit: none;
изображение не
изменен размер:
Использование подгонки объекта: уменьшение масштаба;
Если мы используем object-fit: scale-down;
изображение
уменьшено до самой маленькой версии нет
или содержать
:
Пример
img {
width: 200px;
высота:
300 пикселей;
размер объекта: уменьшение;
}
Другой пример
Здесь у нас есть два изображения, и мы хотим, чтобы они занимали 50% ширины окна браузера и 100% высоты.
В следующем примере мы НЕ используем object-fit
, поэтому, когда мы изменяем размер окна браузера, соотношение сторон изображений будет уничтожено:
В следующем примере мы используем object-fit: cover;
, поэтому, когда мы изменяем размер окна браузера, соотношение сторон изображений
сохранилось:
Соответствие объекта CSS Другие примеры
В следующем примере демонстрируются все возможные значения свойства object-fit
.
в одном примере:
Пример
.fill {object-fit: fill;}
.contain {объект-подходящий: содержать;}
.cover {object-fit: cover;}
.scale-down {object-fit: scale-down;}
.none {object-fit: none;}
CSS Object- * Свойства
В следующей таблице перечислены свойства объекта CSS — *:
Имущество | Описание |
---|---|
пригонка объекта | Определяет, как изменить размер или |
объект-позиция | Задает расположение или |
объектно-подходящий | CSS-уловки
Свойство подгонки объекта
определяет, как элемент реагирует на высоту и ширину своего поля содержимого.Он предназначен для изображений, видео и других встраиваемых мультимедийных форматов в сочетании со свойством object-position
. Сама по себе object-fit
позволяет нам обрезать встроенное изображение, давая нам детальный контроль над тем, как оно сжимается и растягивается внутри своего поля.
соответствие объекта
может быть установлено с одним из следующих пяти значений:
-
fill
: это значение по умолчанию, которое растягивает изображение до размеров поля содержимого, независимо от его соотношения сторон. -
содержат
: увеличивает или уменьшает размер изображения для заполнения поля с сохранением его соотношения сторон. -
обложка
: изображение будет занимать высоту и ширину своего прямоугольника, снова сохраняя соотношение сторон, но часто в процессе обрезая изображение. -
нет
: изображение игнорирует высоту и ширину родительского элемента и сохраняет исходный размер. -
в уменьшенном масштабе
: изображение сравнивает разницу междунет
исодержит
, чтобы найти наименьший размер конкретного объекта.
Вот как мы можем установить это свойство:
img {
высота: 120 пикселей;
}
.покрытие {
ширина: 260 пикселей;
объект подходит: крышка;
}
Поскольку второе изображение имеет соотношение сторон, отличное от исходного изображения слева, оно будет растягиваться за пределы области своего содержимого, обрезая верхнюю и нижнюю части изображения.
Стоит отметить, что по умолчанию изображение центрируется в пределах своего поля содержимого, но это можно изменить с помощью свойства object-position
.
Демо
В приведенной ниже демонстрации показаны пять примеров, подробно описывающих, как мы можем захотеть, чтобы изображение сжималось в поле содержимого, которое иногда меньше или больше его исходной ширины (измените размер браузера, чтобы лучше понять, как это может работать):
См. Соответствие объекта Pen Робина Рендла (@robinrendle) на CodePen.
Если содержимое изображения не заполняет поле содержимого по какой-либо причине, то в незаполненном пространстве будет отображаться фон элемента, в данном случае светло-серый фон.
Сопутствующие объекты
Другие ресурсы
Поддержка браузера
Стоит отметить, что iOS 8-9.3 и Safari 7-9.1 имеют свойство object-fit
, но не object-position
.
Настольный ПК
Chrome | Firefox | IE | Edge | Safari | ||
---|---|---|---|---|---|---|
32 | 36 | Нет | 79 | 9024 9024 10 Mobile | 79 | 9024 10105 |
Android Chrome | Android Firefox | Android | iOS Safari | |||
89 | 86 | 4.4,3-4,4,4 | 10,0-10,2 |
Как использовать изображения в электронных письмах — Klaviyo
Обзор
При работе с шаблонами электронной почты в Klaviyo вы можете управлять изображениями во время самого процесса создания шаблона электронной почты. Хотя в вашей учетной записи есть вкладка Image Library , у вас также будет полный доступ к этой библиотеке — включая возможность загрузки новых изображений — из шаблона.
Рекомендации по использованию изображений в сообщениях электронной почты
Klaviyo поддерживает файлы изображений JPG, PNG и GIF.Как правило, файлы PNG лучше всего отображаются на разных устройствах, особенно для изображений, содержащих текст.
Максимальный размер файла изображения, поддерживаемый Klaviyo, составляет 5 МБ. Однако мы рекомендуем использовать изображения размером 1 МБ или меньше, поскольку изображения большего размера могут загружаться медленно, что затрудняет работу получателя.
В Интернете рекомендуется использовать разрешение 72 точки на дюйм. Старайтесь, чтобы ваши изображения не превышали 600 пикселей в ширину и менее 2000 пикселей в высоту, чтобы сбалансировать качество изображения и скорость загрузки.
Вставить блок изображения
Самый простой способ загрузить изображения в Klaviyo — просто перетащить изображения со своего компьютера в шаблон:
Каждое изображение, которое вы перетаскиваете в шаблон, создает отдельный блок изображения. Кроме того, вы можете сначала перетащить блок изображения в шаблон, а затем выбрать, какое изображение включить.
После того, как вы разместите блок изображения, вам будет предложено добавить изображение:
- Перетаскивание изображения в блок для мгновенной загрузки
- Просмотр вашего компьютера, чтобы найти и загрузить изображение
- Импорт из URL-адреса
- Выбор изображения из вашей библиотеки изображений
- Выбор изображения из каталога продуктов (если вы интегрированы с платформой электронной коммерции)
- Вставка URL-адреса заполнителя или последовательности переменных, если вы хотите, чтобы изображение заполнялось динамически (только для потоков)
Если вы загружаете изображение, максимальный размер изображения, который вы можете загрузить, составляет 5 МБ.
Редактировать изображение
Чтобы отредактировать вставленное изображение, щелкните изображение в шаблоне и перейдите в раздел Block на левой панели. Здесь вы можете настроить следующее:
- Установить альтернативный текст для изображения
- Добавить гиперссылку на изображение
- Изменить ширину изображения
- Отрегулируйте выравнивание изображения
- Выберите, чтобы растянуть изображение, чтобы заполнить весь размер блока
- Редактировать изображение
Если щелкнуть синюю ссылку Редактировать изображение , откроется окно редактора фотографий.Здесь вы можете выбирать из множества функций редактирования фотографий, от изменения размера изображения до настройки цвета изображения. Вы также можете рисовать поверх изображения или накладывать текст.
Изменить настройки блока изображения
При нажатии на изображение в шаблоне у вас также будет возможность настроить стили блоков . Здесь вы можете:
- Измените цвет фона блока изображения
- Добавить границу
- Отрегулируйте набивку
- Обновить настройки мобильной оптимизации
Изображения в загруженных HTML-шаблонах
Для HTML-шаблонов, которые вы копируете в Klaviyo (за исключением шаблонов MailChimp), вы загрузите zip-файл, содержащий ваши изображения, в процессе импорта.
В частности, для шаблонов MailChimp, если вы загружаете шаблон, который содержит изображения, уже загруженные в MailChimp, Klaviyo автоматически скопирует все эти изображения.
После того, как вы загрузили изображение, вы можете использовать кнопку Insert Image , чтобы загрузить новые изображения для этого шаблона:
Качество изображения
Если вас беспокоит, что ваши изображения не отображаются так чисто или четко, как хотелось бы, вы можете улучшить качество изображения.
Одним из основных стандартов повышения четкости визуализированного изображения в электронном письме является вставка изображения в 2 раза больше желаемого размера с последующим уменьшением размера изображения в шаблоне.Есть два подхода к этому:
- Вставьте большую четкую версию изображения в шаблон, затем нажмите Редактировать изображение и измените размер до желаемых размеров
- Вставить изображение большего размера (например, шириной 600 пикселей) и отобразить с меньшим размером (например, шириной 300 пикселей) с помощью CSS; чтобы воспользоваться этим подходом, вам нужно вставить свое изображение в текстовый блок и настроить исходный код CSS
Типы изображений
Klaviyo поддерживает три различных типа изображений: JPEG, PNG и GIF.
Если у вас есть файл PSD, SVG или другой формат, вам придется преобразовать его в один из указанных выше типов изображений.
Чтобы узнать больше о том, какие типы изображений лучше всего подходят для вашей электронной почты, щелкните здесь.
Дополнительные ресурсы
Мы также рекомендуем ознакомиться со следующими статьями из нашего блога:
Полное руководство по блоку изображений Гутенберга
Обзор
Блок изображения является самым основным из всех блоков медиа-типа. Используйте его, чтобы вставить одно изображение где-нибудь на вашей странице / публикации.
Новый блок изображенийGutenberg работает почти так же, как кнопка «Добавить медиа» в классическом редакторе. Выровняйте изображение по левому, правому краю или по центру, укажите заголовок, ссылку, замещающий текст и т. Д.
Давайте посмотрим, как добавить изображение и настроить его стиль и настройки.
Как добавить изображение в Gutenberg
При добавлении изображения в Gutenberg вы можете загрузить новое изображение или выбрать существующее из своей медиабиблиотеки. Теперь есть 3 способа добавить изображение:
1.Перетащите изображение с компьютера на экран редактирования
2. Нажмите кнопку «Загрузить», чтобы выбрать изображение на своем компьютере.
3. Выберите существующее изображение из медиабиблиотеки
Как изменить размер изображения
Одной из новых функций блока изображений Гутенберга является возможность изменять размер изображения. Вы не можете обрезать его, но можете включить уменьшенную версию, сохранив размеры изображения.
- Возьмите любой из синих кружков в углу изображения
- Нажмите и удерживайте
- Перетащите внутрь или наружу, в зависимости от того, хотите ли вы уменьшить или увеличить размер изображения.
Выравнивание блока изображения
Изменение выравнивания фактически переместит ваше изображение по отношению к окружающему его содержимому.
Например, выравнивание по левому краю сдвинет ваше изображение влево, и какие бы блоки у вас ни были под ним, они будут плавать вверх по правой стороне вашего изображения.
У вас есть три варианта выравнивания блоков на выбор:
Left & Right перенесет ваше изображение на соответствующую сторону.Центр выровняет ваш блок изображения по центру страницы, возможно, добавив немного места слева и справа от него.
ПРИМЕЧАНИЕ. Возможно, вам придется уменьшить размер изображения, чтобы параметры выравнивания по левому и правому краям работали правильно.
Подписи к изображениям
Подписи к изображениям будут стилизованы под вашу тему, но вы можете установить несколько дополнительных параметров самостоятельно:
- Полужирный
- Курсив
- Зачеркнутый
- Ссылки
Щелкните B для жирного шрифта, I для курсива и ABC для зачеркивания.
Вот быстрый пример:
Ссылка на изображение
Если вы хотите, чтобы ваше изображение было связано с другим местом назначения, вы можете просто использовать значок ссылки на панели инструментов.
Панель дополнительных настроек изображения
Большинство настроек изображения расположены прямо над блоком изображения. На панели дополнительных настроек вы можете сделать еще несколько вещей.
Текстовая альтернатива
Это более широко известно как «замещающий текст».»Если ваше изображение является основной частью контента, вы должны предоставить его текстовое описание. Если ваше изображение предназначено исключительно для дизайна, вы можете оставить это поле пустым.
Размер изображения
Размер можно регулировать, перемещая синие кружки по 4 углам, как описано выше. Однако здесь вы также можете выбрать один из предварительно определенных размеров изображений WordPress.
Дополнительный класс CSS
Если вам нужен еще больший контроль над своим изображением, вы можете добавить дополнительный класс CSS и написать собственные стили.
- Допускается несколько классов CSS
- Разделите имя каждого класса пробелом
Вы также можете редактировать изображение так же, как и в классическом редакторе. Просто щелкните значок карандаша, чтобы открыть изображение в медиатеке WordPress, где вы можете:
Преобразование изображения в галерею
Блок изображения можно преобразовать только в один другой тип блока, а именно в галерею. Выбор этой опции позволит вам выбрать больше изображений — помимо вашего текущего — для добавления в галерею.
Узнайте больше о блоках Гутенберга
Как вырвать изображение из родительского контейнера с помощью CSS
Как вырвать изображение из родительского контейнера с помощью CSS | Сделай вещи Сделай вещиЯ несколько раз утверждал, что слишком много разработчиков JavaScript недостаточно хорошо знают CSS, что заставляет нас обращаться к JS в поисках решений, которые лучше обрабатываются с помощью CSS.
Имея это в виду, сегодня я хотел показать вам технику выделения изображения из его родительского контейнера с использованием только CSS.
Что теперь ломать?
Допустим, у вас есть макет со столбцом контента, который расположен по центру страницы, с небольшим количеством пробелов любого размера.
Может быть, есть максимальная ширина 40em
, и вы также используете методы адаптивного изображения, чтобы динамически изменять размер изображений, чтобы они соответствовали контейнеру.
кузов {
маржа слева: авто;
маржа-право: авто;
максимальная ширина: 40em;
ширина: 88%;
}
img {
высота: авто;
максимальная ширина: 100%;
}
Вот пример.
Отлично, но что, если вы хотите, чтобы одно из этих изображений занимало всю ширину страницы?
Вы, , могли бы использовать некоторые элементы div
с классами для создания контейнерных областей, но это может усложнить вашу разметку. Может, есть способ попроще.
. Полной ширины
классЭтот трюк любезно предоставлен экспертом по CSS Уной Кравец.
Простой служебный класс .full-width
будет отделять изображение от родительского контейнера, используя некоторые отрицательные поля, относительное позиционирование и единицу измерения ширины области просмотра ( vw
).
.full-width {
осталось: 50%;
маржа слева: -50vw;
поле справа: -50vw;
максимальная ширина: 100vw;
положение: относительное;
справа: 50%;
ширина: 100ввт;
}
Добавьте его к своему изображению, а CSS сделает все остальное.
Вот демонстрация этого в действии.
Совместимость с браузером
Этот метод работает во всех браузерах, поддерживающих модуль vw
, так что… все современные браузеры, а также IE11 и выше.
🚀 Перезапуск! Карманные руководства Vanilla JS были полностью обновлены новыми методами и современными подходами JS. С сегодняшнего дня по 25 апреля получите скидку 30% на любой путеводитель или пакет. Кликните сюда, чтобы узнать больше.
Нравится? Я отправляю короткие электронные письма каждый будний день с фрагментами кода, инструментами, методами и интересными вещами из Интернета. Присоединяйтесь к более чем 11 900 подписчикам в день.
Сделано с ❤️ в Массачусетсе.Если не указано иное, весь код можно использовать бесплатно в соответствии с Лицензией MIT. Я также очень нерегулярно делюсь мыслями, не связанными с кодированием.
Как автоматически изменить размер изображения, чтобы оно поместилось в DIV без растяжения?
Если вы разрабатываете адаптивную веб-страницу или гибкую веб-страницу, вы наверняка столкнулись бы со сценариями, в которых вы хотели бы уместить большое изображение в меньший DIV, не искажая его и не нарушая соотношения сторон. Что ж, это легко сделать с помощью свойства max-width
.
Предположим, у меня есть изображение шириной 768 пикселей, и я хочу уместить его в DIV с шириной 320 пикселей. Назовем DIV «фигурой-контейнером». Чтобы поместить изображение в DIV «фигура-контейнер», я должен использовать для изображения свойство max-width
. Следовательно, мой CSS может выглядеть примерно так:
.figure-container img {
максимальная ширина: 100%;
дисплей: блок;
высота: авто
}
Это гарантирует, что ширина изображения не превышает 100% ширины DIV.Это означает, что мое изображение размером 768 пикселей теперь вписывается в 320 пикселей DIV при сохранении соотношения сторон. Однако помните, что в зависимости от вашего сценария вам, возможно, также придется использовать свойство display
. Вы можете установить отображение на блок
или встроенный блок
.