ФронтендHTML / CSS

Почему картинка не отображается в HTML: img, src, путь к файлу и регистр

Разбираем сломанную картинку в HTML по цепочке: тег img, относительный путь, структура папок, расширение, регистр букв, DevTools и сетевой ответ 404.

Кодик

Автор

5 мин чтения

Если вместо изображения видна пустая рамка или значок ошибки, браузер почти всегда не нашёл файл по адресу из src. Сначала проверьте имя и расширение, затем считайте путь от HTML-файла, откройте Network в DevTools и найдите запрос со статусом 404. Сам тег img обычно исправен.

Браузер не ищет картинку по всему компьютеру. Он берёт адрес из src и разрешает его относительно URL текущей страницы. Поэтому файл может лежать прямо рядом, но путь images/cat.png ведёт в несуществующую подпапку. На Windows ещё легко пропустить разницу между Photo.PNG и photo.png, а после публикации сайт на Linux перестаёт прощать такой регистр.

1Сверяем имя

Проверяем точное расширение, пробелы и регистр букв в имени файла.

2Считаем путь

Идём от файла страницы к папке изображения, а не от корня диска.

3Читаем запрос

В Network смотрим полный URL, статус и ответ сервера вместо перебора вариантов.

Как браузер превращает src в адрес картинки

Атрибут src принимает URL. Он бывает относительным, например images/avatar.png, или абсолютным, например https://example.com/avatar.png. Относительный путь начинается от адреса HTML-документа. Запись ../ поднимается на одну папку, а начальный слеш /images/avatar.png идёт от корня сайта. Это четыре разных адреса, даже если имя файла одинаковое.

СтруктураsrcКуда смотрит браузер
index.html и cat.png рядомcat.pngВ ту же папку
Картинка в images/images/cat.pngВ подпапку images
HTML в pages/, картинка в images/../images/cat.pngСначала на уровень вверх
Файл доступен от корня сайта/images/cat.pngОт домена, а не от текущей папки

Схема преобразования относительного пути img src в адрес изображения
Браузер соединяет адрес страницы и src. Ошибка в одном сегменте приводит к другому URL.

Путь считается от страницы, а не от CSS и не от проекта в проводнике. Откройте страницу в браузере и мысленно подставьте значение src после её текущего URL. Так ошибка становится видна без угадывания.

Собираем минимальный рабочий пример

Положите index.html рядом с папкой images, а внутрь папки добавьте файл cat.jpg. Укажите размеры, чтобы страница заранее зарезервировала место, и напишите осмысленный alt. Alt не чинит путь, но объясняет содержание, если изображение не загрузилось или страницу читает экранный диктор.

<!doctype html>
<html lang="ru">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>Карточка питомца</title>
</head>
<body>
  <figure>
    <img
      src="images/cat.jpg"
      width="640"
      height="426"
      alt="Рыжий кот сидит у окна">
    <figcaption>Фото лежит в папке images рядом с index.html.</figcaption>
  </figure>
</body>
</html>
Что проверить в браузере
  • На странице видна фотография размером до 640 на 426 пикселей, а под ней находится подпись.
  • Во вкладке Network запрос cat.jpg получает статус 200, а его тип начинается с image/.
  • Если временно переименовать файл, появляется alt-текст, а Network показывает ошибочный запрос.

Сравнение неправильного и правильного пути к картинке в HTML
Структура папок и src должны описывать один и тот же маршрут.

Как за минуту найти 404 через DevTools

Откройте инструменты разработчика клавишей F12, перейдите во вкладку Network и обновите страницу. Включите фильтр Img. Красная строка покажет адрес, который запросил браузер. Скопируйте Request URL и откройте в новой вкладке. Если сервер отвечает 404, исправлять CSS бессмысленно: сначала нужен правильный URL.

Что видноПричинаСледующая проверка
404 Not FoundФайла нет по указанному адресуПуть, имя, регистр и публикация файла
200, но не изображениеСервер вернул HTML или ошибочную заглушкуContent-Type и содержимое ответа
Запроса нетТег не попал в DOM или src пустойElements и итоговая разметка
Локально работает, на сайте нетРазный регистр или файл не загруженРепозиторий и точное имя на сервере
Статус 404 экономит десять случайных правок. Он доказывает, что проблема находится между URL и файлом. Размер, display и другие стили проверяйте только после ответа 200.

Практика: ломаем путь и чиним его по сигналам

Полезно один раз намеренно сломать пример. Тогда значок ошибки перестаёт быть загадкой: вы увидите, как конкретная опечатка превращается в конкретный URL. Используйте Live Server или другой локальный сервер, потому что адреса опубликованного сайта ближе к HTTP, чем открытие файла через file://.

Четыре контролируемые поломки
  1. Откройте рабочий пример и убедитесь, что images/cat.jpg получает 200.
  2. Замените папку на image/cat.jpg. Найдите 404 и сравните Request URL со структурой проекта.
  3. Верните папку, но напишите Cat.JPG. Проверьте, совпадает ли регистр с настоящим файлом.
  4. Добавьте к имени лишний пробел перед расширением и снова найдите его в закодированном URL.
  5. Верните точный путь и проверьте, что статус стал 200 без изменений CSS.
  6. Переместите HTML в папку pages и осознанно измените путь на ../images/cat.jpg.
Результат практики
  • Вы умеете вычислить путь по структуре папок, а не подбирать количество ../.
  • Вы отличаете проблему загрузки от проблемы размера или видимости.
  • Вы можете доказать исправление статусом 200 и открытием URL картинки отдельно.

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

Частые причины, которые выглядят одинаково

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

Расширение скрыто проводником

Файл называется cat.jpg.png, хотя виден как cat.jpg. Включите отображение расширений и переименуйте точно.

В пути стоят обратные слеши

В URL используйте прямой слеш: images/cat.jpg. Путь Windows C:\... не является адресом сайта.

Регистр совпадает только локально

Logo.PNG и logo.png могут считаться разными файлами на сервере. Договоритесь о нижнем регистре.

Картинка загрузилась, но скрыта

При статусе 200 проверьте display, нулевую ширину, прозрачность и перекрытие. Это уже отдельный уровень, не путь.

Фиксируйте доказательство. Рабочий результат означает три вещи сразу: правильный URL, ответ 200 с типом image и видимый элемент ненулевого размера. Технические детали сверены с справкой MDN по элементу img.
Короткие ответы
Откуда считается относительный путь в src?

От URL текущего HTML-документа.

Как перейти к родительской папке в src?

Путь ../ поднимает поиск на один уровень выше относительно текущей папки страницы.

Почему локально работает, а после публикации нет?

Частая причина: различие регистра букв или незагруженный файл.

Что первым смотреть в DevTools?

Request URL и HTTP-статус запроса картинки во вкладке Network.

Нужно ли чинить CSS при статусе 404?

Нет. Сначала сделайте URL правильным и получите ответ 200.

Закрепите путь на живой странице

Соберите структуру страницы в курсе HTML, а оформление добавьте в курсе CSS. Там каждый ресурс сразу виден в результате, поэтому связь между файлом и адресом запоминается быстрее.

После этого опубликуйте работу по гайду GitHub Pages, проверьте адаптивность на телефоне и подключите поведение через JavaScript.