Код
#База знаний

Как работать с фоновыми картинками в CSS

Три примера вёрстки, которые встречаются часто и пригодятся наверняка.

При разработке сайта верстальщик должен отличать контентные (информативные) изображения от декоративных.

Контентные изображения связаны со структурой и смысловым наполнением страниц. Они содержательны, поэтому их вставляем в разметку.

Декоративные изображения — это элементы оформления: разделители, маркеры, значки, фоны и так далее. Они не несут полезной информации для пользователя, поэтому их задаём средствами CSS. Так мы избавляем HTML-документ от всего лишнего.

Пример явно декоративных изображений — пиктограммы («иконки») и фоновые картинки. Научимся их верстать с помощью CSS-свойства background.

Иконка соцсети без текста

Почти на любом сайте есть блок со ссылками на Facebook*, «ВКонтакте», Instagram* и другие соцсети:

Поскольку это иконки, а текста (контентной составляющей) мы рядом не видим, — нужно использовать CSS.

Здесь есть пара нюансов:

  • Раз текста нет, то у ссылки нет размеров. А фона без размеров не бывает (нельзя покрасить стену, когда самой стены нет).
  • Если мы зададим размеры ссылке, то они не сработают, так как по умолчанию ссылка — строчный элемент (его размер не изменить с помощью свойств width и height).

Обойдём эти ограничения.

Сперва напишем простую разметку — список ссылок. Классы сделаем по БЭМ, чтобы наш компонент было удобно стилизовать и использовать повторно.

Начнём, конечно, с HTML-кода:

<ul class="social">
   <li class="social__item">
    <a href="#" class="social__link social__link--vk" aria-label="Мы во ВКонтакте"></a>
  </li>
  <li class="social__item">
    <a href="#" class="social__link social__link--fb" aria-label="Мы в Фейсбуке*"></a>
  </li>
  <li class="social__item">
    <a href="#" class="social__link social__link--insta" aria-label="Мы в Инстаграме*"></a>
  </li>
</ul>

Далее — CSS:

.social__link {
  display: inline-block;
  width: 30px;
  height: 30px;
  background-position: center;
  background-size: cover;
  background-repeat: no-repeat;
}
 
.social__link--vk {
  background-image: url("../img/vk.svg");
}
 
.social__link--fb {
  background-image: url("../img/fb.svg");
}
 
.social__link--insta {
  background-image: url("../img/instagram*.svg");
}
    • Заметьте, что свойству display для ссылок мы задали значение inline-block. Поэтому наши ссылки стали строчно-блочными элементами. Теперь можно задать им ширину и высоту — и это уже сработает.
    • Одинаковые для всех элементов стили (background-position, background-size, background-repeat) мы вынесли в общий класс social__link.
    • А вот фоновые изображения у нас разные — их мы задаём в разных классах.

    Вот и готов наш универсальный компонент. Его легко обновить и использовать повторно, когда нам понадобятся другие соцсети.

    Иконка рядом с текстом

    Такие иконки с фоном встречаются в контактах на сайте. Мы вешаем ссылку на email, а для наглядности добавляем пиктограмму.

    На скриншоте выше видно, что значок находится слева от текста. Вспоминаем все свойства background и понимаем, что для размещения слева годится background-position (начальная позиция фонового изображения). Перейдём к коду.

    Сперва ничего особенного — обычная ссылка:

    <a href="mailto:mail@yahoo.com" class="email-link">mail@yahoo.com</a>
    

    Вся магия в CSS:

    .email-link {
      background-image: url("../img/mail.svg");
      background-position: left center;
      background-size: 20px 20px;
      background-repeat: no-repeat;
    }
    
    • Сначала задали путь до изображения.
    • Потом установили начальное положение фона (background-position) в left center — ведь наша иконка левее текста (горизонтальная позиция left) и на одном с ним уровне (вертикальная позиция center).
    • Размер фонового изображения (background-size) мы задали, чтобы предотвратить отдалённые проблемы.

      Дело в том, что иконка может оказаться больше блока, в котором её захотят показать. Тогда она некрасиво обрежется по бокам. Чтобы этого не произошло — указываем размеры, в которые иконка должна вписаться.
    • И наконец, устанавливаем режим повторения фона (background-repeat) в no-repeat. Без этого фоновая картинка будет дублироваться, пока не заполнит собой блок (как это выглядит — зависит от размеров картинки и HTML-элемента, где она задана фоном).

    Что же мы получили:

    Не совсем то, чего ожидали. Давайте разбираться.

    Наш «конвертик» стал фоновым изображением для блока, который занимает ссылка. Текст ссылки — это содержимое того же блока. Оно и наложилось на наше фоновое изображение.

    Значит, нужно отодвинуть это самое содержимое от левой границы блока (помните, мы прижали «конвертик» именно к левому краю). Причём отодвинуть более чем на 20px (ширина фоновой картинки, заданная background-size) — тогда увидеть наш фон уже ничто не помешает.

    Делается это с помощью свойства padding (внутренний отступ).

    Добавим в код такой отступ слева:

    .email-link {
      padding-left: 30px;
      background-image: url("../img/mail.svg");
      background-position: left center;
      background-size: 20px 20px;
      background-repeat: no-repeat;
    }
    

    Вот теперь всё вышло как надо:

    На заметку: этот приём также подходит для иконок справа, сверху или снизу от текста. Например, нужна иконка справа — меняйте отступ слева на отступ справа, и позицию фона задайте тоже справа.

    Блок с контентом поверх фонового изображения

    Подобные блоки привлекают внимание. Фоном идёт картинка, а поверх неё текст. Давайте разбираться, как такое сделать.

    Взглянув на этот макет, можно предположить, что тут достаточно задать высоту и ширину, расположить фоновое изображение — и всё.

    Однако мы не всегда знаем заранее, сколько контента будет внутри блока — не изменят ли потом его содержимое. Могут поменять заголовок, сделать его больше на две-три строки — и тогда всё сломается. Поэтому фон нужно делать адаптивным. Итак, к коду.

    Создаём простую HTML-разметку:

    <article class="card">
        <h3 class="card__title">Мальдивские острова</h3>
        <p class="card__price">от 55 000 р</p>
        <a href="tel:+74932200080" class="card__link">+7 (4932) 2000-80</a>
      </article>
    

    Главное у нас снова в CSS:

    .card {
      padding: 30px;
      background-image: url("../img/content-bg.jpg");
      background-repeat: no-repeat;
      background-position: center;
      background-size: cover;
    }
    
    • Чтобы даже при увеличении текста ничего не сломалось — применяем внутренний отступ (padding). Таким образом уходим от фиксированных размеров: контент можно менять, при этом блок и его фон будут подстраиваться.
    • Устанавливаем background-repeat в no-repeat. По умолчанию применяется repeat, но с ним фоновая картинка повторяется, пока не заполнит собой блок, а нам такого не нужно.
    • Задаём background-position: center — выравниваем картинку по центру контейнера (как по вертикали, так и по горизонтали).
    • А теперь самое важное — масштабируем фон. Задаём свойству background-size значением cover. Это и позволит нашей картинке подстроиться под размеры блока (её ширина или высота будет равняться ширине или высоте блока, а пропорции сохранятся).

    Вот мы и сделали фон адаптивным.

    Что дальше?

    Например, поучитесь верстать картинки формата SVG.


    * Решением суда запрещена «деятельность компании Meta Platforms Inc. по реализации продуктов — социальных сетей Facebook и Instagram на территории Российской Федерации по основаниям осуществления экстремистской деятельности.

    Изучайте IT на практике — бесплатно

    Курсы за 2990 0 р.

    Я не знаю, с чего начать
    Научитесь: Профессия Python-разработчик Узнать больше
    Понравилась статья?
    Да

    Пользуясь нашим сайтом, вы соглашаетесь с тем, что мы используем cookies 🍪

    Ссылка скопирована