Cum se configurează smartphone-uri și PC-uri. Portal informativ

Diagramă circulară html. Diagrame svg cu plăcintă și gogoși în HTML5 de la zero

  • Traducere
  • Tutorial

Formularele sunt o modalitate excelentă de a adăuga un pic de aromă elementelor de pe pagina dvs. web. Cercurile sunt deosebit de bune în această privință, deoarece sunt holistice, simple și asemănătoare plăcintei. Acum serios, cui nu iubește plăcinta?

După cum trebuie să fi observat din anii de experiență în utilizarea internetului, majoritatea elementelor de pe paginile web sunt, de fapt, fie pătrate, fie dreptunghiuri. Prin urmare, în unele cazuri, elemente interesante, cum ar fi cercurile și triunghiurile din designul dvs., pot fi destul de utile. Acest tutorial va demonstra cum să construiți o diagramă circulară animată, asemănătoare celor pe care le vedeți de obicei pe site-urile de portofoliu. Acest lucru vă poate ajuta să vă evidențiați vizual abilitățile, precum și să vă demonstrați ce sarcini vă puteți ocupa. Aruncă o privire la demo pentru a vedea rezultatul final.

Deci, să începem!

Când scriu acest tutorial, voi lucra cu Circliful. Este un plugin jQuery gratuit și open source. Puteți descărca fișierul principal de pe Github. Include un fișier .js împreună cu o foaie de stil CSS corespunzătoare. Pagina trebuie să le conțină pe ambele pentru a obține efectul de cerc.




 
 
 Statistici cerc animate - Demo de monstru șablon
 
 
 
 
 
 
 

Pagina mea conține o foaie de stil styles.css similară pentru stilurile mele personale CSS. De asemenea, trebuie să faceți o copie a bibliotecii jQuery. Este necesar pentru ca pluginul să funcționeze corect.
În sine, pagina este destul de ușor de structurat. Elementele cerc sunt conținute în etichete div care folosesc atribute HTML5 pentru a manipula datele. Alternativ, acestea pot fi stocate în Funcții jQuery dar dacă doriți un control mai bun asupra fiecărui element, atunci este mai ușor să lucrați în HTML.

Photoshop

Ilustrator

Dupa efecte

Aceasta este o copie a primului rând de cercuri, constând din 3 unități animate. Toate aceste atribute de date sunt explicate în continuare în documentația pluginului. Fiecare reprezintă o opțiune care definește un efect de animație. dau mai jos scurta descriere opțiuni pe care le folosesc:

  • data-dimension - dimensiunea totală a lățimii/înălțimii cercului;
  • data-text - textul care apare în centrul fiecărui cerc;
  • data-width - grosimea arcului de date rotativ;
  • data-fontsize - dimensiunea fontului textului central;
  • date-percent - un număr de la 0 la 100 reprezentând procentele din cercul tău;
  • data-fgcolor - culoarea primului plan a cercului;
  • data-bgcolor - culoarea de fundal a cercului;
  • data-fill - umplerea interioară a culorii de fundal a cercului interior.

Aspectul paginii CSS

Nu insist să editezi direct jquery.circliful.css cu excepția cazului în care doriți să personalizați pluginul, desigur. Majoritatea culorilor pot fi modificate direct din atributele de date HTML5 și, dacă doriți cu adevărat să rescrieți oricare dintre stiluri Circliful, aș recomanda să faceți acest lucru în propria foaie de stil.
După ce v-am spus acest lucru, am creat propria mea foaie de stil pentru proiectul dat, nu pentru a rescrie stiluri Circliful... Pagina web în sine are nevoie de un aspect implicit care este cu adevărat ușor de proiectat. Zona de conținut este centrată într-o secțiune mică pentru o diagramă circulară. Fiecare zonă se mișcă liber în interiorul containerului de linie din original #stats div.

/ ** structura paginii ** / .wrap (afișare: bloc; margine: 0 automat; lățime maximă: 800px;) #intro (afișare: bloc; margine-jos: 25px; text-align: center;) #intro p (dimensiune font: 1,8 em; înălțime linie: 1,35 em; culoare: # 616161; stil font: cursiv; margine-jos: 25px;) #stats (afișare: bloc; lățime: 100%; umplutură: 15px 0; fundal: # f8f8f8; chenar-sus: 4px solid # c3c3c3; chenar-jos: 4px solid # c3c3c3;) #stats .row (afișare: bloc;) .circle-container (afișare: bloc; float: stânga; margine-dreapta) : 55px; margin-bottom: 45px;) .circle-container h3 (afișare: bloc; text-align: center; font-size: 2.25em; line-height: 1.4em; culoare: # 363636; text-shadow: 1px 1px 0 #fff;)

În cadrul fiecărei secțiuni, conținutul este păstrat .wrap div pentru fixare în centru. De asemenea, elementele cercului care se mișcă liber au nevoie de un container suplimentar. .clearfix pentru a menține totul corect aliniat.

/ ** clearfix ** / .clearfix: după (conținut: "."; afișare: bloc; clar: ambele; vizibilitate: ascuns; line-height: 0; înălțime: 0;) .clearfix (display: inline-block; ) html .clearfix (afișare: bloc;) * html .clearfix (înălțime: 1%;)

Această clasă clearfix este cunoscută de ani de zile ca o soluție de containere cu mișcare liberă. De obicei, acestea sunt eliminate din textul documentului și nu își păstrează lățimea/înălțimea inițială. Dar aceasta menține constantă lățimea containerului #statistici si lasa loc pt Mai mult conținut care va fi localizat mai jos pe pagină.

Retușuri finale

Așadar, am frământat aluatul, am umplut tava de plăcintă, am dat-o la cuptor și suntem aproape gata să-l degustăm. Dacă totul arată suficient de bine, care este pasul final? Avem nevoie de cod jQuery pentru a decora acest proiect.
Deschideți o nouă etichetă de script în partea de jos a acesteia Pagini HTML... Acesta va conține un mic fragment de JavaScript. Deoarece am folosit toate atributele de date HTML5, nu trebuie să apelăm nicio opțiune jQuery. Scriptul trebuie doar să ruleze funcția Circliful pe fiecare cerc de div. Folosind un nume de clasă duplicat, cum ar fi .circlestat face procesul foarte ușor.

$ (funcție () ($ ("". circlestat"). circliful ();));

Pentru cei care nu sunt familiarizați cu structura de sintaxă jQuery, voi oferi o scurtă descriere. După ce documentul este încărcat, rulăm noua functie... Scopul nostru interior este fiecare element care folosește clasa .circlestatși rulează funcția circular ()... Aceasta conduce pluginul Circliful, care creează efecte de animație, în acțiune și aplică conținut / culori suplimentare.

Nu pot spune că aceste cercuri vor fi mereu cea mai bună soluție... Am văzut o mulțime de portofolii care se bazau pe cuvinte și numere, dar nu funcționează în sine. Luați în considerare utilizarea acestor cercuri în rare ocazii și încercați să le împrumutați în alte scopuri decât abilitățile simple. Statisticile tale nu trebuie să fie măsurate ca procent - ele pot arăta câți ani ai fost în afaceri, numărul total de proiecte pe care le ai sau alte cifre similare. Puteți descărca gratuit o copie a tutorialului meu și puteți experimenta cu codul pentru a-l îmbunătăți pentru proiectele dvs.

Cu toate că diagrame circulare sunt cel mai comun mod de prezentare a informațiilor, variind de la simple statistici la indicatori de progres și cronometre, chiar și în cea mai simplă formă bicoloră, acestea au fost create în mod tradițional în orice alt mod decât metode simple folosind tehnologii web. De obicei, pentru implementarea lor, fie extern editor grafic pentru a crea mai multe imagini pentru mai multe valori de diagramă circulară sau cadre JavaScript pentru crearea de diagrame mai complexe.

Deși acum sarcina nu pare la fel de imposibilă ca înainte, nu există încă o soluție simplă, fără ambiguitate. Cu toate acestea, există multe altele mai bune astăzi (comparativ cu metodele de mai sus), moduri mai acceptate de implementare a diagramelor circulare.

O soluție bazată pe transformare

Această soluție este cea mai bună din punct de vedere al marcajului: are nevoie doar de un element și orice altceva se va face folosind pseudo-elemente, transformări și Gradienți CSS... Să începem cu un element simplu:

Acum, să presupunem că vrem o diagramă circulară care să afișeze hard-coded 20% ... Vom lucra mai târziu la flexibilizarea acestuia. Mai întâi, vom stila elementul ca un cerc, care va fi fundalul nostru (Figura 1):

Figura 1 - Punctul nostru de pornire (diagrama circulară care afișează 0%) .pie (lățime: 100 px; înălțime: 100 px; rază de margine: 50 %; fundal: galbenverde;)

Diagrama noastră circulară va fi verde (mai precis galbenverde) cu un sector maro (# 655) care arată procentul. S-ar putea să fim tentați să folosim transformări oblice pentru procent, dar așa cum arată o mică experimentare, aceasta ar fi o soluție destul de neglijentă. În schimb, vom colora părțile stânga și dreaptă ale cercului nostru doua culori si foloseste rotirea pseudo-elementului pentru a dezvălui doar fracțiunea de cerc de care avem nevoie.

Pentru a colora partea dreaptă a cercului nostru maro, vom folosi un gradient liniar simplu:

Imagine de fundal: gradient liniar (la dreapta, transparent 50%, # 655 0); Figura 2 - Colorarea părții drepte a cercului nostru maro cu un gradient liniar simplu

După cum puteți vedea în Figura 2, de asta ne trebuia. Acum putem începe să stilăm pseudo-elementul care va acționa ca o mască:

Pie :: înainte (conținut: ""; afișare: bloc; margine-stânga: 50%; înălțime: 100%;) Figura 3 - Pseudo-elementul care acționează ca mască este evidențiat aici cu un chenar întrerupt

În Figura 3, puteți vedea cum în acest moment pseudo-elementul nostru este situat în raport cu elementul diagramei circulare. Acum nu este încă stilizat și nu îndeplinește nicio funcție. Este doar un dreptunghi invizibil. Înainte de a începe să-l modelăm, să facem câteva comentarii:

  • cum vrem noi ascunde partea maro a cercului nostru, atunci trebuie să aplicăm pseudo-elementului fundal verde folosind culoarea de fundal: moșteniți pentru a evita duplicarea atunci când îi atribuiți aceeași culoare de fundal ca element părinte;
  • îl vrem se învârte în jurul centrului cercului care se află în mijlocul părții stângi a pseudo-elementului, așa că trebuie să setăm originea transformării la 0 50% sau doar la stânga;
  • nu vrem să fie un dreptunghi, deoarece va depăși marginile plăcintei, așa că trebuie fie să aplicăm overflow: ascuns pe .placintă, fie să îi dăm o rază de margine pentru a o face un semicerc.

Punând totul împreună, obținem următorul stil pentru pseudo-elementul nostru;

Pie :: înainte (conținut: ""; afișare: bloc; margine-stânga: 50%; înălțime: 100%; chenar-rază: 0 100% 100% 0/50%; fundal-culoare: moștenire; transform-origine: stânga;) Figura 4 - Pseudo-elementul nostru (prezentat cu un chenar întrerupt) după terminarea stilului

Notă: nu utilizați background: inherit; în loc de backround-color: inherit;, deoarece aceasta va moșteni gradientul!

Diagrama noastră circulară arată acum ca Figura 4. Aici începe distracția! Putem începe rotiți pseudo element prin aplicarea transformării rotire (). Pentru 20% încercăm să implementăm, putem folosi 72deg (0,2 × 360 = 72) sau 2turn, care este mai ușor de citit. În Figura 5, puteți vedea cum arată acest lucru și pentru alte câteva valori.

Figura 5 - Diagrama noastră circulară simplă care arată diferite procente, de la stânga la dreapta: 10% (36deg sau 1turn), 20% (72deg sau 2turn), 40% (144deg sau 4turn)

Ai putea crede că treaba este gata, dar, din păcate, nu totul este atât de simplu. Diagrama noastră circulară este excelentă pentru afișarea procentelor de la 0 la 50%, dar dacă încercăm să afișăm o rotație de 60% (folosind 6turn), obținem ceea ce este afișat în Figura 6. Dar nu renunțați la speranță, putem remedia acest lucru . și hai să o facem!

Figura 6 - Graficul nostru se descompune pentru acțiuni mai mult de 50%(afișat aici pentru 60%)

Dacă considerăm afișarea a 50% -100% acțiuni ca o problemă separată, atunci puteți vedea că pentru ele putem folosi o versiune inversată a soluției anterioare: pseudo-element maro care se rotește de la 0 la 5, respectiv. Deci, pentru o cotă de 60%, codul pseudo-element va arăta astfel:

Pie :: înainte (conținut: „”; afișare: bloc; margine-stânga: 50%; înălțime: 100%; chenar-rază: 0 100% 100% 0/50%; fundal: # 655; origine-transformare: stânga ; transformare: rotire (.1turn);) Figura 7 - Diagrama noastră acum corectă, cu o valoare de 60%

În Figura 7, puteți vedea codul în acțiune. De acum am dezvoltat o modalitate de a afișa orice procent, putem și animați o diagramă circulară de la 0% la 100% cu folosind CSS animatii prin crearea unui fel de indicator de progres:

@keyframes se rotesc (la (transforma: rotiți (.5turn);)) @keyframes bg (50% (fond: # 655;)) .pie :: înainte (conținut: ""; afișare: bloc; margine-stânga: 50 %; înălțime: 100%; rază de margine: 0 100% 100% 0/50%; culoarea de fundal: moștenire; originea transformării: stânga; animație: rotire 3s liniar infinit, bg 6s pas-sfârșit infinit;)

Este în regulă, dar cum stilăm mai multe diagrame statice cu procente diferite, care este cel mai mult caz general folosind diagrame? În mod ideal, dorim să putem imprima ceva de genul acesta:

20%
60%

Și obțineți două diagrame circulare, unul care arată 20% și celălalt indicând 60%. În primul rând, ne vom uita la modul în care putem face acest lucru folosind stiluri inline și apoi putem oricând să scriem un script scurt pentru a analiza continutul textuluiși adăugați stilurile inline specificate pentru eleganța codului, încapsulare, mentenanță și, poate cel mai important, accesibilitate.

Partea dificilă despre controlul procentajului unei diagrame circulare cu stiluri inline este că CSS-ul care este responsabil pentru setarea procentului este setat la un pseudo element. După cum știți deja, nu putem seta stiluri inline pe pseudo-elemente, prin urmare va trebui să fim mai inventivi.

Notă: Pentru utilizare valori din spectrul de culori fără repetări și calcule complexe puteți folosi metoda de mai jos. Puteți utiliza această metodă și în alte cazuri. Mai jos este un exemplu simplu, izolat de utilizare a acestei tehnici.

Soluția vine din unul dintre cele mai neașteptate locuri. Vom folosi animația care a fost deja afișată, dar care va fi întreruptă. În loc să o rulăm ca o animație normală, vom folosi întârzieri negative ale animației setați o poziție în orice punct al animației si stai acolo. Esti surprins? Da, valorile negative ale întârzierii animației nu sunt permise numai în specificații, ci sunt foarte utile în astfel de cazuri.

Deoarece animația noastră este întreruptă, va fi afișat doar primul cadru (determinat de programul nostru valoare negativă animație-întârziere). Procentul afișat în diagrama circulară va fi egal cu procentul pe care animația noastră îl face întârzierea în durata totală. De exemplu, cu o durată curentă de 6 secunde, avem nevoie de o întârziere de animație de -1,2 secunde pentru a afișa o fracțiune de 20%. Pentru a simplifica calculele, vom seta durata la 100 de secunde. Rețineți că, din moment ce animația este oprită definitiv, valoarea pe care o setăm pentru durata acesteia nu joacă niciun alt rol.

Si ultima intrebare: animația este aplicată pseudo-elementului, dar dorim să setăm stilul inline la elementul .pie... Cu toate acestea, deși pe

fără animație, îi putem seta animation-delay ca stil inline și apoi folosim animation-delay: inherit; pentru un pseudo element. Punând totul cap la cap, marcajul nostru pentru diagramele cu 20% și 60% arată astfel:

Și codul CSS pentru această animație devine următorul (regulile pentru .pie nu sunt afișate, deoarece rămân aceleași):

@keyframes rotesc (la (transforma: rotiți (.5turn);)) @keyframes bg (50% (fond: # 655;)) .pie :: înainte (/ * [alte stiluri nu s-au schimbat] * / animație: rotire 50s liniar infinit, bg 100s step-end infinit; animație-play-stare: întrerupt; animație-întârziere: moștenire;)

Deocamdată, putem converti marcajul pentru a folosi procente ca conținut, așa cum ne-am propus inițial, și putem adăuga stiluri de întârziere de animație prin intermediul unui script simplu:

$$ ("". plăcintă"). forEach (funcție (plăcintă) (var p = parseFloat (pie.textContent); pie.style.animationDelay = "-" + p + "s";));

Vă rugăm să rețineți că am lăsat textul intact deoarece avem nevoie de el pentru accesibilitate și utilizare. Diagramele noastre circulare arată acum ca Figura 8. Trebuie să ascundem textul care poate fi disponibil prin culoare: transparent, astfel încât să rămână selectabil și imprimabil... Pentru un plus de luciu, putem plasați valorile procentuale în centrul diagramei circulare ca să nu fie în loc aleatoriu atunci când utilizatorul încearcă să le evidențieze. Pentru a face acest lucru, avem nevoie de:

Figura 8 - Textul nostru înainte de a-l ascunde

  • convertiți valoarea înălțimii diagramei în înălțimea liniei (sau adăugați o valoare a înălțimii liniei egală cu înălțimea, dar aceasta ar fi o duplicare inutilă a codului, deoarece înălțimea liniei va fi setată la valoarea înălțimii calculate, ceea ce este bun) ;
  • setați dimensiunea și poziția pseudo-elementului cu poziționare absolută ca să nu împingă textul în jos;
  • adăugați text-align: center; pentru a centra textul pe orizontală.

Codul final arată astfel:

Placintă (poziție: relativă; lățime: 100px; înălțimea liniei: 100px; raza chenarului: 50%; fundal: galbenverde; imaginea de fundal: gradient liniar (la dreapta, transparent 50%, # 655 0); culoare: transparent ; text-align: center;) @keyframes rotesc (la (transforma: rotiți (.5turn);)) @keyframes bg (50% (fundal: # 655;)) .pie :: înainte (conținut: ""; poziție : absolut; sus: 0; stânga: 50%; lățime: 50%; înălțime: 100%; raza marginii: 0 100% 100% 0/50%; culoarea fundalului: moștenire; originea transformării: stânga; animație: rotire 50s liniar infinit, bg 100s step-end infinit; animație-stare de redare: întreruptă; animație-întârziere: moștenire;)

Soluție bazată pe SVG

SVG ia decizia multora sarcini de grafică mai simple și diagramele circulare nu fac excepție. Cu toate acestea, în loc să creăm o diagramă circulară folosind căi, care ar necesita matematică complicată, vom folosi un mic truc.

Să începem cu un cerc:

Acum să-i aplicăm câteva stiluri de bază:

Cerc (umplere: galbenverde; contur: # 655; lățime trază: 30;)

Notă: După cum știți, acestea Proprietățile CSS sunt disponibile și ca atribute Elemente SVG care ar putea fi utile dacă portarea ar fi o problemă.

Figura 9 - Punctul nostru de plecare: un cerc SVG verde cu o contur groasă # 655

Puteți vedea cercul nostru conturat în Figura 9. Cursurile în SVG sunt alcătuite din mai mult decât proprietățile cursei și lățimii cursei. Există multe alte proprietăți mai puțin populare legate de accident vascular cerebral care vă permit să le reglați fin aspectul. Unul dintre ele este stroke-dasharray, care este pentru a crea linii întrerupte. De exemplu, l-am putea folosi pentru a face acest lucru:

Stroke-dasharray: 20 10; Figura 10 - Contur simplu punctat creat cu stroke-dasharray

Aceasta înseamnă că dorim o liniuță de lungime 20 cu spații de lungime 10, precum cele prezentate în Figura 10. În acest moment, s-ar putea să fii surprins că acest exemplu SVG are ceva de-a face cu diagramele circulare. Dar lucrurile devin mai clare atunci când aplicăm o contur cu o liniuță de 0 și spații mai lungi decât sau lungime egală circumferința cercului nostru (C = 2πr, sau în cazul nostru C = 2π × 30 ≈ 189):

Stroke-dasharray: 0 189; Figura 11 - Mai multe valori stroke-dasharray și rezultatul acestora; de la stânga la dreapta: 0 189; 40 189; 95 189; 150 189

După cum puteți vedea, în primul cerc din Figura 11, aceasta elimină complet cursa și rămânem doar cu cercul verde. Cu toate acestea, distracția începe atunci când începem să creștem prima valoare (Figura 11): din cauza unui decalaj atât de lung, nu vom mai obține cursă punctată, ci un accident vascular cerebral care acoperă atât de mult din circumferința cercului cât am specificat.

Poate ți-ai dat seama deja în ce direcție ne mișcăm: dacă reducem suficient de mult raza cercului nostru, astfel încât să-și ascundă complet cursa, vom ajunge la ceva foarte asemănător cu o diagramă circulară. De exemplu, în Figura 12, puteți vedea cum ar arăta acest lucru atunci când este aplicat unui cerc cu o rază de 25 și o lățime a cursei de 50:

Figura 12 - Imaginea noastră SVG începe să semene cu o diagramă circulară

Rețineți: liniile SVG sunt întotdeauna jumătate în interiorul și jumătate în afara elementului la care sunt aplicate. În viitor, vom putea controla acest comportament.

cerc (umplere: galbenverde; stroke: # 655; lățimea stroke: 50; stroke-dasharray: 60 158; / * 2π × 25 ≈ 158 * /)

Acum, transformarea acestei imagini într-o diagramă circulară precum cea creată în soluția anterioară este destul de ușoară: trebuie doar să adăugați un cerc verde mai mare pentru accident vascular cerebralși rotiți-l cu 90 ° în sens invers acelor de ceasornic astfel încât să înceapă de sus la mijloc. În măsura în care element este de asemenea element HTML, putem doar să-l stilăm:

Svg (transformare: rotire (-90deg); fundal: galbenverde; chenar-rază: 50%;) Figura 13 - Diagramă circulară finală cu SVG

Puteți vedea rezultatul final în Figura 13. Această metodă face și mai ușoară animarea diagramei circulare de la 0% la 100%. Trebuie doar să creăm o animație CSS care schimbă stroke-dasharray de la 0 158 la 158 158:

@keyframes umplere (la (stroke-dasharray: 158 158;)) cerc (umplere: galbenverde; accident vascular cerebral: # 655; stroke-width: 50; stroke-dasharray: 0 158; animație: umplere 5s liniar infinit;)

Ca o rafinare suplimentară, putem seta o anumită rază a cercului astfel încât circumferința acestuia să fie (infinit aproape de) 100, astfel încât să putem specificați lungimile stroke-dasharray ca procente, fara calcule. Deoarece circumferința este 2πr, avem nevoie de o rază de 100 ÷ 2π ≈ 15,915494309, care pentru nevoile noastre poate fi rotunjită la 16. De asemenea, setăm dimensiunile SVG în atributul viewBox, în loc de atribute de lățimeși înălțimea pentru a-l face redimensionabil la dimensiunea containerului său.

Cu aceste modificări, marcajul pentru diagrama circulară prezentată în Figura 13 devine:

Și CSS-ul va fi așa:

Svg (lățime: 100 px; înălțime: 100 px; transformare: rotire (-90 grade); fundal: galbenverde; chenar-rază: 50%;) cerc (umplere: galbenverde; contur: # 655; lățime stroke: 32; stroke-dasharray : 38 100; / * pentru 38% * /)

Notă, cât de ușor este acum să schimbi procentul... Chiar și cu această simplificare excesivă, totuși, nu dorim să repetăm ​​toate aceste markupuri SVG pentru fiecare diagramă circular. Este timpul ca JavaScript să ne ajute cu puțină automatizare. Vom scrie un mic script pentru a lua un marcaj HTML simplu ca acesta...

20%
60%

Și adăugați SVG inline în interiorul fiecărui element .pie cu toate elemente esentiale si atribute. De asemenea, va adăuga elementul pentru accesibilitate astfel încât utilizatorii <a href="https://bumotors.ru/ro/skachat-golosovoi-dvizhok-dlya-android-ekrannyi-diktor-dlya.html">cititoare de ecran</a> ar putea afla și ce procente sunt afișate. Scriptul final va arăta astfel:</p><p>$$ ("". plăcintă"). forEach (funcție (plăcintă) (var p = parseFloat (pie.textContent); var NS = "http://www.w3.org/2000/svg"; var svg = document. createElementNS (NS, „svg”); var circle = document.createElementNS (NS, „cercle”); var title = document.createElementNS (NS, „title”); circle.setAttribute („r”, 16); circle. 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 (titlu); svg.appendChild (cerc); pie.appendChild (svg);));</p><p>Iată-l! Ai putea crede că <a href="https://bumotors.ru/ro/podklyuchenie-stilei-css-kak-podklyuchit-css-metody-i-sposoby-podklyuchenii.html">Metoda CSS</a> mai bine, deoarece codul său este mai simplu și mai familiar. Cu toate acestea, metoda SVG are anumite avantaje față de soluția CSS pură:</p><ul><li><b>este mai ușor să adăugați o a treia culoare</b>: doar adăugați un alt cerc conturat și mutați-i cursa cu stroke-dashoffset. Sau adăugați lungimea cursei acesteia la lungimea cursei cercului anterior din fața (dedesubt). Cum ați adăuga exact cea de-a treia culoare la diagrama circulară creată în primul mod?</li><li>noi <b>nu ar trebui să depună niciun efort suplimentar în tipărire</b> deoarece elementele SVG sunt tratate ca conținut și tipărite în același mod ca elementele <img>... Prima soluție depinde de fundal și astfel nu va fi tipărită;</li><li>noi putem <b>schimba culorile folosind stiluri inline</b> ceea ce înseamnă că le putem schimba cu ușurință prin <b>scenarii</b>(adică în funcție de <b>intrarea utilizatorului</b>). Prima soluție se bazează pe pseudo-elemente, care nu pot accepta stiluri inline decât prin moștenire, ceea ce nu este întotdeauna convenabil.</li> fundal: conic-gradient (# 655 attr (data-valoare%), galbenverde 0); <p>De asemenea, face incredibil <a href="https://bumotors.ru/ro/how-to-add-a-photo-in-contact-a-few-simple-waysssss.html">simplă adăugare</a> a treia culoare. De exemplu, pentru o diagramă circulară, <a href="https://bumotors.ru/ro/modelirovanie-informacionnyh-sistem-podobnymi-diagrammami-mozhno.html">diagrama asemanatoare</a> mai sus, am adăuga doar încă două opriri de culoare:</p><p>Fundal: conic-gradient (roz intens 20%, # fb3 0, # fb3 30%, galbenverde 0);</p><p>Asta e tot! Lasă-ți comentariile!</p></ul> <p>Probabil ați întâlnit acești indicatori de încărcare, în special pe site-urile Flash. Acesta este un sector al unui cerc care devine din ce în ce mai mare până când se transformă într-un cerc complet.</p> <p>La prima vedere, sarcina pare simplă: faceți un cerc, rotiți-l și ascundeți partea din spatele unei măști. Dar, în realitate, totul se dovedește a fi ceva mai complicat. CSS nu este pregătit pentru astfel de sarcini, chiar și atunci când se utilizează preprocesoare precum SASS și Compass. Ne luptăm mereu când trebuie să facem diferite forme și mai ales când definim stiluri și animații pentru ele. Cea mai mare parte a timpului de lucru este petrecut cu asta. pentru a face ceva funcțional și pentru a sacrifica semantica codului și suportul acestuia.</p> <h2>De ce o facem?</h2> <p>Cea mai probabilă utilizare a unor astfel de articole este cronometrele. Dar <a href="https://bumotors.ru/ro/koncepciya-hranilishcha-dannyh-fizicheskie-i-virtualnye.html">acest concept</a> poate fi folosit pentru a face o diagramă circulară într-un singur CSS.</p> <p>Deși există câteva instrumente uimitoare pentru manipularea diagramelor circulare (mai ales în JavaScript), totuși vom crea un astfel de element numai în CSS și chiar îl vom anima cu câteva trucuri.</p> <p>Semantica codului va fi așa-așa! Dar acompaniamentul poate fi făcut destul de convenabil.</p> <h2>HTML</h2> <p>Avem nevoie de 3 elemente diferite:</p> <ul><li><b>spinner:</b> jumătate din cerc care se va roti;</li> <li><b>masca:</b> acest element ascunde cercul de rotire în timpul primelor 50% din animație;</li> <li><b>material de umplutură:</b> acest element umple cercul în ultimele 50% din animație.</li> </ul><p>Și toate cele trei elemente trebuie să aibă același părinte pentru poziționarea absolută:</p> <p> <div class="wrapper"> <div class="spinner pie"></div> <div class="filler pie"></div> <div class="mask"></div> </div></p> <p>Deoarece spinner și filler sunt două jumătăți ale aceluiași cerc, vom folosi clasa .pie pentru ele.</p> <h2>CSS</h2> <p>Părintele este mărimea și <a href="https://bumotors.ru/ro/css-raspolozhenie-elementov-css---pozicionirovanie-blokov.html">poziționare absolută</a> context pentru cronometru:</p> <p>Wrapper (lățime: 250px; înălțime: 250px; poziție: relativă; fundal: alb;)</p> <p>Este important ca lățimea și înălțimea să fie egale pentru a obține cercul și totul funcționează.</p> <p>Elementele de filare și umplere folosesc <a href="https://bumotors.ru/ro/velcom-kody-nomerov-baza-dannyh-mts.html">codul dat</a> CSS:</p> <p>Placintă (lățime: 50%; înălțime: 100%; poziție: absolută; fundal: # 08C; chenar: 10px rgba solid (0,0,0,0.4);)</p> <p>Au o lățime egală cu 50% din elementul părinte, deci sunt două părți ale aceluiași cerc, iar înălțimea lor este egală cu înălțimea elementului părinte. De asemenea, definim aceeași culoare și cadru pentru ele.</p> <h3>Element spinner</h3> <p>Spinner (chenar-rază: 125px 0 0 125px; z-index: 200; chenar-dreapta: niciunul; animație: rotație 10s liniar infinit;)</p> <p>Faceți-l un semicerc folosind proprietatea rază-chenar din colțurile din stânga sus și din stânga jos. De asemenea, definim un index z pozitiv pentru a-l poziționa deasupra elementului de umplere, dar sub mască.</p> <p>Apoi adăugați animație timp de 10 secunde. Despre animație vom vorbi mai târziu.</p> <h3>Element de umplere</h3> <p>Umplere (chenar-rază: 0 125px 125px 0; z-index: 100; chenar-stânga: niciunul; animație: umpleți pași de 10 s (1, sfârșit) infinit; stânga: 50%; opacitate: 0;)</p> <p>Pentru acest element, setați raza de margine și indexul z, eliminați chenarul din stânga și animați-l timp de 10 secunde. Pentru un element dat, funcția animație-temporizare nu primește o valoare liniară, ci pași (1, final). Aceasta înseamnă că animația va rula instantaneu.</p> <p>Deoarece elementul de umplere nu ar trebui să fie vizibil în prima jumătate a animației, opacitatea sa va fi 0 și poziția sa va fi de 50% din lățimea elementului părinte.</p> <h3>Elementul „mască”.</h3> <p>Mască (lățime: 50%; înălțime: 100%; poziție: absolut; index z: 300; opacitate: 1; fundal: moștenire; animație: masca pași de 10s (1, final) infinit;)</p> <p>Masca este prezentă de la începutul animației, deci opacitatea sa este setată la 1 și fundalul este moștenit de la părinte (astfel încât să fie invizibil). Pentru a acoperi elementul rotativ, acesta va avea aceleași dimensiuni și proprietatea z-index este setată la 300.</p> <h3>Cadre de animație</h3> <p>@keyframes rotație (0% (transformare: rotire (0deg);) 100% (transformare: rotire (360deg);)) @keyframes umplere (0% (opacitate: 0;) 50%, 100% (opacitate: 1;) ) Mască @keyframes (0% (opacitate: 1;) 50%, 100% (opacitate: 0;))</p> <p>Prima animație (rota) este folosită pentru elementul spinner. Se rotește treptat de la 0 la 360 de grade în 10 secunde.</p> <p>A doua animație (umplere) este utilizată pentru elementul de umplere. Schimbă imediat opacitatea de la 0 la 1 după 5 secunde.</p> <p>Ultima animație (mască) este folosită pentru elementul mască. Schimbă imediat opacitatea de la 1 la 0 după 5 secunde.</p> <p>Animația arată astfel:</p> <ul><li><b>T0</b>- spinner-ul este în stânga, ascuns de mască. Elementul de umplere este ascuns.</li> <li><b>T1</b>- spinnerul începe să se rotească în sensul acelor de ceasornic și apare încet din spatele măștii.</li> <li><b>T2</b>- spinnerul r este rotit 360/10 * 2 = 72 ° și continuă să se rotească.</li> <li><b>T3</b>- spinnerul este rotit 360/10 * 3 = 108 ° și continuă să se rotească.</li> <li><b>T4</b>- spinnerul este rotit 360/10 * 4 = 144 ° și continuă să se rotească.</li> <li><b>T5</b>- spinnerul este rotit 360/10 * 5 = 180 ° și continuă să se rotească. În acest moment, elementul de umplere este vizibil instantaneu, iar masca este ascunsă.</li> <li><b>T6</b>- spinnerul este rotit 360/10 * 6 = 216 ° și continuă să se rotească.</li> <li><b>T7</b>- spinnerul este rotit 360/10 * 7 = 252 ° și continuă să se rotească.</li> <li><b>T8</b>-filator este rotit 360/10 * 8 = 288 ° și continuă să se rotească.</li> <li><b>T9</b>- spinnerul este rotit 360/10 * 9 = 324 ° și continuă să se rotească.</li> <li><b>T10</b>- spinnerul este rotit la 360 °. Ne-am întors la punctul de plecare. Resetarea animației. Apare masca și elementul de umplere este ascuns.</li> </ul><h2>Primă</h2> <p>Câteva trucuri suplimentare.</p> <h3>Pauză la hover</h3> <p>Wrapper: hover .filler, .wrapper: hover .spinner, .wrapper: hover .mask (animație-play-stare: întrerupt;)</p> <p>Cu acest cod, puteți opri toate animațiile când treceți cu mouse-ul peste elementul părinte.</p> <h3>Inserați conținut</h3> <p>Datorită proprietății z-index, putem adăuga cu ușurință conținut la spinner și îl putem face să se rotească. Încercați următorul cod:</p> <p>Spinner: după (conținut: ""; poziție: absolut; lățime: 10px; înălțime: 10px; chenar-rază: 50%; sus: 10px; dreapta: 10px; fundal: #fff; chenar: 1px rgba solid (0,0) , 0,0,4); casetă-umbră: inset 0 0 3px rgba (0,0,0,0,2);)</p> <h2>Preprocesor sau variabile CSS</h2> <p>În prezent, codul este foarte greu de întreținut. Dar dacă folosim variabile (în preprocesor sau intern așteptat <a href="https://bumotors.ru/ro/peremennye-v-html-kode-nativnye-peremennye-v-css-uzhe-pora.html">variabile css</a>), totul poate deveni mult mai ușor. De exemplu, puteți adăuga variabile pentru a controla durata în loc să fixați codul în cele 3 definiții de animație.</p> <p>Dacă doriți să îmbunătățiți mentenabilitatea codului fără a utiliza preprocesoare, puteți crea o clasă cu un control al duratei animației și o puteți adăuga la 3 copii. De exemplu astfel:</p> <p>Animație-durată (animație-durată: 10s;)</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>dezavantaje</h2> <p>Această tehnică are mai multe dezavantaje:</p> <ul><li>Gradienele nu sunt acceptate.</li> <li>Umbrele nu sunt acceptate.</li> <li>Fără adaptabilitate. Dacă elementul părinte este redimensionat, atunci totul va fi bine, cu excepția razei de rotunjire a marginii. Va trebui schimbat manual.</li> <li>Fără semantică (4 elemente pentru o animație).</li> </ul><h2>Suport pentru browser</h2> <p>Din moment ce folosim <a href="https://bumotors.ru/ro/zaderzhka-animacii-css3-primery---obratnaya-animaciya-css-kratkaya.html">Animații CSS</a>, atunci suportul pentru browser este destul de slab:</p> <ul><li>Internet Explorer 10</li> <li>Firefox 12+</li> <li>Crom</li> <li>Safari 5+</li> <li>Opera 12+</li> <li>iOS Safari 3+</li> <li>Android 2+</li> </ul> <ul><li>Traducere</li><li>Tutorial</li> </ul><p>Formularele sunt o modalitate excelentă de a adăuga un pic de aromă elementelor de pe pagina dvs. web. Cercurile sunt deosebit de bune în această privință, deoarece sunt holistice, simple și asemănătoare plăcintei. Acum serios, cui nu iubește plăcinta?</p><p>După cum trebuie să fi observat din anii de experiență în utilizarea internetului, majoritatea elementelor de pe paginile web sunt, de fapt, fie pătrate, fie dreptunghiuri. Prin urmare, în unele cazuri, elemente interesante, cum ar fi cercurile și triunghiurile din designul dvs., pot fi destul de utile. Acest tutorial va demonstra cum să construiți o diagramă animată, similară cu cele pe care le vedeți de obicei pe site-urile de portofoliu. Acest lucru vă poate ajuta să vă evidențiați vizual abilitățile, precum și să vă demonstrați ce sarcini vă puteți ocupa. Aruncă o privire la demo pentru a vedea rezultatul final.</p><h3>Deci, să începem!</h3>Când scriu acest tutorial, voi lucra cu Circliful. Este un plugin jQuery gratuit și open source. Puteți descărca fișierul principal de pe Github. Include un fișier .js împreună cu o foaie de stil CSS corespunzătoare. Pagina trebuie să le conțină pe ambele pentru a obține efectul de cerc. <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>Statistici cerc animate - Demo de monstru șablon

Pagina mea conține o foaie de stil styles.css similară pentru stilurile mele personale CSS. De asemenea, trebuie să faceți o copie a bibliotecii jQuery. Este necesar pentru ca pluginul să funcționeze corect.
În sine, pagina este destul de ușor de structurat. Elementele cerc sunt conținute în etichete div care folosesc atribute HTML5 pentru a manipula datele. Alternativ, acestea pot fi stocate într-o funcție jQuery, dar dacă doriți un control mai bun asupra fiecărui element, atunci este mai ușor să lucrați în HTML.

Photoshop

Ilustrator

Dupa efecte

Aceasta este o copie a primului rând de cercuri, constând din 3 unități animate. Toate aceste atribute de date sunt explicate în continuare în documentația pluginului. Fiecare reprezintă o opțiune care definește un efect de animație. Mai jos este o scurtă descriere a opțiunilor pe care le folosesc:

  • data-dimension - dimensiunea totală a lățimii/înălțimii cercului;
  • data-text - textul care apare în centrul fiecărui cerc;
  • data-width - grosimea arcului de date rotativ;
  • data-fontsize - dimensiunea fontului textului central;
  • date-percent - un număr de la 0 la 100 reprezentând procentele din cercul tău;
  • data-fgcolor - culoarea primului plan a cercului;
  • data-bgcolor - culoarea de fundal a cercului;
  • data-fill - umplerea interioară a culorii de fundal a cercului interior.

Aspectul paginii CSS

Nu insist să editezi direct jquery.circliful.css cu excepția cazului în care doriți să personalizați pluginul, desigur. Majoritatea culorilor pot fi modificate direct din atributele de date HTML5 și, dacă doriți cu adevărat să rescrieți oricare dintre stiluri Circliful, aș recomanda să faceți acest lucru în propria foaie de stil.
După ce v-am spus acest lucru, am creat propria mea foaie de stil pentru proiectul dat, nu pentru a rescrie stiluri Circliful... Pagina web în sine are nevoie de un aspect implicit care este cu adevărat ușor de proiectat. Zona de conținut este centrată într-o secțiune mică pentru o diagramă circulară. Fiecare zonă se mișcă liber în interiorul containerului de linie din original #stats div.

/ ** structura paginii ** / .wrap (afișare: bloc; margine: 0 automat; lățime maximă: 800px;) #intro (afișare: bloc; margine-jos: 25px; text-align: center;) #intro p (dimensiune font: 1,8 em; înălțime linie: 1,35 em; culoare: # 616161; stil font: cursiv; margine-jos: 25px;) #stats (afișare: bloc; lățime: 100%; umplutură: 15px 0; fundal: # f8f8f8; chenar-sus: 4px solid # c3c3c3; chenar-jos: 4px solid # c3c3c3;) #stats .row (afișare: bloc;) .circle-container (afișare: bloc; float: stânga; margine-dreapta) : 55px; margin-bottom: 45px;) .circle-container h3 (afișare: bloc; text-align: center; font-size: 2.25em; line-height: 1.4em; culoare: # 363636; text-shadow: 1px 1px 0 #fff;)

În cadrul fiecărei secțiuni, conținutul este păstrat .wrap div pentru fixare în centru. De asemenea, elementele cercului care se mișcă liber au nevoie de un container suplimentar. .clearfix pentru a menține totul corect aliniat.

/ ** clearfix ** / .clearfix: după (conținut: "."; afișare: bloc; clar: ambele; vizibilitate: ascuns; line-height: 0; înălțime: 0;) .clearfix (display: inline-block; ) html .clearfix (afișare: bloc;) * html .clearfix (înălțime: 1%;)

Această clasă clearfix este cunoscută de ani de zile ca o soluție de containere cu mișcare liberă. De obicei, acestea sunt eliminate din textul documentului și nu își păstrează lățimea/înălțimea inițială. Dar aceasta menține constantă lățimea containerului #statisticiși lasă loc pentru mai mult conținut pentru a merge în jos pe pagină.

Retușuri finale

Așadar, am frământat aluatul, am umplut tava de plăcintă, am dat-o la cuptor și suntem aproape gata să-l degustăm. Dacă totul arată suficient de bine, care este pasul final? Avem nevoie de cod jQuery pentru a decora acest proiect.
Deschideți o nouă etichetă de script în partea de jos a acestei pagini HTML. Acesta va conține un mic fragment de JavaScript. Deoarece am folosit toate atributele de date HTML5, nu trebuie să apelăm nicio opțiune jQuery. Scriptul trebuie doar să ruleze funcția Circliful pe fiecare cerc de div. Folosind un nume de clasă duplicat, cum ar fi .circlestat face procesul foarte ușor.

$ (funcție () ($ ("". circlestat"). circliful ();));

Pentru cei care nu sunt familiarizați cu structura de sintaxă jQuery, voi oferi o scurtă descriere. După ce documentul este încărcat, rulăm o nouă funcție. Scopul nostru interior este fiecare element care folosește clasa .circlestatși rulează funcția circular ()... Aceasta conduce pluginul Circliful, care creează efecte de animație, în acțiune și aplică conținut / culori suplimentare.

Nu pot spune că aceste cercuri vor fi întotdeauna cea mai bună soluție. Am văzut o mulțime de portofolii care se bazau pe cuvinte și numere, dar nu funcționează în sine. Luați în considerare utilizarea acestor cercuri în rare ocazii și încercați să le împrumutați în alte scopuri decât abilitățile simple. Statisticile tale nu trebuie să fie măsurate ca procent - ele pot arăta câți ani ai fost în afaceri, numărul total de proiecte pe care le ai sau alte cifre similare. Puteți descărca gratuit o copie a tutorialului meu și puteți experimenta cu codul pentru a-l îmbunătăți pentru proiectele dvs.

„Bucătăria” unui dezvoltator web este un pic ca gătitul acasă. Dezvoltatorul are acces la o varietate de biblioteci din cod terminat care îl va ajuta să creeze o aplicație web, în ​​același mod în care un bucătar de acasă poate folosi alimente comode pentru a-și găti felul de mâncare mai eficient. În ambele cazuri, calitatea articolelor pregătite în prealabil ar trebui să fie foarte importantă. Cu toate acestea, uneori calitatea este sacrificată pentru comoditate. Nu mă înțelege greșit, comoditatea nu este întotdeauna un lucru rău. Poate fi util atunci când argumentele pro și contra sunt cunoscute și bine analizate. Analizând opțiunile pentru diagramele plăcinte și gogoși în HTML, putem evidenția doar câteva:

  1. Diagramă bazată pe elemente de pânză generată pe client (adică JavaScript)
  2. O diagramă bazată pe SVG și generată pe client (adică JavaScript)
  3. Server de diagrame bazat pe SVG generat

Biblioteci gata de fabricație folosind Canvas și JavaScript SVG

Bibliotecile JavaScript pentru desenarea diagramelor sunt adesea mai convenabile și încărcate cu o mulțime de opțiuni interesante, cum ar fi interactivitatea. Iată câteva biblioteci:

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

Câteva rânduri de JavaScript și o serie de date vă vor permite să creați o diagramă pe site-ul dvs. în câteva secunde. Nu este surprinzător că mulți aleg această cale.

Deci, de ce să vă deranjați și să le codați singur? Aceasta este o întrebare grozavă pe care mi-am pus-o și eu. Până la urmă, m-am convins de trei lucruri:

  1. Cele mai multe biblioteci JavaScript sunt greu de găsit, în special cele bazate pe elementul Canvas (cu excepția Google Charts)
  2. Dacă informațiile din diagramă sunt foarte importante (cum era în situația mea), ar trebui să ne bazăm pe un script care rulează pe client pentru a genera informațiile? Eu nu cred acest lucru.
  3. Dacă aprofundez codul SVG și îmi murdăresc mâinile, s-ar putea să învăț puțin mai multe despre prostiile magice subiacente. Cu alte cuvinte, procesul de învățare poate fi distractiv și merită efortul.

Situatia mea

Echipa mea avea nevoie de o componentă simplă care să poată fi construită pe server și afișată informatii simple despre utilizarea conturilor. De asemenea, preferința noastră a fost pentru ușurința acestei componente (evitați JavaScript dacă este posibil); nu trebuia să fie prea sofisticat sau interactiv, trebuia doar să afișeze date importante.

Notă suplimentară despre diagramele bazate pe Canvas

Poate ați observat (dacă sunteți familiarizat cu crearea de diagrame pentru web) că nu am inclus Chart.js în lista de biblioteci recomandate de mai sus. Deși îl puteți folosi cu siguranță, merită să rețineți că Chart.js folosește un element Canvas pentru a-și reda diagramele, iar conținutul elementului nu face parte din DOM. Prin urmare, acestea nu sunt disponibile pentru cititorii de ecran. Asta înseamnă că trebuie să accepți măsuri suplimentare pentru a vă asigura că datele dvs. sunt disponibile.

O introducere în diagramele CSS și SVG

Diagramele CSS și SVG sunt în mod inerent mai accesibile și mai semantice decât alte tehnologii. Dar pot fi complexe și poate consuma mai mult timp dacă le codificați manual.

CSS Ninja Lea Verou oferă mai multe opțiuni pentru crearea de diagrame circulare de la zero în articolul ei „Designing Flexible, Maintainable Pie Charts With CSS and SVG”. Metodele ei pot fi aplicate și la diagramele gogoși.

Robin Randle a scris, de asemenea, despre crearea graficelor exclusiv cu CSS, unde și-a subliniat eșecurile în abordare.

Inexplicabil

Am căutat pe Google despre SVG și diagrame de gogoși și am găsit articole de Lea Verou și Robin Randle (menționate mai sus), în plus față de alte câteva. Aproape toți au discutat despre utilizarea atributelor stroke-dasharray și stroke-dashoffset în SVG pentru a poziționa porțiuni dintr-o diagramă. Aceste proprietăți sunt identice cu „stroke” atunci când se creează vectori în programe precum Adobe Illustrator.

Unele dintre aceste articole chiar au discutat despre animația în SVG, ceea ce este grozav, dar nici nu este ceea ce căutam.

După cercetarea mea, am putut să-mi dau seama că folosind din SVG împreună cu stroke și stroke-dasharray mi-ar putea oferi segmentele de plăcintă imbricate de care aveam nevoie. De asemenea, mi-am dat seama că stroke-dashoffset mi-ar permite să „animez”, sau cu alte cuvinte, să poziționez segmentul acolo unde mi-am dorit să fie în cerc.

Cu toate acestea, nu am găsit nicio explicație clară a modului exact în care au funcționat atributele liniuței și a modului în care acestea se raportau la circumferința cercului. Și ceea ce era mai de neatins era atașarea mai multor elemente (unul după altul) în jurul cercului. Mai bine, care este formula pentru obținerea acestor poziții relative folosind dimensiunile unice/dinamice ale segmentelor și atributele de contur ale SVG?

Așa că am devenit hotărât să aflu singur.

Notă: dacă găsiți resurse care explică aceste concepte, vă rugăm să distribuiți.

Cum să faci o diagramă SVG DIY

Explicația stroke-dasharray și stroke-dashoffset

Să începem cu o simplă diagramă SVG „gogoșă”.

Veți observa câteva lucruri:

  1. Raza (atributul „r”) pare absurd! De ce? Am vrut să fac dimensiunile segmentelor mele logice, ușor de înțeles și lizibile. Pentru a realiza acest lucru, am decis să bazez totul pe 100% (sau un cerc de 100). Formele SVG sunt scalabile, deci nu contează cât de mari ajung; cel puțin matematica va fi simplă aici. Mergând mai departe în zona pe care mi-o amintesc de la matematica de liceu: știu că raza unui cerc este r = C / (2π) sau r = 100 / (2π). Rezultatul este 15,91549430918952. Un număr nebun cu o grămadă de numere, da, știu, dar mai târziu ne va face viața mai ușoară tuturor.
  2. Pentru viewBox valorile sunt „0 0 42 42”. Ele trebuie să fie duble față de valorile cx & cy (centrul x și centrul y). și să fie puțin mai mare decât diametrul cercurilor (inclusiv lățimea conturului).
  3. Există cu clasa „goașă-găură”. Acesta este ceea ce este garantat pentru a face centrul alb. Dacă acest lucru nu este important pentru dvs. (în cazul unui simplu Graficul proporțiilor), atunci acest element poate fi eliminat.
  4. De asemenea, există cu clasa „ingele de gogoși”. Servește ca fundal gri deschis în cazul în care sectoarele nu umplu 100% din cerc.

Deci, trebuie să ajustăm dimensiunea sectorului la procentul dorit. Să folosim 85%:


Sectoarele sunt create folosind un atribut de contur SVG numit stroke-dasharray. Valoarea pe care o setăm în exemplul de mai sus este „85 15”.

Dacă ne gândim la diagramă ca fiind una circulară, atunci din prezența unui sector de 85%, putem judeca despre restul de 15%. Aceste două valori sunt o matrice delimitată de spațiu. Iată ce se întâmplă: se creează o bară de 85, apoi un spațiu de 15, apoi o bară de 85, un spațiu de 15 și așa mai departe și așa mai departe. Dar din moment ce folosim un cerc și totalul este 100, totul se repetă din nou. Dacă nu am făcut a doua valoare din matrice astfel încât să completeze primul număr la o sută, atunci vom obține a treia cursă (sau o parte) sau mai multe. De exemplu, iată un stroke-dasharray din „10 10”:


Deci, în forma 2 și forma 3, puteți observa că stroke-dasharray nu începe chiar de sus (la 12:00). În schimb, începe de fapt cu partea dreapta(3:00) și se mișcă în sensul acelor de ceasornic într-un cerc.

Dacă vrem să poziționăm (sau să începem) deasupra, atunci trebuie să folosim stroke-dashoffset. Cu toate acestea, spre deosebire de stroke-dasharray, stroke-dashoffset se mișcă în sens invers acelor de ceasornic. Deci, va trebui să setăm valoarea la „25” (25% în cealaltă direcție de la 3:00, înapoi la 12:00). Amintiți-vă că acesta nu este un număr negativ, deoarece offset-ul se mișcă împotriva săgeții.


Cum să aranjezi feliile de gogoși în jurul SVG

Acum trebuie să adăugăm sectoare suplimentare în jurul cercului. Să folosim un sector care reprezintă 15% din cerc. Procentul rămas pentru stroke-dasharray va fi de 85%, indiferent de orice alte sectoare. Prin urmare, codul va arăta astfel:

Am lăsat stroke-dashoffset la 25, așa că sectorul verde începe de sus și merge în sensul acelor de ceasornic, suprapunându-se pe primul sector (roz).


Evident, acest lucru nu este tocmai ceea ce ne-am dorit. Vrem ca al cincisprezecelea procent (verde) să se potrivească aproape de spațiul lăsat de optzeci și cinci la sută (roz). Putem ajusta stroke-dashoffset până când avem noroc, dar nu ar fi atât de ușor dacă am mai avea două sectoare. În schimb, avem nevoie de o formulă:

Cerc - lungimea totală a tuturor sectoarelor anterioare + offset al primului sector = offset al sectorului curent

Introducând numerele noastre, obținem:


Adăugați mai multe felii la diagrama noastră!

Aceeași formulă funcționează pentru adăugarea de sectoare suplimentare. Să umplem graficul cu 40, 30, 20 la sută și restul de 10 nu vor fi folosiți.

Rezultat:


Adăugarea de text în interiorul diagramei

Nu ar fi o diagramă gogoașă fără text în și în afara; pentru asta e gaura, nu? Ei bine, adăugarea de text este ușoară. Folosim doar elementul care este nativ pentru formele SVG.

10 beri

Veți observa că am împărțit textul diagramei în 2 elemente și le-a grupat ( ). Acest lucru a fost făcut astfel încât să putem suprapune mai ușor titlul și numărul unul peste altul și, de asemenea, să le aranjam ca o singură unitate. Am ajustat atributele X și Y pentru a începe din centrul formei pe linia de bază și le-am aliniat la stânga.


După cum puteți vedea, poziționarea nu este tocmai corectă, așa că trebuie să o decoram cu puțin CSS:

Mai întâi, să adăugăm fontul Montserrat (doar pentru că îmi place). Apoi trebuie să ajustam dimensiunea fontului și înălțimea liniei. După adăugarea „translateY” în 0.25em, textul este puțin aliniat vertical, dar încă nu am terminat.

Trebuie să facem ambele casete de text mai mici și aliniate la centru, ajustând dimensiunea fontului oriunde dorim (0,6 em pentru numărul mai mare și 0,2 em pentru titlu arată bine) și folosind proprietatea „text-anchor” cu valoarea „mijloc”. ".

Textul este acum centrat. Tot ce rămâne este să le faci cu majuscule (acest lucru este ușor) și să-i aranjezi elementele individuale folosind „translateY”, astfel încât să se plieze corect. Și asta este ceea ce avem acum:


Probleme de accesibilitate

După cum am menționat mai devreme, conținutul SVG face parte din DOM, deci este în mod inerent mai accesibil. Acest lucru face incredibil de ușor să oferiți un context suplimentar pentru cititorii de ecran prin atribute și elemente precum titluri.

Primul nivel de preocupări privind accesibilitatea este de a face diagrama SVG mai semantică prin încadrarea acesteia într-un element

(deoarece aceasta este o diagramă). Ca formă, putem folosi elementul pentru a furniza un titlu sau o descriere pentru diagrama gogoși.

În plus, putem adăuga etichete de conținut și <desc>(care sunt native pentru SVG) și asociați-le cu anteturi ARIA, ID-uri și rolul de „a oferi mai mult context pentru cititoarele de ecran”.</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">Bere în pivnița mea Cvadrupeli belgieni Segmentul grafic roz acoperă 40% din total, adică 4 cvadrupeli belgieni din 10 în total. Imperial India Pale ales Segment de diagramă verde care acoperă 20% din total, adică 2 Imperial India Pale Ales din 10 total. Ruse Imperiale Stouts Segment de diagramă albastră care acoperă 3% din total, adică 3 Russian Imperial Stout din 10 total. 10 beri

Tabel cu gogoși care arată un total de 10 beri. Două beri sunt Imperial India Pale Ales, patru beri sunt Belgian Quadrupels și trei sunt Russian Imperial Stouts. Ultima bere rămasă este neetichetată.

Putem adăuga, de asemenea, cheia de legendă pentru diagramă ca parte

, notând-o cu rolul „vizualizare” și atributul ascuns de aria, deoarece este cu adevărat necesar pentru claritate.

Cu un vârf de magie CSS Flexbox putem poziționa cheia la dreapta și o aliniem vertical cu diagrama. Ce ne va oferi produsul final:


Din moment ce designul CSS cu cheia la care se aplică proprietate frontier-radiusși Flexbox ar putea fi articole separate (al doilea necesită o explicație mult mai lungă), voi lăsa acele subiecte pentru mai târziu.

Rezultate finale

După cum am menționat mai devreme, scrierea manuală a codului pentru obiectele SVG poate fi consumatoare de timp, mai ales dacă luați în considerare faptul că există multe biblioteci JavaScript excelente care vor construi aceste obiecte pentru dvs. Dar pot exista cazuri (cum ar fi situația mea) în care dumneavoastră sau echipa dumneavoastră aveți nevoie de o metodă care să nu atingă JavaScript, una care va fi compilată pe partea serverului.

Vestea bună este că, odată ce te pricepi la asta intr-un mod similar, poate fi aplicat de dvs. oriunde altundeva cu cost minim efort. În plus, a-ți murdara mâinile cu obiecte SVG mod bun aflați mai multe despre modul în care funcționează și aflați beneficiile utilizării lor.

Rezultatele mele:

  • Aplicarea matematicii la așa ceva este mult mai distractiv decât era în liceu.
  • În retrospectivă, înțeleg că logica din spatele stroke-dasharray și stroke-dashoffset nu este atât de complexă pe cât credeam inițial.
  • Nu uitați să adăugați aici niveluri suplimentare disponibilitate. La urma urmei, accesibilitatea nu este doar de dragul cititoarelor de ecran. De asemenea, este necesar pentru a face conținutul dvs. mai accesibil și mai consumabil de către toți oamenii și toate dispozitivele (inclusiv motoare de căutare). Dacă biblioteca dvs. JavaScript nu are funcții de accesibilitate, luați în considerare modificarea acesteia.

Top articole similare