CSS-функция `image()`
image() — это CSS-функция, которая задаёт <image> подобно функции url(), но с дополнительными возможностями: можно указать направление изображения, отображать только часть изображения, заданную медиафрагментом, и указать сплошной цвет в качестве запасного варианта на случай, если ни одно из заданных изображений не удастся отобразить.
Примечание: CSS-функцию image() не следует путать с конструктором <code>Image()</code> интерфейса <code>HTMLImageElement</code>.
Синтаксис
/* Basic usage */
image("image1.jpg");
image(url("image2.jpg"));
/* Bidi-sensitive Images */
image(ltr "image1.jpg");
image(rtl "image1.jpg");
/* Image Fallbacks */
image("image1.jpg", black);
/* Image Fragments */
image("image1.jpg#xywh=40,0,20,20");
/* Solid-color Images */
image(rgb(0 0 255 / 0.5)), url("bg-image.png");
Значения
- Направление изображения:
ltrдля направления слева направо илиrtlдля направления справа налево. -
image-srcНеобязательный - Ноль или более
<url>или<string>, задающих источники изображений, с необязательными идентификаторами фрагментов изображения. -
colorНеобязательный - Цвет, задающий сплошной цвет фона, который используется в качестве запасного варианта, если ни один
image-srcне найден, не поддерживается или не указан.
Поддержка двунаправленного текста
Первый необязательный параметр нотации image() задаёт направление изображения. Если этот параметр указан и изображение используется на элементе с противоположным направлением текста, изображение будет отражено по горизонтали в режимах горизонтального письма. Если направление не задано, изображение не будет отражено при смене направления языка.
Фрагменты изображений
Одно из ключевых различий между url() и image() заключается в возможности добавить к источнику изображения идентификатор медиафрагмента — начальную точку по осям X и Y, а также ширину и высоту, — чтобы отобразить только часть исходного изображения. Часть изображения, заданная параметром, становится самостоятельным изображением. Синтаксис выглядит так:
background-image: image("my-image.webp#xywh=0,20,40,60");
Фоновым изображением элемента будет часть изображения myImage.webp, начинающаяся в точке с координатами 0px, 20px (в левом верхнем углу) и имеющая ширину 40px и высоту 60px.
Синтаксис медиафрагмента #xywh=#,#,#,# принимает четыре числовых значения, разделённых запятыми. Первые два значения задают координаты X и Y начальной точки создаваемой области. Третье значение задаёт ширину области, а последнее — её высоту. По умолчанию используются значения в пикселях. Определение пространственных измерений в спецификации медиафрагментов указывает, что также будут поддерживаться проценты:
xywh=160,120,320,240 /* results in a 320x240 image at x=160 and y=120 */ xywh=pixel:160,120,320,240 /* results in a 320x240 image at x=160 and y=120 */ xywh=percent:25,25,50,50 /* results in a 50%x50% image at x=25% and y=25% */
Фрагменты изображений можно использовать и в нотации url(). Синтаксис медиафрагментов #xywh=#,#,#,# «обратно совместим»: медиафрагмент будет проигнорирован, если браузер его не распознаёт, и не нарушит вызов источника при использовании с url(). Если браузер не распознаёт синтаксис медиафрагментов, он игнорирует фрагмент и отображает изображение целиком.
Браузеры, распознающие image(), также понимают синтаксис фрагментов. Поэтому, если фрагмент не распознаётся в image(), изображение будет считаться недопустимым.
Запасной цвет
Если вместе с источниками изображений в image() указан цвет, он используется в качестве запасного варианта, если изображения недопустимы и не отображаются. В таких случаях функция image() работает так, словно изображение не задано, создавая изображение сплошного цвета. Например, рассмотрим тёмное изображение, используемое в качестве фона для белого текста. Если изображение не загрузится, для читаемости текста переднего плана может потребоваться тёмный цвет фона.
Можно не указывать источники изображений, задав только цвет: это создаст цветовой образец. В отличие от задания background-color, которое располагается под всеми фоновыми изображениями или позади них, такой способ позволяет накладывать (обычно полупрозрачные) цвета поверх других изображений.
Размер цветового образца можно задать с помощью свойства background-size. Это отличается от background-color, которое задаёт цвет для всего элемента. На размещение как image(color), так и background-color влияют свойства background-clip и background-origin.
Формальный синтаксис
<image()> = image( <image-tags>? [ <image-src>? , <color>? ]! ) <image-tags> = ltr | rtl <image-src> = <url> | <string> <color> = <color-base> | currentColor | <system-color> | <light-dark()> | <deprecated-system-color> <color-base> = <hex-color> | <color-function> | <named-color> | <color-mix()> | transparent <system-color> = AccentColor | AccentColorText | ActiveText | ButtonBorder | ButtonFace | ButtonText | Canvas | CanvasText | Field | FieldText | GrayText | Highlight | HighlightText | LinkText | Mark | MarkText | SelectedItem | SelectedItemText | VisitedText <light-dark()> = light-dark( <color>, <color> ) <deprecated-system-color> = ActiveBorder | ActiveCaption | AppWorkspace | Background | ButtonHighlight | ButtonShadow | CaptionText | InactiveBorder | InactiveCaption | InactiveCaptionText | InfoBackground | InfoText | Menu | MenuText | Scrollbar | ThreeDDarkShadow | ThreeDFace | ThreeDHighlight | ThreeDLightShadow | ThreeDShadow | Window | WindowFrame | WindowText <color-function> = <rgb()> | <rgba()> | <hsl()> | <hsla()> | <hwb()> | <lab()> | <lch()> | <oklab()> | <oklch()> | <color()> <named-color> = aliceblue | antiquewhite | aqua | aquamarine | azure | beige | bisque | black | blanchedalmond | blue | blueviolet | brown | burlywood | cadetblue | chartreuse | chocolate | coral | cornflowerblue | cornsilk | crimson | cyan | darkblue | darkcyan | darkgoldenrod | darkgray | darkgreen | darkgrey | darkkhaki | darkmagenta | darkolivegreen | darkorange | darkorchid | darkred | darksalmon | darkseagreen | darkslateblue | darkslategray | darkslategrey | darkturquoise | darkviolet | deeppink | deepskyblue | dimgray | dimgrey | dodgerblue | firebrick | floralwhite | forestgreen | fuchsia | gainsboro | ghostwhite | gold | goldenrod | gray | green | greenyellow | grey | honeydew | hotpink | indianred | indigo | ivory | khaki | lavender | lavenderblush | lawngreen | lemonchiffon | lightblue | lightcoral | lightcyan | lightgoldenrodyellow | lightgray | lightgreen | lightgrey | lightpink | lightsalmon | lightseagreen | lightskyblue | lightslategray | lightslategrey | lightsteelblue | lightyellow | lime | limegreen | linen | magenta | maroon | mediumaquamarine | mediumblue | mediumorchid | mediumpurple | mediumseagreen | mediumslateblue | mediumspringgreen | mediumturquoise | mediumvioletred | midnightblue | mintcream | mistyrose | moccasin | navajowhite | navy | oldlace | olive | olivedrab | orange | orangered | orchid | palegoldenrod | palegreen | paleturquoise | palevioletred | papayawhip | peachpuff | peru | pink | plum | powderblue | purple | rebeccapurple | red | rosybrown | royalblue | saddlebrown | salmon | sandybrown | seagreen | seashell | sienna | silver | skyblue | slateblue | slategray | slategrey | snow | springgreen | steelblue | tan | teal | thistle | tomato | turquoise | violet | wheat | white | whitesmoke | yellow | yellowgreen <color-mix()> = color-mix( <color-interpolation-method> , [ <color> && <percentage [0,100]>? ]#{2}) <rgb()> = rgb( <percentage>#{3} , <alpha-value>? ) | rgb( <number>#{3} , <alpha-value>? ) | rgb( [ <number> | <percentage> | none ]{3} [ / [ <alpha-value> | none ] ]? ) <rgba()> = rgba( <percentage>#{3} , <alpha-value>? ) | rgba( <number>#{3} , <alpha-value>? ) | rgba( [ <number> | <percentage> | none ]{3} [ / [ <alpha-value> | none ] ]? ) <hsl()> = hsl( <hue>, <percentage>, <percentage>, <alpha-value>? ) | hsl( [ <hue> | none ] [ <percentage> | <number> | none ] [ <percentage> | <number> | none ] [ / [ <alpha-value> | none ] ]? ) <hsla()> = hsla( <hue>, <percentage>, <percentage>, <alpha-value>? ) | hsla( [ <hue> | none ] [ <percentage> | <number> | none ] [ <percentage> | <number> | none ] [ / [ <alpha-value> | none ] ]? ) <hwb()> = hwb( [ <hue> | none ] [ <percentage> | <number> | none ] [ <percentage> | <number> | none ] [ / [ <alpha-value> | none ] ]? ) <lab()> = lab( [<percentage> | <number> | none] [ <percentage> | <number> | none] [ <percentage> | <number> | none] [ / [<alpha-value> | none] ]? ) <lch()> = lch( [<percentage> | <number> | none] [ <percentage> | <number> | none] [ <hue> | none] [ / [<alpha-value> | none] ]? ) <oklab()> = oklab( [ <percentage> | <number> | none] [ <percentage> | <number> | none] [ <percentage> | <number> | none] [ / [<alpha-value> | none] ]? ) <oklch()> = oklch( [ <percentage> | <number> | none] [ <percentage> | <number> | none] [ <hue> | none] [ / [<alpha-value> | none] ]? ) <color()> = color( [ from <color> ]? <colorspace-params> [ / [ <alpha-value> | none ] ]? ) <color-interpolation-method> = in [ <rectangular-color-space> | <polar-color-space> <hue-interpolation-method>? | <custom-color-space> ] <alpha-value> = <number> | <percentage> <hue> = <number> | <angle> <colorspace-params> = [<custom-params> | <predefined-rgb-params> | <xyz-params>] <rectangular-color-space> = srgb | srgb-linear | display-p3 | display-p3-linear | a98-rgb | prophoto-rgb | rec2020 | lab | oklab | xyz | xyz-d50 | xyz-d65 <polar-color-space> = hsl | hwb | lch | oklch <hue-interpolation-method> = [ shorter | longer | increasing | decreasing ] hue <custom-color-space> = <dashed-ident> <custom-params> = <dashed-ident> [ <number> | <percentage> | none ]+ <predefined-rgb-params> = <predefined-rgb> [ <number> | <percentage> | none ]{3} <xyz-params> = <xyz> [ <number> | <percentage> | none ]{3} <predefined-rgb> = srgb | srgb-linear | display-p3 | display-p3-linear | a98-rgb | prophoto-rgb | rec2020 <xyz> = xyz | xyz-d50 | xyz-d65
Доступность
Браузеры не предоставляют вспомогательным технологиям специальную информацию о фоновых изображениях. Это особенно важно для программ чтения с экрана: они не объявляют о наличии таких изображений и, следовательно, не сообщают о них пользователям. Если изображение содержит информацию, важную для понимания общей цели страницы, лучше описать её семантически в документе.
- MDN: пояснения к руководству 1.1 WCAG
-
[Понимание критерия успеха 1.1.1 W3C: «Понимание WCAG 2.0»](https://www.w3.org/TR/UNDERSTANDING-WCAG20/text-equiv-all.html)
Эта возможность помогает повысить доступность, предоставляя запасной цвет, если изображение не загружается. Хотя для этого можно и следует задавать background-color для каждого фонового изображения, CSS-функция image() позволяет указывать цвет фона только на случай, если изображение не загрузится. Это позволяет задать запасной цвет на случай, если не загрузится прозрачный файл PNG, GIF или WebP.
Примеры
Изображения, зависящие от направления текста
<ul> <li dir="ltr">Bullet is a right facing arrow on the left</li> <li dir="rtl">Bullet is the same arrow, flipped to point left.</li> </ul>
ul {
list-style-image: image(ltr "rightarrow.png");
}
В элементах списка с направлением слева направо — тех, у которых для самого элемента задано dir="ltr" или которые наследуют направление от родительского элемента либо используют значение по умолчанию для страницы, — изображение будет отображаться без изменений. У элементов списка, у которых для <li> задано dir="rtl" или которые наследуют направление справа налево от родительского элемента (например, в документах на арабском или иврите), маркер будет отображаться справа и будет отражён по горизонтали, как если бы было задано transform: scaleX(-1). Текст также будет отображаться слева направо.
Отображение части фонового изображения
<div class="box">Hover over me. What cursor do you see?</div>
.box:hover {
cursor: image("sprite.png#xywh=32,64,16,16");
}
При наведении указателя на блок курсор изменится и будет отображать фрагмент спрайта размером 16 × 16 px, начинающийся в точке x=32, y=64.
Наложение цвета поверх фонового изображения
.quarter-logo {
height: 200px;
width: 200px;
border: 1px solid;
}
.quarter-logo {
background-image: image(rgb(0 0 0 / 25%)), url("firefox.png");
background-size: 25%;
background-repeat: no-repeat;
}
<div class="quarter-logo"> If supported, a quarter of this div has a darkened logo </div>
Пример выше накладывает полупрозрачную чёрную маску на фоновое изображение с логотипом Firefox. Если бы вместо этого мы использовали свойство background-color, цвет отображался бы позади изображения логотипа, а не поверх него. Кроме того, весь контейнер имел бы одинаковый цвет фона. Поскольку мы использовали image() вместе со свойством background-size (и запретили повторение изображения с помощью свойства background-repeat), цветовой образец покрывает только четверть контейнера.
Спецификации
| Спецификация |
|---|
| Модуль CSS Images, уровень 4 # funcdef-image |
Совместимость с браузерами
В настоящее время ни один браузер не поддерживает эту возможность.
См. также
© 2005–2025 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/Values/image/image