Как исправить картинку в html

Одно из решений, которые приходится принимать фронтенд-разработчику при создании сайта, касается выбора способа включения изображений в состав веб-страниц. Этот способ может заключаться в использовании HTML-тега <img>. Это может быть применение CSS-свойства background или тега <image> элемента <svg>. Выбор правильного подхода к работе с изображениями весьма важен, так как это может очень сильно повлиять на производительность и доступность проекта.

Материал, перевод которого мы сегодня публикуем, посвящён изучению различных способов включения изображений в состав веб-страниц. Здесь будут обсуждены преимущества и недостатки этих способов. Кроме того, мы поговорим о том, когда и почему их обычно используют.

HTML-элемент <img>

Элемент <img> в простейших вариантах его использования содержит лишь необходимый для его правильной работы атрибут src:

<img src="cool.jpg" alt="">

▍Настройка атрибутов width и height

Если не будут настроены ширина и высота изображения, то при загрузке странице с последующей загрузкой изображения макет страницы может понадобиться перестроить. Для того чтобы этого избежать, можно задать атрибуты width и height тега <img>:

<img src="cool.jpg" width="200" height="100" alt="">

Хотя кому-то такой подход может слегка напомнить, так сказать, «старую школу», он, на самом деле, довольно полезен. Давайте, чтобы лучше в этом разобраться, продемонстрируем вышесказанное примером. А именно, я предлагаю вам посмотреть это короткое видео.

Кадр из видео. У изображения слева ширина и высота не заданы. У изображения справа — заданы

Здесь показана панель Network инструментов разработчика браузера и продемонстрирован процесс загрузки пары изображений. Одно из них, расположенное слева, представлено тегом <img>, у которого атрибуты width и height не заданы. У другого значения этих атрибутов заданы.

Вы заметили, что на странице место под правое изображение резервируется ещё до того, как это изображение будет загружено? Всё дело в заданных атрибутах width и height. Обратите внимание и на то, что происходит с подписями к изображениям в процессе их загрузки. Это — наглядная демонстрация силы атрибутов width и height.

→ Вот рабочий пример

▍Скрытие изображения средствами CSS

Изображение можно скрыть с помощью CSS. Правда, такое изображение всё равно загружается при загрузке страницы. Поэтому, поступая так, следует соблюдать осторожность. Если некое изображение нужно скрыть, то оно, возможно, используется лишь в декоративных целях.

Вот CSS-код, скрывающий изображение:

img {
    display: none;
}

Повторюсь: при таком подходе браузер будет загружать изображение, делая это даже в том случае, если оно оказывается невидимым. Дело тут в том, что элемент <img> считается замещаемым элементом, поэтому наши возможности по управлению таким элементом из CSS ограничены.

▍О доступности контента

Доступность изображений, выводимых на страницах с помощью HTML-элемента <img>, обеспечивается их атрибутами alt. В таком атрибуте должно содержаться понятное описание изображения. Это может очень пригодиться пользователям, применяющим средства для чтения с экрана.

Однако в том случае, если в alt-описании изображение не нуждается, этот атрибут, всё равно, удалять не рекомендуется. Дело в том, что если это сделать, то «озвучено» будет содержимое атрибута src. Это очень плохо для доступности контента.

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

У нас есть пара изображений:

<img class="food-thumb" width="300" height="200" src="cheescake.jpg">
<img class="food-thumb" width="300" height="200" src="cheescake.jpg" alt="">

В атрибуте src записан неправильный адрес к графическому файлу, этот файл не может быть загружен браузером. У первого <img> нет атрибута alt, а у второго есть такой атрибут, в который записана пустая строка. Как вы думаете, как эти элементы будут выведены на странице?

Слева — изображение без атрибута alt. Справа — с пустым атрибутом alt

Под изображение без атрибута alt резервируется пространство страницы, что может запутать пользователя и ухудшить доступность контента. А другое изображение занимает совсем мало места, которое нужно для вывода «содержимого» пустого атрибута alt. В результате оно больше похоже на точку, а не на изображение. Происходит это и-за настроек свойства border изображения.

Правда, когда в атрибут alt что-то записано, изображение будет выглядеть уже по-другому.

Справа — изображение, в атрибут alt которого записан текст

Это гораздо лучше, чем ничего. Кроме того, если не удаётся загрузить файл, выводимый в <img>, можно добавить к нему псевдо-элемент.

▍Отзывчивые изображения

Изображения разных размеров

Элемент <img> хорош тем, что его можно настроить так, чтобы он выводил бы разные версии изображения в областях просмотра страницы разного размера. Это, например, можно использовать для изображений, применяемых в статьях.

Отзывчивый набор изображений можно настроить двумя способами.

1. Атрибут srcset

Вот код изображения, в котором используется атрибут srcset:

<img src="small.jpg" srcset="medium.jpg 500w, large.jpg 800w" alt="">

Это — простой пример. Я не считаю идеальным решением использование srcset для описания изображений разных размеров, выводимых на экранах с разными характеристиками. Дело в том, что в такой ситуации последнее слово остаётся за браузером, а разработчик на выбор браузера повлиять не может.

2. HTML-элемент picture

Вот код, в котором используется элемент <picture>:

<picture>
  <source srcset="large.jpg" media="(min-width: 800px)" />
  <source srcset="medium.jpg" media="(min-width: 500px)" />
  <img src="small.jpg" />
</picture>

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

Вот демонстрационный проект к этому разделу.

▍Изменение размеров изображений

Слева — изображение, у которого не задано CSS-свойство object-fit. Справа — изображение, у которого это свойство задано

CSS-свойства object-fit и object-position — это замечательные инструменты, которые можно использовать с элементом <img>. Они дают нам контроль над тем, как изменяется и позиционируется содержимое элемента <img>. Это напоминает работу с CSS-свойством background.

Свойство object-fit может иметь следующие значения: fill, contain, cover, none, scale-down.

Вот как им пользоваться:

img {
    object-fit: cover;
    object-position: 50% 50%;
}

Теперь, когда мы немного разобрались с элементом <img>, пришло время двигаться дальше и осваивать следующую методику работы с изображениями.

Изображения, задаваемые CSS-свойством background

Когда для вывода изображений используют CSS-свойство background, нужно, чтобы это свойство применялось бы к элементу с неким содержимым, или к элементу, у которого заданы размеры. Обычно главной сферой использования этого свойства являются декоративные элементы.

▍Как пользоваться CSS-свойством background

Для того чтобы воспользоваться CSS-свойством background, нам сначала понадобится элемент:

<div class="element">Some content</div>

Потом понадобится стиль:

.element {
    background: url('cool.jpg');
}

▍Задание нескольких изображений в свойстве background

Приятное свойство изображений, выводимых средствами CSS-свойства background, заключается в том, что таких изображений может быть несколько. Этими изображениями можно управлять средствами CSS:

.element {
    background: url('cool-1.jpg'), url('cool-2.jpg');
}

▍Скрытие изображения

Средствами CSS можно скрывать и показывать изображения в конкретной области просмотра. При этом изображения, которые не будут выводиться, не будут и загружаться. Если изображение в CSS не настроено как видимое, то и загружаться оно не будет. Это — дополнительное преимущество CSS-свойства background перед элементом <img>.

@media (min-width: 700px) {
    .element {
        background: url('cool-1.jpg');
    }
}

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

▍О доступности контента

Если изображениями, выводимыми с помощью CSS-свойства background, пользоваться неправильно, это может повредить доступности контента. Например, доступность может пострадать при использовании такого изображения для закладки статьи, которая жизненно важна при работе со статьей.

▍Сложности с загрузкой background-изображений обычными пользователями

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

▍Псевдо-элементы

Псевдо-элементы можно использовать и с изображениями, задаваемыми CSS-свойством background. Например — для показа одного изображения поверх другого. В случае с элементом <img> этого можно достичь только с использованием дополнительного элемента, накладываемого на другой элемент.

Теперь поговорим об использовании SVG-изображений

SVG-изображения

Основной сильной стороной SVG-изображений считается возможность их масштабирования без потери качества. Более того, элемент <svg> может выводить, помимо SVG-изображений, ещё и файлы формата JPG и PNG. Вот HTML-код SVG-изображения:

<svg width="200" height="200">
  <image href="cheesecake.jpg" height="100%" width="100%" preserveAspectRatio="xMidYMid slice" />
</svg>

JPG-изображение, выведенное средствами элемента SVG

Обратили внимание на атрибут preserveAspectRatio? Благодаря ему изображение занимает полную ширину и высоту элемента <svg>, не растягиваясь и не сжимаясь.

Если ширина элемента <image> больше, оно заполнит родительский элемент (<svg>) по ширине, но при этом не будет растягиваться.

Изображение не растягивается

Это очень похоже на то, как работают CSS-свойства object-fit: cover или background-size: cover.

▍О доступности контента

Если говорить о доступности контента при использовании SVG-изображений, то могу сказать, что такой разговор сразу напоминает мне об элементе <title>. Ниже показан пример кода, в котором к изображению, выводимому средствами <svg>, добавлен такой элемент:

<svg width="200" height="200">
   <title>A photo of blueberry Cheescake</title>
   <image href="cheesecake.jpg" height="100%" width="100%" preserveAspectRatio="xMidYMid slice" />
</svg>

Тут, более того, можно воспользоваться и элементом <desc>:

<svg width="200" height="200">
   <title>A photo of blueberry Cheescake</title>
   <desc>A meaningful description about the image</desc>
   <image href="cheesecake.jpg" height="100%" width="100%" preserveAspectRatio="xMidYMid slice" />
</svg>

▍Сложности с загрузкой <svg>-изображений обычными пользователями

Изображение, выведенное с помощью <svg>, можно загрузить, лишь проанализировав его код и добравшись до ссылки на изображение. Это минус, но  в том случае, если некто хочет ограничить возможности обычных пользователей по загрузке изображений, эта особенность может и пригодиться. По меньшей мере, это снизит шансы на загрузку такого изображения.

→ Вот пример к этому разделу

Сценарии использования разных способов вывода изображений

▍Раздел страницы, выводимый в её верхней части

Проектируя раздел страницы, находящийся в её верхней части (такой раздел называют «Hero Section»), иногда нужно сделать так, чтобы в нём выводилось бы изображение, поверх которого выводится заголовок и какие-то другие данные о странице. Выглядеть это может примерно так, как показано ниже.

Верхняя часть страницы с изображением и надписями

Обратите внимание на то, что тут имеется фоновое изображение. Как бы вы подошли к разработке подобного раздела страницы? Но, прежде чем вы ответите на этот вопрос, позвольте мне сформулировать некоторые требования:

  • Изображение должно поддерживать лёгкую динамическую смену при интеграции страницы с бэкенд-CMS.
  • Поверх изображения должен быть наложен элемент, упрощающий чтение текста.
  • Нужно поддерживать вывод изображения в трёх размерах: в маленьком, среднем и большом. Каждый из них предназначен для собственной области просмотра.

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

  1. Важно ли это изображения с точки зрения пользователя, или он ничего не потеряет в том случае, если оно будет не видно?
  2. Нужно ли, чтобы это изображение выводилось в областях просмотра всех размеров?
  3. Является ли это изображение статическим, или оно динамически меняется (из CMS, например)?

Рассмотрим пару вариантов решения этой задачи.

Первый вариант решения задачи

Используя CSS-свойство background с несколькими заданными в нём изображениями, одно из них можно использовать для элемента, накладываемого на основное изображение, а другое — для представления самого изображения. Взгляните на этот CSS-код:

.hero {
    background-image: linear-gradient(rgba(0, 0, 0, 0.4), rgba(0, 0, 0, 0.4)), var('landscape.jpg');
    background-repeat: no-repeat;
    background-size: 100%, cover;
}

Этот подход позволяет достичь желаемого, background-image можно менять средствами JavaScript:

<section class="hero" style="background: linear-gradient(rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0.5)), url('landscape.jpg');">
  <!-- Hero content -->
</section>

Свойство background я определил во встраиваемом стиле. Хотя это и рабочий код, выглядит он плохо и отличается непрактичностью.

Может быть, можно воспользоваться здесь CSS-переменными?

<section class="hero" style="--bg-url: url('landscape.jpg')">
  <!-- Hero content -->
</section>

Вот результат исследования стиля.

Исследование стиля элемента

Теперь для изменения фонового изображения нам достаточно поменять переменную --bg-url. Это в миллион раз лучше, чем встроенные стили.

Анализ

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

→ Вот рабочий пример

Второй вариант решения задачи

Здесь мы воспользуемся HTML-средствами вывода изображения:

<section class="hero">
  <h2 class="hero__title">Using Images in CSS</h2>
  <p class="hero__desc">An article about which and when to use</p>
  <img src="landscape.jpg" alt="">
</section>

В CSS надо настроить абсолютное позиционирование изображения, расположив его под текстом. Кроме того, тут нам понадобится псевдо-элемент, который будет играть роль элемента, накладываемого на изображение:

.hero {
    position: relative;
}

.hero img {
    position: absolute;
    left: 0;
    top: 0;
    z-index: -1;
    width: 100%;
    height: 100%;
    object-fit: cover;
}

.hero:after {
    content: "";
    position: absolute;
    left: 0;
    top: 0;
    z-index: -1;
    width: 100%;
    height: 100%;
    background: rgba(0, 0, 0, 0.4);
}

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

Кроме того, отмечу, что мне нравится в <img>-изображениях то, что при их использовании можно использовать резервные механизмы, срабатывающие в том случае, если файл изображения загрузить не удаётся. Такой вспомогательный механизм, скажем, вывод вместо изображения простого цветного фона, по крайней мере, позволит пользователям прочитать текст:

.hero img {
    /* Другие стили */
    background: #2962ff;
  }

Фоновый цвет, выводимый в том случае, если изображение загрузить не удаётся

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

→ Вот рабочий пример

▍Логотип веб-сайта

Логотип — это очень важно. Логотипы добавляют сайтам уникальности. Для того чтобы вывести на странице логотип, мы можем прибегнуть к нескольким возможностям:

  • Элемент <img>, выводящий PNG, JPG или SVG-изображение.
  • Встроенное SVG-изображение.
  • Фоновое изображение.

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

Логотип с множеством деталей

Если логотип имеет множество деталей или содержит много фигур, вывод его с использованием встроенного SVG-изображения может оказаться не такой уж хорошей идеей. В такой ситуации я рекомендую использовать тег <img>, средствами которого выводится PNG, JPG или SVG-изображение.

Разные логотипы

Вот код для вывода подобного логотипа, хранящегося в формате SVG:

<a href="#"><img src="logo.svg" alt="Nature Food"></a>

Простой логотип, который нужно анимировать

Простой анимированный логотип

Рассмотрим ситуацию, когда имеется простой логотип, содержащий некую фигуру или текст. При наведении на него указателя мыши нужно изменить цвет фигуры и текста. Как это сделать? Мне кажется, что в этой ситуации лучше всего воспользоваться встроенным SVG-изображением:

<a href="#">
    <svg class="logo" width="115" height="47" xmlns="http://www.w3.org/2000/svg">
      <g transform="translate(-5 -5)" fill="none" fill-rule="evenodd">
        <rect fill="#D8D8D8" transform="rotate(45 28.5 28.5)" x="9" y="9" width="39" height="39" rx="11" />
        <text font-family="Rubik-Medium, Rubik" font-size="25" font-weight="400" fill="#6F6F6F">
          <tspan x="63.923" y="36.923">Rect</tspan>
        </text>
      </g>
    </svg>
</a>

Вот стили:

.logo rect,
.logo text {
  transition: 0.3s ease-out;
}

.logo:hover rect,
.logo:hover text {
  fill: #4a7def;
}

Вот демонстрационный проект к этому разделу:

Отзывчивый логотип

Когда я подумал об отзывчивых логотипах, то вспомнил логотип Smashing Magazine. Мне нравится то, как меняется его размер. Вот макет, иллюстрирующий базовый логотип и логотип, выводимый в больших областях просмотра.

Отзывчивый логотип

Для реализации такого поведения логотипа идеально подойдёт элемент <picture>, который позволяет описать две версии логотипа:

<a class="logo" href="/">
    <picture>
      <source media="(min-width: 1350px)" srcset="sm-logo--full.svg"><img src="sm-logo.svg" alt="Smashing Magazine"></picture>
  </a>

В CSS нужно поменять ширину логотипа в том случае, если ширина область просмотра будет равной или большей 1350px:

.logo {
  display: inline-block;
  width: 45px;
}

@media (min-width: 1350px) {
  .logo {
    width: 180px;
  }
}

Перед нами — простое и понятное решение проблемы отзывчивых логотипов.

→ Вот рабочий пример к этому разделу

Логотип с градиентом

Пример логотипа с градиентом

Работая с логотипами, на которых имеется градиент, нужно знать о том, что экспорт подобного логотипа из приложения для дизайна, вроде Adobe Illustrator или Sketch, может завершиться далеко не идеально. В ходе этого процесса что-то в логотипе может «поломаться».

При использовании формата SVG можно легко применить к логотипу градиентный цвет. В следующем примере я использовал <linearGradient>, настроив с его помощью атрибут текста fill:

<svg class="logo" width="115" height="47" xmlns="http://www.w3.org/2000/svg">
    <defs>
      <linearGradient id="gradient" x1="0%" y1="100%" x2="0%" y2="0%">
        <stop offset="0%" stop-color="#4a7def"></stop>
        <stop offset="50%" stop-color="#ab4787"></stop>
      </linearGradient>
    </defs>
      <g transform="translate(-5 -5)" fill="none" fill-rule="evenodd">
        <rect fill="#AB4787" transform="rotate(45 28.5 28.5)" x="9" y="9" width="39" height="39" rx="11" />
        <text font-family="Rubik-Medium, Rubik" font-size="30" font-weight="400" fill="url(#gradient)">
          <tspan x="63.923" y="36.923">Rect</tspan>
        </text>
      </g>
</svg>

→ Вот пример

▍Аватар пользователя

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

Для начала взгляните на следующий макет. Обратите внимание на то, что там представлены два аккуратных аватара с чёткими краями.

Пара удачных аватаров

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

Неудачный аватар

Обратите внимание на то, что на предыдущем рисунке изображён аватар с очень светлым фоном. В результате для того чтобы понять то, что он имеет круглую форму, к нему приходится присматриваться. Это плохо. Для того чтобы исправить эту проблему, нужно добавить к аватару внутреннюю границу. Эта граница будет использоваться в качестве вспомогательного решения, применяемого в том случае, когда изображение оказывается слишком светлым.

Слева — аватар со слишком светлым фоном. Справа — результат решения этой проблемы

Решить эту задачу можно несколькими способами:

  • С использованием <img>.
  • С использованием <img> и вспомогательного элемента <div>.
  • С использованием <div> и CSS-свойства background.
  • С использованием <image> в <svg>.

Что тут подходит лучше всего? Давайте выясним.

Использование <img>

Как решить эту задачу? Может — просто настроить границу элемента? Исследуем эту возможность (сразу извиняюсь за то, что ниже вы часто будете видеть мою фотографию).

Вот CSS-код:

.avatar {
    border: 2px solid #f2f2f2;
}

Вот как это выглядит.

Результат оказался не таким, как ожидается: тёмная граница расположена за пределами границ изображения

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

Использование <img> и вспомогательного элемента <div>

Напомню, что перед нами стоит задача добавления к изображению внутренней тени. Эту задачу мы не можем решить с помощью внутренней тени (box-shadow) и ключевого слова inset, так как HTML-элементы <img> внутреннюю тень не поддерживают. Для решения этой задачи нужно поместить аватар в элемент <div> и воспользоваться ещё одним элементом, единственное предназначение которого — вывод внутренней границы.

Вот HTML-код:

<div class="avatar-wrapper">
     <img class="avatar" src="shadeed2.jpg" alt="A photo of Ahmad Shadeed">
     <div class="avatar-border"></div>
</div>

Вот стили:

.avatar-wrapper {
  position: relative;
  width: 150px;
  height: 150px;
}

.avatar-border {
  position: absolute;
  left: 0;
  top: 0;
  width: 100%;
  height: 100%;
  border-radius: 50%;
  border: 2px solid rgba(0, 0, 0, 0.1);
}

Если у элемента <div> имеется граница, окрашенная в 10%-й чёрный цвет, это обеспечит нам то, что такая граница на тёмном изображении будет не видна, а на светлом будет заметна, выделяя его границу. Вот как это выглядит.

Внутренняя граница, видимая только на светлых изображениях

→ Вот пример к этому разделу

Использование <div> и CSS-свойства background

Если бы я использовал для вывода аватара элемент <div>, то это, возможно, значило бы, что изображение играет декоративную роль. Мне тут приходит в голову один пример, показанный ниже. Здесь разные аватары просто разбросаны по странице.

Аватары, разбросанные по странице

HTML-код здесь будет таким:

<div class="avatar" style="--img-url: url(shadeed2.jpg)"></div>

Вот стиль:

.avatar {
  background: var(--img-url) center/cover;
  width: 150px;
  height: 150px;
  border-radius: 50%;
  box-shadow: inset 0 0 0 2px rgba(#000, 0.1);
}

Здесь можно найти работающий пример.

Использование <image> в <svg>

Я полагаю, что это — наиболее интересное решение нашей задачи. Я обнаружил этот приём, изучая новый дизайн Facebook.

Вот разметка:

<svg role="none" style="height: 36px; width: 36px;">
  <mask id="avatar">
    <circle cx="18" cy="18" fill="white" r="18"></circle>
  </mask>
  <g mask="url(#avatar)">
    <image x="0" y="0" height="100%" preserveAspectRatio="xMidYMid slice" width="100%" xlink:href="avatar.jpg" style="height: 36px; width: 36px;"></image>
    <circle cx="18" cy="18" r="18"></circle>
  </g>
</svg>

Сначала разберём этот код. Вот что тут есть:

  1. Маска, обрезающая изображение в виде круга.
  2. Группа, к которой применяется маска.
  3. Само изображение с атрибутом preserveAspectRatio=«xMidYMid».
  4. Круг, который используется в роли внутренней границы.

Вот как это стилизуется:

circle {
  stroke-width: 2;
  stroke: rgba(0, 0, 0, 0.1);
  fill: none;
}

→ Здесь можно найти пример

С аватарами мы на этом разобрались. Поэтому идём дальше.

▍Поле ввода с иконкой

Вот пример поля ввода с иконкой.

Поле ввода с иконкой

Такие поля встречаются довольно часто. Как оснастить поле иконкой? Что происходит при получении таким полем фокуса? Исследуем эти вопросы.

Вот HTML-код:

<p>
    <label for="name">Full name</label>
    <input type="text" id="name">
</p>

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

input {
    background-color: #fff;
    background-image: url('user.svg');
    background-size: 20px 20px;
    background-position: left 10px center;
    background-repeat: no-repeat;
}

Для изменения цвета иконки при получении полем фокуса можно использовать URL-кодированное SVG-изображение. Сделать это очень легко. Например, для этого предназначен данный инструмент, разработанный Yoksel.

Вот пример.

▍CSS-стили для печати

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

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

Постарайтесь не включать в страницы, предназначенные для печати, изображения, выводимые с помощью CSS-свойства background

Если изображение включается в состав страницы с помощью CSS-свойства background, тогда на печать оно выводиться не будет. То место, где оно отображалось, при печати окажется пустым. Вот о чём я говорю.

Пустые места вместо изображений, включённых в страницу с помощью CSS-свойства background

От такой печатной версии рецепта будет мало пользы. Исправить это можно, заставив браузер выводить подобные изображения в печатной версии страницы. Но этот подход не работает в Firefox и в IE. Вот как это выглядит в CSS:

.element {
    background: url('cheesecake.png') center/cover no-repeat;
    -webkit-print-color-adjust: exact; /* Принудительный вывод фонового изображения в режиме печати */
}

В подобных ситуациях лучше всего пользоваться HTML-элементом <img>. Изображения, включённые в страницу с помощью этого элемента, выводятся на печать без проблем.

→ Вот пример

Итоги

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

Уважаемые читатели! Сталкивались ли вы с проблемами при выводе изображений на веб-страницах?

Почему не отображается картинка на сайте?

Почему не отображается картинка на сайте?

Давно я уже не писал ничего для новичков, в основном, пишу уже для достаточно опытных специалистов. Поэтому чтобы исправить это положение, я решил написать статью по теме наиболее частого вопроса, который я постоянно получаю: «Почему не отображается картинка на сайте?«. В этой статье я постараюсь разобрать все причины, почему изображение не появляется на сайте на основании того, что я видел у своих учеников.

Не будем тянуть резину, а сразу перейдём к делу.

Первая ошибка

<img scr="image.jpg" alt="Картинка" />

Тот, кто уже хорошо знает HTML, мгновенно найдёт в данном коде ошибку. А ошибка здесь синтаксическая, так как атрибута «scr» не существует, а правильно писать «src«. Ошибка очень распространена, поэтому я решил её поставить первой.

Вторая ошибка

<img src="image.jpg" alt="Картинка" />

Здесь никаких ошибок в коде не имеется, однако, если копнуть глубже, то название картинки, скорее всего, указано неправильно. Очень часто в ОС отключён показ расширений файлов, как следствие, image.jpg — это только имя файла, без расширения. Для решения проблемы надо включить показ расширений файлов в свойстве папок, далее увидеть, что файл называется, например, так: «image.jpg.png«, и это имя прописать в src.

Третья ошибка

<img src="image.jpg" alt="Картинка" />

Снова код правильный, однако, картинка всё равно не отображается. Если не помог предыдущий пункт, то, скорее всего, в браузере просто отключён показ картинок. Включите показ картинок в браузере, и Ваше изображение должно будет появиться.

Четвёртая ошибка

<img src="images/image.jpg" alt="Картинка" />

Очень часто ошибка состоит в том, что путь написан с ошибкой. А этот путь они просто откуда-то сдирают (с моего сайта, с книг, с моих курсов или ещё откуда-нибудь), не подумав о том, что это только путь, а не сама картинка. И по нему должна находиться само изображение. В большинстве случаев, её и близко нет. Иногда картинка имеется, но путь написан неправильно. Здесь надо просто уметь писать относительные пути. Начинается всё от каталога, в котором находится данная страница, далее пишем каталог, в котором находится картинка, а затем через слеш пишем название картинки. Если есть ещё один каталог на пути к картинке, то пишем и его (например, так: «images/photo/user1.jpg«). Если сама страница находится во внутреннем каталоге, также как и картинка, то нужно использовать «../» (например, так: «../images/image.jpg«). Всё просто, но вот возникают почему-то проблемы.

Я разобрал все ошибки, которые мне удалось вспомнить в своей практике. Если у Вас не отображается картинка на сайте, то 99.9% того, что решение Вы найдёте здесь, поэтому внимательно просмотрите всю статью и подумайте, что у Вас не так. И всегда помните, что ошибка может быть комплексной. Например, синтаксическая ошибка, путь указан неверно, да и имя неправильно написано. Такое тоже бывает, поэтому проверяйте себя на каждой ошибке, и после их исправления картинка обязательно появится на Вашем сайте.

  • Создано 07.05.2012 14:02:48


  • Михаил Русаков

Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!

Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.

Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления

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

Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

  1. Кнопка:

    Она выглядит вот так: Как создать свой сайт

  2. Текстовая ссылка:

    Она выглядит вот так: Как создать свой сайт

  3. BB-код ссылки для форумов (например, можете поставить её в подписи):

Редактирование изображений в CSS: смешение техник

От автора: в предыдущих двух уроках этой серии мы узнали, как фильтры и режимы наложения могут полностью изменить изображения. В этом же уроке я расскажу про основные моменты редактирования изображений css обоими способами.

Основы

Даже для примитивного редактирования изображений зачастую требуется более одного элемента. Сделать это можно при помощи псевдоэлементов. Но на нашем пути встает проблема. Тег img попадает под влияние заменяемых элементов, вследствие чего псевдоклассы :before и :after не работают с тегом изображения. Чтобы решить эту проблему, необходимо обернуть тег изображения в тег figure. Разметка будет такая:

<figure>

  <img src=«image-url»>

</figure>

У всех наших эффектов будет общий базовый CSS код:

Профессия Frontend-разработчик PRO

Готовим Frontend-разработчиков с нуля

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

Узнать подробнее

До 10 проектов в портфолио для старта карьеры

Подходит для новичков без опыта в программировании

Практика на вебинарах с разработчиками из крупных компаний

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

figure {

  position: relative;

}

figure:before,

figure:after {

  content: »;

  height: 100%;

  width: 100%;

  top: 0;

  left: 0;

  position: absolute;

}

img {

  width: 100%;

  height: 100%;

  margin: 0;

  padding: 0;

}

Я использовал псевдоклассы :before и :after, чтобы можно было применять разные режимы наложения. Обратите внимание на то, что я задал свойства width и height на 100%, чтобы изображение занимало всю площадь от figure. Для идеального выравнивания я использовал абсолютное позиционирование.

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

Высококонтрастные черно-белые изображения

Чтобы создать изображение с повышенной контрастностью, можно просто поставить контраст на максимум. Чтобы эффект был еще более драматичным, можно повысить яркость. Если бы вы просто работали с фильтрами, то большего вы бы сделать не смогли. Однако с режимами наложения можно добавить внутреннюю тень с режимом перекрытия overlay на изображении. CSS код эффекта:

img {

  filter: contrast(1.8) brightness(1.5) grayscale(1);

}

figure:before {

  zindex: 3;

  mixblendmode: overlay;

  boxshadow: 0 0 200px black inset;

}

С помощью свойства z-index можно поднять перекрывающий слой над изображением. Чтобы сделать изображение чуть темнее после применения тени, я использовал режим наложения overlay. Наведите курсор на изображение ниже, чтобы увидеть разницу между просто фильтрами и фильтрами в паре с режимами наложения.

В качестве практики можно поменять значения свойства box-shadow.

Состариваем изображение

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

img {

  filter: saturate(0.6);

}

figure {

  filter: contrast(1.1) saturate(1.9) sepia(0.7) grayscale(0.3);

}

figure:before {

  zindex: 2;

  mixblendmode: multiply;

  boxshadow: 0 0 250px brown inset;

  background: rgba(125, 100, 0, 0.3);

}

figure:after {

  zindex: 3;

  mixblendmode: hardlight;

  boxshadow: 0 0 150px pink inset;

  background: rgba(198, 155, 0, 0.3);

}

В этот раз я применил фильтры к изображению и тегу figure. Нам необходимо понизить цветность изображения. Сделать это можно, понизив значение фильтра насыщенности ниже 1. Фильтры к тегу figure применяются после всех режимов наложения. Если фильтры не применить, на финальном изображении будут более яркие оттенки коричневого, что нам не нужно.

Также вам стоит обратить внимание на то, что я применил полупрозрачный красный фон к обоим псевдоклассам. Именно этот фон придает красноватый оттенок. Свойство box-shadow используется для придания контуру коричневого оттенка.

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

Добавление оттенка

На сей раз, мы попробуем придать нашему изображению голубой оттенок. По сравнению с теплыми цветами, холодные оттенки намного приятнее для глаз. CSS код:

img {

  filter: brightness(1.1) contrast(1.3);

}

figure:before {

  zindex: 2;

  mixblendmode: multiply;

  boxshadow: 0 0 100px rgba(100, 150, 200, 1) inset, 0 0 300px rgba(100, 150, 200, 1) inset;

}

figure:after {

  zindex: 3;

  mixblendmode: difference;

  background: rgba(0, 0, 255, 0.3);

}

Я начну с увеличения яркости и контрастности изображения. Так наше изображение не потеряет незаметные цвета, а редактирование не будет таким скучным.

Для более заметных изменений необходимо использовать несколько свойств box-shadow со светлыми цветами. Именно поэтому я добавил две голубых тени box-shadow. Свойство box-shadow направляет тень внутрь изображения, и она не выходит за его рамки. Для полной заливки изображения голубым оттенком я использовал псевдокласс :after. Конечный результат после всех фильтров:

Попробуйте изменить оттенок на красный или зеленый.

Желтоватая дымка

Вы когда-нибудь наблюдали такую погоду, когда облачным вечером ветер гоняет песчинки по воздуху? Когда на улице такая погода, все приобретает желтоватый оттенок, а объекты теряют цветность. Для создания такого эффекта нам нужен следующий код CSS:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

img {

  filter: saturate(0.2);

}

figure {

  filter: contrast(1.8) brightness(1.1) saturate(1.5);

}

figure:before {

  zindex: 2;

  mixblendmode: multiply;

  boxshadow: 0 0 100px rgba(0,0,0,0.5) inset;

  background: rgba(125, 100, 0, 0.3);

}

figure:after {

  zindex: 3;

  mixblendmode: hardlight;

  boxshadow: 0 0 500px rgba(0,0,0,0.6) inset;

  background: rgba(198, 155, 0, 0.3);

}

Первым шагом я понижаю насыщенность изображения. На оба псевдокласса :before и :after наложен полупрозрачный желтоватый фон, добавляющий нужный эффект. Режим наложения hard-light на псевдоклассе :after делает эффект ярче.

Свойство box-shadow на псевдоклассах заставляет сфокусироваться на байкере. И наконец, фильтры contrast, brightness и saturation на теге figure еще сильнее усиливают эффект.

Заключительные мысли

Редактировать изображения в CSS не так и сложно. Если вы запомните описанные мной способы, вы сможете создавать удивительно красивые фильтры.

В качестве практики можете поэкспериментировать с демо из урока, а также вы можете попытаться воссоздать популярные фильтры из Instagram*.

Редакция: Monty Shokeen

Источник: //code.tutsplus.com/

Редакция: Команда webformyself.

Профессия Frontend-разработчик PRO

Готовим Frontend-разработчиков с нуля

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

Узнать подробнее

До 10 проектов в портфолио для старта карьеры

Подходит для новичков без опыта в программировании

Практика на вебинарах с разработчиками из крупных компаний

* Признана экстремистской организацией и запрещена в Российской Федерации.

Существую CSS-свойства, которые используют изображения для создания фона элементов, создания рамок и масок «слоев», а также вырезки частей изображения. Применяя их, вы сможете добавлять изображения к элементам страницы и контролировать их положение и поведение.

Однако, существуют другие свойства, которые используются не так часто и применяются непосредственно к изображениям (тегу <img />). Использование тега является наиболее предпочтительными способом размещения изображений на страницах.

Предназначение указанных css свойств, применяемых к изображениям различное: от создания тени до увеличения резкости. Они помогают нам лучше контролировать положение и внешний вид изображений, добавляемых с помощью тега .

Давайте рассмотрим каждый из них подробнее.

Усиление резкости изображений с image-rendering

Поддержка браузерами — 90,82% (на 11.2017)

При масштабировании изображения браузер сглаживает его, чтобы оно не выглядело пиксельным, но в зависимости от разрешения изображения и экрана, результат не всегда получается приемлемым. Вы можете контролировать поведение браузера при сглаживании изображения с помощью свойства image-rendering.

Это широко поддерживаемое свойство контролирует алгоритм, применяемый браузером при масштабировании. Оно имеет 2 значения: crisp-edges и pixelated.

Значение crisp-edges удерживает цветовой контраст между пикселями. Другими словами, никакого сглаживания не производится, что отлично подходит для создания контраста.

Когда используется pixelated, соседние пиксели определенного пикселя объединиться с ним, создавая впечатление, будто они образуют один большой пиксель, отличный для экранов с высоким разрешением.

Если вы внимательно посмотрите на края цветов на gif-изображении, представленном ниже, вы сможете увидеть разницу между изображениями: обычным и с примененным CSS-свойством image-rendering: pixelated.

CSS

img {
  image-rendering: pixelated;
}

Растягивание изображений с помощью object-fit

Поддержка браузерами — 89,7% (на 11.2017)

Значения contain, cover, fill похожи на аналогичные значения свойства background-size, которое указывает как фоновое изображение заполняет какой-либо элемент. Свойство object-fit очень похоже на упомянутое выше свойство background-size, так как оно также определяет размер изображения внутри его контейнера. Значение contain масштабирует изображение внутри контейнера. Cover делает тоже самое, но если соотношение сторон изображения и контейнера не совпадают, изображение обрезается. Fill заставляет изображение растягиваться и заполнять его контейнер. scale-down уменьшает изображение чтобы оно поместилось внутри контейнера.

HTML

<div id='container'>
  <img src="/rose.png' alt="rose flower'>
</div>

CSS

#container {
  width: 300px;
  height: 300px;
}
img {
  width: 100%;
  height: 100%;
  object-fit: contain;
}

Сдвиги изображений с помощью object-position

Поддержка браузерами — 89,7% (на 11.2017)

Аналогично дополняющему background-position свойству background-size, существует свойство object-position, которое дополняет object-fit.
Свойство object-position позволяет сдвинуть изображение внутри его контейнера. Координаты можно указывать в абсолютных и относительных величинах, использовать ключевые слова или комбинировать различные значения (top 20px right 5px, center right 80px).

HTML

<div id='container'>
  <img src="/rose.png' alt="rose flower'>
</div>

CSS

#container {
  width: 300px;
  height: 300px;
}
img {
  width: 100%;
  height: 100%;
  object-position: 150px 0;
}

Выравнивание изображений с помощью vertical-align

Иногда мы добавляем тег <img /> (который по своей природе является строчным элементом) внутрь текста в качестве иллюстраций или для украшения. В таких случаях выравнивание изображений и текста в необходимом нам положении может стать сложной задачей, если вы не знаете какое свойство применить.

Свойство vertical-align применяется не только в ячейках таблиц. Оно также может выравнивать строчные элементы, родителями которых также являются строчные элементы, поэтому с его помощью мы можем выровнять изображение внутри строки текста. У этого свойства имеется довольно много значений, которые можно применить к строчным элементам, поэтому вам будет из чего выбрать.

HTML

<p>
PDF <img width="15px" src="/pdf.png"
style="vertical-align:text-top" alt="Image">
</p>

Добавляем тень, используя filter: drop-shadow()

Тени, применяемые к тексту и блочным элементам, могут сделать ваши страницы более привлекательными. То же самое относится и к изображениям. Значения, которые передаются filter: drop-shadow() очень похожи на значения CSS-свойств для создания тени (text-shadow, box-shadow). Первые 2 указывают вертикальный и горизонтальный отступ тени от изображения, третий и четвёртый – степень размытия и радиус распространения тени, а последнее, пятое значение – цвет тени.

Как text-shadow и drop-shadow тень добавляется к объектам, к которым применяется этот фильтр. При использовании filter: drop-shadow() к изображениям во внимание принимаются прозрачные участки в изображении и тень отбрасывается с их учётом.

Оригинал статьи — http://www.hongkiat.com/blog/img-css-properties/

Перевод: Матвей Земсков

Мои услуги

Предлагаю следующие услуги:

  • Верстка шаблона сайта из дизайн-макета для CMS «1С-Битрикс Управление сайтом» и CMS “Joomla”
  • Создание форм различной сложности (обратная связь, анкеты и тп) для указанных CMS
  • Настройка и кастомизация компонентов и модулей для указанных CMS
  • Доработка модулей и компонентов для указанных CMS, добавление нестандартного функционала
  • Разработка лендингов (landing-pages)

По все вопросам обращайтесь через форму обратной связи

I am using following simple HTML :

   <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <html>
    <body>
            <img src="loading.gif" alt="MISSING GIF"> 
            <img src="j.JPG" alt="MISSING JPG">              
    </body>
    </html>

loading.gif and j.jpg are present in same directory as html file. loading.gif is displayed fine in ie 8 but j.jpg doesn’t load.

When I use firefix, both images display correctly.

Please help

Barnee's user avatar

Barnee

3,1728 gold badges39 silver badges52 bronze badges

asked Jan 26, 2013 at 19:09

Aman Khanna's user avatar

2

Check that JPG file extension is uppercase in the file system. I suspect that it is lowercase. Also be sure to close the image tag.

<img src="j.jpg" alt="MISSING JPG"/> 

answered Jan 26, 2013 at 19:11

Kevin Bowersox's user avatar

Kevin BowersoxKevin Bowersox

92.9k19 gold badges157 silver badges187 bronze badges

4

<img src="loading.gif" alt="MISSING GIF">

will be like this

<img id="ImgEmployee" src="Photos/loading.gif" alt="MISSING GIF" />

answered Jan 26, 2013 at 19:14

A.Goutam's user avatar

A.GoutamA.Goutam

3,3428 gold badges40 silver badges88 bronze badges

0

I had the same problem, i deiscovered that when working with wordpress you should use this code for images:

<img src="<?php bloginfo('template_directory'); ?>/images/example.jpg" alt = "example">

answered May 2, 2014 at 11:59

Novakim's user avatar

Was the img file originally in another extension? If so, revert to the original extension.

I took a screenshot on my Windows PC in .png format. I changed the extension to .jpg (thinking it would work the same as my Mac). IE didn’t like it, but Firefox was fine with it.

<img src="1.jpg" />

I changed the extension back to .png, and it worked fine in both browsers.

<img src="1.png" />

answered Apr 2, 2015 at 0:31

Montaz Meah II's user avatar

lowercase the extension, and close the img tags, you are using XHTML 1.0 Strict !

<img src="loading.gif" alt="MISSING GIF" />  
<img src="j.jpg" alt="MISSING JPG" /> 

EDIT: maybe you hit a IE8 bug… +1 to the question :)

Let’s try like this: using a page really XHTML 1.0 Strict compliant,

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html 
     PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
      <title>hi!</title>
   </head>
   <body>
      <div>
         j.JPG : <img src="j.JPG" alt="MISSING JPG" /> 
                 (upper case) <br/>
         j.jPG : <img src="j.jPG" alt="MISSING JPG" /> 
                 (first lower case, others upper case <br/>
         j.jpg : <img src="j.jpg" alt="MISSING JPG" /> 
                 (lower case) <br/> 
      </div>
   </body>
</html>

create two copies of the file, so you will have the three files listed above. Then run the page in IE8 and tell us which one is working…

answered Jan 26, 2013 at 19:12

Andrea Ligios's user avatar

Andrea LigiosAndrea Ligios

49.3k26 gold badges114 silver badges242 bronze badges

8

Is it broken in IE9/10 too?

Also, if the code you posted above is exactly what’s in your file, you have an incorrect character (`) right before the doctype declaration.

Internet Explorer breaks when your HTML is wrong, browsers like Firefox are much more lenient and try and fix things for you.

answered Jan 26, 2013 at 19:55

Ian Devlin's user avatar

Ian DevlinIan Devlin

18.4k6 gold badges55 silver badges73 bronze badges

1

I think it is because of the specific images. Check if you have permission to use those files.
I also had the same problem. I had two OS(Ubuntu and Windows) running and the image I was using was coming from Windows local disk. After I solved this permission issue, it worked.

answered Mar 21, 2014 at 5:56

recently i was working in a web project using WAMP server. i placed my web site under c:/wamp/www/my_site folder and referenced an image from this folder on a page. the image did not display. i referenced another image at desktop…bingo, it worked. i think its the permission thing
:)

The Heist's user avatar

The Heist

1,4381 gold badge16 silver badges32 bronze badges

answered Apr 26, 2014 at 4:30

rens's user avatar

rensrens

492 silver badges8 bronze badges

Did you checked if there is some difference in the header? This happens sometimes that due to some GET requests header changes to something like this: {https:www.xyz.com/?id=blah-blah}.
Now since no such file exist in the directory, the img tag remains clueless that actually where it had to look for the resource. You need to change send header again to the same page so that no GET request get connected to the address this time.
Took me a long time to figure out.

answered Mar 9, 2019 at 17:25

Subrat Saxena's user avatar

Check for cors setting, sometime server might be configured to reject such requests and if accessing the image from different that there are high chances of that the resulting server might be switched off the hot loading of images.

Resources:

https://en.wikipedia.org/wiki/Cross-origin_resource_sharing

answered Nov 27, 2022 at 12:25

Abhishek Gurjar's user avatar

Abhishek GurjarAbhishek Gurjar

7,42610 gold badges37 silver badges45 bronze badges

Another possible issue that happened to me:

Your adblocker might be blocking the image.
Yes, even if the image is hosted on the same website. In my case, I had a bunch of images under /banners/imagename.jpg, which uBlockOrigin all blocked from loading. That’s why not even the alt tag showed up.

Check the Network tab, it should show you there what went wrong. In my case, this is what I found:
enter image description here

answered Mar 26 at 12:34

Plagiatus's user avatar

PlagiatusPlagiatus

3522 silver badges12 bronze badges

Понравилась статья? Поделить с друзьями:
  • Как составить бизнес план для открытия собственного дела образец
  • Скайрим как найти оценщика
  • Метод объекта не обнаружен сведенияовнешнейобработке как исправить
  • Warframe как найти джаггернаута
  • Как составить медийный план