Kako podesiti pametne telefone i računare. Informativni portal

Pie chart html. Pie i donut svg grafikoni u HTML5 od nule

  • Prevod
  • Tutorial

Obrasci su odličan način da dodate malo ukusa elementima na vašoj web stranici. Krugovi su posebno dobri u tom pogledu jer su holistički, jednostavni i slični kolačima. Ozbiljno, ko ne voli pitu?

Kao što ste sigurno primijetili iz vlastitog višegodišnjeg iskustva korištenja interneta, većina elemenata na web stranicama su, u stvari, kvadrati ili pravokutnici. Stoga u nekim slučajevima zanimljivi elementi poput krugova i trokuta u vašem dizajnu mogu biti vrlo korisni. Ovaj vodič će pokazati kako napraviti animirani tortni grafikon, slični onima koje obično vidite na portfolio sajtovima. Ovo vam može pomoći da vizualno istaknete svoje vještine, kao i da pokažete koje zadatke možete nositi. Pogledajte demo da vidite konačni rezultat.

Dakle, počnimo!

Kada pišem ovaj tutorijal, radit ću sa Circlifulom. To je besplatni jQuery dodatak otvorenog koda. Glavni fajl možete preuzeti sa Github-a. Sadrži .js datoteku zajedno sa odgovarajućom CSS stilskom tablicom. Stranica mora sadržavati oba da bi se postigao efekat kruga.




 
 
 Statistika animiranih krugova - Demo predložaka Monster
 
 
 
 
 
 
 

Moja stranica sadrži sličan styles.css stylesheet za moje lične CSS stilove. Također morate napraviti kopiju jQuery biblioteke. Potreban je za ispravan rad dodatka.
Sama po sebi, stranicu je prilično lako strukturirati. Elementi kruga sadržani su u div oznakama koje koriste HTML5 atribute za manipulaciju podacima. Alternativno, mogu se pohraniti u jQuery funkcije ali ako želite bolju kontrolu nad svakim elementom onda je lakše raditi u HTML-u.

Photoshop

Ilustrator

After Effects

Ovo je kopija prvog reda krugova, koji se sastoji od 3 animirane jedinice. Svi ovi atributi podataka su dalje objašnjeni u dokumentaciji dodatka. Svaki predstavlja opciju koja definira efekat animacije. Dajem u nastavku Kratki opis opcije koje koristim:

  • data-dimenzija - ukupna veličina širine/visine kruga;
  • data-text - tekst koji se pojavljuje u centru svakog kruga;
  • data-width - debljina rotacionog luka podataka;
  • data-fontsize - središnja veličina fonta teksta;
  • data-percent - broj od 0-100 koji predstavlja procente u vašem krugu;
  • data-fgcolor - boja prednjeg plana kruga;
  • data-bgcolor - boja pozadine kruga;
  • data-fill - unutrašnja ispuna boje pozadine unutrašnjeg kruga.

CSS izgled stranice

Ne insistiram da direktno uređujete jquery.circliful.css osim ako ne želite prilagoditi dodatak, naravno. Većina boja se može promijeniti direktno iz HTML5 atributa podataka, a ako zaista želite prepisati bilo koji od stilova Circliful, preporučio bih da to učinite u vlastitom stilu.
Nakon što sam vam ovo rekao, kreirao sam vlastitu tablicu stilova za dati projekat, a ne da prepisujem stilove Circliful... Sama web stranica treba zadani izgled koji je zaista jednostavan za dizajn. Područje sadržaja je centrirano u malom dijelu za kružni grafikon. Svaka oblast se slobodno kreće unutar linijskog kontejnera unutar originala #stats div.

/ ** struktura stranice ** / .wrap (prikaz: blok; margina: 0 auto; max-width: 800px;) #intro (prikaz: blok; margin-bottom: 25px; text-align: centar;) #intro p (veličina fonta: 1.8em; visina linije: 1.35em; boja: # 616161; stil fonta: kurziv; margin-bottom: 25px;) #stats (prikaz: blok; širina: 100%; padding: 15px 0; background: # f8f8f8; border-top: 4px solid # c3c3c3; border-bottom: 4px solid # c3c3c3;) #stats .row (display: block;) .circle-container (display: block; float: lijevo; margin-right : 55px; margin-bottom: 45px;) .circle-container h3 (display: block; text-align: center; font-size: 2.25em; line-height: 1.4em; color: # 363636; text-shadow: 1px 1px 0 #fff;)

Unutar svake sekcije sadržaj se čuva .wrap div za fiksiranje u centru. Također, elementi kruga koji se slobodno kreću trebaju dodatnu posudu. .clearfix da sve bude ispravno poravnato.

/ ** clearfix ** / .clearfix: nakon (sadržaj: "."; prikaz: blok; jasno: oba; vidljivost: skrivena; visina linije: 0; visina: 0;) .clearfix (prikaz: inline-block; ) html .clearfix (prikaz: blok;) * html .clearfix (visina: 1%;)

Ova klasa clearfix je godinama poznat kao slobodno pokretno rješenje za kontejnere. Obično se uklanjaju iz teksta dokumenta i ne zadržavaju svoju originalnu širinu/visinu. Ali ovo održava širinu kontejnera konstantnom #stats i ostavlja prostor za više sadržaj koji će se nalaziti ispod na stranici.

Final touchs

Dakle, zamesili smo testo, napunili kalup za pitu, stavili u rernu i skoro smo spremni za degustaciju. Ako sve izgleda dovoljno dobro, koji je posljednji korak? Potreban nam je neki jQuery kod da ukrasimo ovaj projekat.
Otvorite novu oznaku skripte na dnu ove HTML stranice... Sadržat će mali isječak JavaScripta. Pošto sam koristio sve HTML5 atribute podataka, ne moramo pozivati ​​nikakve jQuery opcije. Skripta samo mora pokrenuti funkciju Circliful na svakom krugu div. Korištenje dupliciranog naziva klase kao što je .circlestatčini proces veoma lakim.

$ (funkcija () ($ (". circlestat"). circliful (;));

Za one koji nisu upoznati sa strukturom sintakse jQueryja, daću kratak opis. Nakon što se dokument učita, pokrećemo nova funkcija... Naš unutrašnji cilj je svaki element koji koristi klasu .circlestat i pokreće funkciju kružno ()... Ovo vodi dodatak Circliful, koji stvara efekte animacije, u akciju i primjenjuje dodatni sadržaj / boje.

Ne mogu reći da će ovi krugovi uvijek biti najbolje rješenje... Vidio sam puno portfelja koji su bili zasnovani na riječima i brojevima, ali ne i rad sam po sebi. Razmislite o korištenju ovih krugova u rijetkim prilikama i pokušajte ih posuditi u druge svrhe osim jednostavnih vještina. Vaša statistika se ne mora mjeriti u procentima – ona može pokazati koliko godina ste u poslu, ukupan broj projekata koje imate ili druge slične brojke. Možete besplatno preuzeti kopiju mog vodiča i eksperimentirati s kodom kako biste ga poboljšali za svoje projekte.

Mada pie charts su najčešći način predstavljanja informacija, u rasponu od jednostavne statistike do indikatora napretka i tajmera, čak iu svom najjednostavnijem dvobojnom obliku, tradicionalno su kreirani na bilo koji drugi način osim jednostavnih metoda korištenjem web tehnologija. Obično, za njihovu implementaciju, bilo eksterno grafički editor za stvaranje više slika za više vrijednosti kružnog grafikona ili JavaScript okviri za kreiranje složenijih dijagrama.

Iako se sada zadatak ne čini nemogućim kao prije, još uvijek nema jednostavnog jednoznačnog rješenja. Međutim, danas ima mnogo boljih (u poređenju sa gornjim metodama), više podržanih načina za implementaciju tortnih grafikona.

Rješenje zasnovano na transformaciji

Ovo rješenje je najbolje u smislu označavanja: potreban mu je samo jedan element, a sve ostalo će se raditi pomoću pseudoelemenata, transformacija i CSS gradijenti... Počnimo s jednostavnim elementom:

Sada, pretpostavimo da želimo tortni grafikon koji prikazuje tvrdo kodiran 20% ... Kasnije ćemo raditi na tome da bude fleksibilan. Prvo ćemo stilizirati element kao krug, koji će biti naša pozadina (slika 1):

Slika 1 - Naša početna tačka (tortni grafikon prikazuje 0%) .pie (širina: 100px; visina: 100px; radijus granice: 50%; pozadina: žutozelena;)

Naš tortni grafikon će biti zelen (tačnije žutozeleni) sa smeđim sektorom (# 655) koji prikazuje procenat. Možda ćemo biti u iskušenju da koristimo kose transformacije za postotak, ali kako malo eksperimentisanje pokazuje, ovo bi bilo prilično traljavo rješenje. Umjesto toga, obojit ćemo lijevu i desnu stranu našeg kruga dvije boje i koristiti rotacijom pseudoelementa da se otkrije samo dio kruga koji nam je potreban.

Da obojimo desnu stranu našeg kruga u smeđu, koristićemo jednostavan linearni gradijent:

Pozadinska slika: linearni gradijent (nadesno, transparentno 50%, # 655 0); Slika 2 - Bojenje desne strane našeg kruga smeđom bojom jednostavnim linearnim gradijentom

Kao što možete vidjeti na slici 2, to je sve što nam je potrebno. Sada možemo početi stilizirati pseudo-element koji će djelovati kao maska:

Pita :: ispred (sadržaj: ""; prikaz: blok; margina-lijevo: 50%; visina: 100%;) Slika 3 - Pseudo-element koji djeluje kao maska ​​ovdje je istaknut isprekidanim rubom

Na slici 3 možete vidjeti kako u ovog trenutka naš pseudoelement se nalazi u odnosu na element tortnog grafikona. Sada još nije stiliziran i ne obavlja nikakve funkcije. To je samo nevidljivi pravougaonik. Prije nego što krenemo sa stiliziranjem, napravimo nekoliko komentara:

  • kako želimo sakrijte smeđi dio našeg kruga, onda moramo primijeniti na pseudo-element zelena pozadina koristeći boju pozadine: naslijedite kako biste izbjegli dupliciranje kada mu se dodijeli ista boja pozadine kao roditeljski element;
  • želimo ga okreće se oko centra kruga koji je u sredini lijeve strane pseudo-elementa, tako da moramo postaviti transform-origin na 0 50% ili samo lijevo;
  • ne želimo da bude pravougaonik jer će preplaviti ivice kolača, tako da moramo ili primijeniti overflow: hidden na .pie ili mu dati radijus granice da postane polukrug.

Stavljajući sve zajedno, dobijamo sledeći stil za naš pseudo-element;

Pita :: ispred (sadržaj: ""; prikaz: blok; margina lijevo: 50%; visina: 100%; radijus ivice: 0 100% 100% 0/50%; boja pozadine: naslijediti; transformacija porijekla: lijevo;) Slika 4 - Naš pseudo-element (prikazano isprekidanom granicom) nakon završetka stiliziranja

Napomena: Nemojte koristiti background: inherit; umjesto backround-color: inherit;, jer će to naslijediti gradijent!

Naš tortni grafikon sada izgleda kao na slici 4. Ovdje zabava počinje! Možemo početi rotirati pseudo element primjenom rotate () transformacije. Za 20% pokušavamo da implementiramo, možemo koristiti 72 stepena (0,2 × 360 = 72), ili 2 okreta što je čitljivije. Na slici 5 možete vidjeti kako to izgleda i za nekoliko drugih vrijednosti.

Slika 5 - Naš jednostavan tortni grafikon koji prikazuje različite procente, s lijeva na desno: 10% (36 stupnjeva ili 1 okret), 20% (72 stupnjeva ili 2 okreta), 40% (144 stupnjeva ili 4 okreta)

Možda mislite da je posao obavljen, ali, nažalost, nije sve tako jednostavno. Naš tortni grafikon je odličan za prikaz postotaka od 0 do 50%, ali ako pokušamo prikazati rotaciju od 60 posto (koristeći 6 okreta), dobićemo ono što je prikazano na slici 6. Ali ne gubite nadu, možemo ovo popraviti .i uradimo to!

Slika 6 – Naš tortni grafikon je raščlanjen za dionice više od 50%(ovdje prikazano za 60%)

Ako posmatramo prikaz 50% -100% dionica kao poseban problem, onda možete vidjeti da za njih možemo koristiti obrnuta verzija prethodnog rješenja: smeđi pseudo-element koji se okreće od 0 do 5 okretaja. Dakle, za 60% udjela, kod pseudoelementa će izgledati ovako:

Pita :: ispred (sadržaj: ""; prikaz: blok; margina lijevo: 50%; visina: 100%; radijus granice: 0 100% 100% 0/50%; pozadina: # 655; izvor transformacije: lijevo ; transformiraj: rotiraj (.1 okret);) Slika 7 - Naš sada ispravan tortni grafikon sa vrijednošću od 60%

Na slici 7 možete vidjeti kod u akciji. Pošto smo sada razvili način da prikažemo bilo koji procenat, možemo i animirajte kružni grafikon od 0% do 100% pomoću koristeći CSS animacije stvaranjem neke vrste indikatora napretka:

@keyframes spin (do (transformacija: rotirati (.5turn);)) @keyframes bg (50% (pozadina: # 655;)) .pie :: ispred (sadržaj: ""; prikaz: blok; margin-left: 50 %; visina: 100%; ivica-radijus: 0 100% 100% 0/50%; boja pozadine: naslijediti; transformacija porijekla: lijevo; animacija: spin 3s linearno beskonačno, bg 6s step-end beskonačno;)

U redu je, ali kako da stiliziramo više statičkih tortnih grafikona s različitim procentima, što je najviše opšti slučaj koristeći grafikone? U idealnom slučaju, želimo da budemo u mogućnosti da štampamo nešto ovako:

20%
60%

I dobijte dva tortna grafikona, jedan pokazuje 20%, a drugi 60%. Prvo ćemo pogledati kako to možemo učiniti koristeći ugrađene stilove, a zatim uvijek možemo napisati kratku skriptu za raščlanjivanje tekstualni sadržaj i dodajte specificirane inline stilove za eleganciju koda, inkapsulaciju, mogućnost održavanja i možda najvažnije, pristupačnost.

Teški dio u kontroli procenta tortnog grafikona sa umetnutim stilovima je da je CSS koji je odgovoran za postavljanje procenta postavljen na pseudo element. kao što već znate, ne možemo postaviti inline stilove na pseudoelemente, Zbog toga moraćemo da budemo inventivniji.

Bilješka: Za upotrebu vrijednosti iz spektra boja bez ponavljanja i složene proračune možete koristiti metodu ispod. Ovu metodu možete koristiti i u drugim slučajevima. Ispod je jednostavan, izoliran primjer korištenja ove tehnike.

Rješenje dolazi sa jednog od najneočekivanijih mjesta. Koristit ćemo animaciju koja je već prikazana, ali će biti pauzirana. Umjesto da ga pokrećemo kao normalnu animaciju, koristit ćemo negativna kašnjenja animacije postavite poziciju u bilo kojoj tački animacije i ostani tamo. Jeste li iznenađeni? Da, negativne vrijednosti kašnjenja animacije nisu samo dozvoljene u specifikaciji, već su vrlo korisne u takvim slučajevima.

Budući da je naša animacija pauzirana, prikazat će se samo njen prvi kadar (određuje naš negativnu vrijednost animacija-kašnjenje). Procenat prikazan na tortnom grafikonu će biti jednak procentu našeg kašnjenja animacije u ukupnom trajanju. Na primjer, sa trenutnim trajanjem od 6s, potrebno nam je kašnjenje animacije od -1,2s da prikažemo 20% frakcije. Da bismo pojednostavili kalkulacije, postavićemo trajanje na 100s. Imajte na umu da, budući da je animacija trajno zaustavljena, vrijednost koju smo postavili za njeno trajanje ne igra nikakvu drugu ulogu.

I poslednje pitanje: animacija se primjenjuje na pseudo-element, ali želimo postaviti inline stil na .pie element... Međutim, iako na

nema animacije, možemo podesiti kašnjenje animacije kao inline stil, a zatim koristiti animation-delay: naslijediti; za pseudo element. Stavljajući sve zajedno, naša oznaka za kružne grafikone od 20% i 60% izgleda ovako:

A CSS kod za ovu animaciju postaje sljedeći (pravila za .pie nisu prikazana, jer ostaju ista):

@keyframes spin (do (transformacija: rotirati (.5turn);)) @keyframes bg (50% (pozadina: # 655;)) .pie :: prije (/ * [drugi stilovi nisu promijenjeni] * / animacija: spin 50s linearno beskonačno, bg 100s step-end beskonačno; animacija-play-state: pauzirana; animacija-kašnjenje: naslijediti;)

Za sada, možemo pretvoriti oznake da koristimo postotke kao sadržaj, kao što smo prvobitno namjeravali, i dodati inline stilove kašnjenja animacije kroz jednostavnu skriptu:

$$ (". pita"). forEach (funkcija (pita) (var p = parseFloat (pie.textContent); pie.style.animationDelay = "-" + p + "s";));

Napominjemo da smo tekst ostavili netaknutim jer nam je potreban radi pristupačnosti i upotrebljivosti. Naši tortni grafikoni sada izgledaju kao na slici 8. Moramo sakriti tekst koji može biti dostupan putem boje: transparentan tako da ostane izbor i štampanje... Za dodatni sjaj možemo postavite procentualne vrijednosti u centar tortnog grafikona tako da nisu unutra nasumično mjesto kada ih korisnik pokuša istaknuti. Za ovo nam je potrebno:

Slika 8 – Naš tekst prije nego što ga sakrijemo

  • pretvoriti vrijednost visine grafikona u liniju-visinu (ili dodati vrijednost visine linije jednaku visini, ali ovo bi bilo besmisleno dupliciranje koda, jer će visina linije biti postavljena na izračunatu vrijednost visine, što je dobro) ;
  • postavite veličinu i poziciju pseudo elementa sa apsolutno pozicioniranje tako da ne gura tekst nadole;
  • dodati text-align: centar; da centrirate tekst horizontalno.

Konačni kod izgleda ovako:

Pita (položaj: relativna; širina: 100px; visina linije: 100px; radijus ivice: 50%; pozadina: žutozelena; pozadinska slika: linearni gradijent (desno, transparentno 50%, # 655 0); boja: prozirna ; text-align: center;) @keyframes spin (do (transformacija: rotirati (.5turn);)) @keyframes bg (50% (pozadina: # 655;)) .pie :: ispred (sadržaj: ""; pozicija : apsolutno; vrh: 0; lijevo: 50%; širina: 50%; visina: 100%; radijus ivice: 0 100% 100% 0/50%; boja pozadine: naslijediti; izvor transformacije: lijevo; animacija: spin 50s linearno beskonačno, bg 100s step-end beskonačno; animacija-play-state: pauzirana; animacija-kašnjenje: naslijediti;)

SVG rješenje

SVG donosi odluku mnogih grafički zadaci jednostavniji i tortni grafikoni nisu izuzetak. Međutim, umjesto kreiranja tortnog grafikona pomoću putanja, što bi zahtijevalo kompliciranu matematiku, upotrijebit ćemo mali trik.

Počnimo s krugom:

Sada primijenimo neke osnovne stilove na to:

Krug (ispuna: žutozelena; potez: # 655; širina poteza: 30;)

Bilješka: Kao što znate, ove CSS svojstva su također dostupna kao atributi SVG elementi koji bi mogli biti od koristi ako je portiranje problem.

Slika 9 - Naša početna tačka: zeleni SVG krug sa debelim potezom # 655

Možete vidjeti naš ocrtani krug na slici 9. Potezi u SVG-u se sastoje od više od samo svojstava poteza i širine poteza. Postoje mnoga druga manje popularna svojstva vezana za udar koji vam omogućavaju da fino prilagodite njihov izgled. Jedan od njih je stroke-dasharray, koji služi za kreiranje isprekidanih poteza. Na primjer, mogli bismo ga koristiti za ovo:

Stroke-dasharray: 20 10; Slika 10 – Jednostavan isprekidani potez kreiran pomoću stroke-dasharray

To znači da želimo crticu dužine 20 sa prazninama dužine 10, poput onih prikazanih na slici 10. U ovom trenutku, mogli biste se iznenaditi da ovaj SVG primjer ima neke veze sa tortnim grafikonima. Ali stvari postaju jasnije kada primijenimo potez s crticom 0 i prazninama dužim od ili jednake dužine obim našeg kruga (C = 2πr, ili u našem slučaju C = 2π × 30 ≈ 189):

Stroke-dasharray: 0 189; Slika 11 - Nekoliko stroke-dasharray vrijednosti i njihov rezultat; s lijeva na desno: 0 189; 40 189; 95 189; 150 189

Kao što vidite, u prvom krugu na slici 11, ovim se potez u potpunosti uklanja, a ostaje nam samo zeleni krug. Međutim, zabava počinje kada počnemo povećavati prvu vrijednost (slika 11): zbog tako velikog razmaka više nećemo dobiti tačkasti potez, ali potez koji pokriva onoliko obima kruga koliko smo odredili.

Možda ste već shvatili u kom smjeru idemo: ako smanjimo polumjer našeg kruga dovoljno da potpuno zakloni svoj potez, na kraju ćemo dobiti nešto što vrlo liči na tortni grafikon. Na primjer, na slici 12, možete vidjeti kako bi ovo izgledalo kada se primijeni na krug polumjera 25 i širine poteza od 50:

Slika 12 – Naša SVG slika počinje da liči na tortni grafikon

Zapamtite: SVG potezi su uvijek pola unutar, a pola izvan elementa na koji se primjenjuju. U budućnosti ćemo moći kontrolisati ovo ponašanje.

krug (ispuna: žutozelena; potez: # 655; širina poteza: 50; stroke-dasharray: 60 158; / * 2π × 25 ≈ 158 * /)

Sada je pretvaranje ove slike u tortni grafikon poput onog koji smo kreirali u prethodnom rješenju prilično jednostavno: samo trebate dodati veći zeleni krug za potez i okrenite ga za 90 ° u smjeru suprotnom od kazaljke na satu tako da počinje na vrhu u sredini. Ukoliko element je takođe HTML element, možemo jednostavno stilizirati:

Svg (transformacija: rotiranje (-90 stepeni); pozadina: žutozelena; ivica-radijus: 50%;) Slika 13 - Finalni tortni grafikon sa SVG-om

Konačan rezultat možete vidjeti na Slici 13. Ova metoda dodatno olakšava animaciju tortnog grafikona od 0% do 100%. Samo trebamo kreirati CSS animaciju koja mijenja stroke-dasharray sa 0 158 na 158 158:

@keyframes popunjavanje (do (stroke-dasharray: 158 158;)) krug (ispuna: žutozelena; potez: # 655; stroke-width: 50; stroke-dasharray: 0 158; animacija: fillup 5s linearno beskonačno;)

Kao dodatno preciziranje, možemo postaviti određeni polumjer kružnice tako da je njegov obim (beskonačno blizu) 100, tako da možemo specificirajte stroke-dasharray dužine u procentima, bez ikakvih kalkulacija. Pošto je obim 2πr, potreban nam je radijus od 100 ÷ 2π ≈ 15,915494309, koji se za naše potrebe može zaokružiti na 16. Također postavljamo dimenzije SVG-a u atributu viewBox, umjesto atributi širine i visinu kako bi se promijenila veličina na veličinu svog spremnika.

Sa ovim modifikacijama, oznaka za tortni grafikon prikazan na slici 13 postaje:

A CSS će biti ovakav:

Svg (širina: 100px; visina: 100px; transformacija: rotiranje (-90deg); pozadina: žutozelena; radijus granice: 50%;) krug (ispuna: žutozelena; potez: # 655; širina poteza: 32; stroke-dasharray : 38 100; / * za 38% * /)

Bilješka, kako je sada lako promijeniti postotak... Međutim, čak i sa ovim prevelikim pojednostavljenjem, ne želimo da ponavljamo sve ove SVG oznake za svaki tortni grafikon. Vrijeme je da nam JavaScript pomogne u maloj automatizaciji. Napisat ćemo malu skriptu za uzimanje jednostavne HTML oznake poput ove...

20%
60%

I dodajte inline SVG unutar svakog .pie elementa sa svime bitnih elemenata i atribute. Takođe će dodati element za pristupačnost kako bi korisnici <a href="https://bumotors.ru/bs/skachat-golosovoi-dvizhok-dlya-android-ekrannyi-diktor-dlya.html">čitači ekrana</a> takođe mogu saznati koji procenti su prikazani. Konačna skripta će izgledati ovako:</p><p>$$ (". pita"). forEach (funkcija (pita) (var p = parseFloat (pie.textContent); var NS = "http://www.w3.org/2000/svg"; var svg = dokument. createElementNS (NS, "svg"); var circle = document.createElementNS (NS, "krug"); var title = document.createElementNS (NS, "title"); circle.setAttribute ("r", 16); krug. setAttribute ("cx", 16); circle.setAttribute ("cy", 16); circle.setAttribute ("stroke-dasharray", p + "100"); svg.setAttribute ("viewBox", "0 0 32 32" "); title.textContent = pie.textContent; pie.textContent =" "; svg.appendChild (naslov); svg.appendChild (krug); pie.appendChild (svg);));</p><p>Evo ga! Možda to mislite <a href="https://bumotors.ru/bs/podklyuchenie-stilei-css-kak-podklyuchit-css-metody-i-sposoby-podklyuchenii.html">CSS metoda</a> bolje jer je njegov kod jednostavniji i poznatiji. Međutim, SVG metoda ima određene prednosti u odnosu na čisto CSS rješenje:</p><ul><li><b>lakše je dodati treću boju</b>: samo dodajte još jedan ocrtani krug i pomaknite njegov potez pomoću poteza-dashoffset-a. Ili dodajte njegovu dužinu poteza dužini poteza prethodnog kruga ispred (ispod) njega. Kako biste tačno dodali treću boju tortnom grafikonu napravljenom na prvi način?</li><li>mi <b>ne treba ulagati dodatne napore u štampanje</b> pošto se SVG elementi tretiraju kao sadržaj i štampaju na isti način kao i elementi <img>... Prvo rješenje ovisi o pozadini i stoga se neće ispisati;</li><li>možemo <b>promijenite boje koristeći ugrađene stilove</b>što znači da ih možemo lako promijeniti putem <b>skripte</b>(tj. zavisno od <b>korisnički unos</b>). Prvo rješenje se oslanja na pseudoelemente, koji ne mogu prihvatiti inline stilove osim putem nasljeđivanja, što nije uvijek zgodno.</li> pozadina: konusni gradijent (# 655 attr (podatak-vrijednost%), žutozelena 0); <p>Takođe čini nevjerovatnim <a href="https://bumotors.ru/bs/how-to-add-a-photo-in-contact-a-few-simple-waysssss.html">jednostavno dodavanje</a> treća boja. Na primjer, za tortni grafikon, <a href="https://bumotors.ru/bs/modelirovanie-informacionnyh-sistem-podobnymi-diagrammami-mozhno.html">sličan dijagram</a> iznad, samo bismo dodali još dva zaustavljanja boje:</p><p>Pozadina: konusni gradijent (deeppink 20%, #fb3 0, #fb3 30%, žutozelena 0);</p><p>To je sve! Ostavite svoje komentare!</p></ul> <p>Vjerovatno ste naišli na ove indikatore učitavanja, posebno na Flash stranicama. Ovo je sektor kruga koji postaje sve veći i veći dok se ne pretvori u potpuni krug.</p> <p>Na prvi pogled zadatak izgleda jednostavan: napravite krug, zarotirajte ga i sakrijte dio iza maske. Ali u stvarnosti, sve se ispostavi da je nešto komplikovanije. CSS nije spreman za takve zadatke, čak ni kada se koriste pretprocesori kao što su SASS i Compass. Uvijek se mučimo kada moramo napraviti različite oblike, a posebno kada definiramo stilove i animacije za njih. Većina radnog vremena se troši na to. da nešto radi i žrtvuje semantiku koda i njegovu podršku.</p> <h2>Zašto to radimo?</h2> <p>Najvjerovatnija upotreba takvih stavki su tajmeri. Ali <a href="https://bumotors.ru/bs/koncepciya-hranilishcha-dannyh-fizicheskie-i-virtualnye.html">ovaj koncept</a> može se koristiti za pravljenje tortnog grafikona u jednom CSS-u.</p> <p>Iako postoje neki neverovatni alati za manipulisanje tortnim grafikonima (uglavnom u JavaScript-u), mi ćemo ipak napraviti takav element samo u CSS-u, pa čak i animirati ga uz nekoliko trikova.</p> <p>Semantika koda će biti tako-tako! Ali pratnja može biti prilično zgodna.</p> <h2>Html</h2> <p>Potrebna su nam 3 različita elementa:</p> <ul><li><b>spinner:</b> polovina kruga koji će se rotirati;</li> <li><b>maska:</b> ovaj element skriva krug koji se okreće tokom prvih 50% animacije;</li> <li><b>punilo:</b> ovaj element ispunjava krug tokom zadnjih 50% animacije.</li> </ul><p>I sva tri elementa moraju imati istog roditelja za apsolutno pozicioniranje:</p> <p> <div class="wrapper"> <div class="spinner pie"></div> <div class="filler pie"></div> <div class="mask"></div> </div></p> <p>Budući da su spiner i filler dvije polovine istog kruga, za njih ćemo koristiti .pie klasu.</p> <h2>CSS</h2> <p>Roditelj je veličine i <a href="https://bumotors.ru/bs/css-raspolozhenie-elementov-css---pozicionirovanie-blokov.html">apsolutno pozicioniranje</a> kontekst za tajmer:</p> <p>Omot (širina: 250px; visina: 250px; pozicija: relativna; pozadina: bijela;)</p> <p>Bitno je da su širina i visina jednake kako bi se dobio krug i sve radi.</p> <p>Koristi se spiner i elementi za punjenje <a href="https://bumotors.ru/bs/velcom-kody-nomerov-baza-dannyh-mts.html">dati kod</a> CSS:</p> <p>Pita (širina: 50%; visina: 100%; pozicija: apsolutna; pozadina: # 08C; ivica: 10px čvrsta rgba (0,0,0,0.4);)</p> <p>Imaju širinu jednaku 50% roditeljskog elementa, pa su dva dijela istog kruga, a visina im je jednaka visini nadređenog elementa. Za njih također definiramo istu boju i okvir.</p> <h3>Spinner element</h3> <p>Spinner (radijus granice: 125px 0 0 125px; z-indeks: 200; granica desno: nema; animacija: rota 10s linearno beskonačno;)</p> <p>Napravite polukrug koristeći svojstvo radijusa granice u gornjem lijevom i donjem lijevom kutu. Također definiramo pozitivan z-indeks da ga pozicioniramo na vrhu elementa za popunjavanje, ali ispod maske.</p> <p>Zatim dodajte animaciju na 10 sekundi. O animaciji ćemo kasnije.</p> <h3>Element za punjenje</h3> <p>Filer (radijus granice: 0 125px 125px 0; z-indeks: 100; granica lijevo: nema; animacija: popuni korake od 10 s (1, kraj) beskonačno; lijevo: 50%; neprozirnost: 0;)</p> <p>Za ovaj element postavite radijus granice i z-indeks, uklonite ivicu lijevo i animirajte ga 10 sekundi. Za dati element, funkcija vremena animacije ne dobiva linearnu vrijednost, već korake (1, kraj). To znači da će se animacija pokrenuti trenutno.</p> <p>Budući da element ispune ne bi trebao biti vidljiv tokom prve polovine animacije, njegova neprozirnost će biti 0, a njegova pozicija će biti 50% širine roditeljskog elementa.</p> <h3>Element "maske".</h3> <p>Maska (širina: 50%; visina: 100%; pozicija: apsolutna; z-indeks: 300; neprozirnost: 1; pozadina: naslijediti; animacija: maska ​​10s koraka (1, kraj) beskonačno;)</p> <p>Maska je prisutna od početka animacije, tako da je njena neprozirnost postavljena na 1, a pozadina je naslijeđena od roditelja (tako da je nevidljiva). Da bi pokrio rotirajući element, on će imati iste dimenzije, a svojstvo z-indeksa je postavljeno na 300.</p> <h3>Okviri animacije</h3> <p>@keyframes rota (0% (transform: rotate (0deg);) 100% (transform: rotate (360deg);)) @keyframes fill (0% (prozirnost: 0;) 50%, 100% (providnost: 1;) ) @keyframes maska ​​(0% (prozirnost: 1;) 50%, 100% (neprozirnost: 0;))</p> <p>Prva animacija (rota) se koristi za spiner element. Postepeno se rotira od 0 do 360 stepeni za 10 sekundi.</p> <p>Druga animacija (fill) se koristi za element punila. Odmah mijenja neprozirnost sa 0 na 1 nakon 5 sekundi.</p> <p>Posljednja animacija (maska) se koristi za element maske. Odmah mijenja neprozirnost sa 1 na 0 nakon 5 sekundi.</p> <p>Animacija izgleda ovako:</p> <ul><li><b>T0</b>- spiner je lijevo, skriven maskom. Element punjenja je skriven.</li> <li><b>T1</b>- spiner počinje da se okreće u smeru kazaljke na satu i polako se pojavljuje iza maske.</li> <li><b>T2</b>- spiner r se okreće 360/10 * 2 = 72 ° i nastavlja se okretati.</li> <li><b>T3</b>- spiner se rotira 360/10 * 3 = 108 ° i nastavlja se okretati.</li> <li><b>T4</b>- spiner se rotira 360/10 * 4 = 144 ° i nastavlja se okretati.</li> <li><b>T5</b>- spiner se rotira 360/10 * 5 = 180 ° i nastavlja se okretati. U ovom trenutku, element punila je trenutno vidljiv, a maska ​​je skrivena.</li> <li><b>T6</b>- spiner se rotira 360/10 * 6 = 216 ° i nastavlja se okretati.</li> <li><b>T7</b>- spiner se rotira 360/10 * 7 = 252 ° i nastavlja se okretati.</li> <li><b>T8</b>- spiner se rotira 360/10 * 8 = 288 ° i nastavlja da se okreće.</li> <li><b>T9</b>- spiner se rotira 360/10 * 9 = 324 ° i nastavlja se okretati.</li> <li><b>T10</b>- spiner se rotira za 360°. Vratili smo se na početnu tačku. Resetovanje animacije. Pojavljuje se maska, a element ispune je skriven.</li> </ul><h2>Bonus</h2> <p>Nekoliko dodatnih trikova.</p> <h3>Pauzirajte pri lebdenju</h3> <p>Omot: hover .filler, .wrapper: hover .spinner, .wrapper: lebdeti .mask (animation-play-state: paused;)</p> <p>Pomoću ovog koda možete zaustaviti svu animaciju kada pređete mišem preko nadređenog elementa.</p> <h3>Umetnite sadržaj</h3> <p>Zahvaljujući svojstvu z-indexa, možemo lako dodati neki sadržaj u spiner i natjerati ga da se okreće. Pokušajte sa sljedećim kodom:</p> <p>Spinner: poslije (sadržaj: ""; pozicija: apsolutna; širina: 10px; visina: 10px; radijus granice: 50%; vrh: 10px; desno: 10px; pozadina: #fff; granica: 1px čvrsti rgba (0,0 , 0,0.4); box-shadow: umetnuti 0 0 3px rgba (0,0,0,0.2);)</p> <h2>Preprocesor ili CSS varijable</h2> <p>Trenutno je kod vrlo teško održavati. Ali ako koristimo varijable (u pretprocesoru ili očekivanom internom <a href="https://bumotors.ru/bs/peremennye-v-html-kode-nativnye-peremennye-v-css-uzhe-pora.html">css varijable</a>), sve može postati mnogo lakše. Na primjer, možete dodati varijable za kontrolu trajanja umjesto popravljanja koda u 3 definicije animacije.</p> <p>Ako želite da poboljšate mogućnost održavanja vašeg koda bez upotrebe predprocesora, možete kreirati klasu sa jednom kontrolom trajanja animacije i dodati je 3 djece. Na primjer ovako:</p> <p>Trajanje animacije (trajanje animacije: 10 s;)</p> <p> <div class="wrapper"> <div class="spinner pie animation-duration"></div> <div class="filler pie animation-duration"></div> <div class="mask animation-duration"></div> </div></p> <h2>Nedostaci</h2> <p>Ova tehnika ima nekoliko nedostataka:</p> <ul><li>Gradijent nije podržan.</li> <li>Sjene nisu podržane.</li> <li>Nema prilagodljivosti. Ako se promijeni veličina roditeljskog elementa, onda će sve biti u redu, osim radijusa zaokruživanja granice. Morat će se mijenjati ručno.</li> <li>Nema semantike (4 elementa za jednu animaciju).</li> </ul><h2>Podrška za pretraživač</h2> <p>Pošto koristimo <a href="https://bumotors.ru/bs/zaderzhka-animacii-css3-primery---obratnaya-animaciya-css-kratkaya.html">CSS animacije</a>, tada je podrška preglednika prilično oskudna:</p> <ul><li>Internet Explorer 10</li> <li>Firefox 12+</li> <li>Chrome</li> <li>Safari 5+</li> <li>Opera 12+</li> <li>iOS Safari 3+</li> <li>Android 2+</li> </ul> <ul><li>Prevod</li><li>Tutorial</li> </ul><p>Obrasci su odličan način da dodate malo ukusa elementima na vašoj web stranici. Krugovi su posebno dobri u tom pogledu jer su holistički, jednostavni i slični kolačima. Ozbiljno, ko ne voli pitu?</p><p>Kao što ste sigurno primijetili iz vlastitog višegodišnjeg iskustva korištenja interneta, većina elemenata na web stranicama su, u stvari, kvadrati ili pravokutnici. Stoga u nekim slučajevima zanimljivi elementi poput krugova i trokuta u vašem dizajnu mogu biti vrlo korisni. Ovaj vodič će pokazati kako napraviti animirani tortni grafikon sličan onima koje obično vidite na web lokacijama s portfoliom. Ovo vam može pomoći da vizualno istaknete svoje vještine, kao i da pokažete koje zadatke možete nositi. Pogledajte demo da vidite konačni rezultat.</p><h3>Dakle, počnimo!</h3>Kada pišem ovaj tutorijal, radit ću sa Circlifulom. To je besplatni jQuery dodatak otvorenog koda. Glavni fajl možete preuzeti sa Github-a. Sadrži .js datoteku zajedno sa odgovarajućom CSS stilskom tablicom. Stranica mora sadržavati oba da bi se postigao efekat kruga. <p> <pre lang="PHP" line="1"><!doctype html> <html lang="en-US"> <head> <meta charset="utf-8"> <meta http-equiv="Content-Type" content="text/html"> <title>Statistika animiranih krugova - Demo predložaka Monster

Moja stranica sadrži sličan styles.css stylesheet za moje lične CSS stilove. Također morate napraviti kopiju jQuery biblioteke. Potreban je za ispravan rad dodatka.
Sama po sebi, stranicu je prilično lako strukturirati. Elementi kruga sadržani su u div oznakama koje koriste HTML5 atribute za manipulaciju podacima. Alternativno, mogu se pohraniti u jQuery funkciji, ali ako želite bolju kontrolu nad svakim elementom onda je lakše raditi u HTML-u.

Photoshop

Ilustrator

After Effects

Ovo je kopija prvog reda krugova, koji se sastoji od 3 animirane jedinice. Svi ovi atributi podataka su dalje objašnjeni u dokumentaciji dodatka. Svaki predstavlja opciju koja definira efekat animacije. Ispod je kratak opis opcija koje koristim:

  • data-dimenzija - ukupna veličina širine/visine kruga;
  • data-text - tekst koji se pojavljuje u centru svakog kruga;
  • data-width - debljina rotacionog luka podataka;
  • data-fontsize - središnja veličina fonta teksta;
  • data-percent - broj od 0-100 koji predstavlja procente u vašem krugu;
  • data-fgcolor - boja prednjeg plana kruga;
  • data-bgcolor - boja pozadine kruga;
  • data-fill - unutrašnja ispuna boje pozadine unutrašnjeg kruga.

CSS izgled stranice

Ne insistiram da direktno uređujete jquery.circliful.css osim ako ne želite prilagoditi dodatak, naravno. Većina boja se može promijeniti direktno iz HTML5 atributa podataka, a ako zaista želite prepisati bilo koji od stilova Circliful, preporučio bih da to učinite u vlastitom stilu.
Nakon što sam vam ovo rekao, kreirao sam vlastitu tablicu stilova za dati projekat, a ne da prepisujem stilove Circliful... Sama web stranica treba zadani izgled koji je zaista jednostavan za dizajn. Područje sadržaja je centrirano u malom dijelu za kružni grafikon. Svaka oblast se slobodno kreće unutar linijskog kontejnera unutar originala #stats div.

/ ** struktura stranice ** / .wrap (prikaz: blok; margina: 0 auto; max-width: 800px;) #intro (prikaz: blok; margin-bottom: 25px; text-align: centar;) #intro p (veličina fonta: 1.8em; visina linije: 1.35em; boja: # 616161; stil fonta: kurziv; margin-bottom: 25px;) #stats (prikaz: blok; širina: 100%; padding: 15px 0; background: # f8f8f8; border-top: 4px solid # c3c3c3; border-bottom: 4px solid # c3c3c3;) #stats .row (display: block;) .circle-container (display: block; float: lijevo; margin-right : 55px; margin-bottom: 45px;) .circle-container h3 (display: block; text-align: center; font-size: 2.25em; line-height: 1.4em; color: # 363636; text-shadow: 1px 1px 0 #fff;)

Unutar svake sekcije sadržaj se čuva .wrap div za fiksiranje u centru. Također, elementi kruga koji se slobodno kreću trebaju dodatnu posudu. .clearfix da sve bude ispravno poravnato.

/ ** clearfix ** / .clearfix: nakon (sadržaj: "."; prikaz: blok; jasno: oba; vidljivost: skrivena; visina linije: 0; visina: 0;) .clearfix (prikaz: inline-block; ) html .clearfix (prikaz: blok;) * html .clearfix (visina: 1%;)

Ova klasa clearfix je godinama poznat kao slobodno pokretno rješenje za kontejnere. Obično se uklanjaju iz teksta dokumenta i ne zadržavaju svoju originalnu širinu/visinu. Ali ovo održava širinu kontejnera konstantnom #stats i ostavlja prostor za više sadržaja koji idu niz stranicu.

Final touchs

Dakle, zamesili smo testo, napunili kalup za pitu, stavili u rernu i skoro smo spremni za degustaciju. Ako sve izgleda dovoljno dobro, koji je posljednji korak? Potreban nam je neki jQuery kod da ukrasimo ovaj projekat.
Otvorite novu oznaku skripte na dnu ove HTML stranice. Sadržat će mali isječak JavaScripta. Pošto sam koristio sve HTML5 atribute podataka, ne moramo pozivati ​​nikakve jQuery opcije. Skripta samo mora pokrenuti funkciju Circliful na svakom krugu div. Korištenje dupliciranog naziva klase kao što je .circlestatčini proces veoma lakim.

$ (funkcija () ($ (". circlestat"). circliful (;));

Za one koji nisu upoznati sa strukturom sintakse jQueryja, daću kratak opis. Nakon što se dokument učita, pokrećemo novu funkciju. Naš unutrašnji cilj je svaki element koji koristi klasu .circlestat i pokreće funkciju kružno ()... Ovo vodi dodatak Circliful, koji stvara efekte animacije, u akciju i primjenjuje dodatni sadržaj / boje.

Ne mogu reći da će ovi krugovi uvijek biti najbolje rješenje. Vidio sam puno portfelja koji su bili zasnovani na riječima i brojevima, ali ne i rad sam po sebi. Razmislite o korištenju ovih krugova u rijetkim prilikama i pokušajte ih posuditi u druge svrhe osim jednostavnih vještina. Vaša statistika se ne mora mjeriti u procentima – ona može pokazati koliko godina ste u poslu, ukupan broj projekata koje imate ili druge slične brojke. Možete besplatno preuzeti kopiju mog vodiča i eksperimentirati s kodom kako biste ga poboljšali za svoje projekte.

"Kuhinja" web programera je pomalo kao domaća kuhinja. Programer ima pristup raznim bibliotekama iz gotov kod to će mu pomoći da napravi web aplikaciju na isti način na koji kuhar kod kuće može koristiti gotovu hranu za efikasnije kuhanje jela. U oba slučaja, kvalitet prethodno pripremljenih artikala bi trebao biti veoma važan. Međutim, ponekad se kvalitet žrtvuje radi pogodnosti. Nemojte me pogrešno shvatiti, udobnost nije uvijek loša stvar. Može biti korisno kada su prednosti i mane poznate i dobro analizirane. Analizirajući opcije za tortne i krofne grafikone u HTML-u, možemo istaknuti samo neke:

  1. Grafikon zasnovan na elementima platna generiran na klijentu (tj. JavaScript)
  2. Dijagram baziran na SVG-u i generiran na klijentu (tj. JavaScript)
  3. SVG generisan server grafikona

Biblioteke koje su gotove iz kutije koje koriste Canvas i SVG JavaScript

JavaScript biblioteke za crtanje dijagrama su često praktičnije i opterećene gomilom sjajnih opcija poput interaktivnosti. Evo nekoliko biblioteka:

  1. D3.js
  2. Chartist.js
  3. Google karte

Nekoliko redova JavaScript-a i niz podataka omogućit će vam da napravite dijagram na vašoj web stranici za nekoliko sekundi. Nije iznenađujuće da mnogi biraju ovaj put.

Zašto se onda truditi i kodirati ih sami? Ovo je odlično pitanje koje sam i ja sebi postavio. Na kraju sam se uvjerio u tri stvari:

  1. Do većine JavaScript biblioteka je teško doći, posebno do onih zasnovanih na elementu Canvas (s izuzetkom Google Charts)
  2. Ako su informacije na dijagramu veoma važne (kao što je to bilo u mojoj situaciji), treba li se osloniti na skriptu koja se izvodi na klijentu za generiranje informacija? Ja tako ne mislim.
  3. Ako zakopam dublje u SVG kod i uprljam ruke, mogao bih naučiti nešto više o magičnim glupostima koje su u pozadini. Drugim riječima, proces učenja može biti zabavan i vrijedan truda.

Moja situacija

Moj tim je trebao jednostavnu komponentu koja bi se mogla izgraditi na serveru i prikazati jednostavne informacije o korišćenju naloga. Takođe, preferirali smo lakoću ove komponente (izbjegavajte JavaScript ako je moguće); nije morao biti pretjerano sofisticiran ili interaktivan, trebao je samo prikazati važne podatke.

Dodatna napomena o grafikonima zasnovanim na platnu

Možda ste primijetili (ako ste upoznati sa kreiranjem grafikona za web) da nisam uključio Chart.js u gornju listu preporučenih biblioteka. Iako ga definitivno možete koristiti, vrijedi imati na umu da Chart.js koristi Canvas element za renderiranje svojih grafikona, a sadržaj elementa nije dio DOM-a. Stoga nisu dostupni čitačima ekrana. To znači da morate prihvatiti dodatne mjere kako biste bili sigurni da su vaši podaci dostupni.

Uvod u CSS i SVG grafikone

CSS i SVG dijagrami su inherentno pristupačniji i semantičniji od drugih tehnologija. Ali oni mogu biti složeni, a možda i dugotrajniji ako ih kodirate ručno.

CSS Ninja Lea Verou nudi nekoliko opcija za kreiranje tortnih grafikona od nule u svom članku "Dizajniranje fleksibilnih, održivih tortnih grafikona sa CSS i SVG". Njene metode se mogu primijeniti i na krofne.

Robin Randle je također pisao o kreiranju grafikona isključivo pomoću CSS-a, gdje također ističe svoje propuste u pristupu.

Neobjašnjivo

Malo sam proguglao SVG i krofne grafikone i naišao na članke Lea Verou i Robin Randle (gore spomenutih) pored nekoliko drugih. Gotovo svi su raspravljali o upotrebi atributa stroke-dasharray i stroke-dashoffset u SVG-u za pozicioniranje dijelova dijagrama. Ova svojstva su identična "stroke" pri kreiranju vektora u programima kao što je Adobe Illustrator.

Neki od ovih članaka čak su govorili o animaciji u SVG-u, što je super, ali takođe nije ono što sam tražio.

Nakon mog istraživanja, uspio sam shvatiti to korištenjem iz SVG-a zajedno sa stroke i stroke-dasharray mogao bi mi pružiti ugniježđene segmente kolača koji su mi potrebni. Takođe sam shvatio da će mi potez-dashoffset omogućiti da "animiram", ili drugim riječima, pozicioniram segment gdje želim da bude u krugu.

Međutim, činilo se da nisam našao nikakvo jasno objašnjenje kako točno funkcioniraju atributi crtice i kako se odnose na obim kruga. A ono što je bilo nedostižnije je pričvršćivanje nekoliko elemenata (jedan za drugim) oko kruga. Još bolje, koja je formula za dobijanje ovih relativnih pozicija koristeći jedinstvene / dinamičke veličine segmenata i atribute poteza SVG-a?

Tako sam postao odlučan da sam saznam.

Napomena: Ako pronađete bilo kakve resurse koji objašnjavaju ove koncepte, podijelite ih.

Kako napraviti DIY SVG dijagram

Objašnjenje stroke-dasharray i stroke-dashoffset

Počnimo s jednostavnim SVG "krofnom" grafikonom.

Primijetit ćete par stvari:

  1. Radijus (atribut "r") izgleda apsurdno! Zašto? Želio sam da svoje veličine segmenata učinim logičnim, razumljivim i čitljivim. Da bih to postigao, odlučio sam da sve baziram na 100% (ili krug od 100). SVG oblici su skalabilni, tako da nije bitno koliko će na kraju biti veliki; barem će matematika ovdje biti jednostavna. Idemo dalje u područje koje se sjećam iz srednje škole matematike: znam da je polumjer kružnice r = C / (2π) ili r = 100 / (2π). Rezultat je 15.91549430918952. Ludi broj sa gomilom brojeva, da, znam, ali kasnije će nam svima olakšati život.
  2. Za viewBox vrijednosti su "0 0 42 42". Moraju biti dvostruke vrijednosti cx & cy (centar x i centar y). i biti nešto veći od prečnika krugova (uključujući širinu obrisa).
  3. Tu je sa klasom "krofna". To je ono što će zajamčeno učiniti centar bijelim. Ako vam ovo nije važno (u slučaju jednostavnog tortni grafikon), tada se ova stavka može ukloniti.
  4. Također postoji sa klasom "krofna-ring". Služi kao svijetlo siva pozadina u slučaju da sektori ne ispunjavaju 100% kruga.

Dakle, trebamo prilagoditi veličinu sektora na željeni postotak. Iskoristimo 85%:


Sektori se kreiraju pomoću SVG atributa poteza koji se zove stroke-dasharray. Vrijednost koju smo postavili u gornjem primjeru je "85 15".

Ako posmatramo dijagram kao kružni, onda iz prisustva sektora od 85% možemo suditi o ostatku od 15%. Ove dvije vrijednosti su niz razgraničen prostorom. Evo šta se dešava: kreira se traka od 85, zatim razmak od 15, zatim traka od 85, razmak od 15, i tako dalje i tako dalje. Ali pošto koristimo krug i ukupno je 100, sve se ponavlja ponovo. Ako drugu vrijednost u nizu nismo napravili tako da dopunjava prvi broj na sto, onda ćemo dobiti treći potez (ili dio) ili više. Na primjer, ovdje je stroke-dasharray iz "10 10":


Dakle, u obliku 2 i obliku 3, možete primijetiti da stroke-dasharray ne počinje na samom vrhu (u 12:00). Umjesto toga, zapravo počinje sa desna strana(3:00) i kreće se u smjeru kazaljke na satu u krug.

Ako želimo pozicionirati (ili početi) na vrhu, onda moramo koristiti stroke-dashoffset. Međutim, za razliku od stroke-dasharray, stroke-dashoffset se kreće suprotno od kazaljke na satu. Dakle, trebat ćemo postaviti vrijednost na "25" (25% u drugom smjeru od 3:00, nazad do 12:00). Zapamtite da ovo nije negativan broj jer se pomak kreće prema strelici.


Kako rasporediti kriške krofne oko SVG-a

Sada moramo dodati dodatne sektore oko kruga. Koristimo sektor koji je 15% kruga. Preostali procenat za stroke-dasharray će biti 85%, bez obzira na bilo koje druge sektore. Dakle, kod će izgledati ovako:

Ostavili smo stroke-dashoffset na 25, tako da zeleni sektor počinje na vrhu i ide u smjeru kazaljke na satu, preklapajući prvi sektor (ružičasti).


Očigledno, ovo nije baš ono što smo željeli. Želimo da petnaesti procenat (zeleno) stane blizu prostora koji je ostavio osamdeset peti procenat (ružičasta). Možemo podesiti stroke-dashoffset dok ne budemo imali sreće, ali ne bi bilo tako lako da imamo još dva sektora. Umjesto toga, potrebna nam je formula:

Krug - ukupna dužina svih prethodnih sektora + pomak prvog sektora = pomak trenutnog sektora

Uključujući naše brojeve, dobijamo:


Dodajte još kriški našem dijagramu!

Ova ista formula radi za dodavanje dodatnih sektora. Popunimo grafikon sa 40, 30, 20 posto, a preostalih 10 nećemo koristiti.

rezultat:


Dodavanje teksta u unutrašnjost grafikona

To ne bi bio dijagram sa krofnama bez unosa i izlaza teksta; za to je rupa, zar ne? Pa, dodavanje teksta je jednostavno. Mi samo koristimo element koji je izvorni za SVG oblike.

10 Piva

Primijetit ćete da sam podijelio tekst grafikona na 2 elementa i grupirao ih ( ). To je urađeno kako bismo lakše preklopili naslov i broj jedan na drugi, te ih poredali u jednu cjelinu. Podesio sam atribute X i Y tako da počnu od centra oblika na osnovnoj liniji i poravnam ih ulijevo.


Kao što vidite, pozicioniranje nije sasvim ispravno, pa ga moramo ukrasiti s malo CSS-a:

Prvo, dodajmo font Montserrat (samo zato što mi se sviđa). Zatim moramo podesiti veličinu fonta i visinu reda. Nakon dodavanja "translateY" u 0.25em, tekst je malo vertikalno poravnat, ali još nismo gotovi.

Moramo da učinimo oba tekstualna okvira manja i poravnata po sredini tako što ćemo prilagoditi veličinu fonta gdje god želimo (0,6em za veći broj i 0,2em za naslov izgleda dobro) i korištenje svojstva "text-anchor" sa vrijednošću "sredina ".

Tekst je sada centriran. Sve što je preostalo je da sve to učinite velikim slovima (ovo je lako) i rasporedite njegove pojedinačne elemente koristeći "translateY" tako da se pravilno presavijaju. A evo šta sada imamo:


Problemi pristupačnosti

Kao što sam ranije spomenuo, SVG sadržaj je dio DOM-a, tako da je inherentno pristupačniji. Ovo čini nevjerovatno lakim pružanje dodatnog konteksta za čitače ekrana putem atributa i elemenata kao što su naslovi.

Prvi nivo zabrinutosti za pristupačnost je da se SVG dijagram učini semantičnijim umotavanjem u element

(jer je ovo dijagram). Kao oblik možemo koristiti element da date naslov ili opis za dijagram krofni.

Osim toga, možemo dodati oznake sadržaja i <desc>(koji su izvorni za SVG) i povezuju ih sa ARIA zaglavljima, ID-ovima i ulogom "pružanja više konteksta za čitače ekrana".</p><p> <style> @import url(https://fonts.googleapis.com/css?family=Montserrat:400); body { font: 16px/1.4em "Montserrat", Arial, sans-serif; } * { -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; } .chart-text { /*font: 16px/1.4em "Montserrat", Arial, sans-serif;*/ fill: #000; -moz-transform: translateY(0.25em); -ms-transform: translateY(0.25em); -webkit-transform: translateY(0.25em); transform: translateY(0.25em); } .chart-number { font-size: 0.6em; line-height: 1; text-anchor: middle; -moz-transform: translateY(-0.25em); -ms-transform: translateY(-0.25em); -webkit-transform: translateY(-0.25em); transform: translateY(-0.25em); } .chart-label { font-size: 0.2em; text-transform: uppercase; text-anchor: middle; -moz-transform: translateY(0.7em); -ms-transform: translateY(0.7em); -webkit-transform: translateY(0.7em); transform: translateY(0.7em); } figure { display: flex; justify-content: space-around; flex-direction: column; margin-left: -15px; margin-right: -15px; } @media (min-width: 768px) { figure { flex-direction: row; } } .figure-content, .figure-key { flex: 1; padding-left: 15px; padding-right: 15px; align-self: center; } .figure-content svg { height: auto; } .figure-key { min-width: calc(8 / 12); } .figure-key { margin-right: 6px; } .figure-key-list { margin: 0; padding: 0; list-style: none; } .figure-key-list li { margin: 0 0 8px; padding: 0; } .shape-circle { display: inline-block; vertical-align: middle; width: 32px; height: 32px; -webkit-border-radius: 50%; -moz-border-radius: 50%; border-radius: 50%; } .shape-fuschia { background-color: #ce4b99; } .shape-lemon-lime { background-color: #b1c94e; } .shape-blue { background-color: #377bbc; } .sr-only { position: absolute; width: 1px; height: 1px; margin: -1px; padding: 0; overflow: hidden; clip: rect(0,0,0,0); border: 0; } </style> <figure> <div class="figure-content"> <svg width="100%" height="100%" viewBox="0 0 42 42" class="donut" aria-labelledby="beers-title beers-desc" role="img"> <title id="beers-title">Piva u mom podrumu Belgijski kvadrupels Segment ružičastog grafikona obuhvata 40% celine, što je 4 belgijska četvoropela od ukupno 10. Imperial india pale ales Segment zelene karte obuhvata 20% od celine, što je 2 Imperial India Pale Ale od ukupno 10. Russian Imperial Stouts Segment plavog grafikona obuhvata 3% celine, što je 3 ruska imperijalna stouta od ukupno 10. 10 Piva

Donut grafikon prikazuje ukupno 10 piva. Dva piva su Imperial India Pale Ales, četiri piva su belgijski Quadrupels, a tri su Russian Imperial Stouts. Posljednje preostalo pivo nije označeno.

Također možemo dodati ključ legende za grafikon kao dio

, napominjući ga ulogom "view" i atributom skrivena arija, budući da je to zaista potrebno radi jasnoće.

Sa prstohvatom magije CSS Flexbox možemo postaviti ključ udesno i poravnati ga okomito sa dijagramom. Šta će nam dati konačni proizvod:


Pošto je CSS dizajn sa ključem na koji se odnosi svojstvo radijusa granice i Flexbox bi mogli biti zasebni članci (drugi zahtijeva mnogo duže objašnjenje), ostaviću te teme za kasnije.

Krajnji rezultati

Kao što sam ranije spomenuo, ručno pisanje koda za SVG objekte može biti dugotrajno, posebno ako uzmete u obzir činjenicu da postoji mnogo odličnih JavaScript biblioteka koje će izgraditi ove objekte umjesto vas. Ali mogu postojati slučajevi (poput moje situacije) u kojima vama ili vašem timu treba metoda koja ne dodiruje JavaScript, ona koja će biti kompajlirana na strani servera.

Dobra vijest je da jednom kad se snađete na sličan način, možete ga primijeniti bilo gdje drugdje sa minimalni trošak napor. Osim toga, prljanje ruku SVG objektima je dobar način saznajte više o tome kako funkcioniraju i naučite o prednostima njihovog korištenja.

Moji rezultati:

  • Primjena matematike na ovako nešto je mnogo zabavnija nego što je to bilo u srednjoj školi.
  • Gledajući unazad, razumijem da logika iza stroke-dasharray i stroke-dashoffset nije tako složena kao što sam prvobitno mislio.
  • Ne zaboravite dodati ovdje dodatni nivoi dostupnost. Na kraju krajeva, pristupačnost nije samo radi čitača ekrana. Također je potrebno kako bi vaš sadržaj učinio dostupnijim i korisnijim za sve ljude i sve uređaje (uključujući i tražilice). Ako vaša JavaScript biblioteka nema funkcije pristupačnosti, razmislite o promjeni.

Top srodni članci