Bagaimana CSS ini menghasilkan lingkaran?

206

Ini adalah CSS:

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

Bagaimana cara menghasilkan lingkaran di bawah ini?

Masukkan deskripsi gambar di sini

Misalkan, jika lebar persegi panjang adalah 180 piksel dan tinggi adalah 180 piksel maka akan muncul seperti ini:

Masukkan deskripsi gambar di sini

Setelah menerapkan batas-radius 30 piksel akan muncul seperti ini:

Masukkan deskripsi gambar di sini

Persegi panjang menjadi lebih kecil, yaitu hampir akan menghilang jika ukuran jari-jari meningkat.

Jadi, bagaimana perbatasan dengan 180 piksel height/width-> 0pxmenjadi lingkaran dengan jari-jari 180 piksel?

Navin Rauniyar
sumber
14
Ini adalah objek 0x0 dengan batas 180 piksel di sekitarnya yang memiliki sudut bulat. Jadi sudut bulat adalah kuadran lingkaran.
Kaz
Saya punya pertanyaan konyol di pikiran saya mengapa Anda ingin membuat circledengan perbatasan ??? kita dapat dengan mudah membuat circledengan widthdan heightjadi mengapa kita lakukan denganborder
The Mechanic
7
FYI, untuk membuat lingkaran, gunakan <code> batas-radius: 50% </code> - membuatnya lebih mudah untuk menyesuaikan lebar / tinggi saat tata letak Anda benar.
David Gilbertson
Ya wanita, ini matematika
Medet Tleukabiluly

Jawaban:

372

Bagaimana perbatasan 180 piksel dengan tinggi / lebar-> 0px menjadi lingkaran dengan jari-jari 180 piksel?

Mari kita rumuskan itu menjadi dua pertanyaan:

Di mana widthdan heightbenar - benar berlaku?

Mari kita lihat area-area dari kotak yang khas ( sumber ):

W3C: Area kotak yang khas

The heightdan widthberlaku hanya pada konten, jika model kotak yang benar sedang digunakan (tidak ada quirks mode, tidak ada Internet Explorer tua).

Di mana border-radiusberlaku?

Ini border-radiusberlaku di tepi perbatasan. Jika tidak ada bantalan atau pembatas, itu akan secara langsung mempengaruhi tepi konten Anda, yang menghasilkan contoh ketiga Anda.

Apa artinya ini untuk radius-lingkaran / lingkaran kita?

Ini berarti bahwa aturan CSS Anda menghasilkan kotak yang hanya terdiri dari perbatasan. Aturan Anda menyatakan bahwa batas ini harus memiliki lebar maksimum 180 piksel di setiap sisi, sementara di sisi lain batas tersebut harus memiliki jari-jari maksimum dengan ukuran yang sama:

Contoh gambar

Dalam gambar, konten aktual elemen Anda (titik hitam kecil) benar-benar tidak ada. Jika Anda tidak menerapkannya, border-radiusAnda akan berakhir dengan kotak hijau. The border-radiusmemberi Anda lingkaran biru.

Semakin mudah untuk dipahami jika Anda menerapkan border-radius hanya ke dua sudut :

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

Batas hanya diterapkan di dua sudut

Karena dalam contoh Anda ukuran dan jari-jari untuk semua sudut / batas sama dengan Anda mendapatkan lingkaran.

Sumber lebih lanjut

Referensi

Demonstrasi

  • Silakan buka demo di bawah ini, yang menunjukkan bagaimana border-radiuspengaruhnya terhadap perbatasan (anggap kotak biru batin sebagai kotak isi, perbatasan hitam dalam sebagai perbatasan padding, ruang kosong sebagai padding dan perbatasan merah raksasa sebagai, yah, berbatasan). Persimpangan antara kotak dalam dan batas merah biasanya akan mempengaruhi tepi konten.

Zeta
sumber
Saya tidak berpikir css3-background membuat referensi ke css3-box (css3-box sedang menunggu penulisan ulang).
BoltClock
@BoltClock: Saya pikir css3-box akan menentukan tepi . Hanya ada referensi untuk css2.1-box di pendahuluan (non-normatif), dan gambar yang diberikan juga ada, jadi css3-box tidak benar-benar perlu dipahami border-radius(perubahan apa yang diharapkan dalam penulisan ulang css3- kotak?).
Zeta
@ Zeta saya punya pertanyaan konyol di pikiran saya mengapa Anda ingin membuat circledengan perbatasan ??? kita dapat dengan mudah membuat circledengan widthdan heightjadi mengapa kita lakukan denganborder
The Mechanic
1
@Sarfaraz: Lihat pertanyaan OP: "Jadi, bagaimana perbatasan 180px dengan height/width-> 0pxmenjadi lingkaran dengan jari-jari 180px?" . Saya hanya menjawab pertanyaan itu. Ada cara lain untuk membuat lingkaran, tetapi OP hanya tertarik dengan cara kerja metode khusus ini.
Zeta
@ Zeta: Saya tidak yakin apa yang sebenarnya akan diubah, tetapi mengingat bahwa WD belum diperbarui dalam 6 tahun, saya curiga banyak akan berubah. Saya tahu bahwa bagian 11 ( overflowkeluarga properti) sekarang tinggal di modulnya sendiri, css-overflow-3, tapi itu belum tercermin dalam UGD. Anda akan melihat banyak masalah di ED, tetapi saya membayangkan itu bukan daftar lengkap: dev.w3.org/csswg/css3-box
BoltClock
94

Demo

Mari kita periksa pertanyaannya dengan cara lain dengan demonstrasi gambar ini:

Mari kita lihat dulu bagaimana radius perbatasan dihasilkan?

Untuk menghasilkan radius diperlukan dua sisi perbatasan. Jika Anda mengatur radius batas menjadi 50 piksel maka akan butuh 25 piksel dari satu sisi dan 25 piksel dari sisi lain.

Masukkan deskripsi gambar di sini

Dan mengambil 25 piksel dari setiap sisi yang akan dihasilkannya seperti ini:

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

Masukkan deskripsi gambar di sini

Sekarang lihat berapa banyak yang bisa diperlukan untuk menggunakan persegi di satu sudut?

Ini dapat memakan waktu hingga 180 piksel dari atas dan 180 piksel dari kanan. Maka akan menghasilkan seperti ini:

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

Masukkan deskripsi gambar di sini

Dan lihat ini bagaimana hasilnya jika kita menetapkan nilai radius yang tidak sama?

Misalkan, jika Anda menerapkan radius perbatasan hanya ke dua sudut secara tidak merata:

  • sudut kanan atas hingga 180 piksel

  • sudut kanan bawah hingga 100 piksel

Maka akan butuh

  • kanan atas: 90 piksel dari atas dan 90 piksel dari kanan

  • kanan bawah: 50 piksel dari kanan dan 50 piksel dari bawah

Maka akan menghasilkan seperti ini

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

Masukkan deskripsi gambar di sini

Seberapa jauh batas maksimum yang bisa diambil persegi untuk diterapkan di semua sisi? Dan lihat bagaimana cara menghasilkan lingkaran?

Ini dapat memakan waktu hingga setengah dari ukuran batas, yaitu 180 piksel / 2 = 90 piksel. Maka akan menghasilkan lingkaran seperti ini

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

Masukkan deskripsi gambar di sini

Mengapa hanya butuh setengah dari lapangan untuk diterapkan di semua sisi?

Karena semua sudut harus menetapkan nilai radius mereka secara merata.

Mengambil bagian yang sama dari perbatasannya, itu menghasilkan lingkaran.

Bhojendra Rauniyar
sumber
7
Sebenarnya versi saat ini dari jawaban ini membutuhkan waktu agak jauh. Pertanyaannya hanyalah "bagaimana CSS ini membuat sebuah lingkaran", bukan "bagaimana cara kerja radius-perbatasan secara umum", jadi sementara secara teknis memperbaikinya itu sedikit berlebihan. Anda juga dapat memformat ulang pertanyaan dan memasukkan kode aktual ke lingkungan kode.
Zeta
3

Perbatasan adalah kotak luar dari konten apa pun dan jika Anda menerapkan radius di atasnya, itu hanya akan menghasilkan tepi melingkar.

rahul_pratap
sumber
3

Saya pikir itu awalnya membuat persegi panjang dengan height and width = 180pxdan kemudian membuat kurva dengan jari-jari yang diberikan seperti 30pxdengan setiap sudut. Jadi set borderdengan diberikan radius.

SanketS
sumber
1

Keduanya .adan.b akan memberikan hasil yang identik.

Q. Mengapa saya menggunakan width: 360px; height: 360px; ?

A. border: 180px solid red;dalam .akarya-karya sepertiborder-width: 180px 180px 180px 180px; /* Top Right Bottom Left */ .

Semoga biola ini membantu Anda memahami konsepnya.

.a{
    width: 0;
    height: 0;
    border: 180px solid red;
    border-radius: 180px;
}
.b{
    background:red;
    width: 360px;
    height: 360px;
    border-radius: 180px;
}
Rajender Joshi
sumber
9
Hah? "Bagaimana cara kerjanya?" "Ini perbandingan antara .a dan .b" Saya tidak yakin apa yang ingin Anda katakan di sini.
BoltClock