Круг с двумя границами
Как я могу стиль круга (a div
) с двумя границами реагировать так, чтобы он реагировал на размер контейнера?
Предположим, что такие круги, как это, например:
![circles with 2 borders]()
Вот рабочий CSS для круга:
div.circle {
width: 90%;
height: 0;
padding-bottom: 90%;
margin: auto;
float: none;
border-radius: 50%;
border: 1px solid green;
background: pink;
}
<div class="circle"></div>
Ответы
Ответ 1
Я бы предложил со следующим HTML:
<div></div>
CSS:
div {
width: 20em;
height: 20em;
border-radius: 50%;
background-color: red;
border: 4px solid #fff;
box-shadow: 0 0 0 5px red;
}
div {
width: 20em;
height: 20em;
border-radius: 50%;
background-color: red;
border: 4px solid #fff;
box-shadow: 0 0 0 5px red;
}
<div></div>
Ответ 2
В этой теме уже есть два очень хороших ответа, но вот еще несколько подходов, чтобы сделать этот поток более полным со всеми возможными подходами. Результат, полученный ими, также чувствителен.
Использование псевдоэлемента:
Вы можете использовать псевдоэлемент, который меньше по размеру, чем родительский, и позиционировать его абсолютно внутри родителя. Когда фон добавляется к псевдоэлементу, а граница добавляется к родительскому, похоже, что существует разрыв между границей и фоном. Если разрыв должен быть прозрачным, нам не нужно добавлять никаких background
в родительский. Если промежуток должен быть сплошного цвета (то есть, он должен быть похож на вторую границу), тогда граница с этим цветом и требуемой шириной должна быть добавлена к псевдоэлементу.
При использовании этого подхода внутренняя область также может иметь изображение или градиент в качестве заливки (фон).
.circle {
position: relative;
height: 200px;
width: 200px;
text-align: center;
line-height: 200px;
color: white;
border-radius: 50%;
border: 2px solid brown;
}
.circle:after {
position: absolute;
content: '';
top: 4px;
left: 4px;
height: calc(100% - 8px);
width: calc(100% - 8px);
border-radius: inherit;
background: brown;
z-index: -1;
}
.circle.white:after {
top: 0px;
left: 0px;
border: 4px solid white;
}
.circle.image:after {
background: url(http://lorempixel.com/200/200/abstract/4);
}
/* Just for demo */
div {
float: left;
margin-right: 10px;
transition: all 1s;
}
div:hover{
height: 250px;
width: 250px;
}
body {
background: url(http://lorempixel.com/500/500/nature/3);
background-size: cover;
}
<div class='circle'>Hello!</div>
<div class='circle white'>Hello!</div>
<div class='circle image'>Hello!</div>
Ответ 3
Другим подходом было бы использовать свойство background-clip. Это не позволит вам выбрать цвет внутренней границы, но он будет отображать фон в этом промежутке:
![circle with a transparent gap inside border]()
div {
width: 150px;
height: 150px;
padding:2px;
border-radius: 50%;
background: #DD4814;
border: 2px solid #DD4814;
background-clip: content-box;
margin:0 auto;
}
/** FOR THE DEMO **/
body {background: url('https://farm9.staticflickr.com/8760/17195790401_ceeeafcddb_o.jpg');background-size: cover;}
<div></div>
Ответ 4
Вот скрипка, где я рисую один круг с рамкой и тенью для создания эффекта внешнего круга https://jsfiddle.net/salientknight/k18fmepL/1/
Протестировано и работает в Chrome, Safari и Opera - сбой в Firefox, если текст слишком велик. Хорошо для размера шрифта размером около 3 символов. Затем высота и ширина выходят из синхронизации - будут работать в FireFox с фиксированным размером и шириной..
<!-- Inside H1 -->
<h1><p class='circleBlue'>10000%</p></h1>
<!-- Regular -->
<p class='circleBlue'>10000%</p>
p.circleBlue{
display: inline-flex;
align-items: center;
justify-content: center;
background-color: #159fda;
border: 5px Solid #fff;
color: #fff;
min-width: 1em;
border-radius: 50%;
vertical-align: middle;
padding:20px;
box-shadow: 0px -0px 0px 3px #159fda;
-webkit-box-shadow: 0px -0px 0px 3px #159fda;
-moz-box-shadow: 0px -0px 0px 3px #159fda;
margin:5px;
}
p.circle:before{
content:'';
float: left;
width: auto;
padding-bottom: 100%;
}
update Я не мог заставить это работать с различными размерами текста и во всех браузерах, поэтому я добавил несколько js. Я вставляю его здесь, чтобы они были одним полным решением. changesSizes - это функция, которая гарантирует, что высота и ширина всегда совпадают... сначала проверяя, что больше, а затем устанавливаем значение как для большего из двух (да, одно из этих назначений является избыточным, но это дает мне душевное спокойствие), Окончательный эффект заключается в том, что я могу добавить контент многих форм и размеров. Единственное реальное ограничение, которое я нашел, - это вкус.
changeSizes(".circleBlue");
//changeSizes(".circleGreen");
//changeSizes(".circleOrange");
---------
function changeSizes(cirlceColor){
var circle = $(cirlceColor);
circle.each(function(){
var cw = $(this).width();
var ch = $(this).height();
if(cw>ch){
$(this).width(cw);
$(this).height(cw);
}else{
$(this).width(ch);
$(this).height(ch);
}
});
}
Example:
![введите описание изображения здесь]()