Как использовать методы отсечения и маскирования CSS и SVG
Опубликовано: 2018-11-06SVG отлично подходят для работы в Интернете, а обрезка и маскирование позволяют использовать некоторые интересные способы отображения или скрытия фрагментов вашей веб-графики. Использование этих методов также обеспечивает большую гибкость ваших проектов, поскольку вам не нужно вручную вносить изменения и создавать новые изображения — все это делается с помощью кода. Используя комбинацию методов обрезки и маскирования CSS, у вас будет множество вариантов графики для вашего веб-сайта.
Чтобы прояснить ситуацию, маскирование и отсечение — это два разных способа манипулирования изображениями с помощью CSS. Начнем с обрезки.
Основы обрезки
Если вы когда-либо использовали Photoshop, вы, вероятно, уже знакомы с обтравочными масками. Это похожий подход. Обрезка включает наложение векторной формы, например круга или треугольника, поверх изображения или элемента. Любая часть изображения за фигурой будет видна, а все, что находится за пределами фигуры, будет скрыто.
Например, если треугольная обтравочная маска находится поверх изображения леса, вы увидите изображение леса внутри треугольной формы. Граница фигуры называется путем отсечения, не путать с устаревшим свойством clip . Вы создаете путь отсечения с помощью свойства clip-path .

Примечание. Не пытайтесь повторить это на своем действующем сайте.
Помните: вы никогда не должны изменять код непосредственно на своем сайте, чтобы ничего не сломалось. Наше бесплатное приложение для локальной разработки Local поможет вам настроить тестовую среду, в которой вы сможете безопасно следовать этому руководству.
Отсечение в действии
Клипы всегда являются векторными путями. Это может сбивать с толку, но все, что находится за пределами пути, будет скрыто, а все, что находится внутри пути, будет видно. Чтобы лучше понять и проверить это самостоятельно, см. пример на CodePen.

Вот фрагмент структуры HTML из примера:
<svg class="clip-svg"> <defs> <clipPath id="polygon-clip-triangle-equilateral" clipPathUnits="objectBoundingBox"> <polygon points="0 0.87, 0.5 0, 0.5 0, 1 0.87" /> </clipPath> </defs> </svg>
Это CSS для отсечения:
.polygon-clip-triangle-equilateral {
-webkit-clip-path: polygon(0% 87%, 50% 0%, 50% 0%, 100% 87%);
clip-path: polygon(0% 87%, 50% 0%, 50% 0%, 100% 87%);
-webkit-clip-path: url("#polygon-clip-triangle-equilateral");
clip-path: url("#polygon-clip-triangle-equilateral");
}
Вы можете увидеть, где в HTML содержится ссылка на идентификатор clipPath и как он использует URL-адрес clip-path для отсечения.
Обрезной инструмент
Clippy — отличный инструмент для создания путей клипа CSS. Существует большое разнообразие стартовых форм и размеров, которые можно настроить по индивидуальному заказу.

Основы маскирования
Маскирование выполняется с помощью изображения PNG, градиента CSS или элемента SVG, чтобы скрыть часть изображения или другой элемент на странице. Мы сосредоточимся на графике SVG, но имейте в виду, что это можно сделать с другими типами изображений или стилями.
Свойство маски и элемент маски
Просто напоминание, чтобы помочь визуализировать, важно помнить, что замаскированный элемент является «исходным» (до применения маски) изображением. Вы можете не захотеть видеть все изображение, поэтому скрытие его частей выполняется с помощью свойства mask CSS. mask — это сокращение CSS для группы отдельных свойств, в которые мы углубимся чуть позже. Элемент SVG <mask> используется внутри графики SVG для добавления эффектов маскировки. В этом примере маска представляет собой круг, а также применяется градиент.
Использование элемента маски SVG на графике SVG
Чтобы получить представление об <mask> SVG, мы будем маскировать с помощью графики SVG.
На первый взгляд это может показаться немного сложным, но все это работает вместе, чтобы замаскировать основное изображение. У нас есть фактическое изображение в качестве фона, так где же SVG вступает в игру? В отличие от примеров обрезки, это фоновое изображение технически находится внутри элемента SVG. Мы будем использовать CSS, чтобы применить эту маску к изображению. Свойства будут исходить из элемента маски SVG, и мы дадим ему идентификатор masked-element в нашем CSS.
Чтобы увидеть это в действии, ознакомьтесь с этим примером Codepen. Вот рабочий код для маскированного изображения SVG:
&amp;amp;lt;svg class=&quot;masked-element&quot; width=&quot;300&quot; height=&quot;300&quot; viewBox=&quot;0 0 300 300&quot;&amp;amp;gt; &amp;amp;lt;image xlink:href=&quot;image link&quot; width=&quot;300px&quot; height=&quot;300px&quot; /&amp;amp;gt; &amp;amp;lt;/svg&amp;amp;gt;

С помощью этого CSS мы указываем, где найти маску. Он будет искать идентификатор #mask-this:
/* Here’s the CSS for masking */
.masked-element image {
mask: url(#mask1);
}

Заметили градиент в форме круга? Был применен градиент, а также задана форма круга для маски.
&amp;amp;lt;svg class=&quot;svg-mask&quot;&amp;amp;gt;
&amp;amp;lt;defs&amp;amp;gt;
&amp;amp;lt;mask id=&quot;mask1&quot; maskUnits=&quot;objectBoundingBox&quot; maskContentUnits=&quot;objectBoundingBox&quot;&amp;amp;gt;
&amp;amp;lt;linearGradient id=&quot;grad&quot; gradientUnits=&quot;objectBoundingBox&quot; x2=&quot;0&quot; y2=&quot;1&quot;&amp;amp;gt;
&amp;amp;lt;stop stop-color=&quot;white&quot; offset=&quot;0&quot;/&amp;amp;gt;
&amp;amp;lt;stop stop-color=&quot;green&quot; stop-opacity=&quot;0&quot; offset=&quot;1&quot;/&amp;amp;gt;
&amp;amp;lt;/linearGradient&amp;amp;gt;
&amp;amp;lt;circle cx=&quot;0.50&quot; cy=&quot;0.50&quot; r=&quot;0.50&quot; id=&quot;circle&quot; fill=&quot;url(#grad)&quot;/&amp;amp;gt;
&amp;amp;lt;/mask&amp;amp;gt;
&amp;amp;lt;/defs&amp;amp;gt;
&amp;amp;lt;/svg&amp;amp;gt;
Маскировка текста SVG
Маскирование текста может делать довольно интересные вещи, например показывать изображение через текстовый блок. Хорошая новость заключается в том, что внутри маски SVG можно использовать текстовый элемент. Поскольку в будущем поддержка браузеров увеличится, это может стать действительно интересным способом объединения изображений и типографики.

Вот основное объяснение того, что происходит. Внутри маски SVG находится текстовый элемент SVG. Мы указали значение RGB для белого цвета, которое создает овальную область вокруг замаскированного текста. Все, что находится за овальной областью, видно сквозь текст, создавая ощущение вырезания.
&amp;amp;lt;div class=&quot;text-wrap&quot;&amp;amp;gt;
&amp;amp;lt;svg class=&quot;text-demo&quot; viewBox=&quot;0 0 600 400&quot; width=&quot;600&quot; height=&quot;400&quot;&amp;amp;gt;
&amp;amp;lt;defs&amp;amp;gt;
&amp;amp;lt;mask id=&quot;myMask&quot;&amp;amp;gt;
&amp;amp;lt;rect width=&quot;100%&quot; height=&quot;100%&quot; fill=&quot;#fff&quot; /&amp;amp;gt;
&amp;amp;lt;text x=&quot;50&quot; y=&quot;200&quot; id=&quot;myText&quot;&amp;amp;gt;My Text&amp;amp;lt;/text&amp;amp;gt;
&amp;amp;lt;text x=&quot;125&quot; y=&quot;293&quot; id=&quot;mySubtext&quot;&amp;amp;gt;SVG&amp;amp;lt;/text&amp;amp;gt;
&amp;amp;lt;/mask&amp;amp;gt;
&amp;amp;lt;/defs&amp;amp;gt;
&amp;amp;lt;ellipse class=&quot;masked&quot; cx=&quot;300&quot; cy=&quot;200&quot; rx=&quot;300&quot; ry=&quot;150&quot; fill=&quot;rgba(255, 255, 255, 0.8)&quot; /&amp;amp;gt;
&amp;amp;lt;/svg&amp;amp;gt;
&amp;amp;lt;/div&amp;amp;gt;
/* Here’s the CSS for text element */
#myText {
font-size: 125px;
font-style: bold;
fill: #000;
}
/* Here’s the CSS for masking */
.masked {
mask: url(&quot;#myMask&quot;);
}
Чтобы полностью понять, полезно поиграть и поэкспериментировать с кодом. Попробуйте изменить цвета, изменить текст и настроить размеры в этом Codepen.

Свойство изображения-маски
Изображение может быть объявлено, а изображение mask-image может быть установлено в значение URL. Изображение mask-image может быть PNG, SVG или ссылкой на элемент mask SVG, как я продемонстрировал в предыдущем примере.
Поскольку маскирование используется для частичного или полного скрытия частей объекта или элемента, сначала вам понадобится ссылка на изображение с файлом для элемента, который будет маскироваться. Вот как выглядит это изображение. Это красочно, чтобы было очень видно, какую часть маски показывает и скрывает.
&amp;amp;lt;img class=&quot;mask-img example-mask&quot; src=&quot;https://linktoimage.com/img/image-example.jpg&quot; alt=&quot;Masked image&quot;&amp;amp;gt;

До сих пор было много кода SVG, но этот пример немного отличается, так как будет растровое изображение, замаскированное с помощью SVG.
.example-mask {
mask-image: url(https://linktoimage.com/browser-icon-01.svg);
webkit-mask-image: url(https://linktoimage.com/browser-icon-01.svg);
mask-mode: alpha;
webkit-mask-mode: alpha;
mask-repeat: no-repeat;
webkit-mask-repeat: no-repeat;
mask-size: 200px;
webkit-mask-size: 200px;
mask-position: center;
webkit-mask-position: center;
}
В свойстве mask-image будет объявлена форма маски. В этом случае изображение маски представляет собой графику SVG. Включение URL-ссылки — это то, как строится маска.

Вот он на Codepen.
Объединение нескольких изображений маски
Как раз тогда, когда вы думали, что маскирование не может быть лучше, есть возможность установить более одного слоя изображения маски. Все, что вам нужно сделать, это добавить два значения URL (или больше, если вы амбициозны), разделенные запятой.
Чтобы расширить простую маску сверху, к исходному изображению будет добавлена стрелка. Вот как сочетаются две маски.
.combined-mask {
mask-image: url(https://linktoimage.com/arrow-01.svg), url(https://linktoimage.com/browser-icon-01.svg);
webkit-mask-image: url(https://linktoimage.com/arrow-01.svg), url(https://linktoimage.com/browser-icon-01.svg);
}

Все, что вам нужно сделать, это добавить два значения (с запятой), и теперь есть две комбинированные маски, что делает возможности маскирования безграничными.
Вот он на Codepen.
Создайте простой градиент с mask-image
Не все маски должны быть сложной формы. Иногда маской является не конкретное изображение, а простая маска, такая как градиент. Если вы ищете быстрый способ добиться этого, свойство mask-image является опцией, которую довольно легко реализовать.
В этом примере к набору градиентов был применен класс в качестве свойства mask-image . С помощью этого простого объявления было легко создать градиентную маску на изображении.
mask-image: linear-gradient(black, white, transparent); -webkit-mask-image: linear-gradient(black, white, transparent);

Смотрите это на Codepen.
Свойство повтора маски
После того, как вы создали одну маску, довольно легко сделать больше. Это очень удобно, если вы хотите сделать индивидуальный шаблон. Свойство mask-repeat позволяет повторять маску. Если вы когда-либо раньше делали мозаичный фон, это похоже на это.
Следует помнить о нескольких важных вещах, таких как размер и тип повтора маски, который необходимо объявить для создания идеального шаблона.
Размер mask-size довольно легко визуализировать, особенно с установленным здесь значением в пикселях.
mask-size: 200px; webkit-mask-size: 200px;

Есть еще несколько вариантов повтора маски, если вы ищете другой эффект для шаблона:
-
repeat-xповторяется по координате x. -
Repeat-yповторяет вниз по координате y. -
spaceповторяется и распространяется в доступной области. -
roundповторяется несколько раз в доступной области (масштабирование поможет заполнить пространство, если это необходимо)
Поддержка браузера
Прежде чем приступить к этому новому способу работы с графикой, важно отметить, что поддержка браузера несовместима с отсечением и маскированием. Отсечение поддерживается больше, чем маскирование, но Internet Explorer не полностью поддерживает отсечение. Текущая поддержка браузерами масок CSS также довольно ограничена, поэтому предлагается использовать их в качестве улучшения некоторых декоративных элементов. Таким образом, если он не поддерживается браузером пользователя, это не повлияет на просмотр контента.
Чтобы проверить и посмотреть, поддерживаются ли ваши маски и вырезки, я бы рекомендовал создать JSFiddle или Codepen, а затем попробовать его в разных браузерах. В последние годы поддержка браузеров увеличилась, и в конечном итоге она будет полностью поддерживаться. Не позволяйте ограничениям сбить вас с толку — всегда хорошо быть впереди игры, и как только поддержка станет более массовой, вы точно будете знать, как революционизировать свою графику. Если вы сомневаетесь, обязательно обратитесь к надежному документу «Можно ли использовать».
После экспериментов с этими примерами это должно стать хорошим введением в маскирование и отсечение. Хотя в настоящее время поддержка браузеров ограничена, в будущем это, вероятно, станет основной практикой. Всегда интересно подумать о том, как эти методы можно использовать для создания интересных визуальных эффектов. Будущее веб-графики сделает нас менее зависимыми от редакторов изображений и предоставит более эффективные способы создания и изменения изображений непосредственно в браузере.

Далее: Создавайте сайты еще быстрее!
Вы понимаете важность оптимизированного процесса веб-дизайна. Все, что вы можете сделать, чтобы разработать веб-сайт быстрее, означает больше денег в вашем кармане. Именно поэтому компания Flywheel разработала нашу платформу хостинга, чтобы сэкономить ваше время и помочь вам лучше работать! С помощью этих советов и инструментов для веб-дизайна вы сможете выполнять больше проектов и уделять больше времени развитию своего бизнеса.
В этом руководстве мы дадим советы о том, как работать быстрее и ускорить рабочий процесс WordPress. От первоначальной настройки сайта до его запуска — узнайте, как вы можете сократить время своей повседневной работы! Загрузите его сегодня.
Эта статья была первоначально опубликована 3 августа 2016 года. Последний раз она обновлялась 6 ноября 2018 года.
