CSS này tạo ra một vòng tròn như thế nào?


206

Đây là CSS:

div {
    width: 0;
    height: 0;
    border: 180px solid red;
    border-radius: 180px;
}

Làm thế nào để nó tạo ra vòng tròn dưới đây?

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

Giả sử, nếu chiều rộng hình chữ nhật là 180 pixel và chiều cao là 180 pixel thì nó sẽ xuất hiện như thế này:

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

Sau khi áp dụng bán kính đường viền 30 pixel, nó sẽ xuất hiện như sau:

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

Hình chữ nhật đang trở nên nhỏ hơn, nghĩa là gần như sẽ biến mất nếu kích thước bán kính tăng.

Vậy, làm thế nào để đường viền 180 pixel height/width-> 0pxtrở thành một vòng tròn có bán kính 180 pixel?


14
Đó là một đối tượng 0x0 với đường viền 180 pixel xung quanh nó có các góc tròn. Vì vậy, các góc tròn là góc phần tư của một vòng tròn.
Kaz

Tôi có một câu hỏi ngớ ngẩn trong đầu tại sao bạn muốn thực hiện circlevới đường viền ??? chúng ta có thể dễ dàng thực hiện circlevới widthheightvậy tại sao chúng tôi làm vớiborder
The Mechanic

7
FYI, để tạo vòng tròn, sử dụng <code> Border-radius: 50% </ code> - giúp dễ dàng điều chỉnh chỉ chiều rộng / chiều cao khi bố trí đúng.
David Gilbertson

Vâng, đó là một phép toán
Medet Tleukabiluly

Câu trả lời:


371

Làm thế nào để đường viền 180 pixel có chiều cao / chiều rộng-> 0px trở thành một vòng tròn có bán kính 180 pixel?

Hãy điều chỉnh lại thành hai câu hỏi:

Làm ở đâu widthheightthực sự áp dụng?

Chúng ta hãy xem các khu vực của một hộp thông thường ( nguồn ):

W3C: Khu vực của một hộp điển hình

Các heightwidthchỉ áp dụng trên nội dung, nếu mô hình hộp đúng đang được sử dụng (không có chế độ quirks, không già Internet Explorer).

Áp border-radiusdụng ở đâu?

Áp border-radiusdụng trên các cạnh biên. Nếu không có phần đệm cũng như đường viền, nó sẽ ảnh hưởng trực tiếp đến cạnh nội dung của bạn, dẫn đến ví dụ thứ ba của bạn.

Điều này có ý nghĩa gì đối với bán kính biên giới / vòng tròn của chúng tôi?

Điều này có nghĩa là các quy tắc CSS của bạn dẫn đến một hộp chỉ bao gồm một đường viền. Quy tắc của bạn nêu rõ rằng đường viền này phải có chiều rộng tối đa 180 pixel ở mọi phía, trong khi mặt khác nó phải có bán kính tối đa có cùng kích thước:

Hình ảnh ví dụ

Trong ảnh, nội dung thực tế của yếu tố của bạn (chấm đen nhỏ) thực sự không tồn tại. Nếu bạn không áp dụng bất kỳ, border-radiusbạn sẽ kết thúc với hộp màu xanh lá cây. Cung border-radiuscấp cho bạn các vòng tròn màu xanh.

Sẽ dễ hiểu hơn nếu bạn chỉ áp dụng border-radius cho hai góc :

#silly-circle{
    width:0; height:0;
    border: 180px solid red;
    border-top-left-radius: 180px;
    border-top-right-radius: 180px;
}

Đường viền chỉ áp dụng ở hai góc

Vì trong ví dụ của bạn, kích thước và bán kính cho tất cả các góc / viền bằng nhau, bạn có được một vòng tròn.

Thêm tài nguyên

Người giới thiệu

Biểu tình

  • Vui lòng mở bản demo bên dưới, cho biết mức độ border-radiusảnh hưởng của đường viền (nghĩ về hộp màu xanh bên trong là hộp nội dung, đường viền màu đen bên trong là đường viền đệm, không gian trống làm đệm và đường viền màu đỏ khổng lồ, tốt, biên giới). Giao lộ giữa hộp bên trong và đường viền màu đỏ thường sẽ ảnh hưởng đến cạnh nội dung.


Tôi không nghĩ nền tảng css3 làm cho bất kỳ tham chiếu nào đến hộp css3 (hộp css3 đang chờ viết lại).
BoltClock

@BoltClock: Tôi nghĩ rằng css3-box sẽ xác định các cạnh . Chỉ có một tham chiếu đến hộp css2.1 trong phần giới thiệu (không quy tắc) và hình ảnh đã cho cũng ở đó, vì vậy css3-box không thực sự cần thiết để hiểu border-radius(những thay đổi nào được mong đợi trong việc viết lại css3- cái hộp?).
Zeta

@Zeta tôi có một câu hỏi ngớ ngẩn trong đầu tại sao bạn muốn làm circlevới đường viền ??? chúng ta có thể dễ dàng thực hiện circlevới widthheightvậy tại sao chúng tôi làm vớiborder
The Mechanic

1
@Sarfaraz: Hãy xem câu hỏi của OP: "Vậy, làm thế nào để đường viền 180px height/width-> 0pxtrở thành một vòng tròn có bán kính 180px?" . Tôi chỉ đơn giản là trả lời câu hỏi. Có nhiều cách khác để tạo một vòng tròn, nhưng OP chỉ quan tâm đến cách thức hoạt động của phương pháp cụ thể này.
Zeta

@Zeta: Tôi không chắc chính xác những gì sẽ được thay đổi, nhưng cho rằng WD đã không được cập nhật trong 6 năm, tôi nghi ngờ rất nhiều điều sẽ xảy ra. Tôi biết rằng phần 11 ( overflowhọ thuộc tính) hiện đang sống trong mô-đun riêng của nó, css-overflow-3, nhưng điều đó chưa được phản ánh trong ED. Bạn sẽ thấy nhiều vấn đề trong ED, nhưng tôi tưởng tượng đó không phải là một danh sách đầy đủ: dev.w3.org/csswg/css3-box
BoltClock

94

Bản giới thiệu

Hãy xem xét câu hỏi theo cách khác với trình diễn hình ảnh này:

Trước tiên hãy xem bán kính đường viền được sản xuất như thế nào?

Để sản xuất bán kính phải có hai mặt của đường viền của nó. Nếu bạn đặt bán kính đường viền thành 50 pixel thì sẽ mất 25 pixel từ một phía và 25 pixel từ một phía khác.

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

Và lấy 25 pixel từ mỗi bên, nó sẽ tạo ra như thế này:

div{
    width: 0px;
    height: 0px;
    border: 180px solid red;
    border-radius: 0 50px 0 0;
}

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

Bây giờ hãy xem có thể mất bao nhiêu hình vuông để áp dụng trên một góc?

Nó có thể mất tới 180 pixel từ trên xuống và 180 pixel từ bên phải. Sau đó, nó sẽ sản xuất như thế này:

div{
    width: 0px;
    height: 0px;
    border: 180px solid red;
    border-radius: 0 180px 0 0;
}

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

Và xem điều này nó tạo ra như thế nào nếu chúng ta đặt giá trị bán kính không bằng nhau?

Giả sử, nếu bạn chỉ áp dụng bán kính đường viền cho hai góc không bằng nhau:

  • góc trên bên phải đến 180 pixel

  • góc dưới bên phải đến 100 pixel

Sau đó, nó sẽ mất

  • trên cùng bên phải: 90 pixel từ trên cùng và 90 pixel từ bên phải

  • dưới cùng bên phải: 50 pixel từ bên phải và 50 pixel từ dưới cùng

Sau đó, nó sẽ sản xuất như thế này

div{
    width: 0px;
    height: 0px;
    border: 180px solid red;
    border-radius: 0 180px 100px 0;
}

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

Làm thế nào tối đa biên giới của nó có thể mất vuông để áp dụng trên tất cả các mặt? Và xem làm thế nào nó tạo ra một vòng tròn?

Nó có thể chiếm tới một nửa kích thước đường viền, nghĩa là 180 pixel / 2 = 90 pixel. Sau đó, nó sẽ tạo ra một vòng tròn như thế này

div{
    width: 0px;
    height: 0px;
    border: 180px solid red;
    border-radius: 180px;
}

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

Tại sao nó chỉ mất một nửa hình vuông để áp dụng trên tất cả các mặt?

Bởi vì tất cả các góc phải đặt giá trị bán kính bằng nhau.

Lấy các phần bằng nhau của biên giới của nó, nó tạo ra một vòng tròn.


7
Trên thực tế, phiên bản hiện tại của câu trả lời này đưa nó đi một chút đến nay. Câu hỏi chỉ đơn giản là "làm thế nào để CSS này tạo ra một vòng tròn", chứ không phải "làm thế nào để bán kính đường viền hoạt động nói chung", vì vậy trong khi về mặt kỹ thuật, nó hơi nhiều một chút. Ngoài ra, bạn có thể định dạng lại câu hỏi và đặt mã thực tế vào môi trường mã.
Zeta

3

Đường viền là hộp bên ngoài của bất kỳ nội dung nào và nếu bạn áp dụng bán kính trên nó, nó sẽ chỉ tạo ra cạnh tròn.


3

Tôi nghĩ rằng ban đầu nó tạo ra hình chữ nhật với height and width = 180pxvà sau đó tạo đường cong với bán kính cho trước như 30pxvới mỗi góc. Vì vậy, nó thiết lập bordervới cho radius.


1

Cả hai .a.bsẽ cho đầu ra giống hệt nhau.

Q. Tại sao tôi sử dụng width: 360px; height: 360px;?

A. border: 180px solid red;trong .acông trình như thế nào border-width: 180px 180px 180px 180px; /* Top Right Bottom Left */.

Hy vọng fiddle này giúp bạn hiểu khái niệm.

.a{
    width: 0;
    height: 0;
    border: 180px solid red;
    border-radius: 180px;
}
.b{
    background:red;
    width: 360px;
    height: 360px;
    border-radius: 180px;
}

9
Huh? "Làm thế nào .a làm việc?" "Đây là so sánh giữa .a và .b" Tôi không chắc bạn đang cố nói gì ở đây.
BoltClock
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.