Оформление незагруженных изображений
Перевод статьи Styling Broken Images с сайта bitsofco.de, опубликовано на css-live.ru с разрешения автора — Ире Адеринокун.
Незагруженные изображения уродливы
Но им необязательно всегда быть такими. Можно воспользоваться CSS для оформления элемента <img>
, чтобы впечатление от них было лучше, чем по умолчанию.
Пара фактов об элементе <img>
Чтобы понимать, как оформлять незагруженные картинки, для начала нужно знать пару особенностей в поведении элемента <img>
.
- К элементу
<img>
можно применять обычное шрифтовое оформление. Эти стили применяются к альтернативному тексту в случае его отображения, и не влияют на рабочее изображение. - Элемент
<img>
замещаемый. Это элемент, «внешний вид и размеры которого определяются внешними ресурсами» (Sitepoint). Поскольку элемент управляется внешним источником, псевдоэлементы:before
и:after
, как правило, к нему не применяются. Однако, когда изображение не загружается из-за сбоя, эти псевдоэлементы могут отобразиться.
Из-за этих особенностей, можно применять к элементу <img>
такие стили, которые отобразятся только когда изображение поломано, а рабочее изображение мы оставим без изменений.
Применим это на практике
Учитывая эту информацию, вот некоторые примеры оформления незагруженных картинок, со следующим неправильным адресом:
<img src="http://bitsofco.de/broken.jpg" alt="Канье смеётся">
Добавление полезной информации
Один из способов обработать незагруженные изображение — сообщить пользователю, что изображение не загружено. С помощью выражения attr()
можно даже отобразить ссылку на незагруженное изображение.
img { font-family: 'Helvetica'; font-weight: 300; line-height: 2; text-align: center; width: 100%; height: auto; display: block; position: relative; } img:before { content: "Извините, изображение не загруженно :("; display: block; margin-bottom: 10px; } img:after { content: "(url: " attr(src) ")"; display: block; font-size: 12px; }
Размещение альтернативного текста по умолчанию
Кроме того, можно использовать псевдоэлементы, чтобы заменить дефолтный текст в alt
, спозиционировав псевдоэлемент поверх дефолтного текста, закрывая его.
img { /* те же стили, что и в первом примере */ } img:after { content: "\f1c5" " " attr(alt); font-size: 16px; font-family: FontAwesome; color: rgb(100, 100, 100); display: block; position: absolute; z-index: 2; top: 0; left: 0; width: 100%; height: 100%; background-color: #fff; }
Дополнительное оформление
В дополнение к отображению пользовательского сообщения (или вместо него), можно воспользоваться псевдоэлементами, чтобы ещё лучше оформить незагруженные картинки.
img { /* те же стили, что и в первом примере */ min-height: 50px; } img:before { content: " "; display: block; position: absolute; top: -10px; left: 0; height: calc(100% + 10px); width: 100%; background-color: rgb(230, 230, 230); border: 2px dotted rgb(200, 200, 200); border-radius: 5px; } img:after { content: "\f127" " Незагруженная картинка, на которой " attr(alt); display: block; font-size: 16px; font-style: normal; font-family: FontAwesome; color: rgb(100, 100, 100); position: absolute; top: 5px; left: 0; width: 100%; text-align: center; }
Если изображение загружается, при всех тех же стилях для элемента, тогда картинка отображается как обычно. Псевдоэлементы вообще не генерируются.
Поддержка браузерами
К сожалению, не все браузеры обрабатывают незагруженные изображения одинаково. В некоторых браузерах, даже если картинка не загружается, псевдоэлементы вообще не отображаются.
Вот результаты моих тестов:
Браузер | Текст в Alt | :before | :after |
---|---|---|---|
Chrome (Компьютер и Android) | ✓ | ✓ | ✓ |
Firefox (Компьютер and Android) | ✓ | ✓ | ✓ |
Opera (Компьютер) | ✓ | ✓ | ✓ |
Opera Mini | ✓ ** | ✗ | ✗ |
Safari (Компьютер and iOS) | ✓ * | ✗ | ✗ |
iOS Webview (Chrome, Firefox, другие) | ✓ * | ✗ | ✗ |
* Текст в alt отобразится только в том случае, если он умещается в ширину изображения.
** Шрифтовое оформление не применяется.
Для браузеров, в которых нет поддержки псевдоэлементов, применяемые стили игнорируются, так что никакого вреда от них не будет. Это значит, что можно по-прежнему применять стили и больше радовать пользователей в поддерживающих браузерах.
Перевод статьи Styling Broken Images с сайта bitsofco.de, опубликовано на css-live.ru с разрешения автора — Ире Адеринокун.
P.S. Это тоже может быть интересно:
Тема с Канье, неожиданно для статей такого характера, порадовала. Посмеялся спасибо))
Аналогично :) Подобный юмор очень уместен в подобных статьях, и делает их прочтение более лёгким и интересным.
content: "\f1c5" " " attr(alt);
— прошу прощения, а зачем столько кавычек? И ещё: иконки хранятся в самом браузере? То есть могут быть различны для различных браузеров?Иконки тут шрифтовые (используется FontAwesome), поэтому отображаться будут более-менее одинаково с точностью до рендеринга шрифта. А отдельные кавычки для Unicode-подстановки — думаю, для наглядности (чтоб не напрягаться, где именно подстановка, а где символы — в данном случае пробел — читаются «как есть»), но это дело вкуса, вполне можно записать их и одной строкой.
Тут ведь еще заодно демонстрируется не очень популярная возможность свойства
content
, что оно может быть составным, собранным из нескольких строк, картинок и значенийattr
. Причем эти значения «склеиваются» без пробелов. Поэтому необходимый пробел между символом-иконкой и значением атрибута добавляется как отдельная строка — опять же для наглядности, полагаю. А в следующем примере там уже полноценная строка с пробелами по краям.Ну, то есть, если взять мой пример, то там будет три пробела, верно?
Ну а в целом, идея понятна, спасибо!
Нет, пробел будет один. Итоговое значение склеивается из трех строк: «\f1c5″ — шрифтовая иконка-символ, » » — пробел между ней и последующим текстом, attr(…) — текст атрибута. Пробелы между самими этими строками не учитываются, они лишь для удобства записи.
То есть вот это: » » » » (или ‘ ‘ ‘ ‘ ‘ ‘) будет восприниматься как один пробел? А если нужно больше, то нужно ставить?
ой, наверное, нужно было тэг код ставить:
нужно ставить, чтоб получить больше одного пробела
Не хочет вордпресс аперсанд-нбсп-английскими точка с запятой отображать хоть с тегом код, хоть нет :-)
Отличное решение на счет использования content:attr(alt). Первый раз увидел такой подход.