Как обрезать углы у фотографии при помощи css
Визуально выглядит как отрезанный угол. На деле поверх угла кладется непрозрачный треугольник.
.corner < position: relative; width: 200px; >.corner img < width: 200px; >.corner:after < content: ''; width: 0; height: 0; border-left: 20px solid transparent; border-top: 20px solid transparent; border-right: 20px solid #fff; border-bottom: 20px solid #fff; position: absolute; bottom: 0; right: 0;
Отслеживать
ответ дан 8 фев 2013 в 9:47
Denis Khvorostin Denis Khvorostin
5,160 5 5 золотых знаков 37 37 серебряных знаков 82 82 бронзовых знака
Спасибо, помогло.
8 фев 2013 в 10:03
1) Добавить туда див с уголком цвета фона.
2) распечатать фотку на N дивах, где N - максимальная длина катета угла.
Второе решение - супертяжелое, но зато будет работать везде
3) напечатать фотку в качестве бэкграунда + в качестве картинки бордера. Потом использовать фишки из CSS Shapes
Отслеживать
ответ дан 8 фев 2013 в 9:20
25.8k 1 1 золотой знак 37 37 серебряных знаков 70 70 бронзовых знаков
Фон не однородный. 3 вариант сейчас попробую реализовать.
8 фев 2013 в 9:37
- css3
- вёрстка
-
Важное на Мете
Похожие
Подписаться на ленту
Лента вопроса
Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.
Дизайн сайта / логотип © 2023 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2023.11.15.1019
Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.
Срезанные/скошенные углы у DIV-слоя с произвольным фоном внутри него и под ним на чистом CSS. Реально ли?
Вот пример (здесь углы через :before/:after и кусочки .png):
Насколько реально сделать:
Срезанные углы у DIV под 45 градусов и произвольным фоном на слое (и вокруг него) на чистом CSS?
1. Поведение такое же как и с закруглёнными, только нужно срезать углы по-прямой.
2. Возможность сайзинга
3. Без нарезки фоновой картинки DIV на куски: изображение - всегда единое.
4. Без JS на чистом CSS и кросс-браузерно.
Насколько это реально сделать?
Заранее, всем Спасибо!
- Вопрос задан более трёх лет назад
- 31489 просмотров
8 комментариев
Средний 8 комментариев
Как обрезать углы в css
Срезание углов — это не только быстрый способ достичь цели, но и популярный вариант стилизации как в печатном дизайне, так и в веб-дизайне. Чаще всего он подразумевает обрезание одного или нескольких уголков контейнера под углом 45°. В последнее время, в связи с тем, что скевоморфизм начал сдавать позиции плоскому дизайну, этот эффект пользуется особенной популярностью. Когда углы срезаются только с одной стороны и каждый из них занимает 50% высоты элемента, это создает фигуру в форме стрелки, что также часто используется в оформлении кнопок и элементов навигации типа «хлебные крошки».
Однако в CSS все еще недостаточно инструментов для создания этого эффекта с помощью простых и понятных однострочных решений. Из-за этого многие разработчики склоняются к использованию фоновых изображений: либо закрывают срезанные углы треугольниками (на одноцветном фоне), либо создают весь фон с помощью одного или нескольких изображений, где углы уже срезаны. Очевидно, что такие методы совершенно негибкие, они сложны в сопровождении и увеличивают время ожидания вследствие дополнительных HTTP-запросов и общего размера файлов веб-сайта.

Пример веб-сайта, где срезанный угол (нижний левый у полупрозрачного поля Find & Book) отлично вписывается в дизайн
Решение
Одно возможное решение предлагают нам всемогущие градиенты CSS. Предположим, что нам требуется только один срезанный угол, скажем, нижний правый. Трюк в том, чтобы воспользоваться способностью градиентов принимать направление угла (например, 45deg ) и позиции границ перехода цвета в абсолютных значениях, которые не меняются при изменении габаритных размеров элемента, которому принадлежит фон. Из вышесказанного следует, что нам будет достаточно одного линейного градиента.
Мы добавим прозрачную границу перехода цвета для создания срезанного угла и еще одну границу перехода цвета в той же позиции, но уже с цветом, соответствующим фону. Код CSS будет следующим (для угла размером 15px ):
background: #58a;
background:linear-gradient(-45deg, transparent 15px, #58a 0);
Просто, не так ли? Результат вы видите на рисунке.

Технически первое объявление нам даже не требуется. Мы добавили его только в качестве обходного пути: если градиенты CSS не поддерживаются, то второе объявление будет проигнорировано, так что мы как минимум получим фон сплошного цвета. Теперь предположим, что нам требуются два срезанных угла, скажем, оба нижних. Это невозможно реализовать с помощью одного градиента, так что нам понадобятся два. Первой мыслью может быть нечто подобное:
background: #58a;
background: linear-gradient(-45deg, transparent 15px, #58a 0), linear-gradient(45deg, transparent 15px, #655 0);
Однако, это не работает. По умолчанию оба градиента занимают всю площадь элемента, так что они заслоняют друг друга. Мы должны уменьшить их, ограничив каждый из них половиной элемента с помощью background-size :
background: #58a;
background: linear-gradient(-45deg, transparent 15px, #58a 0) right, linear-gradient(45deg, transparent 15px, #655 0) left;
background-size: 50% 100%;
Результат вы можете видеть на рисунке.


Несмотря на то что мы применили background-size , градиенты все равно перекрывают друг друга. Причина в том, что мы забыли выключить background-repeat,поэтому каждый из фонов повторяется дважды. Следовательно, один из фонов все так же заслоняет другой, но на этот раз за счет повторения. Новая версия кода выглядит так:
background: #58a;
background: linear-gradient(-45deg, transparent 15px, #58a 0) right, linear-gradient(45deg, transparent 15px, #655 0) left;
background-size: 50% 100%;
background-repeat: no-repeat;
Результат вы можете увидеть на рисунке и убедиться, что он — наконец-то! — работает! Вы наверняка уже догадались, как применить этот эффект ко всем четырем углам. Вам потребуются четыре градиента и код, подобный следующему:

background: #58a;
background: linear-gradient(135deg, transparent 15px, #58a 0) top left,
linear-gradient(-135deg, transparent 15px, #655 0) top right,
linear-gradient(-45deg, transparent 15px, #58a 0) bottom right,
linear-gradient(45deg, transparent 15px, #655 0) bottom left;
background-size: 50% 50%;
background-repeat: no-repeat;
СОВЕТ
Мы использовали разные цвета (#58a и #655 ) для упрощения отладки. На практике оба градиента будут одного и того же цвета.
Но проблема предыдущего кода в том, что он трудно поддается сопровождению. Он требует внести пять правок для изменения фонового цвета и четыре для изменения величины угла. Примесь, созданная с помощью препроцессора, могла бы сократить количество повторений. Вот как этот код будет выглядеть в SCSS:
SCSS
@mixin beveled-corners($bg,
$tl:0, $tr:$tl, $br:$tl, $bl:$tr)

Затем, когда необходимо, его можно будет вызывать, как показано далее, с 2–5 аргументами:
SCSS
@include beveled-corners(#58a, 15px, 5px);
В этом примере мы получим элемент, у которого верхний левый и нижний правый углы срезаны на 15px , а верхний правый и нижний левый — на 5px , аналогично тому, как работает border-radius , когда мы указываем меньше четырех значений. Это возможно благодаря тому, что мы в нашей примеси SCSS также позаботились о значениях по умолчанию для аргументов, — и да, эти значения по умолчанию могут ссылаться и на другие аргументы тоже.
ПОПРОБУЙТЕ САМИ!
http://play.csssecrets.io/bevel-corners-gradients
Искривленные срезанные углы

Превосходный пример использования искривленных срезанных углов на веб-сайте http://g2geogeske.com; дизайнер сделал их центральным элементом оформления: они присутствуют в навигации, в содержимом и даже в нижнем колонтитуле.
Вариация метода с градиентами позволяет создавать искривленные срезанные углы — эффект, который многие называют «внутренним радиусом рамки», так как он выглядит словно инвертированная версия скругленных углов. Единственное отличие заключается в использовании радиальных градиентов вместо линейных:
background: #58a;
background: radial-gradient(circle at top left, transparent 15px, #58a 0) top left,
radial-gradient(circle at top right, transparent 15px, #58a 0) top right,
radial-gradient(circle at bottom right, transparent 15px, #58a 0) bottom right,
radial-gradient(circle at bottom left, transparent 15px, #58a 0) bottom left;
background-size: 50% 50%;
background-repeat: no-repeat;

Так же как и в предыдущей технике, размером угла можно управлять посредством позиций границ перехода цвета, а примесь способна и этот код сделать более пригодным для дальнейшего сопровождения.
Решение со строковым SVG и border-image
Хотя решение, основанное на градиентах, работает, у него есть несколько недостатков:
код очень длинный и полон повторений. В самом распространенном случае, когда нам требуется обрезать все четыре угла на одинаковую величину, изменение этой величины влечет за собой четыре правки в коде.
Аналогично, для изменения фонового цвета также необходимы четыре правки, а если учитывать резервное решение, то все пять; анимировать изменение величины срезанного угла невероятно сложно, а в некоторых браузерах вообще невозможно. К счастью, в зависимости от желаемого результата мы можем воспользоваться еще парой методов. Один из них подразумевает объединение border-image со строковым SVG-кодом, в котором и генерируются углы.
Зная, как работает border-image (если вам необходимо освежить эти знания в памяти, подсказку вы найдете здесь), можете ли вы уже представить, как должен выглядеть требуемый SVG-код?
Так как габаритные размеры для нас неважны ( border-image позаботится о масштабировании, а SVG-рисунки идеально масштабируются вне зависимости от габаритов — будь благословенна векторная графика!), все размеры можно приравнять к единице, для того чтобы оперировать более удобными и короткими значениями. Величина срезанного угла будет равна единице, и прямые стороны также будут равны единице. Результат (увеличенный для удобства восприятия). Код, необходимый для этого, показан далее:
border: 15px solid transparent;
border-image: 1 url(‘data:image/svg+xml,\
width=»3″ height=»3″ fill=»%2358a»>\
\
’);

Обратите внимание, что размер шага нарезки равен 1 . Это не означает 1 пиксел; фактический размер определяется системой координат SVG-файла (потому-то у нас и отсутствуют единицы измерения). Если бы мы использовали проценты, то нам пришлось бы аппроксимировать 1/3 изображения дробным значением, вроде 33.34% . Прибегать к приблизительным значениям всегда рискованно, так как в разных браузерах значения могут округляться с разной степенью точности. А придерживаясь единиц изменения системы координат SVG-файла, мы избавляем себя от головной боли, сопутствующей всем этим округлениям.

Как вы видите, срезанные углы присутствуют, но фона нет. Эту проблему можно решить двумя способами: либо определить фон, либо добавить ключевое слово fill к объявлению border-image , чтобы центральный элемент нарезки не отбрасывался. В нашем примере мы лучше определим отдельный фон, так как это определение будет также служить обходным путем для браузеров, не поддерживающих данное решение.
Помимо этого, вы, вероятно, заметили, что теперь срезанные углы меньше, чем при использовании предыдущей техники, и это может поставить в тупик. Мы ведь задали ширину рамки, равную 15px! Причина в том, что в решении с градиентом эти 15 пикселов отсчитывались вдоль градиентной линии, которая перпендикулярна направлению градиента. Однако ширина рамки измеряется не по диагонали, а по горизонтали/вертикали.
Чувствуете, к чему я веду? Да-да, снова вездесущая теорема Пифагора, которую мы активно использовали здесь. Схема на рисунке должна прояснить ситуацию.

Короче говоря, для того, чтобы достичь того же визуального результата, нам необходима ширина рамки, в 2 раз превышающая размер, который мы бы использовали в методе с градиентом. В данном случае это будет пиксела, что разумнее всего аппроксимировать до 20px , если только перед нами не стоит задача как можно точнее приблизить размер диагонали к заветным 15px :
border: 20px solid transparent;
border-image: 1 url(‘data:image/svg+xml,\
width=»3″ height=»3″ fill=»%2358a»>\
0,2″/>\
’);
background: #58a;
Однако, как можно видеть, результат не совсем тот, которого мы ожидали.

Куда делись наши кропотливо срезанные углы? Не бойся, юный падаван, углы все так же на месте. Вы сразу же поймете, что произошло, если установите другой фоновый цвет, например #655.
Как демонстрирует рисунок ниже, причина, почему наши углы исчезли, кроется в фоне: тот фон, который мы выше определили, попросту заслоняет их. Все, что нам нужно сделать для устранения этого неудобства, — с помощью background-clip запретить фону подлезать под область рамки:
border: 20px solid transparent;
border-image: 1 url(‘data:image/svg+xml,\
width=»3″ height=»3″ fill=»%2358a»>\
0,2″/>\
’);
background: #58a;
background-clip: padding-box;

Теперь проблема решена, и наше поле выглядит точно так же, как раньше. К тому же на этот раз мы можем с легкостью изменить размер углов, внеся всего лишь одну правку: просто скорректируем ширину рамки. Мы можем даже анимировать этот эффект, потому что border-width поддерживает анимацию!
А для смены фона требуется теперь две правки вместо пяти. Кроме того, так как наш фон не зависит от эффекта, накладываемого на углы, мы можем определить для него градиент или любой другой узор, при условии, что по краям цвет все так же будет равен #58a .
Например, мы используем радиальный градиент от цвета hsla(0,0%,100%,.2) до transparent. Осталось решить лишь одну небольшую проблему. Если border-image не поддерживается, то резервное решение не ограничится отсутствием срезанных углов. Из-за того что фон обрезан, пространство между краем поля и его содержимым уменьшится. Для того чтобы исправить это, необходимо для рамки определить тот же цвет, который мы используем для фона:
border: 20px solid #58a;
border-image: 1 url(‘data:image/svg+xml,\
width=»3″ height=»3″ fill=»%2358a»>\
\
’);
background: #58a;
background-clip: padding-box;
В браузерах, где наше определение border-image поддерживается, этот цвет будет проигнорирован, но там, где border-image не работает, дополнительный цвет рамки обеспечит более изящное резервное решение. Единственный его недостаток — увеличение количества правок, необходимых для изменения фонового цвета, до трех.
ПОПРОБУЙТЕ САМИ!
http://play.csssecrets.io/bevel-corners
Решение с обтравочным контуром
Хотя решение с border-image очень компактное и хорошо соответствует принципам DRY, оно накладывает определенные ограничения. Например, наш фон все так же должен быть либо целиком, либо хотя бы вдоль кромок заполнен сплошным цветом.
А что, если мы хотим использовать другой тип фона, например текстуру, узор или линейный градиент? Существует другой способ, не имеющий подобных ограничений, хотя, конечно, определенные ограничения его применения есть.
Помните свойство clip-path из секрета «Как сделать ромб»? Обтравочные контуры CSS обладают поразительным свойством: они позволяют смешивать процентные значения (с помощью которых мы указываем габаритные размеры элемента) с абсолютными, обеспечивая невероятную гибкость. Например, код обтравочного контура, обрезающего элемент до формы прямоугольника со скошенными углами размером 20px (если измерять по горизонтали), выглядит так:
background: #58a;
clip-path: polygon(
20px 0, calc(100% — 20px) 0, 100% 20px,
100% calc(100% — 20px), calc(100% — 20px) 100%,
20px 100%, 0 calc(100% — 20px), 0 20px);
Несмотря на краткость, в этом фрагменте кода принципы DRY не соблюдены, и это становится одной из самых больших проблем, если вы не используете препроцессор. В действительности этот код — лучшая иллюстрация принципа WET из всех решений на чистом CSS, представленных в этой книге, ведь для изменения размера угла здесь требуется внести целых восемь (!) правок.
С другой стороны, фон можно поменять с помощью только одной правки, так что у нас есть хотя бы это. Одно из преимуществ данного подхода — то, что мы можем использовать абсолютно любой фон или даже обрезать подменные элементы, такие как изображения. На рисунке показано изображение, стилизованное с использованием срезанных углов. Ни один из предыдущих методов не позволяет добиться такого эффекта. Помимо этого, свойство clip-path поддерживает анимацию, и мы можем анимировать не только изменение размера угла, но и переходымежду разными фигурами.

Все, что для этого нужно, — использовать другой обтравочный контур. Помимо многословности и ограниченной поддержки браузерами, недостатком этого решения является то, что, если мы не позаботимся о достаточно широкой забивке, текст также будет обрезан, так как при обрезке элемента его составляющие никак не учитываются. В противоположность этому метод с градиентом позволяет тексту просто выходить за границы обрезанных углов (ведь они всего лишь часть фона), а метод с border-image работает так же, как обычные рамки, — переносит текст на новую строку.
If you have found a spelling error, please, notify us by selecting that text and tap on selected text.
Блок со скошенным углом на CSS

Существует несколько способов создания блоков со скошенными углами на CSS. Блоки со скошенными углами можно использовать для секций или для всевозможных карточек на сайтах. На макетах для верстки такой способ отрисовки блоков довольно часто встречается.
Посмотрите демо на CodePen
Независимо от способа, у нас всегда будет блок и псевдоэлемент (before / after). Сделаем у блока правый верхний угол скошенным.
// HTML разметка
Иван Петров
Консультант по кредитам
// CSS код
.block
Мы видим псевдоэлемент черного цвета в верхней части блока. Нам пришлось его сдвинуть вверх на его собственную высоту (30 пикселей). Черный цвет используется для лучшей наглядности.

Первый способ: linear-gradient()
Эффект скошенного края получается за счет резкого перехода между двумя цветам у линейного градиента. Поэтому зададим свойству background вместо черного цвета, линейный градиент. Укажем направление заливки градиентом (из нижнего левого угла к верхнему правому), от красного (цвет блока) до прозрачного цвета и по 50% на каждый цвет, чтобы был резкий переход.
background: linear-gradient(to top right, red 50%, rgba(255,0,0,0) 52%);

Второй способ: transform: skewY()
Значение skewY() свойства transform будет искажать наш блок по оси Y на .-175 градусов. Вернем у псевдоэлемента before назад красный цвет и добавим к свойству трансформации, искажение skew.

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

Оба эти способа имеют хорошую поддержку у браузеров, даже у семейства Microsoft.

Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!
Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.
Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления
Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.
Порекомендуйте эту статью друзьям:
Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):
Она выглядит вот так:
Комментарии ( 0 ):
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.
Вырезать углы с помощью CSS
Я хочу «вырезать» верхний левый угол div, как если бы вы свернули угол страницы вниз.
Я бы хотел сделать это на чистом CSS, есть ли методы?
задан 06 сен ’11, 15:09
16 ответы
Если родительский элемент имеет сплошной цвет фона, вы можете использовать псевдоэлементы для создания эффекта:
PS Предстоящий border-corner-shape это именно то, что вы ищете. Жаль, что это может быть вырезано из спецификации и никогда не попадет в какие-либо браузеры в дикой природе
Я не понимаю, почему это работает. Before используется для добавления содержимого к элементу. Что вызывает диагональный эффект? — чили ОРЕХ
@chiliNUT — :before добавляет псевдоэлемент, стиль которого может быть изменен независимо от основного элемента. Псевдоэлемент здесь оформлен рамкой, которая создает белый треугольник (когда границы элемента встречаются, они обрезаются по диагонали. — Джозеф Зильбер
Это круто, но я считаю, что прав, говоря, что это работает только тогда, когда цвет фона за родительским элементом белый? — Энди
@Andy Или предсказуемого сплошного цвета. — Натан Артур
Есть / будут? однако можно обойти эту проблему, например, чтобы отключить переполнение. — Brandito
Если вам нужно прозрачный вырезанный край, вы можете использовать повернутый псевдоэлемент в качестве фона для div и расположите его так, чтобы вырезать нужный угол:

Обратите внимание, что это решение использует преобразования, и вам необходимо добавить необходимые префиксы поставщиков. Для получения дополнительной информации см. могу ли я использовать.
к отрежьте правый нижний край, вы можете изменить свойства top, transform и transform-origin псевдоэлемента на:
ответ дан 27 апр.
Это действительно хорошее решение — Томас Вуд
Просто если кто-то ищет 2 обрезанных угла решение: jsfiddle.net/o2udwet4 для кнопок назад / вперед — Кирилл
Было бы неплохо, если бы кто-нибудь объяснил, почему это работает. Что-то связано с порядком прорисовки псевдоэлементов? — Адам Томас
@AdamThomas Фон применяется к :after псевдоэлемент, выходящий за пределы родительского div , и повернут так, чтобы не закрывать верхний угол. Потому что родитель div определяет overflow: hidden , части :after псевдоэлементы, выходящие за его пределы, не видны. — Машааль
Я хотел бы знать, почему ширина и высота специально установлены на 1100%, почему правильное свойство установлено на -500% — Энди
CSS Clip-путь
Использование клип-путь это новая, перспективная альтернатива. Он начинает получать все больше и больше поддержки и теперь хорошо документирован. Поскольку он использует SVG для создания формы, он реагирует прямо из коробки.
CSS преобразование
У меня есть альтернатива ответу на преобразование веб-тики.
ответ дан 13 окт ’15, 11:10
Вот еще один подход с использованием CSS transform: skew(45deg) для создания эффекта срезанного угла. Сама форма включает три элемента (1 реальный и 2 псевдоэлемента), а именно:
- Основной контейнер div элемент имеет overflow: hidden и создает левую границу.
- Компания :before псевдоэлемент, который составляет 20% высоты родительского контейнера и к нему применено преобразование перекоса. Этот элемент формирует границу сверху и обрезает (наклонную) границу с правой стороны.
- Компания :after псевдоэлемент, который составляет 80% высоты родительского элемента (в основном, оставшаяся высота) и создает нижнюю границу, оставшуюся часть правой границы.
Полученный результат является отзывчивым, дает прозрачный разрез вверху и поддерживает прозрачный фон.

Ниже приведен еще один метод создания эффекта срезанного угла с помощью linear-gradient фоновые изображения. Используется комбинация 3 градиентных изображений (приведенных ниже):
- Один линейный градиент (под углом к нижнему левому краю) для создания эффекта срезанного угла. Этот градиент имеет фиксированный размер 25 x 25 пикселей.
- Один линейный градиент, обеспечивающий сплошной цвет слева от треугольника, вызывающий эффект обрезки. Градиент используется, даже если он дает сплошной цвет, потому что мы можем контролировать размер, положение фона только при использовании изображений или градиентов. Этот градиент расположен на -25 пикселей по оси X (в основном это означает, что он закончится до того места, где присутствует разрез).
- Другой градиент, аналогичный приведенному выше, который снова дает сплошной цвет, но расположен на 25 пикселей вниз по оси Y (опять же, чтобы оставить область вырезания).
Полученный результат является отзывчивым, обеспечивает прозрачную обрезку и не требует никаких дополнительных элементов (реальных или псевдо). Недостатком является то, что этот подход будет работать только тогда, когда фон (заливка) сплошного цвета и очень сложно создать границы (но все же возможно, как видно из фрагмента).

ответ дан 28 окт ’15, 16:10

Вы можете использовать linear-gradient . Скажем, родитель div было фоновое изображение, и вам нужен был div сидеть поверх этого с серым фоном и загнутым левым углом. Вы можете сделать что-то вроде этого:
ответ дан 10 апр.

К сожалению, в определенных ракурсах это выглядит не так хорошо. — xbilek18
Если вам нужна диагональная граница вместо диагонального угла, вы можете сложить 2 блока, каждый из которых является псевдоэлементом:
ответ дан 15 авг.
Этот код позволяет обрезать углы с каждой стороны прямоугольника:

Можно ли как-то добиться при наличии границы? — Цуры
Спасибо. Вы знаете, как это решение влияет на производительность? Кажется, немного тяжеловато. — Цуры
@Tsury Это требует дополнительного расследования — Святослав Олексив
Это старый, но путь клипа отлично работает. Я нашел удобный инструмент для создания траекторий клипа для вас: benettfeely.com/clippy — ЛарриБад
У нас была проблема с разными цветами фона для вырезанных элементов. И нам нужны только верхний правый и нижний левый угол.

ответ дан 09 мар ’18, в 11:03

Еще одна идея — использовать маску и переменные CSS, чтобы лучше контролировать всю фигуру. Он отзывчивый, прозрачный и позволяет использовать любой фон:

И ниже, если вы хотите рассмотреть границу:

Также добавим радиус:


После небольшого изменения кода Джозефа элемент не требует сплошного фона:
Это использование ‘rgba (0,0,0,0)‘позволяет скрыть внутренний’ угол ‘.
ПРИМЕЧАНИЕ: Цветовые значения RGBA поддерживаются в IE9 +, Firefox 3+, Chrome, Safari и Opera 10+.

используйте слово «прозрачный» вместо rgba (0,0,0,0), и вы получите большую поддержку в IE7 + — роб_джеймс
Компания родителя Однако элемент все еще должен быть сплошного цвета (например, в вашем примере это сплошной белый цвет), что, я думаю, было ограничением, о котором говорил Джозеф. Ответ @web-tiki фантастически обрабатывает более сложные фоны. — Тобек
Согласно решению Гарри с линейным градиентом (ответил 14 октября 15 г. в 9:55), в нем говорится, что непрозрачность фона невозможна, я пробовал, и да, это не так.
Но! Я нашел обходной путь. Нет, это не супер оптимизировано, но сработало. Итак, вот мое решение. Поскольку Гарри не использует псевдоэлемент, мы можем добиться этого, создав его.
Задайте положение относительно контейнера и создайте псевдоэлемент с такими же свойствами linear-gradient. Другими словами, просто клонируйте его. Затем установите прозрачный фон для контейнера и, скажем, черный фон для клона. Поместите на него абсолютную позицию, z-index равным -1 и значение непрозрачности (например, 50%). Это сработает. Опять же, это обходной путь, и он не идеален, но работает отлично.
Недокументированные приемы CSS
Всем привет! Зовут меня Дмитрий Григоров. Работаю фронтедером в Райффайзенбанке в команде RBO PRO. Я расскажу и покажу вам, как можно творчески применять данные возможности CSS. В статье мы рассмотрим следующие темы:
- Фоны и рамки;
- Фигуры;
- Визуальные эффекты.
Фоны и рамки
В первой теме «Фоны и рамки» я расскажу, что такое currentColor в CSS3, как cделать прозрачные рамки, несколько рамок, что такое гибкое позиционирование фона. Во второй теме «Фигуры» приведу методы создания различных видов прямоугольников с помощью css. В визуальных эффектах рассмотрю примеры наложения различных цветовых тонов. А в теме «Взаимодействие с пользователем» покажу, как сделать интерактивное сравнение изображений.
Как вы думаете, какого цвета будет border у блока с текстом «Hello world»?

Такого же синего? Да, правильно. А почему?

Цвет будет такой же, #38A потому что в CSS есть такая прекрасная переменная, как currentCollor, которая берет свое значение цвета из свойства color. И если мы не передадим цвет в border, outline, text-shadow, box-shadow, то по умолчанию получим такой же цвет, что и в свойстве color.
На рисунке ниже можно увидеть, что currentColor можно передавать, как явным образом, так и не передавать вовсе.

Переменная currentColor предоставляет нам очень удобный код и соответствует принципам DRY (don’t repeat yourself — не повторяйся). И как показано на следующем рисунке, изменяя только свойство color, для блока с кодом, который был представлен выше, мы получаем разное отображение элемента.

Полупрозрачные рамки
Если бы меня кто-нибудь спросил раньше, как сделать полупрозрачные рамки, то я бы ответил: «Легко! Я бы сделал два блока дива: родительский и дочерний. И уже в родительском задал бы некоторый padding: 10px и background-color: rgba(255, 255, 255, 0.5) (полупрозрачный), который был бы цветом моей прозрачной границы». Но это можно сделать гораздо проще.


Что если мы просто передадим полупрозрачный border для нашей рамки? Мы ничего хорошего не получим. Почему? В CSS есть такое свойство, как background-clip, и многие забывают о его существовании. Background-clip отвечает за распространения фона и имеет три значения: border-box (по умолчанию), content-box и padding-box.
По умолчанию оно у нас border-box, что значит, что наш фон будет заходить под нашу рамку, и мы не увидим ту самую прозрачность, которую передали в border, так как у нас наш фон будет под нашей границей. Также в background-clip можно передавать content-box, что будет значить, что наш фон распространяется под нашим контентом. Но тут передаем padding-box и получаем вот такую прозрачную рамку.

Несколько рамок
Несколько рамок мы можем создать двумя способами, один используя border и outline. Border и Outline хороши, но с помощью их мы можем сделать только две рамки.
А что если нам потребуется куда больше рамок, к примеру 3, 4 или более, то тут нам на помощь приходят тени.

Все из нас сталкивались со свойством box-shadow. Многие знают, что если передать нулевое вертикальное смещение (v-offset), нулевое горизонтальное смещение (h-offset), нулевое размытие (blur) и четвертый параметр, называемый радиусом распространения (spread radius), который делает тень больше, то получится что-то похожее на рамку. И так можно создать сколько угодно рамок, разделяя их запятой.
Гибкое позиционирование фона
Следующая тема – это гибкое позиционирование фона. Многие из нас сталкивались с такой проблемой, как расположить картинку на нашем фоне. Расположить ее можно с помощью background-position. Хочу отметить, что такие ключевые слова, как right, top, bottom, left в CSS были обновлены. Теперь, когда мы пишем right 10 px и bottom 20 px для нашей картинки, то это будет значить, что сделай нам отступ справа 10 px, а снизу 20 px.

Точно также, если написать background-position: right 10 px top 20 px, то получим отступ справа 10 px, сверху 20 px.

С помощью гибкого позиционирования можно располагать несколько картинок в нашем фоне. Мы им всем говорим no-repeat и с помощью ключевых слов раскидываем по разным углам. Вот так круто получается. отлично все поддерживается, пользуйтесь.

Фон в полоску

Поговорим о создании фона. Обычно для создания какого-либо неоднотонного фона мы прибегаем к использованию различных картинок, которые сделаны с помощью визуальных редакторов. Или нам дизайнер нарисовал картинку, мы ее вставили, и у нас все красиво отображается.
Но простой фон в полоску можно сделать с помощью одного лишь CSS.
Все мы знаем, как выглядит стандартный градиент.

А что если мы этому градиенту зададим границы распространения?

То по краям мы увидим сплошной цвет.
А что если мы сведем градиент к одной точке?

Мы увидим просто две полоски. Вот эти две полосы будут основой нашего фона в полоску. Далее задаем background-size: 30px. Одна полоса будет 15 px и вторая тоже 15 px, так как градиент разделен 50/50. И получаем вот такой вот фон в полоску.

Для того чтобы сделать одну полосу больше, другую меньше, мы для желтого цвета задаем 30%, а для синего — 0. Что значит вот этот ноль? 30% у нас, понятное дело, будет занимать желтый цвет. А вот что значит вот этот 0, кто-нибудь может сказать? По сути, это просто оставшееся расстояние нашего background-size. То есть 30% из 30px – это примерно 9px у нас заполнится желтым, а вся остальная часть синим.

Для того чтобы нарисовать несколько цветов в нашем фоне, мы сталкиваемся с такой ситуацией, как промежуточное повторение цветов. То есть я говорю нашему желтому цвету: заполни мне 33% нашего фона желтым цветом, а ставшуюся часть заполни синим. Потом синему цвету говорю: нет, до 66% заполни, и все остальное заполни желто-зеленым, и получаем 3 цвета в нашем фоне.

Для того чтобы сделать вертикальные полосы — все то же самое, только у нас меняется background-size и в linear-gradient появляется ключевое слов to right. Также вместо ключевого слова мы можем вставить 90° и все отобразится, как надо.

Если мы совместим горизонтальные и вертикальные полосы вместе, то получим вот такой вот фон в решетку.
У нас есть квадратный background-size, мы передаем через запятую в background-image наши градиенты и получаем фон в решетку.

С фоном в диагональную полосу немного посложнее. Здесь мы уже не пользуемся обычным linear-gradient-ом, мы здесь пользуемся repeating-linear-gradient. Обратите внимание, что наш фон распространяется до 30 px, и background-size у нас квадратный 42px на 42px. Почему же все-таки 42?

А что, если мы передадим что-нибудь другое? К примеру 30px вместо 42px.


Почему же все-таки 42px. На помощь приходит обычная школьная математика.

Мы знаем, что наш фон – квадрат, а квадрат состоит из двух равнобедренных треугольников. Дальше мы делаем некоторые математические преобразования, но при этом помним, что наш фон распространяется до 30px.

Подставляем в нашу формулу 30 и получаем примерно 42. Округляем в меньшую степень. Получаем вот такой фон, диагональные полосы.


lea.verou.me/css3patterns
У автора книги «CSS секреты» Леа Веру, сотрудника всемирного веб-консорциума w3с, есть целая подборка фонов, которые она реализует с помощью градиентов.
Примеры, которые реализует Леа Веру.
Примеры, реализованные Беннеттом Фили.
Фигуры
И начну я эту тему с параллелограммов.

Все из нас знают, как выглядят параллелограммы. Параллелограмм – это, прежде всего, нестандартный прямоугольник, у которого углы должны быть не всегда прямые. Для того чтобы сделать скошенные углы, можно обойтись псевдоклассом before. Задаем относительное позиционирование (position: relative) классу button, а абсолютно позиционируем псевдокласс before. Задаем псевдоклассу background, делаем трансформацию с помощью skewX и получаем вот такие скошенные углы.

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

Изображение в форме ромба можно сделать различными способами. Один из них также с помощью трансформации. То есть у нас есть родительский div, и в него вложено изображение.

Поворачиваем родительский div на 45 градусов, и уже получаем ромб, но изображение у нас наклонилось тоже. Мы хотим его вернуть к нормальному виду и разворачиваем наше изображение обратно на -45 градусов. В итоге получается шестиугольник. Почему? А потому что у нас здесь два прямоугольника, и они срезают углы. Для того чтобы у нас получился именно ромб, мы просто задаем scale(1.42), увеличиваем наше изображение и получаем вот такой ромб.

Изображение в форме ромба можно сделать также с помощью clip-path. Туда мы можем передавать различные имена такие, как circle, polygon и другие. Здесь я пользуюсь полигоном. Я передаю в polygon середину каждой стороны квадрата, а при hover-e возвращаю точки к углам квадрата и получаю вот такую вот анимацию. Это очень хорошее свойство.
Оно поддерживает анимацию, но к сожалению, очень плохо поддерживается браузерами. Его поддерживают только Chrome и Firefox.

Как сделать срезанные углы? Вспомним тему про фон в полоску. Здесь точно также с градиентами. Мы, по сути, разделяем наш фон на 4 части. У нас есть 4 градиента, которые мы раскидываем с помощью гибкого позиционирования по разным углам и закрашиваем их от прозрачного цвета до синего. И получаем срезанные углы.

Для того чтобы сделать срезанные углы во внутрь, здесь используется radial-gradient. Единственное, что у нас появляется, это такие ключевые слова, как circle at top left, чтобы расположить кружочки в различных углах. Опять же 4 части расставляем, с помощью ключевых слов, по местам и получаем такие углы.


Как сделать простые секторные диаграммы с помощью одно лишь CSS. Обычно, чтобы создать секторные диаграммы, мы пользуемся каким-либо фреймворком, например, d3.js. Но простую секторную диаграмму можно сделать на CSS.
У нас есть блок, мы из него делаем круг.

Половину круга закрашиваем коричневым цветом.

Дальше делаем псевдокласс, который закрашиваем в тот же зеленый цвет, который уже есть в блоке.

По сути, просто двигая этот псевдокласс, уже получается некоторый вид секторной диаграммы, но только до половины, так как другая часть у нас зеленая.
Опишу такой интересный подход, если передавать в наш блок отрицательный animation-delay и при этом animation-play-state оставить в состоянии paused, то можно заметить, что изменяется состояние нашего элемента. И если у нас анимация проигрывается до 4s (4 секунд), и мы напишем в стилях -2s, то получим на половину проигравшее состояние, и наш круг будет на половину закрашен.

Визуальные эффекты

Наложения цвета можно сделать различными способами, я приведу два примера: первый из них наложения цвета с помощью фильтров. С помощью фильтров мы можем наложить множество оттенков, но добиться какого-либо конкретного будет проблемой для многих. И тут на помощь приходит такое свойство, как background-blend-mode.

И перейдем к гораздо более адаптивному способу: это background-blend-mode.
Более адаптивный он, потому что он может не просто накладывать желаемые цвета, но и смешивать, и это свойство прекрасно анимируется. Плюс, с помощью его мы можем сделать различные цветовые эффекты.
Похожие публикации:
- Как преобразовать char в int
- Как рисовать бойфренда из игры fnf
- Как залить юнити проект на гитхаб
- First l2tp udp packet received from mikrotik что это
Срезанные углы блока в CSS 2018

Очень похоже на notched boxes, только здесь углы вырезаны по дуге, и нам нужно обрезать только один угол в блоке. Давайте разберемся, как сделать с помощью CSS срезанные углы блока, как можно применить технику к нескольким углам, с какими проблемами столкнемся, и как их решить с или без кроссбраузерности.
Первоначальная идея: box-shadow!
Начинаем с блока:
Блоку можно указать размеры или позволить определять размер, исходя из его контента – неважно. Для простоты поставим max-width и min-height. Также добавим outline, чтобы видеть рамки.
outline : solid 2px ;
max - width : 15em ;
min - height : 10em ;
Затем с помощью абсолютного позиционирования располагаем квадрат из псевдоэлемента ::before, чья длина края равна диаметру (или двум радиусам $r) выреза в углу. Зададим псевдоэлементу также красноватую box-shadow и какой-нибудь background (потом удалим), чтобы лучше видеть:
position : relative ;
/* same styles as before */
position: absolute;
padding : $ r ;
box - shadow : 0 0 7px #b53;
background : #95a;
Что мы получаем:
Смотрится не очень круто… пока что! Превратим квадрат в диск, указав на нем border-radius: 50% и отрицательный радиус $r, чтобы центральная точка круга совпадала с точкой (0, 0) (верхний левый угол) родительского блока. На родительском блоке мы указали overflow: hidden, чтобы часть псевдоэлемента, вылезающая за пределы .box, обрезалась.
overflow : hidden ;
/* same styles as before */
/* same styles as before */
border - radius : 50 %
Мы получили нужную фигуру:
Но это все еще не то, что мы хотим. Для достижения цели мы используем четвертое значение свойства box-shadow: spread radius. Можете освежить память по работе четырех значений свойства box-shadow:
Трюк заключается в том, чтобы радиус распространения точно покрывал остальную часть родителя. Что хорошо, мы можем сделать box-shadow полупрозрачной или скруглить углы на родителе .box:
/* same styles as before */
border - radius : 1em ;
/* same styles as before */
box-shadow: 0 0 0 300px rgba(#95a, .75);
Как Крис заметил в статье по notched boxes, радиус среза можно положить в переменную и легко изменять его через JS. Затем все красиво обновляется, даже с текстом в нашем блоке:
/* same styles as before */
padding : var ( -- r ) ;
/* same styles as before */
margin: calc(-1*var(--r));
padding : inherit ;
С текстовым контентом необходимо задать отрицательный z-index на псевдоэлементе ::before и явно поместить его в угол, так как теперь у нас есть padding на .box для компенсации среза.
/* same styles as before */
/* same styles as before */
Применение этой техники
Теперь давайте узнаем, как применять эту концепцию, чтобы воспроизвести дизайн, показанный в начале статьи. В этом примере центральные точки дисков из псевдоэлементов не совпадают с углами блока и выходят за его пределы в середину пространства между блоками.
Используемая структура довольно простая. Просто
и следом теги article, сгенерированные в цикле Pug:
a ( href = '#' ) go
К body применяем Flexbox макет с переносом элементов, очень широкий header и 1 или 2 элемента article в строке (зависит от вьюпорта).

Если в каждой строке всего один article, у нас не будет срезанных углов, поэтому их радиус равен 0px. В противном случае этот радиус –r задается в ненулевое значение.
$ min - w : 15rem ; /* min width of an article element */
$ m : 1rem ; /* margin of such an element */
margin : $ m ;
min - width : $ min - w ;
width : 21em ;
@ media ( min - width : 2 * ( $ min - w + 2 * $ m ) /* enough for 2 per row */ ) <
Разберем ситуацию, когда в строке 2 тега article (и, конечно, у них срезанные углы, нам ведь это и нужно).
У первого тега самая левая точка диска должна находится на одном уровне с правой гранью родителя (left: 100%). Чтобы сдвинуть координату Х центральной точки диска к правой грани родителя, необходимо вычесть радиус диска, что дает нам left: calc(100% — var(—r)). Но центр не должен располагаться вдоль правой границы, он должен быть свещен с помощью margin $m тега
. Так мы получаем финальное значение:
left : calc ( 100 % - var ( -- r ) + #);$m>
По оси У начнем с того, что передвинем самую верхнюю точку диска на пересечение а нижней границей родителя — top: 100%. Чтобы переместить центральную точку диска на нижнюю грань родительского блока, необходимо передвинуть фигуру на 1 радиус, что даст нам top: calc(100% — var(—r)). Нам также нужно сместить центральную точку на $m вниз от нижней грани родителя. Так мы получаем финальный сдвиг:
top : calc ( 100 % - var ( -- r ) + #);$m>
Для второго article (второй на той же строке) значение вертикального сдвига не изменится.
По горизонтали же необходимо сдвинуть самую левую точку диска на пересечение с левой гранью родителя — left: 0%. Чтобы переместить центральную точку диска на пересечение с левой гранью родителя, необходимо сдвинуть фигуру влево на один радиус —r (left: calc(0% — var(—r))). Финальная позиция – смещение $m влево от левого родительского края:
left : calc ( 0 % - var ( -- r ) - #);$m>
Для третьего article (первый во второй строке) значение сдвига по оси Х совпадает с первым тегом.
По вертикали необходимо сдвинуть фигуру так, чтобы самая верхняя точка диска оказалась на пересечении с верхней гранью родителя — top: 0%. Чтобы сдвинуть центральную точку диска на пересечение с верхним краем родителя, необходимо сдвинуть фигуру на один радиус —r (top: calc(0% — var(—r))). Но нам нужно добавить еще $m, поэтому финальный верхний сдвиг:
top : calc ( 0 % - var ( -- r ) - #);$m>
У последнего тега (второй во второй строке) значение горизонтального сдвига совпадает с тем, который расположен над ним, а значение вертикального сдвига – с тем, который слева от него на той же строке.
Сдвиги можно записать следующим образом:
article : nth - of - type ( 1 ) < /* 1st */
left : calc ( 100 % /* 2*50% = (1 + 1)*50% = (1 + i)*50% */ - var ( -- r ) + /* i=+1 */ #);$m>
top : calc ( 100 % /* 2*50% = (1 + 1)*50% = (1 + j)*50% */ - var ( -- r ) + /* j=+1 */ #);$m>
article : nth - of - type ( 2 ) < /* 2nd */
left : calc ( 0 % /* 0*50% = (1 - 1)*50% = (1 + i)*50% */ - var ( -- r ) - /* i=-1 */ #);$m>
top : calc ( 100 % /* 2*50% = (1 + 1)*50% = (1 + j)*50% */ - var ( -- r ) + /* j=+1 */ #);$m>
article : nth - of - type ( 3 ) < /* 3rd */
left : calc ( 100 % /* 2*50% = (1 + 1)*50% = (1 + i)*50% */ - var ( -- r ) + /* i=+1 */ #);$m>
top : calc ( 0 % /* 0*50% = (1 - 1)*50% = (1 + j)*50% */ - var ( -- r ) - /* j=-1 */ #);$m>
article : nth - of - type ( 4 ) < /* 4th */
left : calc ( 0 % /* 0*50% = (1 - 1)*50% = (1 + i)*50% */ - var ( -- r ) - /* i=-1 */ #);$m>
top : calc ( 0 % /* 0*50% = (1 - 1)*50% = (1 + j)*50% */ - var ( -- r ) - /* j=-1 */ #);$m>
Это значит, что позиции центральных точек дисков зависят от расстояния между article (это расстояние равно двойному margin: $m, заданному для article), радиусом дисков r и нескольких горизонтальных и вертикальных множителей (—I и —j). Изначально оба множителя равны -1.
Для первых двух article (на первой строке сетки 2х2) изменим вертикальный множитель —j на 1б так как координата У центральных точек дисков должна быть ниже нижней грани, а для нечетных тегов (в первой колонке) мы меняем горизонтальный множитель –i на 1, так как координата Х должна быть правее правого края.
html < -- i : - 1 ; -- j : - 1 >/* multipliers initially set to -1 */
h3 , section <
/* set generic offsets */
top: calc((1 + var(--j))*50% - var(--r) + var(--j)*#);$m>
left : calc ( ( 1 + var ( -- i ) ) * 50 % - var ( -- r ) + var ( -- i ) * #);$m>
@ media ( min - width : 2 * ( $ min - w + 2 * $ m ) ) <
/* change vertical multiplier for first two (on 1st row of 2x2 grid) */
& : nth - of - type ( - n + 2 ) < -- j : 1 >
/* change horizontal multiplier for odd ones (on 1st column) */
& : nth - of - type ( odd ) < -- i : 1 >
Для первых двух article мы имеем только видимые вырезы в виде дисков на теге section. Для оставшихся – вырезы на h3. Поэтому для первых двух article радиус —r псевдоэлемента ::before заголовка равен 0. Для последних двух радиус равен 0 для псевдоэлемента ::before секции:
@ media ( min - width : 2 * ( $ min - w + 2 * $ m ) ) < &:nth-of-type(-n + 2) h3, &:nth-of-type(n + 3) section < &:before < --r: 0 ; >>
Точно так же добавляем разные padding дочерним тегам article:
h3 , section < padding : $ p ; >
@ media ( min - width : 2 * ( $ min - w + 2 * $ m ) ) <
&:nth-of-type(-n + 2) section,
&:nth-of-type(n + 3) h3 <
padding-right: calc(.5*(1 + var(--i))*(var(--r) - #) + #);$m>
padding - left : calc ( . 5 * ( 1 - var ( -- i ) ) * ( var ( -- r ) - #) + #);$m>
Мы получаем, что хотели:
Демо сверху работает во всех текущих версиях основных браузеров. Если подобрать значения вместо CSS переменных, можно добавить поддержку вплоть до IE9.
Потенциальные проблемы описанного метода
Это был быстрый и легкий кроссбраузерный способ получить желаемый результат в этом определенном случае. Однако этот подход может быть не так успешен.
Во-первых, для всех обрезаемых углов нужны псевдоэлементы. Поэтому если нужно срезать все углы, придется вводить дополнительный элемент. Грустно.
Во-вторых, мы не всегда хотим иметь однотонный background. Нас может заинтересовать полупрозрачный фон (что сделать очень сложно, если срезанных углов более одного), градиентный (можно эмулировать радиальный градиент с помощью box-shadow, но решение далеко от идеального) или вообще background с изображением (сложно реализуемо, единственный выход — mix-blend-mode – но он отрезает поддержку Edge безе элегантного фолбека).
А что делать с очень большими блоками, которым недостаточно радиуса распространения? Эмм. Рассмотрим другие, более надежные подходы с разной степенью поддержки в браузерах.
Гибкость и хорошая поддержка в браузерах? SVG!
Наверное, не удивительно, но полное решение SVG лучше всего подходит, если нам нужно что-то гибкое и надежно кроссбраузерное. Решение заключается в том, что нужно использовать SVG элемент перед контентом блока. Этот SVG содержит circle с заданным нами атрибутом радиуса r.
