Маскирование в CSS
Optional Advanced только что разлил газетные колонки. Этот урок — другой необязательный инструмент: маска. Вы кладёте трафарет на один блок. Где трафарет плотный, видны фото или цвет. Где пусто — блок исчезает. Вы не режете статью на потоки и не сдвигаете плитки иконок по спрайт-листу.
Прямой ответ
Маскирование CSS скрывает части элемента через mask-image — PNG, SVG или градиент. Представьте краску через вырез. mask-size, mask-repeat и mask-position ведут себя как слой фона: cover, no-repeat, center. mask-mode выбирает альфу (прозрачность файла маски) или яркость (свет против тьмы). Маска, когда край должен таять. clip-path — когда нужен жёсткий круг или многоугольник. Подписи и кнопки остаются полностью видимыми.
Почему маска — не колонка и не спрайт
Многоколоночность дробит один текстовый поток. Спрайт-лист обрезает битмап через background-position, чтобы много иконок делили файл. Маска не делает ни того ни другого. Элемент по-прежнему занимает свой блок. Ширина и высота раскладки не сжимаются. Меняется только то, какие пиксели этого блока рисуются. Фильтры (blur(), grayscale()) меняют вид каждого видимого пикселя; маска решает, какие пиксели остаются.
PNG как трафарет
mask-image принимает url(...) так же, как background-image. Типичный PNG-маски белый (или непрозрачный) там, где нужно фото, и прозрачный там, где дыра:
.hero-photo {
width: 20rem;
height: 12rem;
background: url("/img/studio.jpg") center / cover no-repeat;
mask-image: url("/img/soft-blob.png");
mask-size: cover;
mask-repeat: no-repeat;
}
Фото по-прежнему фон (или <img> с той же маской). PNG-клякса — только трафарет. Если файла маски нет, элемент может исчезнуть целиком — держите стиль без маски или проверьте URL.
Затухание градиентом
Второй файл не нужен. Градиентная маска — привычное затухание внизу карточки:
.card-lead {
mask-image: linear-gradient(to bottom, #000 60%, transparent);
mask-repeat: no-repeat;
}
Чёрный (или полностью непрозрачный) сохраняет содержимое; transparent пробивает дыру. Градиент живёт в CSS, лишнего HTTP нет — в отличие от спрайт-листа иконок. Это не opacity на всю карточку: текст в плотной части остаётся чётким; растворяется только замаскированная область.
Размер, повтор, позиция
Считайте маску фоновым слоем, который никогда не видите как картинку:
.badge {
mask-image: url("/img/star-mask.svg");
mask-size: 4rem 4rem;
mask-repeat: no-repeat;
mask-position: center;
}
mask-size: cover заполняет блок; contain сохраняет пропорции трафарета; длины фиксируют маленькую форму. repeat плитит трафарет (редко и легко переборщить). Есть сокращение mask, но новичкам спокойнее длинные свойства, пока слой не ощущается как background.
Альфа против яркости
mask-mode отвечает: «Читать прозрачность или светлоту?»
.portrait {
mask-image: url("/img/gray-sculpt.jpg");
mask-mode: luminance;
mask-size: cover;
}
alpha (часто по умолчанию у прозрачного PNG) берёт альфа-канал. luminance — свет и тьму: белый обычно показывает, чёрный скрывает — удобно, когда трафарет серое фото, а не прозрачный PNG. Если JPEG-маска «ничего не делает», скорее всего нужен был luminance. У SVG <mask> есть mask-type; на HTML-блоках начинайте с mask-mode.
Жёсткий клип против мягкой маски
clip-path режет геометрию: круг, inset, многоугольник. Край острый. Маска может быть мягкой. Это не два имени одного свойства:
.avatar {
clip-path: circle(50%);
}
.poster {
mask-image: radial-gradient(circle, #000 55%, transparent 80%);
mask-repeat: no-repeat;
}
Аватары и билеты часто хотят clip-path. Постер, который тает в страницу, хочет градиентную маску. Можно совмещать, но одна задача на свойство спокойнее. overflow: hidden с border-radius — третий инструмент: обрезает потомков по padding-коробке. Маска рисует сам элемент, включая фон, не скругляя раскладочный блок.
Safari и префикс WebKit
Некоторые версии Safari всё ещё хотят -webkit-mask-image (и соседние свойства) рядом со стандартными:
.fade-photo {
-webkit-mask-image: linear-gradient(#000 70%, transparent);
mask-image: linear-gradient(#000 70%, transparent);
-webkit-mask-repeat: no-repeat;
mask-repeat: no-repeat;
}
Строка с префиксом и стандартная. Не поставляйте только префикс навсегда. @supports может обернуть лишнее; привычка: проверить затухание в Safari, не только в Chromium.
Маска vs клип vs overflow vs спрайты
📊 Mask vs clip-path vs overflow vs sprites
| Tool | Job | Poor fit |
|---|---|---|
mask-image / mask-mode |
Soft holes, fades, shaped photos on one element | Hiding a whole form; replacing column layout |
clip-path |
Hard circle, polygon, inset silhouette | Soft dissolves; newspaper columns |
overflow: hidden |
Clip descendants to the box (often with radius) | Painting a gradient stencil on the element’s own pixels |
Sprites (background-position) |
Many icon tiles from one bitmap | Stenciling a hero photo; flowing article text |
Multi-column (column-*) |
Newspaper fill of one text stream | Visibility holes in a picture |
Optional Advanced уже брал спрайты для иконок и колонки для прозы. Маскирование — трафарет. Все три на одном герое — фото, обрезанное как спрайт и разрезанное как колонка.
Что не маскировать
Не чините маской беспорядочную вёрстку. Если кнопка или подпись под затуханием, их не прочитают и не нажмут. Скринридер может озвучить текст, а глаз ничего не видит — это баг, не фича. Контраст важен в видимой части. Декоративные фото, карточки и иконки — обычные цели; поля входа — нет.
.ok-art {
mask-image: linear-gradient(to right, #000, transparent);
}
.not-a-layout-fix {
/* don't: mask the entire toolbar because it overflowed */
}
.icons {
/* sprites still use background-position — not mask-image */
background-image: url("/img/icons.png");
background-position: 0 -32px;
}
Если ребёнок вылезает из карточки, overflow (или меньший ребёнок) — правка вёрстки. Если двенадцать HTTP-файлов иконок — спрайт или набор SVG. Маска не заменяет ни то ни другое.
Попробуйте сами
- Дайте цветному блоку
mask-image: linear-gradient(to bottom, #000 50%, transparent)и смотрите, как тает низ. - Подставьте маленький SVG- или PNG-трафарет; задайте
mask-sizeиmask-position: center. - Сравните
mask-mode: luminanceна сером JPEG иalphaна прозрачном PNG. - Тот же круг через
clip-path: circle(50%)— заметьте жёсткий край. - Добавьте
-webkit-mask-imageс тем же градиентом. Не маскируйте форму.
Частые ошибки
- Маска как макет страницы или как
overflow: hidden - Забыть
mask-size, и крошечный трафарет сидит в углу - Ждать дыр от JPEG без
mask-mode: luminance - Пропустить
-webkit-mask-imageи винить «маски CSS» в Safari - Считать
clip-pathиmask-imageодним и тем же - Маскировать подписи, подписи к фото или кнопки, пока не умрут контраст и клики
- Путать со спрайтами (смещения плиток) или колонками (потоки текста)
Кратко
- Маска — трафарет на одном элементе: здесь показать, там скрыть
mask-imageберёт url или градиент; размер, повтор и позиция как у фонаmask-mode: альфа против яркостиclip-path— жёсткий геометрический срез; маски могут таять- Префикс для Safari; не маскируйте нужный интерфейс
- Optional Advanced дальше: пользовательский интерфейс (
user-interface)
🧠 Проверьте Свои Знания
Проверьте Свои Знания
Бросьте себе вызов с помощью этой интерактивной викторины и узнайте, насколько хорошо вы понимаете тему
📝 Инструкции
- Внимательно прочитайте каждый вопрос
- Выберите лучший ответ на каждый вопрос
- Вы можете пересдавать тест столько раз, сколько захотите
- Ваш прогресс будет показан вверху