Геометрическая фигура на HTML/CSS
Как сделать на HTML/CSS такую геометрическую фигуру? В сети нашел метод с помощью clip-path и псевдоэлемента, задавая ему нулевую ширину/высоту, стилизуя border . Есть ли ещё способы?
Отслеживать
7,291 5 5 золотых знаков 27 27 серебряных знаков 69 69 бронзовых знаков
задан 9 апр 2018 в 3:24
rialit1993 Rialit rialit1993 Rialit
23 3 3 бронзовых знака
а сами то что сделали ? что уже реализовали и в чём вас не устроило то что есть в сети ?здесь не фрилансе и здесь помогут только если вы сами что то пытались сделать . а до этих пор это обычное либо учебное задание либо попытка получить на халяву готовое
9 апр 2018 в 4:42
Это не учебное задание, и не попытка получить халяву, сам я разобрался с вышеуказанными способами, но внутреннее я говорит что должен быть еще метод, поэтому и задаю такой вопрос, чтобы поощрить свое либидо
9 апр 2018 в 5:28
хм. тогда svg хороший способ . вы всё таки покажите что сделали . фотки не надо . код: html css или что там у вас ..
Как правильно рисовать геометрические фигуры в css?
Такой вопрос. Если нужно сделать какую нибудь простенькую геометрическую фигуру при верстке, как быть? Я загуглил, есть разные варианты сделать треугольник на css, но они все какие то муторные, надо использовать border, потом абсолютом накладывать. Можно ли это сделать как то проще и эффективней? Например я слышал что такую штуку как svg.
Ничего о ней не знаю, на курсах не рассказывали. Может подскажите где можно почитать (очень хотелось бы на русском), и есть ли какой то редактор, который позволяет быстро забомбить треугольник, стрелку, и тому подобное. Или можно как по другому делать?
- Вопрос задан более трёх лет назад
- 117 просмотров
1 комментарий
Простой 1 комментарий
Ankhena @Ankhena Куратор тега CSS
Как правильно
Нету правильности.
Есть задача, есть решения. Выбор оптимального зависит от задачи.
SVG
Редактор Inkscape или любой другой поддерживающий векторную графику.
Статей про SVG хоть на русском, хоть не на русском завались.
Мне нравятся вот отсюда css.yoksel.ru/svg-fill-and-stroke
Как использовать обрезку в CSS
От автора: все элементы на веб-страницах определены в прямоугольной рамке. Однако это не значит, что мы должны делать все блоками. Вы можете использовать свойство CSS clip-path, чтобы вырезать части изображения или другого элемента и создать интересные эффекты.
В приведенном выше примере изображение воздушного шара квадратное (источник). Использование clip-path со значением базовой фигуры circle() обрезает изображение, оставляя сам воздушный шар и часть неба вокруг него.
Поскольку изображение является ссылкой, вы можете увидеть еще кое-что, касающееся объекта clip-path. Кликнуть можно только по видимой области изображения, поскольку события не срабатывают на скрытых частях изображения.
Отсечение можно применить к любому элементу HTML, а не только к изображениям. Есть несколько разных способов создать clip-path, в этом посте мы рассмотрим их.
Совместимость с браузерами
Помимо значений box, как описано далее в этом посте, различные продемонстрированные значения clip-path имеют отличную поддержку браузерами. Для устаревших браузеров запасным вариантом может быть разрешить браузеру игнорировать свойство clip-path и отображать необрезанное изображение. Если это проблема, вы можете проверить clip-path в запросе функции и предложить альтернативный макет для неподдерживающих браузеров.
Как обрезать геометрическую фигуру в css
Как реализовывается такие углы(левый верхний, правый нижний) на CSS?

Код может не самый лучший, зато белую обводку можно сделать
Таких углов на CSS можно достичь с помощью свойств: border-
Нашел ответ на вопрос в этой статье.
Всё ещё ищете ответ? Посмотрите другие вопросы с метками css border или задайте свой вопрос.
Site design / logo © 2022 Stack Exchange Inc; user contributions licensed under cc by-sa. rev 2022.4.14.41981
Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.
Реальные примеры с clip-path
Каждая демонстрация использует clip-path из CSS, но в разметке также содержится встроенный SVG с классом clip-svg , который просто сбрасывает ширину и высоту SVG до 0. Вы также можете удалить этот класс и задать атрибуты width и height непосредственно в разметке SVG.
Пример 1: Обрезка изображений разными многоугольниками
Если вам требуется быстрое определение многоугольника — это замкнутая двумерная фигура, состоящая из прямых линий.
Таким образом, фигура не может быть многоугольником, если она содержит закругления, открыта или состоит меньше, чем из трёх линий. Наиболее известные многоугольники в истории — это треугольники, четырёхугольники, пятиугольники и шестиугольники. Даже звёзды является многоугольниками, поскольку границы многоугольника могут пересекать друг друга.
Примечание. Изображения в этой демонстрации адаптивные. Используя хорошее решение для адаптивных изображений img , а также адаптивные обтравочные контуры через CSS и SVG, мы делаем наши многоугольники прекрасно масштабируемыми.
Данная демонстрация является результатом упражнения для понимания построения координат при создании многоугольников. В демонстрации ниже я добавила несколько фигур, которые вы можете использовать в своих проектов. При наведении на каждое изображение вы увидите соотношение сторон исходного изображения.
Ничто не сравнится с исключительным инструментом Clippy для визуализации фигур — графическим интерфейсом от Беннетта Фели. Координаты всех существующих фигур представлены в процентах, также есть возможность добавления собственного многоугольника. Вы можете использовать Clippy для создания обрезанных фигур и своего SVG на их основе для лучшей поддержки в браузерах.
Пример 2: Анимация базовых фигур через transition
Наведите курсор на фиолетовый шестиугольник и он превратится в восьмиугольник. Однако заданного эффекта перехода не произойдёт.
Причина объясняется в статье Сары Суэйдан об анимации фигур через CSS: «Число точек, определяющих конечную фигуру, должно быть таким же, как число точек, определяющих начальную фигуру». Вполне логично!
Поскольку шестиугольник содержит шесть пар координатных точек, давайте добавим две пары через дублирование, чтобы их стало восемь и они соответствовали числу пар для восьмиугольника. Эти дублированные пары не будут влиять на форму шестиугольника.
Вот описание шестиугольника с шестью парами координатных точек:
А это описание шестиугольника с восемью парами координат, первые две из которых были дублированы:
Теперь переход при трансформации фигур будет плавным, как видно в демонстрации ниже.
Учтите, что для браузеров, которые поддерживают обтравочные контуры только на SVG, нам нужно добавить анимацию SMIL, чтобы получить бесшовный переход при наведении. Согласно спецификации SMIL, декларативные анимации могут применяться для анимации линий и точек многоугольника в SVG, что в настоящее время невозможно с помощью CSS.
Имейте в виду, что некоторые люди обсуждают устаревшие SMIL в Chrome и Chromium и уделяют особое внимание внедрению Web Animations API, который, к сожалению, находится на стадии рабочего проекта.
В демонстрации ниже (фоновое изображение предоставлено morgueFile), вы можете видеть, как мы анимировали точки многоугольника между событиями mouseover и mouseout в течение 0,2 секунд. Присмотритесь к тегу в разметке SVG.
Пример 3. Добавление рамки к обрезанному объекту
Для сокращения рассказа — границы, контуры и тени, которые лежат за пределами области отсечения, удаляются.
Мне было немного грустно от этого, и я поспрашивала членов W3C по рабочей группе CSS. Однако вывод в том, что нет способа сделать это при использовании базовых фигур. Дирк Шульцe так ответил на мой вопрос: «Да, все операции рисования с элементом отсекаются. Сюда входят контуры и границы».
Смотрите демонстрацию ниже. Наведите указатель на ромбоид с неполной рамкой, чтобы увидеть исходную, необрезанную версию с целой рамкой.
Конечно, мы всегда можем использовать приём, к которому я наконец пришла, и получить рамку с помощью генерируемого содержимого.
В демонстрации ниже создаётся копия элемента через псевдоэлемент ::after и затем он позиционируется абсолютно. Это создаёт иллюзию рамки, позволяя нам моделировать интересные эффекты, такие как градиентная рамка на втором восьмиугольнике и внутренняя тень через фильтр CSS на третьем (не очень изящно, но функционально). Обратите внимание, что фильтры CSS в настоящее время работают только в Firefox и в браузерах WebKit и Blink.
Пример 4: Использование clip-path для создания ромбовидной сетки
Ниже приведено изображение, которое будем использовать.

Вот эффект, к которому мы стремимся. При наведении указателя на нижние три блока вы увидите, что фоновый цвет исчезает и проступает изображение.

Фактический размер изображения составляет 600×600 пикселей. Так что начнём с четырех пустых по 300 пикселей каждый и применим к ним одно и то же фоновое изображение. Затем добавим родителя размером 604 пикселя и скомпонуем изображения с помощью inline-block .

Теперь изменим значение свойства background-position для каждого изображения на top , left , right и bottom , соответственно.

Обрежем каждый блок в виде ромба и наложим абсолютно позиционированный слой с некоторым текстом на каждое из нижних трёх изображений.

Теперь переместим изображения по рядам — второе и третье изображения в один ряд, а первое и четвертое в отдельные ряды.

Наконец, используем отрицательные margin для смещения второй и третьей строки, чтобы они выстроились как в окончательной демонстрации ниже. Мы можем удалить значение ширины 604 пикселя у родителя и переделать медиа-запрос, чтобы четыре ромба складывались в колонку на маленьких экранах и в ряды на больших.
Во время работы над этой демонстрацией я заметила ошибку в Chrome, связанную с событиями указателя, они отправлялись за пределами области отсечения, что нарушает спецификацию: «По умолчанию события указателя не должны отправляться за пределами обрезанной (невидимой) области». Я сообщила о данной ошибке. Проблема с этой демонстрацией была решена с помощью свойства pointer-events со значением none для класса overlay . В качестве альтернативы вы можете применить то же самое значение clip-path к overlay для обхода проблемы.
Из-за отрицательных margin эта демонстрация будет выглядеть странно в браузерах, которые не поддерживают clip-path . Так что желательно использовать какую-то проверку перед применением margin (но сама я с этим не экспериментировала) или @supports , хотя не рекомендовала бы последнее в рабочем коде.
Пример 5. Создание фиктивной страницы профиля на шестиугольниках
Наша финальная страница должна выглядеть так:

Начнём с добавления фоновой картинки в виде шестиугольных плиток к body (изображение любезно предоставлено Subtle Patterns).
Значения clip-path для шестиугольника могут быть получены с одной из демонстраций выше или с помощью инструмента Clippy.
Первый шестиугольник использует фоновое изображение (потому что мы смешиваем тусклый бордовый цвет с фоном с помощью свойства background-blend-mode ). Используя генерируемое содержимое, абсолютно позиционированный элемент обрезается до бордового треугольника, его вы можете видеть снизу. Он исчезает при наведении.
Для второго шестиугольника со словом «work» просто задан тёмно-серый фон, который меняется при наведении.
Третий шестиугольник содержит градиентную рамку, аналогичную той, что показана в демонстрации при создании рамок на clip-path .
Шестиугольники вертикально выстраиваются на маленьких экранах и выравниваются по центру на больших. Я использовала комбинацию display: table , абсолютного позиционирования и трансформации. Конечно, вы можете воспользоваться flexbox, float или чем-то ещё, что заставит вашу лодку плавать.
Вот заключительная демонстрация.
Я обнаружила ошибку с clip-path при создании этой демонстрации. Изменение значения opacity в сочетании с переходом CSS вызывает мерцание и артефакты на странице. Помните об этом, если используете clip-path для прогрессивного улучшения дизайна.
Также имеется другая ошибка с clip-path и свойством backface-visibility , когда оно задано как hidden . Эта ошибка задокументирована в Chromium и мне удалось воспроизвести её, используя синтаксис базовых фигур в Chrome под Linux. Имейте это в виду, если используете clip-path для создания классного трёхмерного разворота или чего-нибудь, что использует трёхмерную трансформацию CSS.
В то время как отсечение с помощью SVG бесспорно побеждает из-за гибкости и возможностей, оно не сравнится по простоте, с которой элементы могут быть обрезаны с помощью CSS. Фактически, одни и те же координаты многоугольников могут быть легко переработаны для создания адаптивного SVG для ещё лучшей поддержки в браузерах.
Благодаря clip-path вы можете значительно изменить внешний вид страницы, не беспокоясь о старых браузерах, где страница будет изящно деградировать. Если вы решите использовать clip-path для улучшения дизайна, следите за спецификацией, поскольку она продвигается к статусу «Рекомендация».
CSS Shapes
Прямоугольники внутри прямоугольников: это то, из чего состоят веб-страницы. Мы долго пытались вырваться из этих ограничений с помощью CSS для создания геометрических фигур, но форма этих фигур никогда не влияла на форму укладки контента внутри элемента, или на то, как элемент соотносится с другими элементами страницы.
Новая спецификация CSS Shapes меняет такое положение вещей. Представленная в середине 2012 года компанией Adobe , она имеет своей целью предоставить веб-дизайнерам новые возможности размещения контента, который теперь может обтекать сложные геометрические фигуры, как изнутри, так и снаружи — чего мы раньше не могли сделать даже с помощью JavaScript .
Например, обратите внимание, как текст обтекает круглое изображение в этом макете. Без Shapes , текст был бы просто прямоугольным блоком — возможность взаимодействия со сложными фигурами действительно открывает перед дизайнерами новые горизонты:

Давайте рассмотрим, как работает Shapes , и как вы можете начать его использовать.
Поддержка браузерами
В настоящее время CSS Shapes поддерживается только в Webkit Nightly и Chrome Canary , но его Модульный уровень 1 получил статус « рекомендовано к рассмотрению », то есть свойства и синтаксис, определенные в спецификации, вполне стабильны.
Думаю, не пройдет много времени, прежде чем Shapes будет реализован в других браузерах. Этот уровень ориентирован на свойства Shapes , которые изменяют обтекание фигур контентом.
В частности, здесь определено свойство shape-outside и связанные с ним другие свойства. В сочетании с другими новейшими функциями, такими как Обрезка и наложение , CSS-фильтры , и Компоновка и взаимодействие , CSS Shapes позволят нам создать более сложные конструкции, не прибегая при этом к помощи графических редакторов, таких как Photoshop или InDesign .
Последующие уровни CSS Shapes будут описывать заключение контента внутри фигур. Например, на сегодняшний день в CSS довольно просто создать фигуру ромба: просто повернуть элемент на 45 градусов, а затем повернуть содержимое внутри него в обратную сторону, чтобы текст располагался горизонтально.
Но контент внутри ромба не будет зависеть от контейнера этой фигуры, он всегда будет оставаться прямоугольным блоком.
Когда же будут реализованы свойства CSS Shapes shape-inside , мы сможем сделать блок самого контента также ромбическим, и такие макеты, как тот, что приведен ниже, станут вполне возможны:

Сегодня для того чтобы использовать CSS Shapes в Chrome Canary , вы должны с помощью специальной опции разрешить использование экспериментальных функций. Если вы не уверены, как это делается, посмотрите эту пошаговую инструкцию в блоге Adobe .
Создание CSS Shape
Вы можете применить форму к элементу с помощью одного из свойств Shapes. Вы передаете свойство фигуры в функцию Shapes в качестве значения. Функция фигуры, это то куда вы передаете аргументы, определяющие фигуру, которую вы хотите применить к элементу:

Фигуры могут быть созданы с помощью одной из следующих функций:
- circle() ;
- ellipse() ;
- inset() ;
- polygon() .
Каждая фигура определяется набором точек. Некоторые функции принимают точки в качестве параметров; другие принимают смещения — но все они в конечном итоге рисуют фигуры в виде набора точек. Мы рассмотрим параметры для каждой из этих функций в приведенных ниже примерах.
Фигура также может быть определена путем ее извлечения из изображения с помощью альфа-канала. Когда изображение передается в свойства фигуры, браузер извлекает фигуру из картинки, используя shape-image-threshold . Форма определяется пикселями, чьи альфа-значения больше, чем пороговое значение.
Изображение должно быть совместимо с CORS . Если предоставляемое изображение по какой-либо причине не может быть отображено (например, если оно не существует), то не будет применяться ни одна из фигур.
Список свойств фигуры, которые принимают указанные выше функции в качестве значений:
- shape-outside : укладывает контент вокруг (вне) фигуры;
- shape-inside : укладывает контент внутри фигуры.
Вы можете использовать свойство shape-outside в сочетании со свойством shape-margin, чтобы добавить отступ от краев фигуры, этот отступ отодвинет текстовый контент от границ фигуры, создавая между ними свободное пространство. Аналогично сочетание свойств shape-inside и shape-padding отодвигает контент от границ фигуры изнутри, создавая внутренний отступ.
С помощью свойств и функций фигур, объявить фигуру, применяемую к элементу, можно одной строкой CSS -кода:
Даже если вы примените этот CSS -код к элементу, форма не будет применена, если не будут выполнены два условия:
- Элемент должен быть плавающим. Будущие уровни CSS Shapes предоставят нам возможность определять фигуры и для не плавающих элементов, однако пока мы не можем сделать это;
- Элемент должен иметь внутренние размеры. Высота и ширина, установленные в элементе, будут использоваться для создания системы координат этого элемента.
Как я уже сказала, фигуры определяются в виде наборов точек. Так как эти точки имеют координаты, браузеру нужна система координат, чтобы знать, где расположить каждую точку в элементе. Так, приведенный выше пример будет работать, если он включен приблизительно следующим образом:
Установка таких внутренних размеров элемента, однако, не означает, что это повлияет на его адаптивность (мы поговорим об этом чуть позже).
Поскольку каждая фигура определяется набором точек, расположенных с помощью пары координат, изменение координат точки будет непосредственно влиять на созданную фигуру. Например, следующее изображение показывает шестиугольник, который может быть создан с помощью функции polygon() .
Фигура состоит из шести точек. Изменение горизонтальной координаты оранжевой точки изменит получившуюся фигуру, и это повлияет на расположение контента внутри и / или снаружи любого элемента, к которому эта фигура применяется:

Исходный бокс Shapes
C SS Shapes определяется и создается внутри исходного бокса ( reference box ), который используется, чтобы нарисовать фигуру в элементе. Кроме высоты и ширины элемента, бокс содержит: бокс границы, бокс смещения, бокс отступа, бокс контента, — они также используются в качестве основы для определения характеристик фигуры элемента.
По умолчанию бокс отступа используется в качестве основы — так, если вы применяете фигуру для элемента с отступом снизу, то этот отступ будет отсчитываться не от края фигуры, а от зоны отступа по умолчанию. Если вы хотите использовать одно из других значений бокса, вы можете указать его в сочетании с функцией фигуры, которую вы передаете в свойства фигуры:
Ключевое слово padding-box в приведенном выше коде указывает, что форма применяется, и она ограничивается боксом заполнения (областью заполнения) элемента. Функция circle() определяет фигуру круга, его размер и положение в элементе.
Определение Shapes с помощью функции фигуры
Мы начнем с укладки некоторой информации вокруг круглой картинки-аватара пользователя, вы могли бы использовать это для отображения профиля пользователя или вывода краткой справки о нем:

Мы будем использовать функцию circle() , чтобы применить фигуру круга с изображением пользователя, используя следующий код:
Вы можете спросить: » Почему бы не использовать border-radius для круглого изображения? » Ответ таков — свойство border-radius не влияет на обтекание контентом внутри или вокруг элемента, к которому применяется — оно не влияет на область контента внутри элемента или обтекание областью контента вокруг элемента. Оно влияет только на границы элемента и фоны.
Фоновая область обрезается по кругу, исходя из того, как задано свойство, но это и все. Контент внутри элемента будет оставаться прямоугольной формы, а контент вне элемента будет по-прежнему взаимодействовать с элементом, как будто он прямоугольной формы, потому что таково это свойство.
Мы используем свойство border-radius , чтобы сделать изображение круглым, таким образом, мы обычно и придаем круглую форму изображениям или другим элементам страницы:

В браузере, который не поддерживает CSS Shapes , контент вокруг круглого изображения будет обтекать его так, как будто оно вовсе не имеет круглую форму. Это будет нашим запасным вариантом для старых браузеров.
Для того чтобы изменить обтекание контента соответственно определенной фигуре, можно использовать свойства фигуры:
С помощью этого кода текст будет » видеть » круглую фигуру, примененную к изображению и укладываться вокруг него, как это было показано на первом скриншоте. (Сам результат вы можете увидеть здесь .) В браузерах, не поддерживающих Shapes , будет применяться код, который выводит контент так, как показано на втором скриншоте.
Вы можете использовать функцию circle() , как есть, или путем передачи в нее параметров. Ее официальный синтаксис следующий:
Знаки вопроса показывают, что эти параметры являются необязательными и могут быть опущены. Если вы опускаете один из параметров, его значение в браузере устанавливается по умолчанию. Если вы используете функцию circle() без указания расположения, то по умолчанию будет определяться круг, который расположен в центре элемента, к которому применена фигура.
Вы можете указать радиус окружности, используя любые единицы длины ( px , em , pt и т.д.) Вы также можете указать радиус, используя либо furthest-side , либо closest-side , но по умолчанию используется параметр closest-side , что означает, что браузер будет использовать расстояние от центра элемента до ближайшей к нему стороны, как длину радиуса. farthest-side использует расстояние от центра до самой дальней стороны элемента:

Функция ellipse() действует так же, как функция circle() , с теми же значениями, за исключением того, что вместо одного параметра радиуса, она принимает два: один для длины радиуса по оси х , второй — по оси у :
Функция inset() напрямую не связана ни с кругом, ни с эллипсом, она используется для создания прямоугольных фигур внутри элемента.
Но поскольку элементы уже имеют прямоугольную форму, и нам не нужно отдельно задавать прямоугольник, inset() может помочь нам создавать прямоугольники с закругленными углами, вокруг которых текст будет обтекать соответствующим образом:

Функция inset() принимает от одного до четырех значений смещения, которые определяют смещения внутри от краев исходного бокса. Они определяют, где прямоугольник будет размещен внутри элемента.
Функция также принимает необязательный параметр степени закругления углов вставляемого прямоугольника. Закругленные углы задаются точно так же, как border-radius , с использованием от одного до четырех значений, в сочетании с ключевым словом round :
Следующий код будет создавать прямоугольник с закругленными углами для плавающего элемента:
Реальный пример вы можете увидеть здесь .
И еще одна функция Shape — polygon() , она определяет более сложные произвольные фигуры, используя любое количество точек. Функция принимает набор пар координат, каждая из которых указывает положение одной точки. Множество точек в совокупности определяют фигуру.
В следующем примере, изображение расположено на странице справа, занимая всю высоту экрана. Мы хотим, чтобы текст обтекал песочные часы внутри изображения, поэтому мы используем функцию polygon() , чтобы задать неправильную фигуру внутри изображения:

CSS для приведенного выше изображения выглядит следующим образом:
Вы можете установить координаты точек, определяющих форму, в единицах длины или процентах, как в данном случае.
Этот код сам по себе дает такой результат, но как вы можете видеть, функция фигуры не влияет на остальные части изображения вне определенной формы.
В самом деле, применение функции фигуры к элементу — изображению, контейнеру или чему-то среднему — не влияет ни на что, кроме обтекания текстом обозначенной области фигуры. Фон, границы и все остальное остаются неизменным.
Для того чтобы визуализировать форму многоугольника, который мы создали, мы должны « обрезать » части изображения вне этой фигуры. В этом нам поможет свойство clip-path из CSS Masking Module .
Свойство clip-path принимает те же функции фигуры и значения, что и свойства фигуры. Если мы передадим в свойство clip-path ту же фигуру многоугольника, которую мы использовали в свойстве shape-outside , мы обрежем все части изображения, которые находятся вне определенной фигуры:
Результат будет следующим:

Свойство clip-path на сегодняшний день поддерживается с помощью префиксов, поэтому оно работает в Chrome через добавление к свойству префикса -webkit-. Реальный пример вы можете увидеть здесь .
Свойство clip-path прекрасно сочетается со свойствами фигур, так как оно помогает визуализировать созданные фигуры и обрезать все части элемента, которые находятся вне определенных форм. Поэтому вы, вероятно, найдете его полезным для себя и будете часто использовать его вместе со свойствами Shapes .
Функция polygon() также может принимать (необязательно) ключевые слова nonzero или evenodd . С их помощью указывается, как располагаются относительно друг друга области внутри фигуры многоугольника, которые имеют пересекающиеся сектора.
Больше об этом вы можете узнать в разделе свойства SVG fill-rule .
Определение фигуры с помощью изображения
Чтобы определить фигуру с помощью изображения, само изображение должно иметь альфа-канал, из которого браузер может извлечь фигуру.
Фигура определяется пикселями, чьи альфа-значения больше, чем определенное крайнее значение. Этот порог по умолчанию равен 0,0 (полностью прозрачный), или вы можете установить собственное значение с помощью свойства shape-image-threshold . Таким образом, любой непрозрачный пиксель будет использоваться как часть определенной формы из изображения.
Будущие уровни CSS Shapes смогут определять переходы, используя данные яркости изображения, вместо альфа-данных. Если это произойдет, shape-image-threshold сможет использовать или альфа-данные, или яркость, в зависимости от состояния переключателя.
Сейчас я хочу использовать следующее изображение, чтобы определить фигуру, соответствующую этому элементу, и задать обтекание текстом вокруг этой фигуры:

С помощью свойства shape-outside со значением url() , указывающим на это изображение фотографии, мы можем задать обтекание контентом вокруг элемента в форме листа:
Конечно, если бы вы применяли к элементу фон, его нужно было бы обрезать вне определенной фигуры. Так как clip-path не принимает альфа-изображение в качестве значения, это можно сделать с помощью свойства mask-image (с соответствующими префиксами) из Masking Module . Результат выглядит следующим образом:

Если вы создаете сложные фигуры, вы, возможно, захотите определить форму, используя изображение. Это позволит использовать альфа-канал изображения в Photoshop , вместо того, чтобы вручную определять точки.
Вы также, вероятно, захотите использовать изображение вместо функции фигуры, когда у вас есть несколько обтекаемых или исключаемых областей внутри элемента — в данный момент мы не можем объявлять несколько фигур в элементе. Но если изображение содержит несколько областей, браузер сможет извлечь эти области из изображения и использовать их.
CSS Shapes в адаптивном дизайне
Может ли CSS Shapes использоваться в процессе разработки адаптивного дизайна? Текущая спецификация уже охватывает shape-outside , и так как мы можем указывать размеры элемента не только в различных единицах длины, но и в процентах, мы смело можем этим пользоваться.
Это означает, что элемент с заданной shape-outside будет полностью адаптивным, как и любой другой плавающий элемент с размерами, заданными в процентах.
shape-inside пока еще не является адаптивной, но это только потому, что данный вопрос специально реализуется в Модульном уровне 2 , многие из нынешних ограничений будут решены в следующем уровне.
Инструменты Shape
Создание сложных форм с помощью функций фигур может оказаться непростой задачей, особенно если вы при помощи функции polygon() создаете фигуру, состоящую из множества точек, каждая со своими координатами. К счастью, команда веб-платформы компании Adobe работает над развитием интерактивного инструментария, что сделает многие вещи гораздо проще.
Беар Трэвис создал коллекцию Shape Tools , которая позволяет визуально задавать многоугольные фигуры. Затем инструмент автоматически генерирует для нас функцию фигуры. Это довольно удобно, но данные инструменты имеют определенные ограничения.
Если вы хотите создать форму на основе определенного изображения, не существует никакого способа вставить изображение в инструмент, а затем создать для него фигуру.
Более продвинутый и гибкий инструмент Shapes был разработан командой Adobe Web Platform . Инструмент был недавно выпущен в качестве расширения для бесплатного редактора Brackets компании.
Он позволяет визуализировать и редактировать фигуры непосредственно в браузере, и имеет интерактивную функцию предварительного просмотра, которая обновляет значения фигуры в таблице стилей, когда вы вносите изменения на странице.
Это позволяет мгновенно визуально отображать все изменения, и вы сразу можете увидеть, как ваши фигуры взаимодействуют с другими элементами страницы.
В правой части окна браузера осуществляется редактирование фигуры, а слева сразу интерактивно отображается код:
Этот инструмент станет для вас незаменимым, потому что он облегчает создание, редактирование и отладку фигур. Разван Калиман написал статью в блоге Brackets , из которой вы можете получить представление о том, как вам установить и начать использовать редактор Shapes в Brackets .
Будущее: CSS Exclusions
Спецификация CSS Shapes раньше использовалась и как спецификация CSS Shapes , и как Exclusions , но позже они были разделены.
В то время как CSS Shapes определяет свойства shape-inside и shape-outside , CSS Exclusions будет определять свойства, которые позволяют нам уложить контент вокруг элементов, которые не являются плавающими, например, элементов с заданным абсолютно расположением.
Это позволяет уложить контент таким образом, чтобы он со всех сторон был окружен другими элементами, как это показано на рисунке ниже:

В будущем, CSS Exclusions позволит нам уложить текст в виде врезки, как показано на этом развороте журнала. Врезка может также быть круглой формы, текст все равно отлично впишется.
Подобные макеты с элементами определенной формы расположенными по центру статьи — с текстом, обтекающим их со всех сторон — также будут возможны.
Дальнейшее развитие Shapes
Текущая спецификация CSS Shapes — это лишь первый шаг. Вскоре новые опции предоставят нам больше контроля при создании фигур и укладке контента в и вокруг них. Что в свою очередь облегчит превращение макетов в интерактивные конструкции с помощью всего нескольких строк кода.
Сегодня редакторы спецификации ориентированы на работу с shape-outside , и еще до конца 2014 года мы, вероятно, увидим широкое применение CSS Shapes .
Вы можете использовать Shapes уже сегодня, как инновационную часть своего рабочего процесса, при этом учитывая, что они на текущий момент еще недостаточно поддерживаются браузерами. Для более сложных конструкций вы можете использовать специальный скрипт для проверки того поддерживает ли браузер Shapes , и, если это не так, предоставлять запасной вариант.
Вы также можете расширить тест Modernizr с помощью этого скрипта , чтобы проверить поддерживается ли shape-outside или скачать пользовательские сборки, включающие этот скрипт.
CSS Shapes еще больше приблизит веб-дизайн к полиграфии. Примеры, приведенные в этой статье, довольно просты, но они позволят вам создавать конструкции, настолько же сложные, как и в иллюстрированных журналах или на плакатах — все это вы сможете воссоздать на экране.
Что бы вас не заинтересовало — макеты неправильной формы или анимированные Shapes — пришло время попробовать их на практике и поэкспериментировать.
Создаем крутые фигуры с помощью Clip-Path и разбиваем привычную боксовую модель.
Перевод статьи Karen Menezes Creating Responsive Shapes With Clip-Path And Breaking Out Of The Box. Публикуется с разрешения автора. Ссылка на оригинальную статью указана выше. С момента написания статьи 11.05.2015 статус спецификации не изменялся.
Свойство CSS clip-path — ваш билет к изменению формы монотонных, боксовых разметок традиционно ассоциирующимся с простым, отзывчивым дизайном. Вы начнете мыслить нестандартно, буквально выходить за рамки, и шестиугольники, звезды и восьмиугольники начнут оживать на ваших веб страницах. Однажды попробовав clip-path , вы будете постоянно генерировать любые фигуры, просто настраивая несколько значений
Несмотря на то что основным объектом этой статьи является использование clip-path для создания многоугольников с помощью CSS, все примеры поддерживают инлайновый SVG, для дополнительной поддержки в Firefox. Создание отзывчивых фигур с помощью SVG — простая задача, если вы хоть раз использовали CSS clip-path .
Clip-Path, в общих чертах
Вырезать фигуры, свойством clip-path , сродни вырезанию фигур (таких как круг или пятиугольник) из прямоугольного куска бумаги. Это свойство находится в спецификации “CSS Masking Module Level 1”. Состояние спецификации, “CSS masking поддерживает два значения для частичного или полного скрытия частей визуальных элементов: маскирование и обрезка”.
Первая часть, т.е. маскирование, использует графический элемент, такие как изображение PNG, CSS градиент или SVG элемент, как маску для скрытия частей другого элемента.
Вторая часть, т.е. clip-path , задействует замкнутый контур, который может быть базовой фигурой определенной в CSS или SVG используя тэг clipPath. Область внутри контура отобразится, а все что снаружи будет отсечено.
Примечание: Маскирование выходит за пределы этой статьи, но на CSS-Tricks и HTML5 Rocks можно найти более подробную информацию.
Ниже простая визуализация работы clip-path :
Примечание: примеры из этой статьи, включая указанный выше, будут работать в Firefox а также в WebKit и Blink браузерах, включая Chrome, Safari и Opera.
Clip-Path это вам не Clip
Есть такое старое CSS 2.1 свойство clip , которое весьма ограничено, главным образом потому, что оно поддерживает только прямоугольную форму. Это свойство устарело, вместо него нужно использовать clip-path .
Пример использования устаревшего синтаксиса:
Поддержка Clip-Path
В августе 2014, спецификация “CSS Masking Module” была опубликована как “Candidate Recommendation,” это шаг вперед по сравнению с ранним черновиком “Last Call Working Draft”. До того как мы посмотрим на поддержку в браузерах, важно рассмотреть разные способы применения clip-path к элементу, потому что поддержка в браузерах варьируется в зависимости от этих способов.
Есть два способа применения clip-path:
- Базовые фигуры CSS из “CSS Shapes Module” предоставляют удобный способ использования clip-path. Доступны следующие варианты фигур: polygon, circle, ellipse и inset; inset для прямоугольных фигур.
- С помощью SVG можно, в качестве альтернативы, создать фигуру используя SVG и затем обрезать элемент по этой фигуре используя синтаксис URL. Есть два способа реализации:
- ссылкой на инлайновый SVG (т.е. SVG разметка будет размещена прямо на странице)
- ссылкой на внешний SVG документ. В обоих случаях, элемент clipPath внутри SVG используется чтобы обернуть элемент который определяет фигуру обрезки, будь то круг, многоугольник, или другой элемент.
Сравните демо ниже в Firefox и в WebKit или Blink браузере, например Chrome, чтобы почувствовать разницу. Квадратные изображения означают ошибку при поддержке браузером. Примечание: третье изображение не показывается в Safari. Несмотря на широкий дебаггинг, решить проблему не удалось. Я была бы благодарна, если в секции комментов встретилось решение.
Если вы тестировали пример кода выше в разных браузерах, то наверняка заметили, что поддержка клиппирования довольно странная, и на данный момент она основывается на выборе способов которые вы применяете чтобы обрезать элемент:
- с CSS: Chrome 24+, Safari 7+, Opera 15+, iOS 7.1+, Android 4.4+, Opera Mobile 24+ (Примечание: для поддержки в указанных браузерах необходимо использовать вендорные префиксы -webkit.)
- с SVG: все браузеры указанные выше и Firefox 3.5+
Свойство clip-path пока не поддерживается Internet Explorer, но находится на рассмотрении как часть “Masking Module.”
Примечание: Есть оговорка насчет поддержки SVG для клиппирования. Современные WebKit и Blink браузеры поддерживают клиппирование с SVG только если SVG — инлайновый (т.е. внутри документа). Ссылки на внешние SVG поддерживаются только в Firefox, что подтверждается в примере кода выше. Проект Chromium знает об этом баге и работает над ним.
Давайте посмотрим преимущества CSS и SVG при использовании clip-path.
- Легкий для понимания простой синтаксис, по причине относительной простоты базовых CSS фигур.
- Отзывчивость легко достигается с помощью применения относительных единиц измерения, таких как проценты.
- Лучшая поддержка в браузерах, включая Firefox
- Вы можете обрезать сложные фигуры, использовать множество фигур и текст.
Пока CSS предлагает свойство background-clip, которое поддерживает множество вариантов (включая нестандартные способы обрезки текста), ни background-clip ни CSS’ clip-path не достигают того, что можно сделать с помощью SVG обрезки в современных браузерах. Знакомство с clip-path через CSS, тем не менее, не такое пугающее (особенно если вы не знакомы с манипуляциями SVG) и подготовит вас к тонкостям клиппирования с SVG, также как в “CSS Shapes Module,” где содержимое выравнивается по форме элемента.
Примечание: если вам не терпится окунуться во все тонкости SVG, обзор Sara Soueidan будет хорошим началом.
Давайте посмотрим на плюсы и минусы clip-path чтобы постепенно улучшить наш дизайн.
- Браузеры, не поддерживающие свойство clip-path будут его игнорировать. Если вы используете его с осторожностью, пользователи неподдерживаемых браузеров ничего не заподозрят. Таким образом событие клика ограничено фигурой и ее внешними границами. Мы увидим это в примерах кода ниже.
- Вы можете использовать проценты или любые другие единицы длины такие как px или em, для определения координат с базовыми фигурами CSS. Относительные единицы такие как проценты могут быть использованы для создания отзывчивых фигур, идеальных для адаптивного дизайна.
- Все границы, тени и контуры снаружи области обрезки будут отсечены. Вы можете добавить границу и ожидать что это будет выполнено. Посмотрим на некоторые альтернативы ниже.
- Спецификация еще не достигла стадии “Recommendation”, так что всегда есть шанс, что синтаксис будет временно изменен.
- Сообщалось о нескольких багах при использовании clip-path и 3Д трансформаций, переходов и проразчности, они будут рассмотрены в примерах далее. Будьте осторожны и избегайте комбинировая свойств, которые могут спровоцировть эти проблемы.
Clip-Path с использованием polygon: использование и синтаксис
Примеры кода ниже сфокусированы на использовании многоугольников в дизайне. Синтаксис для базовых фигур (т.е. прямоугольник, круг и эллипс) достаточно прост, и вы можете сделать с ними достаточно много. Многоугольники, тем не менее, практически открывают дверь к бесконечному числу фигур.
Базовый синтаксис для многоугольника выглядит следующим образом:
Каждая пара аргументов в списке представляет координаты по осям x и y вершин многоугольника.
Вот — как это выглядит в реальном мире (не считая текущей поддержки версии с префиксом WebKit):
Добавим поддержку для Firefox с помощью ссылки на инлайновый SVG:
Вот как выглядит наш селектор с кроссбраузерной поддержкой:
Ниже представлен код инлайнового SVG, который необходимо добавить в разметку.
И окончательный пример кода с многоугольником:
Вы можете создать отзывчивый SVG для обрезки в следующем порядке:
- Установите width и height для SVG в 0.
- Назначьте ID для clipPath элемента внутри SVG, на который можно ссылаться в CSS. Вы можете использовать инлайновый или внешний SVG, держа в уме поддержку браузеров, о которой говорилось ранее.
- Используйте значения координат в процентах назначенные в CSS clip-path. Просто делите их на 100 и уберите единицы измерения SVG.
Установите значения атрибута clipPathUnits для objectBoundingBox, таким образом фигура обрезки послужит границами HTML элемента на который она ссылается.
Dudley Storey может рассказать больше об этом.
Давайте посмотрим на примере как составить координаты для многоугольника.
Итак у нас есть изображение, которое обрезано. Фоновым цветом обозначены габариты оригинального изображения. Ячейки с координатами просто абсолютно спозиционированные дивы, положение которых, соответствует координатам многоугольника в процентах. Вы увидите, что они сохраняют свою позицию, даже даже если вы измените ширину окна браузера (например, до 400px или более).
Реальные примеры использования Clip-Path
Примечание: Каждый пример кода в этой статье использует clip-path с CSS но также имеет инлайновый SVG в разметке с классом clip-svg, который просто обнуляет значения высоты и ширины SVG. В качестве альтернативы, вы можете удалить класс и обнулить высоту и ширину прямо в разметке SVG.
Пример 1: Обрезаем изображение до разных многоугольных фигур
В данном случае нам понадобится определение многоугольника, это плоская замкнутая фигура состоящая из прямых линий.
Таким образом, фигура не может быть многоугольником если содержит кривые, разомкнута, или состоит менее чем из трех отрезков. Самые часто встречающиеся многоугольники: треугольники, четырехугольники, пятиугольники и шестиугольники. Даже фигура звезды является многоугольником, т.к. границы многоугольника связаны между собой.
Примечание: Изображения в примерах — отзывчивые. Используя решение для отзывчивости изображений img и адаптивные области обрезки для CSS и SVG, мы делаем наши многоугольники пропорционально уменьшающимися и увеличивающимися.
Этот пример является результатом упражнений по назначению координат для многоугольных фигур. В примере добавлены несколько фигур, которые вы можете использовать для своего дизайна. При наведении курсора на каждое изображение, вы увидите соотношение сторон оригинального изображения.
Ничто не сравнится с особенным Clippy , GUI инструментом от Bennett Feely для визуализации фигур. Все координаты для всех существующих фигур указаны в процентах, а также есть вариант с настраиваемым многоугольником. Это поворотный момент. Вы можете использовать Clippy для создания фигур обрезки и SVG для них, с целью лучшей поддержки в браузерах.
Пример 2: Анимация базовых фигур с помощью переходов CSS
Наведите курсор на фиолетовый шестиугольник. Он трансформируется в восьмиугольник. Тем не менее, переход CSS не сработал.
Причина такого поведения объяснена в статье Sara Soueidan об анимации фигур CSS : “ Число точек конечной фигуры должно соответствовать числу точек начальной фигуры.” Это вполне разумно!
Т.к. шестиугольник имеет шесть пар координат вершин, давайте добавим еще две пары дублирующих координат, чтобы достичь числа координат для восьмиугольника. эти дублирующие пары координат никак не повлияют на шестиугольник.
Так выглядит стандартное объявление шести пар координат для шестиугольника:
А это объявление шестиугольника с восемью парами координат (первые две вершины продублированы):
Теперь, при трансформации фигуры, переход будет плавным, как в примере ниже.
Примечание: Для браузеров поддерживающих области обрезки через SVG (а именно Firefox), нам понадобится добавить SMIL анимацию для реализации перехода при наведении. Согласно SMIL спецификации, анимации могут использоваться для изменения контуров и точек фигур SVG, которое невозможно выполнить средствами CSS.
Помните, что некоторые осуждают использование SMIL в Chrome и Chromium при этом фокусируясь на внедрении Web Animations API, которое, к сожалению, пока на стадии раннего черновика.
В примере ниже, вы можете увидеть, что мы анимировали вершины многоугольника между событиями указателя мыши mouseover и mouseout events в течение 0.2 секунд. Обратите внимание на тэг в SVG разметке.
Пример 3: Добавляем границы для обрезанного объекта.
Короче, границы, контуры и тени that находящиеся снаружи обрезаемой области будут удалены.
Меня немного опечалил этот факт, и я решила отправить запрос представителям W3C рабочей группы CSS. Тем не менее, в итоге оказалось, что нет способа реализовать это при использовании базовых фигур. Dirk Schulze ответил на мой запрос: “Да, все операции отрисовки,которые принадлежали элементу будут обрезаны. Это включает контуры и границы.”
Посмотрите на пример кода ниже. Наведите курсор на ромб с частичными границами чтобы увидеть оригинальную, полную версию со всеми границами.
Конечно, мы всегда можем использовать CSS хак чтобы получить границу, к чему я в итоге и решила прибегнуть — старый добрый генерируемый контент.
В примере ниже создается копия элемента через псевдо-элемент (content:after) с абсолютным позиционированием. Получается иллюзия границы, позволяя нам использовать интересные эффекты, такие как граница с градиентом во втором восьмиугольнике и добавление тени с помощью CSS фильтра на третьем (не очень симпатично, зато работает). Заметьте, что that CSS фильтры на текущий момент работают только в Firefox и в WebKit и в Blink браузерах.
Пример 4: Используем CLIP-PATH для создания “бриллиантовой” сетки из ромбов.
Ниже изображение которое мы будем использовать.

А это то, к чему мы стремимся. По наведению на один из трех нижних блоков, вы увидите что фоновый цвет постепенно исчезает и появляется фон.

Актуальный размер изображения составляет 600 × 600 пикселей. Значит, давайте начнем с четырех пустых дивов по 300 пикселей каждый и применим к ним одинаковое фоновое изображение. Еще добавим родительский контейнер размером 604 пикселя и разместим изображения с применением свойства `inline-block`.

Теперь, изменим значение свойства background-position для каждого изображения на top , left , right и bottom , соответственно.
Давайте обрежем каждый блок по фигуре ромба.
Мы перекроем абсолютно спозиционированным слоем три нижних изображения, с небольшим текстом.

Теперь переместим изображения в строки — второе и третье изображение в одну строку, а первое и четвертое изображение в собственные индивидуальные строки.

Наконец, используем отрицательные margins чтобы поднять вторую и третью строки, таким образом они будут располагаться как в примере ниже. Мы можем удалить значение ширины родительского контейнера 604 пикселя, и назначить медиа запросы, чтобы блоки ромбов менялись от расположения в колонку на маленьких экранах, до расположения в строку на экранах побольше.
Работая над эти примером, я заметила баг в Chrome с направленным pointer-events вне обрезанной области, что является нарушением спецификации: “По умолчанию, pointer-events не должно ссылаться на отсеченные (неотображаемые) области фигуры.” Я получила ошибку. Проблема в этом примере решена использованием свойства pointer-events со значением none для слоя наложения. В качестве альтернативы, вы можете применить такое же значение clip-path для слоя наложения. Чтобы решить проблему.
Из-за применения отрицательных отступов, этот пример может выглядеть странно в браузерах, не поддерживающих clip-path . Вам нужно использовать что-то типа проверки возможности использования clip-path для применения отступов (хотя, я этого не пробовала) или использовать запрос для CSS @supports, хотя последнее я не рекомендую использовать в продакшене.
Пример 5: Делаем глупую страничку профиля с шестиугольниками.
В результате наша страница должна выглядеть так:

Начнем с добавления фонового изображения из шестиугольных плиток для body (спасибо за изображение Subtle Patterns).
Значения шестиугольника для clip-path могут быть получены из примеров ниже или с помощью Clippy tool.
Первый шестиугольник использует фоновое изображение (т.к. мы подмешиваем скучный бордовый в фон используя свойство background-blend-mode ). Используя полученное содержимое, абсолютно спозиционированный перекрывающий слой обрезается до бордового треугольника, который вы видите внизу. Он исчезает при наведении курсора.
Второй шестиугольник, со словом “work,” просто содержит серый фон, который меняется при наведении.
У третьего шестиугольника есть граница с градиентом, так же как и в одном из примеров с созданием границ с помощью clip-path .
Шестиугольники складываются на маленьких экранах и центрируются по вертикали на экранах побольше. Я использовала комбинацию свойства display : table и хака для абсолютного центрирования — конечно, вы можете использовать flexbox , floats или что-то еще, что поможет удержать ваш корабль верстки “на плаву”.
Вот итоговый пример кода.
Я обнаружила баг clip-path при создании этого примера. Изменение значения свойства opacity в сочетании с переходами CSS провоцирует мигание и артефакты на странице. Избегайте этого, если вы используете clip-path чтобы улучшить дизайн.
Также есть проблема при использовании clip-path и свойства backface-visibility если его установить в значение hidden . Этот баг указан в баг трекере Chromium и мне удалось его воспроизвести используя основной синтаксис для фигур в Chrome на Linux. Помните об этом если используете clip-path фигуру для создания крутого 3D поворота или чего нибудь, что использует 3D трансформации CSS.
Обрезка с помощью SVG без труда побеждает из-за ее гибкости иnи вариаций, но ничто не сравнится с легкостью,с которой элемент может быть обрезан с помощью CSS. Фактически, те же координаты для многоугольника могут быть играючи преобразованы для создания отзывчивого SVG и лучшей поддержки браузерами. С clip-path , вы можете кардинально менять вид и поведение страницы, не слишком волнуясь о поддержке браузерами, где она ухудшена. При выборе clip-path для улучшения дизайна, следите за статусом спецификации, возможно она продвинется до статуса “Recommendation”.
Похожие публикации:
- Как отключить кэширование css на сайте
- Как открыть папку в node js
- Что выбрать arduino или raspberry
- Что лучше css v34 или css v91
