如何画一个中间有文字的圆圈?
Posted
技术标签:
【中文标题】如何画一个中间有文字的圆圈?【英文标题】:How to draw a circle with text in the middle? 【发布时间】:2013-05-12 23:56:03 【问题描述】:我在***上找到了这个例子:
Draw Circle using css alone
这很棒。但我想知道如何修改该示例,以便在圆圈中间包含文本?
我还发现了这个:Vertically and horizontally centering text in circle in CSS (like iphone notification badge)
但由于某种原因,它对我不起作用。当我创建以下测试代码时:
<div class="badge">1</div>
我得到的是椭圆形,而不是圆形。 我正在尝试修改代码,看看如何让它工作。
【问题讨论】:
【参考方案1】:当然,你必须使用 to 标签来做到这一点。一个用于创建圆圈,另一个用于文本。
这里有一些代码可以帮助你
#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
【讨论】:
谢谢!我比帖子 (***.com/questions/4801181/…) 中的示例更了解您的示例,但我想了解为什么该示例对我不起作用... 看起来他们已经做了你正在做的同样的事情,但只是在 css 中合并为一个类......? 是的,我只是注意到我做了同样的事情。 等一下,我会更新我的帖子和代码以使其更好:D【参考方案2】:如果它只有一行文本,你可以使用 line-height 属性,其值与元素高度相同:
height:100px;
line-height:100px;
如果文本有多行,或者内容是可变的,你可以使用 padding-top:
padding-top:30px;
height:70px;
示例:http://jsfiddle.net/2GUFL/
【讨论】:
【参考方案3】:我想你想用椭圆形或圆形写文字?为什么不是这个?
<span style="border-radius:50%; border:solid black 1px;padding:5px">Hello</span>
【讨论】:
你只考虑了椭圆,没有考虑圆形【参考方案4】:将line-height
设置为与 div 的高度相同的值将显示垂直居中的一行文本。在此示例中,高度和行高为 500 像素。
示例
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>
【讨论】:
@dot: 不是我做的——bryanhadaway.com/how-to-create-circles-with-css 如果您可以使border-radius:50%;
使您的代码事件更加优雅和可移植,而不必每次根据宽度和高度更改此属性;)
我个人会删除 line-height 属性并添加 vertical-align: middle;显示:表格单元格;这样你的文本行仍然会居中。 jsfiddle.net/z9bLtw99
多行怎么样。
@DamjanPavlica 查看此 answer 的最新更新,该更新未明确设置任何宽度或高度。也适用于多行,因为您可以在 jsfiddle 上实时验证【参考方案5】:
如果您的内容要包装并且高度未知,这是您最好的选择:
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>
【讨论】:
这会生成椭圆,而不是完美的圆形。 这是真正的解决方案。虽然我必须提到,display: absolute
打破了 alingment - 但简单的解决方案是将其包装在另一个 div 中。
产生一个完美的圆形(不是椭圆形)。在使用绝对定位或固定定位时,另外一个包装 div 确实是一个好主意。
对于绝对定位,您将使用包装器。但它给出了一个椭圆形,因为它可以达到的最大宽度是 180 像素。因此,如果您将 min-width 指定为所需的宽度并将高度也设置为该值。你会得到一个圆圈。否则你会得到一个超过宽度和高度> 180px的椭圆。【参考方案6】:
如果你使用的是 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%;
【讨论】:
【参考方案7】:对于一个网页设计,我最近被告知我必须解决固定圆圈中的居中和未知数量的文本问题,我想我会在这里分享解决方案,供其他研究圆圈/文本组合的人使用。
我遇到的主要问题是文本经常会打破圆圈的界限。为了解决这个问题,我最终使用了 4 个 div。 一个指定圆的最大(固定)边界的矩形容器。 里面是 div,它绘制圆形,其宽度和高度设置为 100%,因此更改父级的大小会改变实际圆形的大小。 里面是另一个矩形 div,它使用 %'s 将创建一个文本边界区域,防止任何文本离开圆圈(大部分) 最后是文本和垂直居中的实际 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 不是我的主要学科,所以我相信它可以改进!
【讨论】:
【参考方案8】:对我来说,只有 this solution 可以处理多行文本:
.circle-multiline
display: table-cell;
height: 200px;
width: 200px;
text-align: center;
vertical-align: middle;
border-radius: 50%;
background: yellow;
【讨论】:
【参考方案9】:一种方法是使用 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
【讨论】:
【参考方案10】:使用此代码,它也会响应。
<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;
【讨论】:
【参考方案11】:您可以使用 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>
【讨论】:
理想世界中的最佳解决方案。可悲的是,在 flexbox 的实现中仍然存在许多跨浏览器错误:github.com/philipwalton/flexbugs 对于 IE:``` 显示:-ms-flexbox ```【参考方案12】:.circle
width: 500px;
height: 500px;
border-radius: 50%;
font-size: 50px;
color: #fff;
line-height: 500px;
text-align: center;
background: #000
<div class="circle">Hello I am A CircleHello I am A CircleHello I am A CircleHello I am A CircleHello I am A CircleHello I am A CircleHello I am A CircleHello I am A CircleHello I am A Circle</div>
【讨论】:
这是另一个答案的直接副本。耻辱。 -1【参考方案13】:我将其他人的一些答案与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;
【讨论】:
【参考方案14】:从设置非常简单的 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>
【讨论】:
【参考方案15】:这里的一些解决方案在小圈子上对我来说效果不佳。所以我使用ol绝对位置制作了这个解决方案。
使用 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上查看演示
查看sn-p查看输出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>
【讨论】:
【参考方案16】:在中间用 HTML 标签和不带 CSS 的文本画一个圆圈
带有 SVG 标签的 HTML。如果您不想使用 CSS,可以遵循此标准方法。
<svg >
<circle cx="50" cy="50" r="40" stroke="green" stroke- 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>
【讨论】:
供普通读者将来参考:从代码和图像中可以看出,文本居中只是因为font-size
、font-family
、x
和y
排队。对于没有安装 Verdana 的任何人,它都不会居中。使用x="50%" y="50%" dominant-baseline="middle" text-anchor="middle"
也不能解决问题。【参考方案17】:
使用 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>
【讨论】:
如果您添加一点解释,这个答案可能会很棒。【参考方案18】:做这个方法你可以把文字做成一个圆圈
.cir
width: 400px;
height: 400px;
background: linear-gradient(to right, blue, orange);/*important*/
border-radius: 50%;
display: flex;
justify-content: center;
align-items: center;
font-size: 50px;/*no need*/
color: white;/*no need*/
font-family: Arial;/*no need*/
border: 15px solid red;/*no need*/
user-select: none;/*no need*/
<div class="cir">hello world</div>
【讨论】:
【参考方案19】:HTML:
<div class="circle">
<p class="inner">HELLO</p>
</div>
CSS:
.circle
background-color: darkgoldenrod;
height: 500px; width: 500px;
border-radius: 50%;
.inner
position: relative;
top: 50%;
text-align: center;
line-height: 0px;
第一个 div 类表示正在绘制的圆,您可以更改高度和宽度以适合您的使用。
内部类表示文本的位置,使用position relative可以让文本留在圆圈内。
前 50% 将其垂直居中,而 text-align 将其水平居中。 0 处的行高只会让它更清晰或更准确。
【讨论】:
请解释您的解决方案。没有解释且只有代码的答案会被标记为低工作量。以上是关于如何画一个中间有文字的圆圈?的主要内容,如果未能解决你的问题,请参考以下文章