Как использовать CSS, чтобы окружить число кругом?

Я хотел бы окружить число кругом, как на этом изображении:

Число в изображении круга

Возможно ли это и как это достигается?


person Pentium10    schedule 01.02.2011    source источник


Ответы (19)


Вот демонстрация JSFiddle и фрагмент:

.numberCircle {
    border-radius: 50%;
    width: 36px;
    height: 36px;
    padding: 8px;

    background: #fff;
    border: 2px solid #666;
    color: #666;
    text-align: center;

    font: 32px Arial, sans-serif;
}
<div class="numberCircle">30</div>

Мой ответ является хорошей отправной точкой, некоторые другие ответы обеспечивают гибкость для разных ситуаций. Если вам небезразличен IE8, посмотрите старую версию моего ответа.

person thirtydot    schedule 01.02.2011
comment
Текущая последняя версия Internet Explorer, 9, на самом деле поддерживает border-radius. ... и div не лучший выбор для этого. :) - person reisio; 25.04.2012
comment
Чтобы заставить его работать в скрипке, вы можете использовать CDN, например jsdelivr, вместо использования относительный путь для URL. Если вы обновите URL-адрес в своей скрипте с помощью //cdn.jsdelivr.net/css3pie/2.0b1/PIE.htc, он должен работать везде без дополнительной переналадки. - person KyleMit; 06.01.2014
comment
@KyleMit: Теоретически это хорошая идея. К сожалению, CSS3 PIE имеет ограничение на использование одного и того же домена. - person thirtydot; 06.01.2014
comment
Кроме того, если у вас есть глобальная высота строки, установленная на 1,5, вы должны установить ее на 1, чтобы это работало... - person stefan; 08.03.2014
comment
Ширина и высота являются ключевыми. Я просто использовал отступы, но потом было 10. Спасибо. - person Yves; 17.07.2014
comment
Чтобы избежать необходимости выполнять математические операции в CSS всякий раз, когда вы меняете размер шрифта (например, если вы делаете адаптивный дизайн), вы можете использовать эту адаптацию jsfiddle компании тридцатьдот, которая использует только пиксели для описания размера шрифта: jsfiddle.net/dQR9T/7058 - person Steven; 02.09.2016
comment
@Steven Последнее редактирование в этом ответе (под названием "Изменить размер с содержимым") работает для любого шрифта. размер и любая длина содержимого. - person Jose Rui Santos; 08.09.2016
comment
@Steven: Вы также можете делать такие вещи: jsfiddle.net/thirtydot/dQR9T/7066 - person thirtydot; 08.09.2016
comment
Это работает только для ширины/высоты/ширины границы в образце. Как только эти значения изменены, это выглядит очень плохо. Как указывает @jeffaudio, для правильной работы стиля требуется box-sizing: content-box. - person Wolfgang Ziegler; 08.11.2016
comment
@WolfgangZiegler: посмотрите на мой предыдущий комментарий. Вы можете проголосовать против, но остальные 241 голосующие за это подумали, что этот ответ был, по крайней мере, полезной отправной точкой... - person thirtydot; 08.11.2016
comment
@steven как обеспечить круг всегда вокруг числа , или мы можем сделать круг больше, если число равно 24928 сейчас оно переполняется - person Transformer; 21.01.2017
comment
@transformer: круг должен быть почти в 3 раза больше текущего размера, что может подойти для вашего дизайна. Вместо этого вы можете уменьшить размер шрифта или отформатировать число как 24,9 КБ (с точки зрения дизайна и, вероятно, потребуется JavaScript). - person thirtydot; 21.01.2017
comment
Удалены отступы, чтобы получить число внутри круга - person Abhishek Poojary; 10.08.2017
comment
Как насчет установки «высоты строки» вместо заполнения? - person marcovtwout; 30.08.2017
comment
Есть ли способ наоборот. У меня есть объект, который круглый. Я хочу поставить число над ним. - person Trect; 24.12.2019

Проблема с большинством других ответов здесь заключается в том, что вам нужно настроить размер внешнего контейнера так, чтобы он был идеальным размером в зависимости от размера шрифта и количества отображаемых символов. Если вы смешиваете однозначные и четырехзначные числа, это не сработает. Если соотношение между размером шрифта и размером круга не является идеальным, вы получите либо овал, либо небольшое число, выровненное по вертикали в верхней части большого круга. Это должно хорошо работать для любого количества текста и круга любого размера. Просто установите width и line-height на одно и то же значение:

.numberCircle {
    width: 120px;
    line-height: 120px;
    border-radius: 50%;
    text-align: center;
    font-size: 32px;
    border: 2px solid #666;
}
<div class="numberCircle">1</div>
<div class="numberCircle">100</div>
<div class="numberCircle">10000</div>
<div class="numberCircle">1000000</div>

Если вам нужно сделать контент длиннее или короче, все, что вам нужно сделать, это отрегулировать ширину контейнера для лучшего соответствия.

Посмотрите на JSFiddle.

person Mike    schedule 27.10.2013
comment
Это именно та проблема, с которой я столкнулся, показывая процент внутри, который может быть «1», «10» или «100». Это работает идеально, спасибо! - person Felipe Castro; 11.03.2014
comment
Обратите внимание, что это предложенное редактирование было отклонено, но изменения фактически центрируют текст немного лучше по вертикали, поэтому я добавил их к ответу вручную. - person Mike; 14.09.2015
comment
Это лучший ответ. Я бы использовал translateY(-50%) вместо отрицательного верхнего поля. - person Tobias; 11.11.2016
comment
@Tobias Спасибо за прекрасную идею. Я обновил свой ответ. - person Mike; 12.11.2016
comment
Было бы намного чище удалить диапазон и добавить text-align и line-height в div. Тем не менее, лучший ответ, наверное. - person dlsso; 23.11.2017
comment
@dlsso Совершенно верно. Я обновил ответ на основе вашего наблюдения. Причина, по которой у меня это было, заключалась в том, что он прошел через очень много версий, которые значительно отличаются друг от друга (см. историю изменений ), но меня больше всего беспокоило обновление CSS, а не HTML. - person Mike; 23.11.2017

Если это 20 и ниже, вы можете просто использовать символы Юникода ① ② ... ⑳

http://www.alanwood.net/unicode/enclosed_alphanumerics.html

person Tom N    schedule 24.08.2012
comment
Хорошая идея, но будьте осторожны, вы нарушаете семантику, если круг предназначен только для отображения - person cubabit; 13.08.2014

Для размеров круга, различающихся в зависимости от содержимого, это должно работать:

http://jsfiddle.net/nzsnw55s/

<span class="numberCircle"><span>30</span></span>
<span class="numberCircle"><span>1</span></span>
<span class="numberCircle"><span>5435</span></span>
<span class="numberCircle"><span>2</span></span>
<span class="numberCircle"><span>100</span></span>

.numberCircle {
  display:inline-block;
  line-height:0px;

  border-radius:50%;
  border:2px solid;

  font-size:32px;
}

.numberCircle span {
  display:inline-block;

  padding-top:50%;
  padding-bottom:50%;

  margin-left:8px;
  margin-right:8px;
}

Он опирается на ширину содержимого плюс margin- для определения радиуса, а затем расширяет высоту для соответствия с использованием padding-. margin- нужно будет скорректировать в зависимости от размера шрифта.

Обновление для удаления внутреннего элемента:

<span class="numberCircle">30</span>
<span class="numberCircle">1</span>
<span class="numberCircle">5435</span>
<span class="numberCircle">2</span>
<span class="numberCircle">100</span>

<style type="text/css">
.numberCircle {
    display:inline-block;

    border-radius:50%;
    border:2px solid;

    font-size:32px;
}

.numberCircle:before,
.numberCircle:after {
    content:'\200B';
    display:inline-block;
    line-height:0px;

    padding-top:50%;
    padding-bottom:50%;
}

.numberCircle:before {
    padding-left:8px;
}
.numberCircle:after {
    padding-right:8px;
}
</style>

Использует псевдоэлементы, чтобы задать высоту. Нужно пространство нулевой ширины для вертикального выравнивания. Переместил line-height:0px с внешнего на псевдо, чтобы он был хотя бы виден при деградации для IE8.

person ryachza    schedule 15.09.2015
comment
Для меня это было лучшим решением. Он позволяет использовать большие числа и является наиболее масштабируемым. Все остальные решения имеют слишком жесткое кодирование размеров. У этого меньше всего. Размер шрифта можно значительно изменить, не нарушая этого. В случае резкого изменения маржа должна быть скорректирована, но это очень снисходительно. Однако необходимость использовать вложенный элемент несколько негативна. - person Necreaux; 15.02.2016
comment
@Necreaux Обновлен ответ версией, в которой явный внутренний элемент заменен псевдоэлементами. - person ryachza; 16.02.2016
comment
Действительно лучшее решение. Я просто заменил размер поля слева и справа на 0,35 em вместо 8 пикселей (отступы в обновленном решении). Так что вы можете изменить размер шрифта номера и сохранить подходящее поле. - person Jibato; 12.01.2018

самый простой способ - использовать класс начальной загрузки и значка

 <span class="badge">1</span>
person Navid    schedule 18.09.2016
comment
Отлично! Я уже использую бутстрап, я просто не знал, что этот класс существует. - person Justin; 24.01.2017
comment
Хороший ответ Навид! - person SeyedPooya Soofbaf; 08.02.2017


Вы можете использовать радиус границы для этого:

<html>
  <head>
    <style type="text/css">

    .round
    {
        -moz-border-radius: 15px;
        border-radius: 15px;
        padding: 5px;
        border: 1px solid #000;
    }

  </style>
  </head>  
  <body>   
    <span class="round">30</span>
  </body>
</html>  

Играйте с радиусом границы и значениями заполнения, пока не будете удовлетворены результатом.

Но это не будет работать во всех браузерах. Я думаю, IE все еще не поддерживает закругленные углы.

person kayahr    schedule 01.02.2011
comment
не забудьте `-webkit-border-radius: 15px;` также есть исправление для IE htmlremix.com/css/curved-corner-border-radius-cross-browser, но дважды подумайте о его реализации. - person Hannes; 01.02.2011
comment
+1, наверное, самый простой способ... запасной вариант для IE тоже выглядит нормально (квадрат). WordPress делает это так, насколько я помню - person Ross; 01.02.2011

Мое решение здесь - это легко позволяет использовать разные размеры и цвета и привязывать к CMS для редакционного контроля. Для IE, деградирующего до квадратов.

HTML:

<div class="circular-label label-outer label-size-large label-color-pink">
    <div class="label-inner"> 
        <span>Fashion & Beauty</span>
    </div>
</div>

CSS:

.circular-label {
    overflow: hidden;
    z-index: 100;
    vertical-align: middle;
    font-size: 11px;
    -webkit-box-shadow:0 3px 3px rgba(0, 0, 0, 0.2);
    -moz-box-shadow:0 3px 3px rgba(0, 0, 0, 0.2);
    box-shadow: 3px 3px 3px rgba(0, 0, 0, 0.2);
}
.label-inner {
    width: 85%;
    height: 85%;
    -moz-border-radius: 50%;
    -webkit-border-radius: 50%;
    border-radius: 50%;
    border: 2px dotted white;
    vertical-align: middle;
    margin: auto;
    top: 5%;
    position: relative;
    overflow: hidden;
}
.label-inner > span {
    display: table;
    text-align: center;
    vertical-align: middle;
    font-weight: bold;
    text-transform: uppercase;
    width: 100%;
    position: absolute;
    margin: auto;
    margin-top: 38%;
    font-family:'ProximaNovaLtSemibold';
    font-size: 13px;
    line-height: 1.0em;
}
.circular-label.label-size-large {
    width: 110px;
    height: 110px;
    -moz-border-radius: 55px;
    -webkit-border-radius: 55px;
    border-radius: 55px;
    margin-top:-55px;
}
.circular-label.label-size-med {
    width: 76px;
    height: 76px;
    -moz-border-radius: 38px;
    -webkit-border-radius: 38px;
    border-radius: 38px;
    margin-top:-38px;
}
.circular-label.label-size-med .label-inner > span {
    margin-top: 33%;
}
.circular-label.label-size-small {
    width: 66px;
    height: 66px;
    -moz-border-radius: 33px;
    -webkit-border-radius: 33px;
    border-radius: 33px;
    margin-top:-33px;
}

Нетрудно увидеть, как это сделать. Больший вопрос заключается в том, можно ли масштабировать размеры круга в соответствии с содержимым.

В настоящее время я не думаю, что это возможно. Кто-нибудь?

person bearinthewoods    schedule 12.09.2012

Поздно на вечеринку, но вот решение только для начальной загрузки, которое сработало для меня. Я использую Bootstrap 4:

<link href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" rel="stylesheet"/>

<body>
<div class="row mt-4">
<div class="col-md-12">
<span class="bg-dark text-white rounded-circle px-3 py-1 mx-2 h3">1</span>
<span class="bg-dark text-white rounded-circle px-3 py-1 mx-2 h3">2</span>
<span class="bg-dark text-white rounded-circle px-3 py-1 mx-2 h3">3</span>
</div>
</div>
</body>

Вы в основном добавляете классы bg-dark text-white rounded-circle px-3 py-1 mx-2 h3 к своему элементу <span> (или любому другому), и все готово.

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

person dotNET    schedule 09.09.2018

Я удивлен, что никто не использовал flex, который легче понять, поэтому я поместил здесь свою версию ответа:

  1. Чтобы создать круг, убедитесь, что width равно height.
  2. Чтобы адаптироваться к font-size числа в круге, используйте em, а не px
  3. Чтобы центрировать число в круге, используйте flex с justify-content: center; align-items: center;
  4. если число растет (например, >1000), увеличьте width и height одновременно

Вот пример:

.circled-number {
  color: #666;
  border: 2px solid #666;
  border-radius: 50%;
  font-size: 1rem;
  display: flex;
  justify-content: center;
  align-items: center;
  width: 2em; 
  height: 2em;
}

.circled-number--big {
  color: #666;
  border: 2px solid #666;
  border-radius: 50%;
  font-size: 1rem;
  display: flex;
  justify-content: center;
  align-items: center;
  width: 4em; 
  height: 4em;
}
<div class="circled-number">
  30
</div>

<div class="circled-number--big">
  3000000
</div>

person Xinxin    schedule 15.12.2020

Вы работаете как со стандартным блоком, то есть квадратом

.circle {
    width: 10em; height: 10em; 
    -webkit-border-radius: 5em; -moz-border-radius: 5em;
  }

Это функция CSS 3, и она не очень хорошо поддерживается, вы точно можете рассчитывать на Firefox и Safari.

<div class="circle"><span>1234</span></div>
person Damian Leszczyński - Vash    schedule 01.02.2011

ПРИМЕР HTML

<h3><span class="numberCircle">1</span> Regiones del Interior</h3>

КОД

    .numberCircle { 

    border-radius:50%;
    width:40px;
    height:40px;
    display:block;
    float:left;
    border:2px solid #000000;
    color:#000000;
    text-align:center;
    margin-right:5px;

}
person Leonardo Vega    schedule 16.06.2017
comment
Хотя этот код полезен, было бы неплохо дать некоторые пояснения - person mhatch; 16.06.2017

Поздно на вечеринку, но вот решение, которое я выбрал https://codepen.io/jnbruno/pen/vNpPpW

CSS:

.btn-circle.btn-xl {
    width: 70px;
    height: 70px;
    padding: 10px 16px;
    border-radius: 35px;
    font-size: 24px;
    line-height: 1.33;
}

.btn-circle {
    width: 30px;
    height: 30px;
    padding: 6px 0px;
    border-radius: 15px;
    text-align: center;
    font-size: 12px;
    line-height: 1.42857;
}

HTML:

<div class="panel-body">
  <h4>Normal Circle Buttons</h4>
  <button type="button" class="btn btn-default btn-circle">
    <i class="fa fa-check"></i>
  </button>
  <button type="button" class="btn btn-primary btn-circle">
    <i class="fa fa-list"></i>
  </button>
</div>

Не требует дополнительной работы. Спасибо, Джон Ноэль Бруно.

person Dt23    schedule 11.12.2018
comment
Кто такой Джон Ноэль Бруно? Если вы получите его из блога или учебника, предоставление ссылок будет плюсом. - person Dush; 26.09.2019

Сделайте что-то подобное в своем css

 div {
    width: 10em; height: 10em; 
    -webkit-border-radius: 5em; -moz-border-radius: 5em;
  }
  p {
    text-align: center; margin-top: 4.5em;
  }

Используйте тег абзаца, чтобы написать текст. надеюсь, это поможет

person 1000Suns    schedule 01.02.2011

Что-то вроде того, что я сделал здесь, может сработать (для чисел от 0 до 99):

CSS:

.circle {
    border: 0.1em solid grey;
    border-radius: 100%;
    height: 2em;
    width: 2em;
    text-align: center;
}

.circle p {
    margin-top: 0.10em;
    font-size: 1.5em;
    font-weight: bold;
    font-family: sans-serif;
    color: grey;
}

HTML:

<body>
    <div class="circle"><p>30</p></div>
</body>
person jstol    schedule 04.06.2013

Улучшая первый ответ, просто избавьтесь от заполнения и добавьте line-height и vertical-align:

.numberCircle {
   border-radius: 50%;       

   width: 36px;
   height: 36px;
   line-height: 36px;
   vertical-align:middle;

   background: #fff;
   border: 2px solid #666;
   color: #666;

   text-align: center;
   font: 32px Arial, sans-serif;
}
person Hubyx Reds    schedule 21.01.2015

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

.circle {
  display: inline-block;
  border: 1px solid black;
  border-radius: 50%;
  position: relative;
  padding: 5px;
}
.circle::after {
  content: '';
  display: block;
  padding-bottom: 100%;
  height: 0;
  opacity: 0;
}
.num {
  position: absolute;
  top: 50%;
  transform: translateY(-50%);
}
.width_holder {
  display: block;
  height: 0;
  overflow: hidden;
}
<div class="circle">
  <span class="width_holder">1</span>
  <span class="num">1</span>
</div>
<div class="circle">
  <span class="width_holder">11</span>
  <span class="num">11</span>
</div>
<div class="circle">
  <span class="width_holder">11111</span>
  <span class="num">11111</span>
</div>
<div class="circle">
  <span class="width_holder">11111111</span>
  <span class="num">11111111</span>
</div>

person Chris Li    schedule 09.09.2018

введите здесь описание изображения

Вот демонстрация JSFiddle и фрагмент:

/* Creating a number within a circle using CSS */
.numberCircle {
    font-family: "OpenSans-Semibold", Arial, "Helvetica Neue", Helvetica, sans-serif;
    display: inline-block;
    color: #fff;
    text-align: center;
    line-height: 0px;
    border-radius: 50%;
    font-size: 12px;
    min-width: 38px;
    min-height: 38px;
}

.numberCircle span {
    display: inline-block;
    padding-top: 50%;
    padding-bottom: 50%;
    margin-left: 1px;
    margin-right: 1px;
}

/* Some Back Ground Colors */
.clrGreen {
    background: #51a529;
}
.clrRose {
    background: #e6568b;
}
.clrOrange {
    background: #ec8234;
}
.clrBlueciel {
    background: #21adfc;
}
.clrMauve {
    background: #7b5d99;
}
<span class="numberCircle clrGreen"><span>8</span></span>
<span class="numberCircle clrRose"><span>80</span></span>
<span class="numberCircle clrOrange"><span>800</span></span>
<span class="numberCircle clrMauve"><span>8000</span></span>

person el-mehdi chouki    schedule 08.09.2020
comment
Мне это решение нравится больше, чем первое, потому что круги остаются одного размера, независимо от того, какое число в них. - person cslotty; 13.10.2020

Ответ тридцать точек правильный, но не хватает кое-чего. Вам нужно добавить position: relative , если вы хотите, чтобы значение было центрировано в круге и включало также другой диапазон чисел. Например 123;

HTML:

<div class="numberCircle">30</div>

CSS:

.numberCircle {    

border-radius: 50%;
behavior: url(PIE.htc); /* remove if you don't care about IE8 */
width: 36px;
height: 36px;
padding: 8px;
position: relative;
background: #fff;
border: 2px solid #666;
color: #666;
text-align: center;

font: 32px Arial, sans-serif;
}

но самое простое решение - использовать Bootstrap

<span class="badge" style ="float:right">123</span>

person Marco Maggiotti    schedule 02.03.2016