- Маскирование в CSS
- Отсечение в CSS 2.1
- Свойство clip-path
- Анимация clip-path
- Маскирование
- Маска по яркости
- Альфа-маска
- Свойство mask
- Свойство mask-border
- Поддержка браузерами
- Спрятать часть изображения средствами CSS
- 3 простых и быстрых техники CSS для обрезки картинок
- Техника 1 — использование отрицательных полей (Negative Margins)
- Как спрятать часть картинки, а остальную часть сделать фоном?
- Войдите, чтобы написать ответ
- Как сделать автогенерацию поддомена?
- Как из коллекции, получить Input в котором произошло изменение?
Маскирование в CSS
В компьютерной графике отсечение и маскирование — это две наиболее используемые операции. Обе они визуально скрывают часть элемента. Если вы ранее работали с SVG или HTML Canvas, то эти операции для вас, скорее всего, уже не новы. Отсечение определяет область элемента которая будет видна, всё остальное за пределами этой области не отображается и получается «отрезанным». При маскировании изображение маски объединяется с элементом, влияя на его альфа-канал. Части маскированного элемента получаются полностью или частично прозрачными. Новая спецификация CSS Masking направлена на объединение этих двух операций в мире HTML.
Отсечение в CSS 2.1
В CSS 2.1 уже определено свойство clip , оно ограничено прямоугольной областью через функцию rect() которая принимает четыре аргумента расстояния для верхнего, правого, нижнего и левого краёв. Раздражающий момент: свойство clip применяется исключительно к абсолютно позиционированным элементам и просто игнорируется для других элементов.
Свойство clip также ограничено отдельными элементами SVG. Это одна из причин, почему в спецификацию SVG добавлено свойство clip-path пригодное для маскирования в CSS.
Свойство clip-path
Свойство clip-path может применяться ко всем элементам HTML, графическим элементам и контейнерам SVG. Свойство либо ссылается на элемент , либо на одну из базовых фигур представленных в CSS Exclusions.
Элемент берёт любой графический элемент из SVG и использует его в качестве области отсечения. Графическими элементами в SVG являются , , , , , и . также позволяет комбинировать несколько графических элементов. Объединение всех фигур затем используется как область отсечения. Следующий пример демонстрирует использование :
Базовые фигуры с другой стороны не требуют какой-либо разметки SVG. Они были добавлены к clip-path , чтобы предоставить удобные универсальные функции для простых операций отрезания.
- inset( [ round ]?) определяет прямоугольник похожий на фунцию rect() у свойства clip . В параметрах указывается смещение верхней, правой, нижней и левой сторон. Функция также имеет необязательный радиус скругления с синтаксисом как у свойства border-radius .
- circle(? [ at ]?) определяет простой круг с необязательным радиусом. Кроме того, необязательный параметр положения задаёт центральную точку окружности. имеет тот же синтаксис, что и свойство background-position .
- ellipse( ? [ at ]?) определяет эллипс с горизонтальным и необязательным вертикальным радиусом, а также центральной точки на основе синтаксиса свойства background-position .
- polygon( , , . ) определяет многоугольник основываясь на списке координат.
Ключевые слова вроде content-box , border-box , margin-box могут использоваться в сочетании с базовыми фигурами для изменения положения и размера указанного пути отсечения. Если ключевые слова применяются без базовых фигур, то они сами действуют как пути отсечения с учётом свойства border-radius . CSS разметка может выглядеть как в следующем примере:
Отсечение может быть весьма полезно для представления визуального контента. В следующих примерах к изображениям применяются различные операции отсечения.
Но отсечение может быть также полезным для разработки пользовательского интерфейса. В следующем примере зубчатый край указывает на продолжение списка.
- List Item 1
- List Item 2
- List Item 3
- List Item 4
- List Item 5
- List Item 6
- List Item 7
- List Item 8
- List Item 9
Прокрутите список для просмотра эффекта.
Обратите внимание, что clip-path (а также clip ) действует на все характеристики элемента, включая фон, границы и механизм прокрутки.
Анимация clip-path
Базовые фигуры и содержимое элемента может быть анимировано. Следующий пример показывает анимацию фигуры в виде звезды.
Вот исходный код для анимации базовой фигуры:
img:hover < clip-path: polygon(0px 208px, 146.5px 207px, 147px 141.2px, . ); animate: star 3s; >@keyframes star < 0% < clip-path: polygon(0px 208px, 146.5px 207px, 147px 141.2px, . ); >, 100% < clip-path: polygon(0px 208px, 146.5px 207px, 147px 141.2px, . ); >>
Маскирование
Вторая операция после отсечения — это маскирование. Изображение маски используется в качестве своего рода «цветной сетки», которая фильтрует визуальные части элемента. В следующих абзацах я поясню разницу между двумя видами масок: маска по яркости и альфа-маска.
Маска по яркости
В маске по яркости вначале изображение маски преобразуется в чёрно-белое изображение (если оно ещё не такое). «Светлые» части маски сильнее маскируют элемент в том же месте. К примеру, чёрный цвет означает полную прозрачность, белый полную непрозрачность, а серые оттенки означают частичную прозрачность элемента.
Альфа-маска
Альфа-маска использует тот же принцип, что и маска по яркости. Разница между ними только в альфа-канале изображения. Чем меньше уровень прозрачности маски, тем больше виден элемент в той же точке.
Подведем итог: оба типа маскирования влияет на уровень прозрачности элемента. Изображение ниже является результатом обоих маскирующих операций показанных выше.
Спецификация CSS Masking описывает два универсальных свойства для маскирования: mask и mask-border .
Свойство mask
Свойство mask сочетает в себе изображение маски и ссылку на маску.
Первый способ заключается в использовании свойств mask-image , mask-repeat , mask-position , mask-clip , mask-origin и mask-size , которые определяются подобно частям background вроде background-image . Как и для background-image можно определить несколько исходников маски, каждый из них представляет собой изображение описанное в CSS3 Images. Все исходники маски будут объединены в единое изображение маски, далее оно используется чтобы замаскировать элемент и его содержимое, как описано выше. Изображение может быть в любом растровом формате вроде JPG или PNG, а также SVG или градиентом CSS. Приведённый выше пример с маской может быть просто реализован с помощью следующего кода:
Если исходник маски должен быть растянут до размера содержимого, то просто используйте универсальное свойство mask как для фона, словно вы имеете дело со свойством background .
Вторым способом является ссылка на элемент , который описан в SVG 1.1. Элемент берёт любой графический элемент, а также группу элементов из SVG и использует их для создания изображения маски.
В итоге это выглядит как такое изображение.
Свойство mask-border
Свойство mask-border позволяет разделить изображение маски на 9 фрагментов: четыре уголка, четыре края и средняя часть. Эти части могут разрезаться, масштабироваться и растягиваться разными способами в соответствии с размером маски. Свойство заимствует функциональность из border-image и обеспечивает эффективное маскирование краёв и углов содержимого. Следующий пример демонстрирует поведение свойства:
Следующее изображение применяется в качестве изображения маски и разделено на девять частей:
Эти части в данный момент используется для маскирования углов и краёв содержимого, в результате мы получим следующий вид:
Поддержка браузерами
Интересным моментом является поддержка в браузерах. Когда дело доходит до конкретной реализации всё становится довольно сложным.
Все браузеры поддерживают clip согласно спецификации. Все браузеры поддерживают свойства mask и clip-path для элементов SVG согласно спецификации SVG 1.1. Но только один браузер позволяет применять эти свойства для HTML-элементов: Firefox (вроде как). Рассмотрим подробнее.
Свойства clip-path и mask со ссылкой на , а также элемент работают в Firefox изначально без всяких префиксов. С другой стороны, mask-image , mask-border и связанные с ними свойства не поддерживаются вообще. Базовые фигуры для отсечения тоже не работают.
Blink и браузеры основанные на WebKit вроде Chrome и Safari поддерживают mask-image и mask-border (только они называются -webkit-mask-box-image в обоих случаях) и связанные с ними свойства. Все они пишутся с префиксами и могут применяться к элементам HTML. Ночные сборки обоих браузеров уже поддерживают свойство -webkit-clip-path для базовых фигур и ссылки на элемент . WebKit дополнительно поддерживает ключевое слово box-sizing .
Если вы хотите попробовать отсечение и маскирование, то используйте свойства как с префиксом, так и без него. Свойство без префикса должно ссылаться на или в настоящее время.
Будьте осторожны, другие браузеры ещё не понимают маскирование и отсечение для элементов HTML.
Спрятать часть изображения средствами CSS
Третий день бьюсь, ничего не получается. Уже весь http://www.w3.org/TR/CSS21/ вдоль и поперёк прочитал.
Требуется средствами CSS, да так, чтобы во всех основных браузерах работало, вот такую конструкцию:
привести к виду, показанному слева:
, где зелёным показано собственно изображение, а заштрихована его невидимая часть. Эта невидимость должна достигаться средствами CSS. Допускается также некоторое количество «обвески» из HTML.
Пока что я научился делать только то, что показано справа, но это очевидно:
img background-color: #e0e0e0;
border: 1px solid #cccccc;
padding: 5px;
>
Размер изображения считать заранее неизвестным. Однако, если без этого совсем никак, буду требуемые циферки вытаскивать через PHP — с этими данными достаточно просто указать height: . и overflow: hidden; . Но очень не хотелось бы — это лишняя нагрузка на сервер, и не будет работать, скажем, в ЖЖ.
JavaScript, в общем, также возможен, однако крайне нежелателен по тем же (и некоторым другим) причинам.
Использовать как-то совсем кисло (слишком много наворотов, дополнительные страницы надо делать, размеры картинки вытаскивать и т.д.), хотя с ним, конечно, всё получится.
Если сделать невидимую область снизу невозможно, пусть она будет с любой другой стороны, да хоть со всех четырёх — это не принципиально.
Поясню, для чего это нужно; авось, ещё кому-нибудь пригодится. Надоело портить публикуемые снимки «водяными знаками», а как-то обозначать авторство, по крайней мере, для честных людей, надо. Поэтому хочу к каждой картинке приделывать снизу полосу с копирайтом, но при отображении в браузере в составе страницы эту полосу скрывать. А рамка нужна из эстетических соображений; можно и без неё, если она чем-то мешает. Вставить всё в ещё один несложно.
UPD: Всем спасибо, решение найдено. См. комменты.
3 простых и быстрых техники CSS для обрезки картинок
18.01.2010 11.02.2014 по 2Web 100 618
В этой статье мы расскажем вам о 3 быстрых и простых методах CSS, которые вы cможете использовать, чтобы показать только часть картинки на вашей страничке.
Все использованные здесь методы, фактически нуждаются только в паре строчек CSS кода. Однако, это не обрезание в прямом смысле этого слова (CSS пока не может сделать этого), мы просто скрываем и показываем только ту часть картинки, которую мы хотим увидеть.
Эти методики могут быть очень полезны, если вы хотите привести картинку к определенному размеру, то есть хотите создать, например, её превьюшку (уменьшенная копия изображения) в секции новостей или что-то подобное.
Техника 1 — использование отрицательных полей (Negative Margins)
Посмотреть пример
По этой технике картинку необходимо поместить в родительский элемент, в нашем случае, это параграф (тэг
) . Родительский абзац должен быть плавающим(floating) элементом (или с заданной шириной). Эта техника не будет работать на элементах с атрибутом «в полную ширину» (full width).
Затем мы задаем отрицательные поля для всех четырех сторон: верх( top ), право( right ), низ( bottom ) и лево( left ). Отрицательные поля определяют: насколько срезано в каждом направлении наше изображение, находящееся в родителе(параграфе). Получаем только часть от первоначальной картинки — обрезок. Затем, когда мы заменяем родительское свойство overflow на hidden , мы скрываем поля, которые находятся за нашим обрезком. Цель достигнута. Вам, правда, придется повозиться со значениями, чтобы по-настоящему почувствовать, как это работает.
Итак, HTML выглядит примерно так:
Как спрятать часть картинки, а остальную часть сделать фоном?
Всем привет!
Вообщем есть лого и оно заходит на меню, вот скриншот prntscr.com/29ctr7
И получается что мы не можем кликнуть на нижнюю область двух кнопок. Можно как-то спрятать часть лого, а оставшуюся часть сделать фоном для верхнего меню?
1. отрезать полголовы и разместить отдельной картинкой поверх меню.
2. сделать меню двуслойным — снизу фон, сверху текст, между ними — картинка
Зависит от верстки. Можно задать позицию логотипа абсолютную и поставить z-index меньше чем у блока меню.
спрятать нет сложности prntscr.com/29cz4h а вот как вернуть пропавшую часть лого, если фон у меню полоска в 1px?
могу честно сказать что ничем хорошим это не закончится.
да, есть несколько способов это сделать не разрезая картинку, но я даже не хочу их описывать — это долго и ненадежно.
если бы строитель был расположен хотя бы слева.
. и если Вы захотите сделать drop-down меню, снова будут проблемы.
убирайте отрицательный margin, пусть логотип не вылазит на меню. дизайну от этого будет только лучше