Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Адаптивные изображения

Фотография шириной 800 пикселей не помещается на экран телефона, а огромный файл для маленького экрана — лишний трафик. Адаптивные изображения решают обе задачи: CSS подгоняет картинку под место, а HTML позволяет браузеру выбрать подходящий файл.

Резиновая картинка

По умолчанию <img> показывается в своём настоящем размере и может вылезти за край. Два свойства делают картинку резиновой — сжимающейся вместе с родителем:

<style>
  img { max-width: 100%; height: auto; }
</style>
 
<img src="/media/photo-800x500.jpg" alt="Река в горах" width="800" height="500">

max-width: 100% запрещает быть шире родителя, height: auto сохраняет пропорции. Атрибуты width и height всё равно стоит указывать: по ним браузер заранее оставляет место, и текст не прыгает, пока картинка грузится.

Пропорции: aspect-ratio

Свойство aspect-ratio задаёт соотношение сторон блока: ширина растягивается, а высота считается сама. Так готовят место под видео или превью:

<style>
  .video { aspect-ratio: 16 / 9; max-width: 320px; background: black; color: white; display: grid; place-items: center; }
</style>
 
<div class="video">16 : 9</div>

Заполнение: object-fit

Когда картинке задают и ширину, и высоту, она искажается. object-fit говорит, как вписать её в рамку:

<style>
  .row { display: flex; gap: 8px; }
  .row img { width: 140px; height: 140px; border: 2px solid gray; }
  .cover { object-fit: cover; }
  .contain { object-fit: contain; }
</style>
 
<div class="row">
  <img src="/media/photo-400x250.jpg" alt="Растянута">
  <img class="cover" src="/media/photo-400x250.jpg" alt="cover">
  <img class="contain" src="/media/photo-400x250.jpg" alt="contain">
</div>
ЗначениеРезультат
fillРастягивается, пропорции ломаются (по умолчанию)
coverЗаполняет рамку целиком, лишнее обрезается
containПомещается целиком, остаются пустые поля

Выбор файла: srcset и sizes

Атрибут srcset перечисляет несколько версий одной картинки с их шириной — 400w значит «файл шириной 400 пикселей». Атрибут sizes подсказывает, какую ширину картинка займёт на странице. Браузер сам скачает самый подходящий файл:

<style>
  img { max-width: 100%; height: auto; }
</style>
 
<img
  src="/media/photo-800x500.jpg"
  srcset="/media/photo-400x250.jpg 400w,
          /media/photo-800x500.jpg 800w"
  sizes="(max-width: 500px) 100vw, 500px"
  alt="Река в горах" width="800" height="500">

Запись sizes читается так: на экране до 500 пикселей картинка во всю ширину окна, иначе — 500 пикселей. Как картинки влияют на скорость загрузки, разобрано в уроке «Скорость страницы».

Элемент picture

<picture> нужен, когда на разных экранах показывают разные картинки — например, широкий кадр на компьютере и квадратный на телефоне. Браузер берёт первый <source>, чьё условие media подходит, а <img> служит запасным вариантом:

<picture>
  <source media="(min-width: 600px)" srcset="/media/photo-600x200.jpg">
  <img src="/media/photo-200x200.jpg" alt="Река в горах">
</picture>

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

Частая ошибка

Задать картинке width: 100% и фиксированную высоту — и получить сплющенное фото:

<style>
  .bad { width: 100%; height: 120px; }
  .good { width: 100%; height: 120px; object-fit: cover; }
</style>
 
<img class="bad" src="/media/photo-800x500.jpg" alt="Сплющено">
<img class="good" src="/media/photo-800x500.jpg" alt="Обрезано аккуратно">

Либо оставляйте height: auto, либо добавляйте object-fit: cover.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.