СоХабр закрыт.

С 13.05.2019 изменения постов больше не отслеживаются, и новые посты не сохраняются.

H Правильное использование тега «picture» для растягивающих изображений (HTML5) в черновиках Из песочницы

Изображения, как известно, один из самых сложных аспектов для растягивающего веб-дизайна. Сегодня мы рассмотрим, как правильно использовать элемент <picture> именно в таком дизайне.

Итак, первая проблема


Дни фиксированной ширины и точных пикселей для веб-дизайна позади и это хорошо. В наши дни широкоэкранных мониторов, интернет-телевизоров, планшетов разных размеров и смартфонов множество, от 320px до 7680px и больше в ширину. Каждый проект будет страдать если не будет автоматически подстраиваться под эти размеры.

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

Так что же нам делать?

Текущий, один из лучших способов


Как правило, вы найдете следующее CSS строки в любом растягивающем сайте:
img {
    max-width: 100%;
    height: auto;
}

В этом коде используется свойство max-width: 100%; указания которого обеспечит, что изображения никогда не выходят за пределы ширины родительского контейнера. Если родительский контейнер сжимается меньше ширины изображения, изображение будет сворачивать вместе с ней. Свойство height: auto; обеспечит нам правильное соотношение сторон изображения сохраняя исходное.


Одно изображения подходит под любую ширину

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

Новое решения <picture>


<picture> это новый элемент, который стал частью HTML5.
Это сделает процесс размещения отзывчивых изображения до скорости с тем, как нынешние <audio> и <video> элементы работать. Это позволит нам разместить несколько изображений, каждый из которых определяет различные имена файлов и присвоить им условия, в которых они должны быть загружены.

Это позволит вам загружать изображения совершенно в иной образ в зависимости от:
  • Результатов медиа запросов, высоты, ширины, ориентации
  • Плотности пикселей

Это в свою очередь означает, что вы можете:
  • Загрузить и подать в соответствующим размере изображения, оптимального использования и доступной пропускной способности.
  • При загрузке по-разному сжимается/растягивается изображения в соответствие с различными соотношениями сторон, чтобы удовлетворить изменения макета на разной ширины.
  • Загрузка изображения более высокого разрешения для плотности большего количества пикселей.


Различные изображения изменяются, в зависимости от обстоятельств

Как работать с <picture> ?


Основными этапами работы <picture> являются:
  • Открыть и закрыть тег <picture></picture>
  • В этих тегах, вставить теги <source> — элемент для каждого запроса, который необходимо запустить
  • Добавить media атрибут, содержащий свойства такие как высота окна просмотра, ширина, ориентация и т.д.
  • Добавить атрибут srcset — путь изображения для загрузки.
  • Можно добавить дополнительные пути к файлам в атрибут srcset, если вы хотите, обеспечить идеальное изображения для различных плотностей пикселей, например Retina дисплеев.
  • Добавить резервный <img> элемент.

Вот простой пример, который проверяет, является ли ширина просмотра меньше, чем 768px, если так — загружает меньшее изображение:
<picture>
    <source srcset="smaller.jpg" media="(max-width: 768px)"> //если ширина экрана меньше 768 пикселей загружается маленькое изображения
    <source srcset="default.jpg"> // стандартное изображения
    <img srcset="default.jpg" alt="My default image">
</picture>

Хочу заметить, что синтаксис, используемый в атрибуте <media> такой же, как в CSS запросах других медиа. Вы можете использовать несколько проверок, то есть вы можете запросить max-width, min-width, max-height, min-height, orientation и так далее.

Вы можете использовать эти проверки что-бы делать загрузку альбомной или портретной версий изображения в зависимости от ориентации устройства, и вы все еще можете смешивать и другие запросы в то же время.
Например:
<picture>
    <source srcset="smaller_landscape.jpg" media="(max-width: 40em) and (orientation: landscape)">
// загружать это маленькое изображение если ориентация устройства горизонтальна 
    <source srcset="smaller_portrait.jpg" media="(max-width: 40em) and (orientation: portrait)">
// загружать это маленькое изображение если ориентация устройства вертикальна
    <source srcset="default_landscape.jpg" media="(min-width: 40em) and (orientation: landscape)">
// загружать стандартное изображение если ориентация устройства горизонтальная
    <source srcset="default_portrait.jpg" media="(min-width: 40em) and (orientation: portrait)">
// загружать стандартное изображение если ориентация устройства вертикальна
    <img srcset="default_landscape.jpg" alt="My default image">
</picture>

Если вы хотите, различные версии изображений с разным разрешением для дисплеев с более высоким уровнем плотности пикселей, вы можете сделать это, добавляя дополнительные пути к файлом атрибутом srcset.
Например, давайте посмотрим на наш первый фрагмент кода с обработкой для разрешения 2x сетчатки:
<picture>
    <source srcset="smaller.jpg, smaller_retina.jpg 2x" media="(max-width: 768px)">
    <source srcset="default.jpg, default_retina.jpg 2x">
    <img srcset="default.jpg, default_retina.jpg 2x" alt="My default image">
</picture>

Медиа запрос нужны в первую очередь, чтобы вы могли контролировать под какие размеры должно загружаться то или иное изображение. Тогда плотность дисплея пикселей будут проверены и, если плотность более высокая загружается другое изображения.

Использования <picture> сегодня


Сейчас <picture> работает в Chrome, Firefox и Opera. В будущем, надеюсь, мы увидим широкую поддержку и в других браузерах которые также завоевали популярность.

В то же время, если вы не хотите ждать, но хотите использовать <picture> прямо сейчас. Можете использовать Picturefill 2.0 разработанный Filament Group.

После загрузки файла picturefill.js в проект, вам остается просто добавить его в главную часть вашего сайта:
<script src="picturefill.js"></script>

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

При этом сценарий загрузки <picture> элемента будет работать, как я объяснил, только с несколькими ограничениями.

Полезные ссылки

  • Узнать больше о Picturefill 2.0 и загрузить его для вашего проекта можете на странице Picturefill
  • Получить полную информацию о <picture> элемента можете на responsiveimages.org.

Попробуйте <picture> в вашем проекте сегодня!

комментарии (11)

+2
bobermaniac ,  

Автоматический перевод?

–5
qWici ,  

Перевод мой, ручной. Старался удержать мысль автора.

+3
bobermaniac ,   * (был изменён)

Вы уверены?

+3
bobermaniac ,   * (был изменён)

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

+1
bobermaniac ,   * (был изменён)

Какие клевые глюки. Я все сломал!

0
olegkrasnov ,  

Ушёл за пирожком.

0
SerDIDG ,  

Я сначала было подумал, что это моя головная регулярка что-то не так парсит после работы, а тут действительно таки syntax error.

+1
qWici ,  

Да, возможно поспешил. И возможно стоит вернуть на доработку.

0
WaveCut ,  

Точно стоит. Интересная фича и невозможно читать.

0
SelenIT2 ,  

Статья нужная и полезная, но перевести действительно надо поаккуратнее. Не только по стилю, но и по смыслу. Например, «which is set to become part of HTML5» — не «стал частью HTML5», а лишь что-то вроде «намечен для того, чтобы стать этой частью» (на сегодня это отдельный черновик спецификации, в актуальных спецификациях ни у W3C, ни у WHATWG этого элемента нет), «native implementation for is in the works for...» — поддержка (в браузерах далее по списку) еще не «есть», а лишь «находится в разработке», и т.д.

И вообще переводы на Хабре лучше оформлять специальным типом топика (при создании кликнуть на слово «Пост» и в выпадушке выбрать «Перевод»). Бонусом будет встроенная ссылка на оригинал, которой сейчас нет как класса, пришлось включать телепательную машинку:)

0
maovrn ,  

Не поверю, что это переводил человек. Либо русский — не ваш язык. Сплошная каша отдельных слов, не связанных друг с другом, без учета адаптации к русской терминалогии и последовательности слов. Чтобы понять смысл приходится обратно переводить на английский. Подборка:
процесс размещения отзывчивых изображения — не согласованность окончаний (куча подобных ляпов, не буду повторять).
присвоить им условия — ммм, что значит присвоить условия?
загружать изображения совершенно в иной образ — что? возможно имелось в виду «загружать изображения совершенно иным образом».
Добавить media атрибут — в русском языке принято определение выносить вперед, атрибут media (к нам пришел алкоголик Вася, а не Вася алкоголик).
Терминалогия:
CSS запросах -> CSS правилах,
запросить max-width -> указать max-width,
2x сетчатка — это вообще в мемориез.

Ну и в конце надо бы добавить ссылку на источник.