Как нарисовать круг с текстом посередине?

Я нашел этот пример в stackoverflow:

Нарисуйте круг, используя только CSS

Это здорово. Но я хотел бы знать, как изменить этот пример, чтобы я мог включить текст в середине круга?

Я также нашел это: Вертикально и горизонтально центрирование текста по кругу в CSS (например, значок уведомления iphone)

но почему-то у меня не работает. Когда я создаю следующий тестовый код:

<div class="badge">1</div>

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


person dot    schedule 17.05.2013    source источник


Ответы (17)


Установка line-height того же значения, что и высота div, покажет одну строку текста по центру по вертикали. В этом примере высота и высота строки равны 500px.

Пример

JSFiddle

.circle {
  width: 500px;
  height: 500px;
  line-height: 500px;
  border-radius: 50%;
  font-size: 50px;
  color: #fff;
  text-align: center;
  background: #000
}
<div class="circle">Hello I am A Circle</div>

person Jawad    schedule 17.05.2013
comment
@dot: На самом деле это не моя работа - bryanhadaway.com/how-to-create -круги-с-CSS - person Jawad; 17.05.2013
comment
Если вы можете сделать border-radius:50%;, это сделает ваше кодовое событие более элегантным и переносимым, без необходимости каждый раз изменять этот атрибут в зависимости от ширины и высоты;) - person bonCodigo; 14.08.2014
comment
Но, в то же время, если ваше число переменное и увеличивается до трех цифр (например, 100) , то border-radius:50%; будет выглядеть плохо. В таких случаях лучше всего использовать фиксированный радиус границы (например, 10 пикселей). - person adi rohan; 21.09.2014
comment
Это по-прежнему здорово, но что, если я хочу, чтобы в круге было больше одной линии? Поскольку высота линии равна высоте, в круге может быть только одна линия. - person Leo C Han; 04.02.2015
comment
Лично я бы удалил атрибут line-height и добавил vertical-align: middle; отображение: таблица-ячейка; Таким образом, ваши строки текста будут по-прежнему центрированы. jsfiddle.net/z9bLtw99 - person ministe2003; 16.03.2015
comment
Что уж говорить о нескольких строках. - person Henry Zhu; 29.08.2015
comment
Полностью согласен с ministe2003. Jawad, ваше решение великолепно, если вы уверены, что текст поместится на одной строке. Чтобы продемонстрировать, попробуйте ввести больше символов, чем может поместиться в одну строку в вашем примере jsfiddle. @ Генри, если вы последуете совету ministe2003, это не будет проблемой. Кстати, мне пришлось изменить атрибут «отображение» родительского элемента на «таблицу», чтобы все заработало (после установки атрибута «круг» на «таблица-ячейка»). - person nullstellensatz; 20.09.2015
comment
@DamjanPavlica См. последнее обновление этого ответа, в котором явно не указана ширина или высота. Также работает для нескольких строк, как вы можете проверить в реальном времени на jsfiddle - person Jose Rui Santos; 08.06.2016

Если ваш контент будет обертываться и иметь неизвестную высоту, это ваш лучший выбор:

http://cssdeck.com/labs/aplvrmue

.badge {
  height: 100px;
  width: 100px;
  display: table-cell;
  text-align: center;
  vertical-align: middle;
  border-radius: 50%; /* may require vendor prefixes */
  background: yellow;
}

.badge {
  height: 100px;
  width: 100px;
  display: table-cell;
  text-align: center;
  vertical-align: middle;
  border-radius: 50%;
  background: yellow;
}
<div class="badge">1</div>

person cimmanon    schedule 17.05.2013
comment
Это генерирует овалы, а не идеальные круги. - person Sophivorus; 08.04.2014
comment
это реальное решение. хотя я должен упомянуть, что display: absolute нарушает связь, но простое решение - обернуть его внутри другого div. - person Ondřej Želazko; 10.06.2015
comment
дает идеальный круг (не овал). Кроме того, div-обертка действительно является хорошей идеей при использовании абсолютного или фиксированного позиционирования. - person krivar; 23.07.2015
comment
Для абсолютного позиционирования вы должны использовать обертку. Но он дает овал, поскольку максимальная ширина, которую он может иметь, составляет 180 пикселей. Поэтому, если вы укажете минимальную ширину на желаемую ширину, а также установите высоту на это значение. У вас получится круг. В противном случае вы получите овал сверх ширины и высоты › 180px. - person mutp; 05.10.2015

Вы можете использовать css3 flexbox.

HTML:

<div class="circle-with-text">
    Here is some text in circle
</div>

CSS:

.circle-with-text {
  justify-content: center;
  align-items: center;
  border-radius: 100%;
  text-align: center;
  display: flex;
}

Это позволит вам иметь вертикально и горизонтально выровненный по середине однострочный и многострочный текст.

body {
  margin: 0;
}
.circles {
  display: flex;
}
.circle-with-text {
  background: linear-gradient(orange, red);
  justify-content: center;
  align-items: center;
  border-radius: 100%;
  text-align: center;
  margin: 5px 20px;
  font-size: 15px;
  padding: 15px;
  display: flex;
  height: 180px;
  width: 180px;
  color: #fff;
}
.multi-line-text {
  font-size: 20px;
}
<div class="circles">
  <div class="circle-with-text">
    Here is some text in circle
  </div>
  <div class="circle-with-text multi-line-text">
    Here is some multi-line text in circle
  </div>
</div>

person Mohammad Usman    schedule 21.12.2016
comment
Лучшее решение в идеальном мире. К сожалению, в реализации flexbox остается много межбраузерных ошибок: github.com/philipwalton/flexbugs. - person jimiayler; 09.03.2020
comment
для IE: ``` display: -ms-flexbox ``` - person Michael Guild; 21.04.2020

Для веб-дизайна, который мне недавно дали, мне нужно было решить проблему с центрированным и неизвестным объемом текста в фиксированном круге, и я подумал, что поделюсь здесь решением с другими людьми, изучающими комбинации круг/текст.

Основная проблема, с которой я столкнулся, заключалась в том, что текст часто выходил за пределы круга. Чтобы решить эту проблему, я использовал 4 div. Один прямоугольный контейнер, в котором указаны максимальные (фиксированные) границы круга. Внутри будет div, который рисует круг с шириной и высотой, установленными на 100%, поэтому изменение размера родителя меняет размер фактического круга. Внутри этого будет еще один прямоугольный div, который, используя %, создаст область границы текста, предотвращающую выход текста за круг (по большей части). Затем, наконец, фактический div для текста и вертикального центрирования.

Это имеет больше смысла как код:

/* Main Container -  this controls the size of the circle */
.circle_container
{
	width : 128px;
	height : 128px;
	margin : 0;
	padding : 0;
/*	border : 1px solid red; */
}

/* Circle Main draws the actual circle */
.circle_main
{
	width : 100%;
	height : 100%;
	border-radius : 50%;
	border : 2px solid black;	/* can alter thickness and colour of circle on this line */
	margin : 0;
	padding : 0;
}

/* Circle Text Container - constrains text area to within the circle */
.circle_text_container
{
	/* area constraints */
	width : 70%;
	height : 70%;
	max-width : 70%;
	max-height : 70%;
	margin : 0;
	padding : 0;

	/* some position nudging to center the text area */
	position : relative;
	left : 15%;
	top : 15%;
	
	/* preserve 3d prevents blurring sometimes caused by the text centering in the next class */
	transform-style : preserve-3d;
	
	/*border : 1px solid green;*/
}

/* Circle Text - the appearance of the text within the circle plus vertical centering */
.circle_text
{
	/* change font/size/etc here */
	font: 11px "Tahoma", Arial, Serif;	
	text-align : center;
	
	/* vertical centering technique */
	position : relative;
	top : 50%;
	transform : translateY(-50%);
}
<div class="circle_container">
	<div class="circle_main">
		<div class="circle_text_container">
			<div class = "circle_text">
				Here is an example of some text in my circle.
			</div>
		</div>
	</div>
</div>			

Вы можете раскомментировать цвета границ в div-контейнерах, чтобы увидеть, как это ограничивает.

На что следует обратить внимание: вы все равно можете нарушить границы круга, если поместите слишком много текста или используете слишком длинные слова/непрерывный текст. Это по-прежнему не подходит для совершенно неизвестного текста (например, пользовательского ввода), но лучше всего работает, когда вы смутно знаете, какой наибольший объем текста вам нужно сохранить, и соответственно устанавливаете размер круга и размеры шрифта. Конечно, вы можете настроить div текстового контейнера, чтобы скрыть любое переполнение, но это может просто выглядеть «сломанным» и не заменяет фактический учет максимального размера в вашем дизайне.

Надеюсь, это кому-нибудь пригодится! HTML/CSS не является моей основной дисциплиной, поэтому я уверен, что ее можно улучшить!

person David Burford    schedule 05.03.2016

Я думаю, вы хотите написать текст в овале или круге? почему не этот?

<span style="border-radius:50%; border:solid black 1px;padding:5px">Hello</span>

person Community    schedule 17.05.2013
comment
Вы учитывали только овал, а не круг - person Osinachi; 20.02.2021

Нарисуйте круг с текстом посередине с помощью тега HTML и без CSS

HTML с тегом SVG для этого. Вы можете следовать этому стандартному подходу, если не хотите использовать CSS.

 <svg width="100" height="100">
   <circle cx="50" cy="50" r="40" stroke="green" stroke-width="4" fill="white" />
     Sorry, your browser does not support inline SVG.
   <text fill="#000000" font-size="18" font-family="Verdana"
     x="15" y="60">ASHISH</text>
 </svg>

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

person Ashish    schedule 14.06.2019
comment
Для справки в будущем для случайных читателей: как видно из кода и изображения, текст центрируется только потому, что font-size, font-family, x и y выстраиваются в линию. Для любого, у кого не установлена ​​Verdana, он не будет центрирован. Использование x="50%" y="50%" dominant-baseline="middle" text-anchor="middle" также не решает проблему. - person LosManos; 19.02.2020

Если это только одна строка текста, вы можете использовать свойство line-height с тем же значением, что и высота элемента:

height:100px;
line-height:100px;

Если текст состоит из нескольких строк или если содержимое является переменным, вы можете использовать padding-top:

padding-top:30px;
height:70px;

Пример: http://jsfiddle.net/2GUFL/

person Bruno Gomes    schedule 17.05.2013

Конечно, вы должны использовать теги, чтобы сделать это. Один для создания круга, а другой для текста.

Здесь некоторый код может вам помочь

#circle {
    background: #f00;
    width: 200px;
    height: 200px;
    border-radius: 50%;
    color:black;

}
.innerTEXT{
    position:absolute;
    top:80px;
    left:60px;
}

<div id="circle">
    <span class="innerTEXT"> Here a text</span>
</div>

Живой пример здесь http://jsbin.com/apumik/1/edit

Обновлять

Здесь меньше меньше с несколькими изменениями

http://jsbin.com/apumik/3/edit

person Ligth    schedule 17.05.2013
comment
Благодарность! Я понимаю ваш пример лучше, чем тот, который можно найти в сообщении (stackoverflow.com/questions/4801181/), но я хотел бы понять, почему этот пример не работает для меня. .. - person dot; 17.05.2013
comment
похоже, что они сделали то же самое, что и вы, но просто объединились в один класс в css...? - person dot; 17.05.2013
comment
Да, я только что заметил, что я сделал то же самое. - person Ligth; 17.05.2013
comment
Дайте секунду, я обновлю свой пост и мой код, чтобы сделать его лучше: D - person Ligth; 17.05.2013

В моем случае для многострочного текста работало только это решение. :

.circle-multiline {
    display: table-cell;
    height: 200px;
    width: 200px;
    text-align: center;
    vertical-align: middle;
    border-radius: 50%;
    background: yellow;
}
person Damjan Pavlica    schedule 08.04.2016

Если вы используете платформу Foundation 5 и Compass, вы можете попробовать это.

.sass ввод

$circle-width: rem-calc(25) !default;
$circle-height: $circle-width !default;
$circle-bg: #fff !default;
$circle-radius: 50% !default;
$circle-line-height: $circle-width !default;
$circle-text-align: center !default;

@mixin circle($cw:$circle-width, $ch:$circle-height, $cb:$circle-bg, $clh:$circle-line-height, $cta:$circle-text-align, $cr:$circle-radius) {
    width: $cw;
    height: $ch;
    background: $cb;
    line-height: $clh;
    text-align: $cta;
    @include inline-block;
    @include border-radius($cr);
}

.circle-default {
    @include circle;
}

.css вывод

.circle-default {
  width: 1.78571rem;
  height: 1.78571rem;
  background: white;
  line-height: 1.78571rem;
  text-align: center;
  display: -moz-inline-stack;
  display: inline-block;
  vertical-align: middle;
  *vertical-align: auto;
  zoom: 1;
  *display: inline;
  -webkit-border-radius: 50%;
  -moz-border-radius: 50%;
  -ms-border-radius: 50%;
  -o-border-radius: 50%;
  border-radius: 50%;
}
person MagicJoseph    schedule 11.08.2014

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

.circle {
    position: absolute;
    top: 4px;
    color: white;
    background-color: red;
    width: 18px;
    height: 18px;
    border-radius: 50%;
    line-height: 18px;
    font-size: 10px;
    text-align: center;
    cursor: pointer;
    z-index: 999;
}
<div class="circle">2</div>

person Front-end Developer    schedule 16.11.2017

Некоторые из решений здесь не сработали для меня на маленьких кругах. Поэтому я сделал это решение, используя абсолютную позицию.

Использование SASS будет выглядеть так:

.circle-text {
    position: relative;
    display: block;
    text-align: center;
    border-radius: 50%;
    > .inner-text {
        display: block;
        @extend .center-align;
    }
}

.center-align {
    position: absolute;
    top: 50%;
    left: 50%;
    margin: auto;
    -webkit-transform: translateX(-50%) translateY(-50%);
    -ms-transform: translateX(-50%) translateY(-50%);
    transform: translateX(-50%) translateY(-50%);
}

@mixin circle-text($size) {
    width: $size;
    height: $size;
    @extend .circle-text;
}

И может использоваться как

#red-circle {
    background-color: red;
    border: 1px solid black;
    @include circle-text(50px);
}

#green-circle {
    background-color: green;
    border: 1px solid black;
    @include circle-text(150px);
}

См. демонстрацию на https://codepen.io/matheusrufca/project/editor/DnYPMK.

См. фрагмент, чтобы просмотреть выходной CSS

.circle-text {
  position: relative;
  display: block;
  border-radius: 50%;
  text-align: center;
  min-width: 50px;
  min-height: 50px;
}

.center-align {
  position: absolute;
  top: 50%;
  left: 50%;
  margin: auto;
  -webkit-transform: translateX(-50%) translateY(-50%);
  -ms-transform: translateX(-50%) translateY(-50%);
  transform: translateX(-50%) translateY(-50%);
}
<div id="red-circle" class="circle-text">
  <span class="inner-text center-align">Hey</span>
</div>

<div id="green-circle" class="circle-text">
  <span class="inner-text center-align">Big size circle</span>
  <div>
    <style>
      #red-circle {
        background-color: red;
        border: 1px solid black;
        width: 60px;
        height: 60px;
      }
      
      #green-circle {
        background-color: green;
        border: 1px solid black;
        width: 150px;
        height: 150px;
      }
    </style>

person m.rufca    schedule 06.02.2018

Один из способов сделать это — использовать flexbox для выравнивания текста по середине. Способ, которым я нашел это сделать, заключается в следующем:

HTML:

<div class="circle-without-text">
  <div class="text-inside-circle">
    The text
  </div>
</div>

CSS:

.circle-without-text {
    border-radius: 50%;
    width: 70vh;
    height: 70vh;
    background-color: red;
    position: relative;
 }

.text-inside-circle {
    position: absolute;
    top: 0;
    bottom: 0;
    width: 100%;
    display: flex;
    align-items: center;
    justify-content: center;
 }

Вот plnkr: https://plnkr.co/edit/EvWYLNfTb1B7igoc3TZx?p=preview

person PennyBirman    schedule 03.08.2016

Используя этот код, он также будет реагировать.

<div class="circle">ICON</div>

.circle {
  position: relative;
  display: inline-block;
  width: 100%;
  height: 0;
  padding: 50% 0;
  border-radius: 50%;
  /* Just making it pretty */
  -webkit-box-shadow: 0 4px 0 0 rgba(0, 0, 0, 0.1);
  box-shadow: 0 4px 0 0 rgba(0, 0, 0, 0.1);
  text-shadow: 0 4px 0 rgba(0, 0, 0, 0.1);
  background: #38a9e4;
  color: white;
  font-family: Helvetica, Arial Black, sans;
  font-size: 48px;
  text-align: center;
}
person Ankit Sinha    schedule 18.10.2016

Я комбинировал некоторые ответы от других людей, и с float и relative это дало мне нужный результат.

В HTML я использую div. Я использую его внутри li для панели навигации.

.large-list-style {
    float: left;
    position: relative;
    top: -8px;

    border-radius: 50%;

    margin-right: 8px;

    background-color: rgb(34, 198, 200);

    font-size: 18px;
    color: white;
}
    .large-list-style:before,
    .large-list-style:after {
        content: '\200B';
        display:inline-block;
        line-height:0;

        padding-top: 50%;
        padding-bottom: 50%;
    }
    .large-list-style:before {
        padding-left: 16px;
    }
    .large-list-style:after {
        padding-right: 16px;
    }
person Halfacht    schedule 31.10.2017

Добавить кружок вокруг числа можно легко с помощью CSS. Это можно сделать с помощью свойства border-radius.

Здесь мы также использовали свойство отображения, для которого установлено значение inline-block, чтобы представить элемент как блочный контейнер встроенного уровня.

  span.circle {
  background: #010101;
  border-radius: 50%;
  -moz-border-radius: 50%;
  -webkit-border-radius: 50%;
  color: #f1f1f1;
  display: inline-block;
  font-weight: bold;
  line-height: 40px;
  margin-right: 5px;
  text-align: center;
  width: 40px;
}
 <span class="circle">1</span>
person Vetrivel Chinnasamy    schedule 27.07.2020
comment
Этот ответ, вероятно, был бы потрясающим, если бы вы добавили небольшое объяснение. - person mw509; 27.07.2020

person    schedule
comment
Это прямая копия другого ответа. Стыд. -1 - person Tim Gautier; 06.05.2020