Làm cách nào để sử dụng CSS để bao quanh một số bằng một vòng tròn?


250

Tôi muốn bao quanh một số trong một vòng tròn như trong hình ảnh này:

Số trong hình tròn

Điều này là có thể và làm thế nào nó đạt được?

Câu trả lời:


442

Đây là bản demo trên JSFiddle và đoạn trích:

.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>

Câu trả lời của tôi là một điểm khởi đầu tốt, một số câu trả lời khác cung cấp sự linh hoạt cho các tình huống khác nhau. Nếu bạn quan tâm đến IE8, hãy xem phiên bản cũ của câu trả lời của tôi.


Phiên bản mới nhất hiện tại của Internet Explorer, 9, thực sự hỗ trợ bán kính đường viền. ... Và div không phải là một lựa chọn tuyệt vời cho việc này. :)
reisio

7
hiển thị: khối nội tuyến;
Kirkland

1
@KyleMit: Đó là một ý tưởng tốt, theo lý thuyết. Thật không may, CSS3 PIE có giới hạn cùng tên miền .
ba mươi

3
Để tránh phải làm toán trong CSS bất cứ khi nào bạn thay đổi kích thước phông chữ (ví dụ rắc rối nếu bạn đang thực hiện thiết kế đáp ứng), bạn có thể sử dụng sự thích ứng này của jsfiddle của ba mươidot chỉ sử dụng pixel để mô tả kích thước phông chữ: jsfiddle. net / dQR9T / 7058
Steven

1
@steven làm thế nào để đảm bảo vòng tròn luôn ở xung quanh số hoặc chúng ta có thể làm cho vòng tròn lớn hơn nếu số đó là 24928 nó tràn ra ngay bây giờ
biến áp

108

Vấn đề với hầu hết các câu trả lời khác ở đây là bạn cần điều chỉnh kích thước của thùng chứa bên ngoài để nó có kích thước hoàn hảo dựa trên kích thước phông chữ và số lượng ký tự được hiển thị. Nếu bạn trộn các số có 1 chữ số và số có 4 chữ số, nó sẽ không hoạt động. Nếu tỷ lệ giữa kích thước phông chữ và kích thước vòng tròn không hoàn hảo, bạn sẽ kết thúc bằng một hình bầu dục hoặc một số nhỏ được sắp xếp theo chiều dọc ở đầu một vòng tròn lớn. Điều này sẽ hoạt động tốt cho bất kỳ số lượng văn bản và bất kỳ vòng tròn kích thước. Chỉ cần đặt widthline-heightcùng một giá trị:

.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>

Nếu bạn cần làm cho nội dung dài hơn hoặc ngắn hơn, tất cả những gì bạn cần làm là điều chỉnh độ rộng của thùng chứa cho phù hợp hơn.

Xem nó trên JSFiddle .


Đó chính xác là vấn đề tôi gặp phải, hiển thị tỷ lệ phần trăm bên trong có thể là '1', '10' hoặc '100'. Điều này làm việc hoàn hảo, cảm ơn!
Felipe Fidel

Lưu ý chỉnh sửa được đề xuất này đã bị từ chối, nhưng những thay đổi thực sự tập trung vào văn bản tốt hơn một chút theo chiều dọc, vì vậy tôi đã thêm chúng vào câu trả lời theo cách thủ công.
Mike

Đây là câu trả lời tốt hơn. Tôi sẽ sử dụng translY (-50%) thay vì lề trên âm
Tobias

@Tobias Cảm ơn bạn vì ý tưởng tuyệt vời. Tôi đã cập nhật câu trả lời của mình.
Mike

Nó sẽ sạch hơn nhiều để loại bỏ khoảng và thêm text-alignline-heightvào div. Vẫn là câu trả lời tốt nhất có lẽ.
dlsso


41

Đối với kích thước vòng tròn khác nhau dựa trên nội dung, điều này sẽ hoạt động:

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;
}

Nó dựa vào chiều rộng của nội dung cộng với margin-'s để xác định bán kính, sau đó mở rộng chiều cao cho phù hợp bằng cách sử dụng padding-' s. Cácmargin- 's sẽ cần phải được điều chỉnh dựa trên font-size.

Cập nhật để loại bỏ yếu tố bên trong:

<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>

Sử dụng các yếu tố giả để buộc chiều cao. Cần không gian chiều rộng bằng không để căn chỉnh dọc. Đã chuyển line-height:0pxtừ bên ngoài sang giả để nó ít nhất có thể nhìn thấy khi xuống cấp cho IE8.


5
Đối với tôi, đây là giải pháp tốt nhất. Nó cho phép số lượng lớn hơn, và có khả năng mở rộng nhất. Tất cả các giải pháp khác có quá nhiều mã hóa kích thước cứng. Điều này có ít nhất. Cỡ chữ có thể được thay đổi một số tiền hợp lý mà không phá vỡ điều này. Nếu thay đổi mạnh mẽ, biên độ cần phải được điều chỉnh, nhưng nó rất tha thứ. Phải sử dụng một yếu tố lồng nhau là một phần tiêu cực.
Necreaux

@Necreaux Cập nhật câu trả lời bằng phiên bản thay thế phần tử bên trong rõ ràng bằng phần tử giả.
ryachza

1
Giải pháp tốt nhất thực sự. Tôi chỉ thay thế kích thước lề trái và lề phải bằng 0,35em thay vì 8px (đệm trong giải pháp cập nhật). Vì vậy, bạn có thể thay đổi kích thước phông chữ số và giữ một lề phù hợp.
Jibato

25

cách dễ nhất là sử dụng lớp bootstrap và huy hiệu

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

4
Điều đó thật tuyệt! Tôi đã sử dụng bootstrap, tôi chỉ không biết lớp này tồn tại.
Justin

1
Câu trả lời tốt đẹp!
SeyedPooya Soofbaf

22

Phiên bản này không dựa trên các giá trị mã hóa cứng, cố định nhưng kích thước tương đối so với font-sizecácdiv .

http://jsfiddle.net/qod1vstv/

nhập mô tả hình ảnh ở đây

CSS:

.numberCircle {
    font: 32px Arial, sans-serif;

    width: 2em;
    height: 2em;
    box-sizing: initial;

    background: #fff;
    border: 0.1em solid #666;
    color: #666;
    text-align: center;
    border-radius: 50%;    

    line-height: 2em;
    box-sizing: content-box;   
}

HTML:

<div class="numberCircle">30</div>
<div class="numberCircle" style="font-size: 60px">1</div>
<div class="numberCircle" style="font-size: 12px">2</div>

1
xin chào, điều này rất hay, nhưng nếu số lượng lớn, thậm chí trong 100 hoặc 1000 giây, nó sẽ cuộn ra khỏi vòng tròn. Ngoài ra, có thể sử dụng kích thước của phông chữ để tạo màu nền mới
biến áp

1
Giải pháp đẹp!
jomofrodo

8

Bạn có thể sử dụng bán kính đường viền cho việc này:

<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>  

Chơi với bán kính đường viền và các giá trị đệm cho đến khi bạn hài lòng với kết quả.

Nhưng điều này sẽ không hoạt động trong tất cả các trình duyệt. Tôi đoán IE vẫn không hỗ trợ các góc tròn.


đừng quên `-webkit-Border-radius: 15px;` cũng có một bản sửa lỗi cho IE htmlremix.com/css/curved-corner-border-radius-cross-browser nhưng hãy suy nghĩ kỹ về việc triển khai nó
Hannes

+1 có lẽ là phương pháp dễ nhất ... dự phòng cho IE cũng có vẻ ổn (vuông). wordpress thực hiện điều này nếu tôi nhớ lại
Ross

4

Giải pháp của tôi ở đây - điều này dễ dàng cho phép các kích cỡ và màu sắc khác nhau và liên kết vào một CMS để kiểm soát biên tập. Đối với IE xuống cấp thành hình vuông.

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;
}

Không quá khó để thấy cách làm điều này. Câu hỏi lớn hơn là liệu có thể làm cho kích thước của tỷ lệ vòng tròn thành nội dung.

Hiện tại tôi không nghĩ rằng nó có thể. Bất kỳ ai?


3

Đi dự tiệc muộn, nhưng đây là một giải pháp chỉ dành cho bootstrap đã làm việc cho tôi. Tôi đang sử dụng 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>

Về cơ bản, bạn thêm bg-dark text-white rounded-circle px-3 py-1 mx-2 h3các lớp vào<span> phần tử (hoặc bất cứ thứ gì) và bạn đã hoàn thành.

Lưu ý rằng bạn có thể cần điều chỉnh các lớp ký quỹ và lớp đệm nếu nội dung của bạn có nhiều hơn một chữ số.


2

Bạn làm việc như với một khối tiêu chuẩn, đó là một hình vuông

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

Đây là tính năng của CSS 3 và nó không được cung cấp nhiều lắm, bạn có thể tin tưởng vào firefox và safari.

<div class="circle"><span>1234</span></div>

2

VÍ DỤ 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;

}

Mặc dù mã này hữu ích, nhưng sẽ tốt khi cung cấp một số lời giải thích
mhatch

2

Đến bữa tiệc muộn nhưng đây là giải pháp tôi đã đi với 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>

Yêu cầu không có việc làm thêm. Cảm ơn John Noel Bruno


John Noel Bruno là ai? Nếu có được nó từ một blog hoặc hướng dẫn, việc cung cấp các liên kết sẽ là một lợi thế
Dush

1

Làm một cái gì đó như thế này trong css của bạn

 div {
    chiều rộng: 10em; chiều cao: 10em;
    -webkit-Border-radius: 5em; -moz-viền-bán kính: 5em;
  }
  p {
    văn bản-align: trung tâm; lề trên: 4,5em;
  }

Sử dụng thẻ đoạn văn để viết văn bản. Mong rằng sẽ giúp


1

Một cái gì đó giống như những gì tôi đã làm ở đây có thể hoạt động (cho các số từ 0 đến 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>

1

Cải thiện câu trả lời đầu tiên chỉ cần thoát khỏi phần đệm và thêm line-heightvertical-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;
}

1

Đây là cách của tôi để làm điều đó, sử dụng phương pháp vuông. Ưu điểm là nó hoạt động với các giá trị khác nhau, nhưng bạn cần 2 nhịp.

.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>


0

Câu trả lời của ba mươi là đúng nhưng thiếu một chút điểm. Bạn cần thêm vị trí: tương đối , nếu bạn muốn có giá trị trung tâm trong vòng tròn và bao gồm cả phạm vi số khác nhau. Ví dụ 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;
}

nhưng một giải pháp đơn giản nhất là sử dụng Bootstrap

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.