CSS-функция `cross-fade()`
Baseline Ограниченная доступность
Эта функция не входит в Baseline, поскольку она не работает в некоторых наиболее широко используемых браузерах.
cross-fade() — это CSS-функция, которую можно использовать для смешивания двух или более изображений с заданной прозрачностью. Она подходит для многих базовых операций с изображениями, например для тонирования изображения сплошным цветом или выделения определённой области страницы путём наложения изображения на радиальный градиент.
Синтаксис
Предупреждение: Спецификация и текущие реализации используют разный синтаксис. Сначала объясняется синтаксис спецификации.
Синтаксис спецификации
Функция cross-fade() принимает список изображений и процентное значение, определяющее, какая часть каждого изображения сохраняется с точки зрения непрозрачности при смешивании с другими изображениями. Процентное значение должно быть записано без кавычек, содержать символ '%' и находиться в диапазоне от 0% до 100%.
Функцию можно использовать в CSS везде, где допустима обычная ссылка на изображение.
Процентные значения cross-fade
Считайте процентное значение уровнем непрозрачности каждого изображения. Это означает, что при значении 0% изображение полностью прозрачно, а при значении 100% — полностью непрозрачно.
cross-fade(url("white.png") 0%, url("black.png") 100%); /* fully black */
cross-fade(url("white.png") 25%, url("black.png") 75%); /* 25% white, 75% black */
cross-fade(url("white.png") 50%, url("black.png") 50%); /* 50% white, 50% black */
cross-fade(url("white.png") 75%, url("black.png") 25%); /* 75% white, 25% black */
cross-fade(url("white.png") 100%, url("black.png") 0%); /* fully white */
cross-fade(url("green.png") 75%, url("red.png") 75%); /* both green and red at 75% */
Если некоторые процентные значения не указаны, все указанные значения суммируются, а полученная сумма вычитается из 100%. Если результат больше 0%, он поровну распределяется между всеми изображениями, для которых процентные значения не указаны.
В простейшем случае два изображения плавно переходят друг в друга. Для этого достаточно указать процентное значение только для одного изображения, а второе будет плавно переходить соответствующим образом. Например, если для первого изображения указано значение 0%, отображается только второе изображение, а при значении 100% — только первое. Значение 25% отображает первое изображение с непрозрачностью 25%, а второе — 75%. Значение 75% даёт обратный результат: первое изображение отображается с непрозрачностью 75%, а второе — 25%.
Приведённый выше пример можно было бы также записать так:
cross-fade(url("white.png") 0%, url("black.png")); /* fully black */
cross-fade(url("white.png") 25%, url("black.png")); /* 25% white, 75% black */
cross-fade(url("white.png"), url("black.png")); /* 50% white, 50% black */
cross-fade(url("white.png") 75%, url("black.png")); /* 75% white, 25% black */
cross-fade(url("white.png") 100%, url("black.png")); /* fully white */
cross-fade(url("green.png") 75%, url("red.png") 75%); /* both green and red at 75% */
Если процентные значения не указаны, оба изображения будут иметь непрозрачность 50%, а в результате смешивания они будут отображаться в равных пропорциях. В приведённом выше примере со значениями 50%/50% их можно было не указывать: если процентное значение пропущено, указанные значения суммируются, а сумма вычитается из 100%. Если результат больше 0, он поровну распределяется между всеми изображениями, для которых процентные значения не указаны.
В последнем примере сумма обоих процентных значений не равна 100%, поэтому оба изображения сохраняют соответствующие им уровни непрозрачности.
Если процентные значения не указаны и включены три изображения, непрозрачность каждого из них составит 33,33%. Следующие две строки (почти) идентичны:
cross-fade(url("red.png"), url("yellow.png"), url("blue.png")); /* all three will be 33.3333% opaque */
cross-fade(url("red.png") 33.33%, url("yellow.png") 33.33%, url("blue.png") 33.33%);
Старый синтаксис, используемый в реализациях
cross-fade( <image>, <image>, <percentage> )
Спецификация функции cross-fade() допускает использование нескольких изображений, каждое из которых может иметь уровень прозрачности, не зависящий от значений для других изображений. Так было не всегда. Изначальный синтаксис, реализованный в некоторых браузерах, допускал только два изображения, а сумма уровней прозрачности этих изображений должна была составлять ровно 100%. Изначальный синтаксис поддерживается в Safari, а также с префиксом -webkit- в Chrome, Opera и других браузерах на базе Blink.
cross-fade(url("white.png"), url("black.png"), 0%); /* fully black */
cross-fade(url("white.png"), url("black.png"), 25%); /* 25% white, 75% black */
cross-fade(url("white.png"), url("black.png"), 50%); /* 50% white, 50% black */
cross-fade(url("white.png"), url("black.png"), 75%); /* 75% white, 25% black */
cross-fade(url("white.png"), url("black.png"), 100%); /* fully white */
В реализованном синтаксисе сначала указываются два изображения, разделённые запятой, а затем — запятая и обязательное процентное значение. Отсутствие запятой или процентного значения делает значение недействительным. Процентное значение определяет непрозрачность первого указанного изображения. Из 100% вычитается указанное процентное значение, а полученная разница задаёт непрозрачность второго изображения.
Пример с зелёным и красным цветами (сумма процентных значений составляет 150%) и пример с жёлтым, красным и синим цветами (с тремя изображениями) из раздела о синтаксисе спецификации в этой реализации невозможны.
Доступность
Браузеры не предоставляют вспомогательным технологиям специальную информацию о фоновых изображениях. Это важно прежде всего для программ чтения с экрана: они не сообщают о наличии таких изображений и, следовательно, не передают пользователям никакой информации о них. Если изображение содержит информацию, критически важную для понимания общего назначения страницы, лучше описать её семантически в документе. При использовании фоновых изображений убедитесь, что контраст достаточно велик, чтобы любой текст оставался читаемым поверх изображения, а также в случае отсутствия изображений.
- MDN: пояснения к руководству WCAG 1.1
-
[Понимание критерия успеха 1.1.1 W3C: Понимание WCAG 2.0](https://www.w3.org/TR/UNDERSTANDING-WCAG20/text-equiv-all.html)
Формальный синтаксис
<cross-fade()> = cross-fade( <cf-mixing-image> , <cf-final-image>? ) <cf-mixing-image> = <percentage>? && <image> <cf-final-image> = <image> | <color> <image> = <url> | <image()> | <image-set()> | <element()> | <paint()> | <cross-fade()> | <gradient> <color> = <color-base> | currentColor | <system-color> | <light-dark()> | <deprecated-system-color> <image()> = image( <image-tags>? [ <image-src>? , <color>? ]! ) <image-set()> = image-set( <image-set-option># ) <element()> = element( <id-selector> ) <paint()> = paint( <ident>, <declaration-value>? ) <cross-fade()> = cross-fade( <cf-mixing-image> , <cf-final-image>? ) <gradient> = <linear-gradient()> | <repeating-linear-gradient()> | <radial-gradient()> | <repeating-radial-gradient()> | <conic-gradient()> | <repeating-conic-gradient()> <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 <image-tags> = ltr | rtl <image-src> = <url> | <string> <image-set-option> = [ <image> | <string> ] [ <resolution> || type(<string>) ] <id-selector> = <hash-token> <linear-gradient()> = linear-gradient( [ <linear-gradient-syntax> ] ) <repeating-linear-gradient()> = repeating-linear-gradient( [ <linear-gradient-syntax> ] ) <radial-gradient()> = radial-gradient( [ <radial-gradient-syntax> ] ) <repeating-radial-gradient()> = repeating-radial-gradient( [ <radial-gradient-syntax> ] ) <conic-gradient()> = conic-gradient( [ <conic-gradient-syntax> ] ) <repeating-conic-gradient()> = repeating-conic-gradient( [ <conic-gradient-syntax> ] ) <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}) <linear-gradient-syntax> = [ [ <angle> | <zero> | to <side-or-corner> ] || <color-interpolation-method> ]? , <color-stop-list> <radial-gradient-syntax> = [ [ [ <radial-shape> || <radial-size> ]? [ at <position> ]? ] || <color-interpolation-method> ]? , <color-stop-list> <conic-gradient-syntax> = [ [ [ from [ <angle> | <zero> ] ]? [ at <position> ]? ] || <color-interpolation-method> ]? , <angular-color-stop-list> <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> ] <side-or-corner> = [ left | right ] || [ top | bottom ] <color-stop-list> = <linear-color-stop> , [ <linear-color-hint>? , <linear-color-stop> ]#? <radial-shape> = circle | ellipse <radial-size> = <radial-extent> | <length [0,∞]> | <length-percentage [0,∞]>{2} <position> = [ [ left | center | right ] || [ top | center | bottom ] | [ left | center | right | <length-percentage> ] [ top | center | bottom | <length-percentage> ]? | [ [ left | right ] <length-percentage> ] && [ [ top | bottom ] <length-percentage> ] ] <angular-color-stop-list> = <angular-color-stop> , [ <angular-color-hint>? , <angular-color-stop> ]#? <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> <linear-color-stop> = <color> <color-stop-length>? <linear-color-hint> = <length-percentage> <radial-extent> = closest-corner | closest-side | farthest-corner | farthest-side <length-percentage> = <length> | <percentage> <angular-color-stop> = <color> <color-stop-angle>? <angular-color-hint> = <angle-percentage> | <zero> <custom-params> = <dashed-ident> [ <number> | <percentage> | none ]+ <predefined-rgb-params> = <predefined-rgb> [ <number> | <percentage> | none ]{3} <xyz-params> = <xyz> [ <number> | <percentage> | none ]{3} <color-stop-length> = <length-percentage>{1,2} <color-stop-angle> = [ <angle-percentage> | <zero> ]{1,2} <angle-percentage> = <angle> | <percentage> <predefined-rgb> = srgb | srgb-linear | display-p3 | display-p3-linear | a98-rgb | prophoto-rgb | rec2020 <xyz> = xyz | xyz-d50 | xyz-d65
Примеры
Старый синтаксис cross-fade
HTML
<div class="cross-fade"></div>
CSS
.cross-fade {
width: 300px;
height: 300px;
background-image: -webkit-cross-fade(url("br.png"), url("tr.png"), 75%);
background-image: cross-fade(url("br.png"), url("tr.png"), 75%);
}
Результат
Спецификации
Совместимость с браузерами
| Настольные компьютеры | Мобильные устройства | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome Android | Firefox для Android | Opera Android | Safari для iOS | Samsung Internet | WebView Android | WebView для iOS | |
cross-fade |
17Поддерживается только исходная реализация для двух изображений с процентным значением.Сведения о поддержке функции cross-fade() без префикса см. в ошибке 40470742. |
79Поддерживается только исходная реализация для двух изображений с процентным значением.Сведения о поддержке функции cross-fade() без префикса см. в ошибке 40470742. |
Нет |
15Поддерживается только исходная реализация для двух изображений с процентным значением.Сведения о поддержке функции cross-fade() без префикса см. в ошибке 40470742. |
10Поддерживается только исходная реализация для двух изображений с процентным значением.5.1Поддерживается только исходная реализация для двух изображений с процентным значением. |
18Поддерживается только исходная реализация для двух изображений с процентным значением.Сведения о поддержке функции cross-fade() без префикса см. в ошибке 40470742. |
Нет |
14Поддерживается только исходная реализация для двух изображений с процентным значением.Сведения о поддержке функции cross-fade() без префикса см. в ошибке 40470742. |
9.3Поддерживается только исходная реализация для двух изображений с процентным значением.5Поддерживается только исходная реализация для двух изображений с процентным значением. |
1.0Поддерживается только исходная реализация для двух изображений с процентным значением.Сведения о поддержке функции cross-fade() без префикса см. в ошибке 40470742. |
4.4Поддерживается только исходная реализация для двух изображений с процентным значением.Сведения о поддержке функции cross-fade() без префикса см. в ошибке 40470742. |
9.3Поддерживается только исходная реализация для двух изображений с процентным значением.5Поддерживается только исходная реализация для двух изображений с процентным значением. |
См. также
<image><url>image()image-set()element()- Использование градиентов CSS
- Функции градиентов:
linear-gradient(),radial-gradient(),repeating-linear-gradient(),repeating-radial-gradient(),conic-gradient(),repeating-conic-gradient()
© 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/cross-fade