Как добиться следующего эффекта градиентной границы:
Сама по себе эта задача не сложная, и есть несколько способов ее достижения, в основном есть некоторые детали, на которые нужно обратить внимание.
border-image
border-image
это спецификация CSSCSS Backgrounds and Borders Module Level 3(Последняя версия официальной спецификации для фона и границы) Новое значение свойства.
Как следует из названия, мы можем добавить изображение к элементу границы, что-то вродеbackground-image
, это может быть изображение или градиент, больше не ограниченный сплошным цветом.
Используйте изображение границы для достижения градиентной границы
имеютborder-image
После этого становится удобно реализовывать градиентные границы
Но больше введенияborder-imageСинтаксис читатели должны понять сами.
Реализация выглядит следующим образом:
<div class="border-image"></div>
.border-image {
width: 200px;
height: 100px;
border-radius: 10px;
border-image-source: linear-gradient(45deg, gold, deeppink);
border-image-slice: 1;
border-image-repeat: stretch;
}
Три вышеприведенных свойства border-image могут быть сокращены какborder-image: linear-gradient(45deg, gold, deeppink) 1;
Получил следующий результат:
радиус границы недействителен
Посмотрите внимательно на демонстрацию выше, установитеborder-radius: 10px
Но реальное исполнение не имеет закругленных углов. использоватьborder-image
Самая большая проблема в том, что наборborder-radius
не удастся.
Мы не можем получить градиентную границу со скругленными углами. Причина, см. официальную спецификацию W3C, объясняется следующим образом:
Фон блока, но не его изображение границы, обрезается до соответствующей кривой (как определено параметром background-clip). Другие эффекты, которые обрезаются до границы или края заполнения (например, «переполнение», отличное от «видимого»). также должен обрезаться по кривой.Содержимое заменяемых элементов всегда обрезается до кривой края содержимого.Кроме того, область за пределами кривой края границы не принимает события мыши от имени элемента.
Для этого нам нужно найти другой способ или немного улучшить его и получить градиентную границу со скругленными углами.
Способ 1: фоновое изображение + псевдоэлемент
Первый способ мы больше не используемborder-image
, вместо этого используйтеbackground-image
+ псевдоэлементная схема, которая тоже есть вborder-image
Спецификация не приводится для наиболее распространенного метода.
Очень просто, простая схема выглядит следующим образом:
использоватьbackground-image
Реализуйте градиентный фон, а затем создайте градиентную границу, наложив белый фон.
Демонстрация CodePen -- bg + переполнение для достижения градиентной границы
недостаток
В этой схеме есть две проблемы: первая — это использование еще двух элементов (разумеется, ::before и ::after), а вторая самая фатальная — если требуется, чтобы фон внутри рамки был прозрачным, то это схема больше не работает.
Метод 2, используйте background-clip для достижения
Второй способ, используяbackground-clip: content-box
так же какbackground-clip: border-box
С использованием.
background-clip:background-clip Устанавливает, выходит ли фон элемента (фоновое изображение или цвет) ниже границы. его частичное значение иbox-sizing
аналогичный. в,
-
background-clip: border-box
Указывает фон настройкиbackground-image
будет простираться до границы -
background-clip: content-box
Указывает фон настройкиbackground-image
Обрезано по внешнему краю поля содержимого
Здесь мы устанавливаем два, используяbackground-image
, поставить дваbackground-clip
и сделайте границу прозрачной:
Основной CSS:
div {
width: 200px;
height: 100px;
border: solid 10px transparent;
border-radius: 10px;
background-image: linear-gradient(#fee, #fee),
linear-gradient(to right, green, gold);
background-origin: border-box;
background-clip: content-box, border-box;
}
потому что используетсяbackground-clip: border-box
, так тоже надоbackground-origin: border-box
Чтобы шаблон отображался полностью, вы можете попробовать отключить это свойство, чтобы понять, зачем вам это нужно.
Демонстрация CodePen — background-clip реализует градиентную границу
недостаток
Подобно первому методу, это решение не будет работать, если фон внутри границы должен быть прозрачным.
Способ 3: изображение границы + переполнение: скрыто
Этот метод также легко понять, так как он установленbackground-image
элементborder-radius
неверный. Затем нам просто нужно добавить к нему родительский контейнер, набор родительских контейнеровoverflow: hidden
+ border-radius
Только что:
<div class="border-image-overflow"></div>
.border-image-pesudo {
position: relative;
width: 200px;
height: 100px;
border-radius: 10px;
overflow: hidden;
}
.border-image-pesudo::before {
content: "";
position: absolute;
width: 200px;
height: 100px;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
border: 10px solid;
border-image: linear-gradient(45deg, gold, deeppink) 1;
}
Эффект следующий:
Конечно, здесь есть еще один элемент, который нужно достичь. Есть еще один способ, который можно реализовать без лишних элементов:
Способ 4: граница изображения + клип-путь
уже настроенbackground-image
элементborder-radius
неверный. Но в CSS есть и другие способы создания контейнера со скругленными углами, и это с помощьюclip-path
.
clip-path, очень интересное свойство CSS.
Свойство CSS clip-path создает область отсечения, в которой может отображаться только часть элемента. Часть внутри области отображается, а часть вне области скрыта. Области отсечения — это пути, определяемые встроенными URL-адресами или внешними SVG, на которые есть ссылки.
Короче говоря, здесь нам нужно толькоborder-image
на основе повторного использованияclip-path
Вырежьте прямоугольный контейнер с закругленными углами:
<div class="border-image-clip-path"></div>
.border-image-clip-path {
position: relative;
width: 200px;
height: 100px;
border: 10px solid;
border-image: linear-gradient(45deg, gold, deeppink) 1;
clip-path: inset(0 round 10px);
}
объяснять:clip-path: inset(0 round 10px)
.
- clip-path: inset() — это прямоугольный клип
- Есть много применений inset(), здесь
inset(0 round 10px)
Его можно понимать как реализацию размера родительского контейнера (полностью подходящего, центрированного по вертикали и горизонтали в родительском контейнере) иborder-radius: 10px
, который обрезает (то есть невидимо) все, что находится за пределами этого элемента.
Все отлично, эффект такой:
Конечно, вы также можете использоватьfilter: hue-rotate()
Просто добавьте анимацию градиента:
ты можешь быть со мнойCSS-InspirationСм. этот пример:
CSS-Inspiration — используйте clip-path и border-image для закругленных градиентных границ.
наконец
Ну вот и конец этой статьи, надеюсь она вам поможет :)
Другие замечательные технические статьи по CSS собраны в моемGithub -- iCSS, продолжайте обновлять, добро пожаловать, нажмите звездочку, чтобы подписаться на коллекцию.
Более захватывающие и интересные эффекты CSS, добро пожаловать сюда, чтобы увидетьВдохновение для CSS. Найдите вдохновение для написания CSS здесь..
Если у вас есть какие-либо вопросы или предложения, вы можете общаться больше.Оригинальные статьи ограничены в написании и знаниях.Если в статье есть какие-либо неточности, пожалуйста, дайте мне знать.