Menu

Прозрачность в CSS: opacity, прозрачный фон и затухание

opacity делает прозрачным весь элемент и все, что внутри, от 0 (невидимый) до 1 (сплошной). Разберем значения, почему opacity делает бледным и текст и как сделать прозрачным только фон, opacity: 0, visibility и display, а также затухание при наведении.

На этой странице есть исполняемые редакторы: меняйте, запускайте и сразу видите результат.

Что делает opacity

opacity задает, насколько элемент прозрачен: 1 это сплошной (по умолчанию), 0 невидимый, а все промежуточное позволяет фону просвечивать. Блоки ниже стоят на полосатом фоне, чтобы это было видно:

Последний блок никуда не делся: он занимает свое место 90px в строке, просто ничего не рисует. Обратите внимание, что белые цифры бледнеют вместе со своими блоками. opacity действует на элемент и все, что внутри него.

Прозрачный фон, непрозрачный текст

Раз opacity делает бледными и дочерние элементы, это неподходящий инструмент для «полупрозрачного фона за читаемым текстом». Используйте цвет фона с альфа-каналом:

Обе белые панели пропускают полосы одинаково. В первой текст бледнеет вместе с панелью. Во второй прозрачен только цвет фона (rgb(255 255 255 / 0.6), то же, что rgba(255, 255, 255, 0.6)), поэтому текст остается сплошным и легко читается. Цвета с альфой разобраны на странице про цвета.

Дочерний элемент не может выйти из-под opacity родителя: opacity: 1 у дочернего элемента ничего не делает, потому что родитель рисуется одним бледным слоем, в котором дочерний элемент уже находится.

Значения

ЗначениеРезультат
1 или 100%полностью непрозрачный (по умолчанию)
0.5 или 50%наполовину прозрачный
0 или 0%полностью прозрачный, но остается в раскладке и кликабелен
1.5, -1приводятся к 1 и 0

Прозрачность наследуется визуально, но не как свойство: вычисленный opacity дочернего элемента остается 1, хотя он рисуется внутри бледного родителя.

opacity: 0, visibility: hidden и display: none

Все три заставляют элемент исчезнуть, но во всем остальном они различаются:

opacity: 0visibility: hiddendisplay: none
Занимает местодаданет
Получает клики и фокусданетнет
Читается программами чтения с экранаданетнет
Можно анимировать переходомда, плавнопереключается в одном из концов, без затуханиянет

Больнее всего бьет вторая строка. На кнопку с opacity: 0 все равно можно кликнуть и перейти табом:

Ниже браузер отвечает, какой элемент находится в точке внутри каждой скрытой кнопки. Кнопка с opacity: 0 отвечает «clickable», а кнопка с visibility: hidden нет. Кнопка Visible начинается после двух пустых мест по 150px, потому что место освободила только кнопка с display: none. Чтобы растворить элемент, а затем убрать его, анимируйте opacity и в конце задайте visibility: hidden.

Затухание при наведении

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

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

Доступность: бледный текст теряет контрастность

Снижая opacity, вы снижаете контрастность. Серый текст на белом с opacity: 0.5 может опуститься намного ниже коэффициента 4.5:1, который нужен основному тексту. Для второстепенного текста выбирайте цвет, проходящий по контрастности, а не делайте бледным темный. Для отключенных элементов управления пониженная прозрачность это частый сигнал, но сочетайте ее с атрибутом disabled, чтобы элемент был недоступен и с клавиатуры и объявлялся как отключенный.

Побочный эффект: контекст наложения

Любая opacity меньше 1 создает новый контекст наложения, как и transform. Дочерние элементы с высоким z-index тогда накладываются только внутри бледного элемента и не могут подняться над элементами снаружи. Если выпадающее меню внутри полупрозрачной панели уходит под другой элемент, причина в этом (наложение объяснено на странице про z-index).

Частые ошибки

  • Карточка становится бледной ради прозрачного фона. Текст бледнеет тоже. Используйте для фона rgb(... / 0.5).
  • Попытка вернуть дочернему элементу непрозрачность. Opacity родителя ограничивает каждого потомка.
  • Скрытие только через opacity: 0. Элемент по-прежнему получает клики и фокус. Добавьте visibility: hidden или используйте display: none (pointer-events: none останавливает клики, но не фокус с клавиатуры).
  • opacity: 50. Opacity от 0 до 1; 50 приводится к 1. Пишите 0.5 или 50%.
  • Низкоконтрастный текст из-за opacity. Проверяйте контрастность результата, а не исходного цвета.

Часто задаваемые вопросы

Что делает opacity в CSS?

Задает, насколько элемент прозрачен, от 0 (полностью прозрачный) до 1 (полностью непрозрачный). Действует на весь элемент, включая текст, рамку, изображения и все дочерние элементы, как на один сведенный слой.

Как сделать прозрачным только фон, а не текст?

Не трогайте opacity и задайте фону цвет с альфой: background-color: rgb(37 99 235 / 0.5); или rgba(37, 99, 235, 0.5). Текст и дочерние элементы остаются полностью непрозрачными.

Может ли дочерний элемент быть непрозрачнее родителя?

Нет. Opacity родителя применяется ко всей группе, поэтому opacity: 1 у дочернего элемента ее не отменит. Дочерний элемент родителя с 0.5 рисуется максимум с половинной непрозрачностью. Перенесите прозрачность в цвет фона родителя.

Чем отличаются opacity: 0, visibility: hidden и display: none?

opacity: 0 скрывает элемент, но он по-прежнему занимает место, на него можно кликнуть, и его читают программы чтения с экрана. visibility: hidden сохраняет место, но на элемент нельзя кликнуть и его не читают. display: none полностью убирает его из раскладки.

Можно ли задавать opacity в процентах?

Да. opacity: 50% то же самое, что opacity: 0.5, во всех актуальных браузерах. Значения меньше 0 или больше 1 приводятся к этому диапазону.

Coddy programming languages illustration

Учитесь программировать с Coddy

НАЧАТЬ