Saya mendapat ide untuk melakukan hal semacam itu ketika saya menemukan diagram lingkaran SVG interaktif ini. Sementara kode SVG sangat ringkas (satu elemen 1. ), menggunakan goresan untuk membuat irisan diagram lingkaran bermasalah karena kami mengalami masalah rendering di Windows untuk Firefox dan Edge. Selain itu, di tahun 2018, kami dapat mencapai lebih banyak hal dengan JavaScript yang jauh lebih sedikit Show
Saya berhasil mendapatkan hasil berikut menggunakan satu elemen HTML untuk bagan dan JavaScript yang sangat sedikit. Masa depan harus sepenuhnya menghilangkan kebutuhan akan JavaScript apa pun, tetapi lebih dari itu nanti Hasil diagram lingkaran terakhirBeberapa dari Anda mungkin ingat pembicaraan Lea Verou's Missing Slice — solusi saya didasarkan pada tekniknya. Artikel ini membedah cara kerjanya, menunjukkan apa yang dapat kita lakukan dalam hal degradasi yang anggun dan cara lain yang dapat digunakan teknik ini HTMLKami menggunakan Pug untuk menghasilkan HTML dari objek 2 yang berisi nilai persentase tanpa satuan selama tiga tahun terakhir
Kami membuat semua elemen kami berada di 3 elemen. Kemudian, kami mengulang objek _2 kami dan, untuk setiap propertinya, kami membuat radio 5 dengan 6 yang sesuai. Setelah ini, kami menambahkan elemen _7 ke dalam campuran _Kode Pug di atas dikompilasi ke HTML berikut
Perhatikan bahwa kami juga memastikan hanya radio pertama 5 yang dicentangMeneruskan properti khusus ke CSSSaya biasanya tidak suka menempatkan gaya dalam HTML tetapi, dalam kasus khusus ini, ini adalah cara yang sangat berguna untuk meneruskan nilai properti khusus ke CSS dan memastikan bahwa kita hanya perlu memperbarui sesuatu di satu tempat jika kita perlu mengubah salah satu dari . CSSnya tetap sama Caranya adalah dengan menetapkan persentase tanpa unit _9 pada elemen 7 untuk setiap radio 5 yang mungkin diperiksa
Kami menggunakan persentase ini untuk _2 pada elemen 7 setelah memastikan tidak satu pun dari dimensinya (termasuk 4 dan 5) adalah 6
Perhatikan bahwa ini memerlukan dukungan asli _2 karena polyfill tidak berfungsi dengan variabel CSS. Saat ini, ini membatasi dukungan untuk browser Blink dengan bendera fitur Platform Web Eksperimental diaktifkan, meskipun semuanya akan menjadi lebih baikBendera fitur Platform Web Eksperimental diaktifkan di ChromeMemperbarui. Chrome 69+ sekarang mendukung 2 secara native tanpa bendera jugaKami sekarang memiliki kerangka kerja demo kami—memilih tahun yang berbeda melalui tombol radio menghasilkan 2 yang berbedaFungsionalitas dasar yang kami kejar (demo langsung, hanya browser Blink)Menampilkan nilaiLangkah selanjutnya adalah benar-benar menampilkan nilai saat ini dan kami melakukannya melalui elemen semu. Sayangnya, variabel CSS bernilai angka tidak dapat digunakan untuk nilai properti 0, jadi kami menyiasatinya dengan menggunakan peretasan 1
Kami juga telah men-tweak properti _2 dan 3 sehingga elemen pseudo kami sedikit lebih terlihatMenampilkan nilai pada grafik (demo langsung, hanya browser Blink)Menghaluskan semuanyaKami tidak ingin perubahan mendadak antar nilai, jadi kami memuluskan semuanya dengan bantuan CSS 4. Sebelum kita dapat mentransisikan atau menganimasikan variabel 9, kita perlu mendaftarkannya di JavaScript
Perhatikan bahwa menggunakan 6 alih-alih 7 menyebabkan nilai yang ditampilkan menjadi 6 selama 4 karena penghitung kami membutuhkan bilangan bulat. Terima kasih kepada Lea Verou karena telah membantu saya mencari tahuPerhatikan juga bahwa pengaturan 0 secara eksplisit adalah wajib. Ini tidak terjadi sampai saat iniIni semua JavaScript yang kami butuhkan untuk demo ini dan, di masa mendatang, kami bahkan tidak perlu sebanyak ini karena kami akan dapat mendaftarkan properti khusus dari CSS Dengan itu, kita dapat menambahkan 4 pada elemen 7 kita
Dan itu saja untuk fungsinya. Semua dilakukan dengan satu elemen, satu variabel khusus, dan taburan sihir Houdini Bagan pai interaktif (demo langsung, Blink browser dengan bendera saja)Sentuhan yang mempercantikMeskipun demo kami berfungsi, tampilannya sama sekali tidak cantik untuk saat ini. Jadi, mari kita urus itu selagi kita melakukannya Membuat pai… paiSejak kehadiran _3 telah meningkatkan 4 dari 7 induknya, kami benar-benar memposisikannya. Dan karena kita ingin elemen 7 kita terlihat lebih seperti pai yang sebenarnya, kita membulatkannya dengan 7Mengumpulkan pai kami (demo langsung, hanya browser Blink, transisi memerlukan tanda)Kami juga ingin menampilkan nilai persentase di tengah potongan pai gelap Untuk melakukan ini, pertama-tama kita memposisikannya mati di tengah elemen 7. Secara default, pseudo-elemen _3 ditampilkan setelah konten induknya. Karena 7 tidak memiliki konten dalam kasus ini, pojok kiri atas elemen semu 3 berada di pojok kiri atas 2 induk. Di sini, 2 adalah 4 kotak di tengah 5. Ingatlah bahwa kita telah menyetel _5 dari 7 menjadi 8—nilai yang relatif terhadap pembungkus 9 untuk arah horizontal dan vertikalIni berarti sudut kiri atas _3 berada di tengah induknya, jadi 1 di atasnya menggesernya ke kiri setengah miliknya sendiri ________31______9 dan naik setengah miliknya 4, membuat titik tengahnya bertepatan dengan titik tengahnya Ingat bahwa terjemahan bernilai 5 adalah untuk dimensi elemen yang diterapkan di sepanjang sumbu yang sesuai. Dengan kata lain, translasi bernilai 5 sepanjang sumbu x relatif terhadap elemen 9, translasi bernilai 5 sepanjang sumbu y relatif terhadap 4 dan translasi bernilai 5 sepanjang sumbu z relatif terhadap Memposisikan label nilai di tengah pai (demo langsung, hanya browser Blink, transisi membutuhkan bendera)Selanjutnya, kita 3 nilai sedemikian rupa sehingga separuh positif sumbu x-nya membagi irisan gelap menjadi dua bagian yang sama dan kemudian 4 dengan setengah radius pai di sepanjang sumbu x yang sekarang diputar iniLihat Pena oleh thebabydino (@thebabydino) di CodePen Yang perlu kita ketahui adalah berapa banyak untuk memutar elemen semu 3 sehingga sumbu x-nya membagi irisan gelap menjadi dua bagian yang sama. Mari kita uraikan ituAwalnya, sumbu x adalah horizontal, mengarah ke kanan, jadi untuk memilikinya ke arah yang diinginkan, pertama-tama kita perlu memutarnya sehingga mengarah ke atas dan berjalan di sepanjang tepi awal irisan. Maka perlu memutar searah jarum jam setengah irisan Agar sumbu mengarah ke atas, kita perlu memutarnya sebesar 6. Tanda minus disebabkan oleh fakta bahwa nilai positif mengikuti arah searah jarum jam dan kita menuju ke arah sebaliknyaLihat Pena oleh thebabydino (@thebabydino) di CodePen Selanjutnya, kita perlu memutarnya menjadi setengah irisan Lihat Pena oleh thebabydino (@thebabydino) di CodePen Tapi berapa setengah potong? Nah, kita sudah tahu berapa persentase pai yang diwakili oleh irisan ini. itu milik adat kami, _9. Jika kita membagi nilai itu dengan _8 lalu mengalikannya dengan 9 (atau 0, tidak masalah unit apa yang digunakan), kita mendapatkan sudut pusat irisan gelap kitaSetelah rotasi 6, kita perlu memutar 3 setengah sudut pusat ini searah jarum jam (positif)Ini berarti kami menerapkan rantai _3 berikut
Terjemahan terakhir adalah seperempat dari 4, yang merupakan pembungkus 9 dan memberi kita diameter 7 juga. (Karena 2 dari 7 adalah 4 kotak, tidak ada 4 dan kedua kiri dan kanannya 5 adalah 8 dari induk pembungkusnya 9. ) Jari-jari _7 adalah setengah dari diameternya, artinya setengah jari-jari adalah seperempat dari diameter ( 4)Sekarang label nilai diposisikan di tempat yang kita inginkan Memposisikan label nilai di tengah irisan (demo langsung, browser Blink saja, transisi memerlukan bendera)Namun, masih ada satu masalah. kami tidak ingin itu diputar, karena itu bisa terlihat sangat canggung dan menekuk leher pada sudut tertentu. Untuk memperbaikinya, kami mengembalikan rotasi di bagian akhir. Untuk mempermudah diri kita sendiri, kita menyimpan sudut rotasi dalam variabel CSS yang kita sebut 06
Jauh lebih baik Memposisikan label nilai di tengah irisan, sekarang horizontal (demo langsung, browser Blink saja, transisi memerlukan tanda)Tata letakKami ingin memiliki seluruh perakitan di tengah layar, jadi kami menyelesaikan ini dengan trik jaringan kecil yang rapi _0Baiklah, ini menempatkan seluruh elemen 3 di tengahMemposisikan seluruh rakitan di tengah (demo langsung, hanya browser Blink, transisi memerlukan bendera)Langkah selanjutnya adalah menempatkan diagram lingkaran di atas tombol radio. Kami melakukan ini dengan tata letak flexbox pada elemen 3 1Menempatkan diagram lingkaran di atas tombol radio (demo langsung, hanya browser Blink, transisi memerlukan tanda). Styling tombol radio…atau lebih tepatnya, kami menata label tombol radio karena hal pertama yang kami lakukan adalah menyembunyikan input radio 2Setelah menyembunyikan tombol radio (demo langsung, browser Blink saja, transisi memerlukan tanda). Karena hal ini membuat kita memiliki beberapa label yang sangat jelek yang sangat sulit dibedakan satu sama lain, mari kita beri masing-masing beberapa 09 dan 5 sehingga mereka tidak terlihat begitu berdesakan, ditambah latar belakang sehingga area yang dapat diklik disorot dengan jelas. Kami bahkan dapat menambahkan bayangan kotak dan teks untuk beberapa efek 3D. Dan, tentu saja, kita dapat membuat kasus terpisah ketika input yang sesuai adalah 11 _3Kami juga telah meledakkan _3 sedikit dan menetapkan 13 untuk menghaluskan sudutSetelah menata label tombol radio (demo langsung, browser Blink saja, transisi memerlukan bendera)Sentuhan terakhir yang mempercantikMari kita atur _14 pada 15, atur 16 dari semuanya dan tambahkan 4 untuk label radioHasil diagram lingkaran terakhir (demo langsung, browser Blink saja, transisi memerlukan tanda)Degradasi anggunMeskipun demo kami sekarang terlihat bagus di browser Blink, demo ini terlihat buruk di semua browser lain… dan itu adalah sebagian besar browser Pertama, mari tempatkan pekerjaan kita di dalam blok 18 yang memeriksa dukungan asli 2 sehingga browser yang mendukungnya akan merender diagram lingkaran. Ini termasuk 2 kami, 5 yang memberikan dimensi horizontal dan vertikal pai yang sama, 13 yang membuat lingkaran pai, dan rantai 3 yang menempatkan label nilai di tengah potongan pai _4Sekarang, mari buat bagan batang sebagai fallback untuk semua browser lain menggunakan 24. Kami ingin batang kami membentang melintasi elemen 3 sehingga horizontal 5 masih 8, tetapi secara vertikal sebagai batang sempit. Kami masih ingin bagan cukup tinggi agar sesuai dengan label nilai. Ini berarti kita menggunakan vertikal yang lebih kecil 5. Kami juga mengurangi 13, karena 8 akan memberi kita elips dan yang kita butuhkan adalah persegi panjang dengan sudut agak membulatFallback juga menggantikan _2 dengan kiri ke kanan 24. Karena _24 membuat fallback bar chart dan 2 membuat pie chart menggunakan stop list yang sama, kita dapat menyimpannya dalam variabel CSS ( 35) sehingga kita bahkan tidak mengulanginya di CSS terkompilasiTerakhir, kami ingin label nilai di tengah bilah untuk fallback karena kami tidak memiliki irisan pai lagi. Ini berarti kami menyimpan semua pemosisian pasca-pemusatan ke dalam variabel CSS ( 36) yang nilainya tidak ada dalam kasus dukungan no 2 dan rantai 3 sebelumnya jika tidak _5Kami juga beralih menggunakan tata letak flexbox pada 15 (karena, sepintar mungkin, 40 kacau di Edge) _6Ini semua memberi kita fallback bagan batang untuk browser yang tidak mendukung 2Fallback untuk hasil diagram lingkaran akhir (demo langsung)Menanggapi itu semuaSatu masalah yang masih kita miliki adalah, jika area pandang lebih sempit dari diameter pai, semuanya tidak akan terlihat bagus lagi. Variabel CSS dan kueri media untuk menyelamatkan Kami mengatur diameter ke variabel CSS ( 42) yang digunakan untuk mengatur dimensi pai dan posisi label nilai di tengah irisan kami _7Di bawah lebar area pandang tertentu, kita juga mengurangi 3, 09 untuk elemen 45 kita, dan kita tidak lagi memposisikan label nilai di tengah potongan pai gelap, melainkan di tengah pai itu sendiri _8Ini memberi kita hasil akhir kita. diagram lingkaran responsif di browser yang mendukung 2 secara asli. Dan, meskipun sayangnya itu hanya browser Blink untuk saat ini, kami memiliki fallback yang solid yang membuat bagan batang responsif untuk semua browser lainnya. Kami juga menganimasikan antara nilai—ini bahkan lebih terbatas pada saat ini, hanya Blink browser dengan bendera fitur Platform Web Eksperimental diaktifkanLihat Pena oleh thebabydino (@thebabydino) di CodePen Bonus. kemajuan radialKita juga bisa menerapkan konsep ini untuk membangun indikator progres radial seperti di bawah ini (terinspirasi oleh Pena ini) Kemajuan radial dan fallback-nyaTekniknya hampir sama, kecuali kita membiarkan label nilai mati di tengah dan menyetel 2 pada elemen semu 48. Ini karena kita menggunakan _49 untuk menghilangkan semuanya, kecuali cincin luar yang tipis dan, jika kita menyetel 2 dan 49 pada elemen itu sendiri, maka 49 juga akan menyembunyikan label nilai di dalamnya dan kita menginginkannya Saat mengklik _53, nilai baru untuk persentase tanpa unit kami ( 9) dihasilkan secara acak dan kami beralih dengan lancar antar nilai. Menetapkan 55 tetap akan membuat 4 yang sangat lambat antara dua nilai dekat (e. g. _57 hingga 58) dan sangat cepat 4 saat berpindah antar nilai dengan jarak yang lebih besar di antaranya (e. g. 60 hingga 61). Kita menyiasatinya dengan membuat _55 bergantung pada nilai absolut selisih antara nilai sebelumnya dari 9 dan nilai yang baru dihasilkan _9 0Ini memberi kami indikator kemajuan radial animasi yang bagus untuk browser yang mendukung semua fitur baru dan berkilau. Kami memiliki fallback linier untuk browser yang tidak mendukung 2 secara asli dan tidak ada 4 jika tidak ada dukungan Houdini
Bagaimana cara membuat diagram lingkaran dinamis dalam HTML?Anda dapat membuat Bagan Pai dalam HTML menggunakan fungsi CSS sederhana bernama conic-gradient . Pertama, kita menambahkan elemen
Bagaimana Anda membuat diagram lingkaran dinamis?Membuat diagram lingkaran dinamis menggunakan rumus offset . Langkah 1. Buat tabel dan masukkan nilai di dalamnya. . Langkah 2. Nilai total 550 muncul di sel Langkah 3. Sekarang, seret rumus yang telah diisi untuk mendapatkan semua baris dari total kolom Langkah 4. Pilih nilai yang perlu digunakan untuk membuat diagram lingkaran dinamis Bagaimana cara membuat diagram lingkaran di CSS?Pengaturan CSS untuk Bagan Pai
. 1 untuk memastikan elemen tetap persegi use aspect-ratio: 1 to make sure the element remains square . Kita juga bisa menggunakan tinggi. var(--w) tetapi selalu baik untuk mempelajari dan menggunakan properti CSS baru. Anda mungkin bertanya-tanya mengapa saya menggunakan variabel untuk menentukan lebar, bukan hanya mengatur lebar. 150px.
Mengapa diagram lingkaran 3D tidak direkomendasikan?Terakhir, mendistorsi data pada diagram lingkaran jauh lebih mudah daripada jenis lainnya . Karena kita sudah sangat buruk dalam membedakan antara irisan pai yang berbeda, jika Anda memiringkan bagan pai atau menjadikannya "3D", seperti yang sangat populer di banyak program, Anda dengan cepat mempersulit untuk membaca dan mendistorsi data Anda . |