Возможна ли вогнутая граница границы?
Вот простой выпуклый пример.
http://jsfiddle.net/swY5k/
#test{
width: 200px;
height: 200px;
background: #888888;
border-radius: 50px;
}
Однако мне нужен вогнутый радиус границы.
Я попытался сделать отрицательный радиус границы, но это не сработало.
Пример вогнутого/выпуклого:
![enter image description here]()
Ответы
Ответ 1
Вы можете создать впечатление вогнутой границы, используя радиальные градиенты на фоне. Например, что-то вроде этого:
#test {
width: 200px;
height: 200px;
background: #888888;
background:
radial-gradient(circle 20px at -20% 50%,transparent,transparent 100px,#888888 100px),
radial-gradient(circle 20px at 120% 50%,transparent,transparent 100px,#888888 100px);
background-size:100px 200px, 100px 200px;
background-position:0 0,100% 0;
background-repeat:no-repeat;
}
Обратите внимание, что большинству браузеров для веб-браузеров по-прежнему требуются префиксы для радиальных градиентов, и если вы хотите полностью поддерживать старые браузеры, вам может понадобиться также реализовать старый синтаксис градиента.
Ответ 2
С умным использованием псевдо-классов :before
и :after
мы можем моделировать вогнутую форму:
#test{
width: 100px;
height: 300px;
background: green;
position: relative;
display: inline-block;
}
#test:before{
background: white;
height: 300px;
width: 30px;
border-radius: 0 60px 60px 0 / 0 300px 300px 0;
display: inline-block;
content: '';
}
#test:after{
background: white;
height: 300px;
width: 30px;
border-radius: 60px 0 0 60px / 300px 0 0 300px;
display: inline-block;
content: '';
position: relative;
left: 40px;
}
#test
div - простой прямоугольник. Но его элементы :before
и :after
являются полукруглыми вогнутыми, заполненными цветом фона (белый в этом случае).
Смотрите этот jsfiddle.
Ответ 3
Чтобы создать форму, вы можете использовать псевдоэлементы
div {
height: 250px;
width: 100px;
background: tomato;
position: relative;
margin:0 auto;
}
div:before {
content: "";
height: 100%;
width: 50%;
position: absolute;
background: white;
border-radius: 50%;
left: -25%;
transition: all 0.8s;
}
div:after {
content: "";
height: 100%;
width: 50%;
position: absolute;
background: white;
border-radius: 50%;
right: -25%;
transition: all 0.8s;
}
div:hover:before,
div:hover:after {
background: blue;
}
hover the shape to see how it works:
<div></div>
Ответ 4
Я предлагаю использовать border-image
с масштабируемым SVG-изображением на границе.
Таким образом, вы можете иметь любую форму, которую хотите на границе; не нужно ограничиваться формами, предлагаемыми border-radius
, и не нужно делать никаких умных хаков или дополнительной разметки.
Нижняя сторона заключается в том, что ни border-image
, ни SVG не поддерживаются в старых браузерах (т.е. старых версиях IE). Но, конечно, border-radius
тоже не так, поэтому вы не теряете много с помощью этой техники, по сравнению с гибкостью, которую вы получаете.
Ответ 5
SVG
- рекомендуемый способ создания таких фигур. Он предлагает простоту и масштабируемость.
Мы можем использовать элемент пути SVG
для создания фигуры, как указано выше, и заполнить ее каким-то сплошным цветом, градиентом или рисунком.
Для определения фигур в элементе path
используется только один атрибут d
. Этот атрибут содержит несколько коротких команд и несколько параметров, необходимых для работы этих команд.
Следующий код создаст выпуклую форму:
<path d="M 150,25
Q 115,100 150,175
Q 185,100 150,25" />
И следующий один создаст вогнутую форму:
<path d="M 30,25
L 80,25
Q 50,100 80,175
L 30,175
Q 60,100 30,25" />
Ниже приведено краткое описание команд path
, используемых в приведенном выше коде:
-
Команда
-
M
используется для определения начальной точки. Он появляется в начале и указывает точку, с которой должен начинаться рисование.
Команда -
L
используется для рисования прямых линий.
Команда -
Q
используется для рисования кривых.
Выходное изображение:
![выпуклые и вогнутые формы]()
Рабочая демонстрация:
<svg width="300" height="200" viewBox="0 0 300 200">
<defs>
<linearGradient id="grad">
<stop offset="0" stop-color="#ddd" />
<stop offset=".5" stop-color="#fff" />
<stop offset="1" stop-color="#ddd" />
</linearGradient>
</defs>
<g stroke-width="1" stroke="#000" fill="url(#grad)">
<path d="M30,25 L80,25 Q50,100 80,175 L30,175 Q60,100 30,25" />
<path d="M150,25 Q115,100 150,175 Q185,100 150,25" />
</g>
</svg>
Ответ 6
Есть несколько способов сделать вогнутую границу. И я предпочитаю использовать радиальные градиенты на заднем плане. https://jsfiddle.net/black_horse/qygmb8z9/
Образец изображения
.single-border{
height: 50px;
padding: 20px;
background:-moz-radial-gradient(0 100%, circle, rgba(204,0,0,0) 20px, #c00 21px), -moz-radial-gradient(100% 100%, circle, rgba(204,0,0,0) 20px, #c00 21px), -moz-radial-gradient(100% 0, circle, rgba(204,0,0,0) 20px, #c00 21px), -moz-radial-gradient(0 0, circle, rgba(204,0,0,0) 20px, #c00 21px);
background:-o-radial-gradient(0 100%, circle, rgba(204,0,0,0) 20px, #c00 21px), -o-radial-gradient(100% 100%, circle, rgba(204,0,0,0) 20px, #c00 21px), -o-radial-gradient(100% 0, circle, rgba(204,0,0,0) 14px, #c00 21px), -o-radial-gradient(0 0, circle, rgba(204,0,0,0) 20px, #c00 21px);
background:-webkit-radial-gradient(0 100%, circle, rgba(204,0,0,0) 20px, #c00 21px), -webkit-radial-gradient(100% 100%, circle, rgba(204,0,0,0) 20px, #c00 21px), -webkit-radial-gradient(100% 0, circle, rgba(204,0,0,0) 20px, #c00 21px), -webkit-radial-gradient(0 0, circle, rgba(204,0,0,0) 20px, #c00 21px);
background-position:left bottom, right bottom, right top, left top;
-moz-background-size:51% 51%;
-webkit-background-size:51% 51%;
background-size:51% 51%;
background-repeat:no-repeat;
}
<div class="single-border">
Single border
</div>