Si të konfiguroni telefonat inteligjentë dhe PC. Portali informativ

Grafiku me byrek html. Grafikët svg të byrekëve dhe donutëve në HTML5 nga e para

  • Përkthimi
  • tutorial

Formularët janë një mënyrë e mirë për t'u shtuar pak elementeve në faqen tuaj të internetit. Rrathët janë veçanërisht të mirë në këtë drejtim, sepse ato janë të plota, të thjeshta dhe si byrek. Tani seriozisht, kush nuk i pëlqen byrekët?

Siç duhet ta keni vënë re nga përvoja juaj e përdorimit të internetit për shumë vite, shumica e elementeve në faqet e internetit janë, në fakt, ose katrorë ose drejtkëndësha. Prandaj, në disa raste, elementë interesantë si rrathët dhe trekëndëshat në dizajnin tuaj mund të jenë mjaft të dobishëm. Ky tutorial do të demonstrojë se si të ndërtoni një tabelë të animuar byrek, të ngjashme me ato, të cilat zakonisht i shihni në faqet e portofolit. Kjo mund t'ju ndihmojë të theksoni vizualisht aftësitë tuaja, si dhe të demonstroni se cilat detyra mund të përballoni. Hidhini një sy demonstrimit për të parë rezultatin përfundimtar.

Pra, le të fillojmë!

Ndërsa shkruaj këtë tutorial, unë do të punoj me Circliful. Ky është një shtojcë jQuery pa pagesë dhe me burim të hapur. Mund ta shkarkoni skedarin kryesor nga Github. Ai përfshin një skedar .js së bashku me fletën përkatëse të stilit CSS. Faqja duhet të përmbajë të dyja për të arritur efektin e rrethit.




 
 
 Statistikat e rrethit të animuar - Demoja e modelit përbindësh
 
 
 
 
 
 
 

Faqja ime përmban një fletë stilesh të ngjashme styles.css për stilet e mia personale CSS. Ju gjithashtu duhet të bëni një kopje të bibliotekës jQuery. Është e nevojshme që shtojca të funksionojë siç duhet.
Në vetvete, faqja është mjaft e lehtë për t'u strukturuar. Elementet e rrethit përmbahen brenda etiketave div që përdorin atributet HTML5 për të manipuluar të dhënat. Përndryshe, ato mund të ruhen në Funksionet jQuery, por nëse doni kontroll më të mirë mbi secilin element, atëherë është më e lehtë të punoni në HTML.

photoshop

Ilustruesi

pas efekteve

Kjo është një kopje e rreshtit të parë të rrathëve, i përbërë nga 3 njësi të animuara. Të gjitha këto atribute të të dhënave shpjegohen më tej në dokumentacionin e shtojcave. Secili përfaqëson një opsion që përcakton efektin e animacionit. Unë jap më poshtë Përshkrim i shkurtër opsionet që përdor:

  • dimensioni i të dhënave - madhësia totale e gjerësisë / lartësisë së rrethit;
  • të dhëna-tekst - teksti që shfaqet në qendër të çdo rrethi;
  • gjerësia e të dhënave - trashësia e harkut rrotullues të të dhënave;
  • data-fontsize - madhësia e shkronjave të tekstit në qendër;
  • përqindje e të dhënave - një numër nga 0-100 që përfaqëson përqindjet në rrethin tuaj;
  • data-fgcolor - ngjyra e planit të parë të rrethit;
  • data-bgcolor - ngjyra e sfondit të rrethit;
  • data-fill - mbushje e brendshme e ngjyrës së sfondit të rrethit të brendshëm.

Struktura e faqes CSS

Unë nuk insistoj që ju të redaktoni drejtpërdrejt jquery.circliful.css, sigurisht, nëse nuk dëshironi të personalizoni shtojcën. Shumica e ngjyrave mund të ndryshohen drejtpërdrejt nga atributet e të dhënave HTML5, dhe nëse vërtet dëshironi të anashkaloni ndonjë nga stilet Rrethore, Unë do të rekomandoja që ta bëni këtë në fletën tuaj të stilit.
Pasi ju thashë këtë, unë krijova fletën time të stilit për këtë projekt, jo për të rishkruar stile. Rrethore. Vetë faqja e internetit ka nevojë për një strukturë të paracaktuar që është vërtet e lehtë për t'u dizajnuar. Zona e përmbajtjes përqendrohet në një seksion të vogël për një grafik byrek. Çdo rajon është i lëvizshëm lirisht brenda kontejnerit të rreshtit brenda origjinalit #statsdiv.

/** struktura e faqes **/ .wrap ( shfaqja: bllok; marzhi: 0 automatik; gjerësia maksimale: 800 px; ) #intro ( shfaqja: bllok; margjina-fund: 25 px; rreshtimi i tekstit: në qendër; ) #intro p ( madhësia e shkronjave: 1,8em; lartësia e rreshtit: 1,35em; ngjyra: #616161; stili i shkronjave: italic; margjina e poshtme: 25 px; ) #stats ( shfaqja: bllok; gjerësia: 100%; mbushja: 15 px 0; sfond: #f8f8f8; kufiri-lart: 4px solid #c3c3c3; kufiri-fund: 4px solid #c3c3c3; ) #stats .row ( shfaqja: bllok; ).circle-container ( shfaqja: bllok; noton: majtas; margjina-djathtas : 55 px; margjina e poshtme: 45 px; ) .circle-container h3 ( ekrani: bllok; rreshtimi i tekstit: në qendër; madhësia e shkronjave: 2,25em; lartësia e rreshtit: 1,4em; ngjyra: #363636; hije e tekstit: 1px 1px 0 #fff;)

Brenda çdo seksioni, përmbajtja mbahet brenda .wrapdiv për të rregulluar në qendër. Gjithashtu, elementët e rrethit që lëvizin lirshëm kanë nevojë për një enë shtesë. .sqaroj për të mbajtur gjithçka në linjë siç duhet.

/** sqarim **/ .clearfix:after ( përmbajtja: "."; ekrani: bllok; i qartë: të dyja; dukshmëria: e fshehur; lartësia e linjës: 0; lartësia: 0; ) .clearfix ( shfaqja: blloku i brendshëm; ) html .clearfix ( shfaqja: bllok; ) * html .clearfix (lartësia: 1%; )

Kjo klasë qartësoj prej vitesh njihet si tretësirë ​​kontejneri me elementë që lëvizin lirshëm. Zakonisht ato hiqen nga teksti i dokumentit dhe nuk ruajnë vlerën e gjerësisë/lartësisë së tyre origjinale. Por kjo e mban konstante gjerësinë e enës #statistika dhe lë vend për më shumë përmbajtjen që do të gjendet më poshtë në faqe.

Prekjet e fundit

Pra, brumin e gatuajmë, mbushim tavën e byrekut, e fusim në furrë dhe jemi pothuajse gati për të marrë një mostër. Nëse gjithçka duket mjaft mirë, cili është hapi përfundimtar? Ne kemi nevojë për një kod jQuery për të dekoruar këtë projekt.
Hapni një etiketë të re skripti në fund të kësaj faqet HTML. Ai do të përmbajë një pjesë të vogël të JavaScript. Meqenëse kam përdorur të gjitha atributet e të dhënave HTML5, nuk kemi nevojë të thërrasim asnjë opsion jQuery. Skripti thjesht duhet të ekzekutojë funksionin Rrethore në çdo divs rrethi. Përdorimi i një emri të dyfishtë të klasës, si p.sh .circlestat e bën procesin shumë të lehtë.

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

Për ata që nuk janë të njohur me sintaksën jQuery, do të jap një përshkrim të shkurtër. Pasi të jetë ngarkuar dokumenti, ne ekzekutojmë veçori e re. Qëllimi ynë i brendshëm është çdo element që përdor klasën .circlestat dhe ekzekutoni funksionin rrethore (). Kjo sjell shtojcën Rrethore, i cili krijon efekte animacioni, në veprim dhe aplikon përmbajtje/ngjyra shtesë.

Nuk mund të them që këto qarqe do të jenë gjithmonë zgjidhja më e mirë. Kam parë shumë portofol që bazoheshin në fjalë dhe numra, por jo në vetë punën. Merrni parasysh përdorimin e këtyre rrathëve në raste të rralla dhe provoni t'i huazoni ato për përdorime të tjera jashtë aftësive të thjeshta. Statistikat tuaja nuk duhet të maten në përqindje - ato mund të tregojnë sa vite keni qenë në biznes, numrin total të projekteve tuaja ose numra të tjerë të ngjashëm. Mund të shkarkoni falas një kopje të udhëzuesit tim dhe të eksperimentoni me kodin për t'iu përshtatur më mirë projekteve tuaja.

edhe pse grafikët me byrek janë mënyra më e zakonshme për të paraqitur informacionin, duke filluar nga statistikat e thjeshta deri te shiritat e progresit dhe kohëmatësit, madje edhe në formën e tyre më të thjeshtë me dy ngjyra, ato tradicionalisht janë krijuar nga çdo gjë tjetër veç metodave të thjeshta të bazuara në ueb. Zakonisht, për zbatimin e tyre, qoftë të jashtëm redaktues grafik për krijimin imazhe të shumta për vlera të shumta grafiku byrek, ose korniza JavaScript të krijuara për të krijuar diagrame më komplekse.

Edhe pse tani detyra nuk duket aq e pamundur sa dikur, ende nuk ka një zgjidhje të thjeshtë dhe të qartë. Sidoqoftë, sot ka shumë më të mira (krahasuar me metodat e mësipërme), më shumë mënyra të mbështetura për të zbatuar grafikët byrek.

zgjidhje e bazuar në transformim

Kjo zgjidhje është më e mira për sa i përket paraqitjes: i duhet vetëm një element, dhe gjithçka tjetër do të bëhet me pseudoelemente, transformime dhe Gradientët CSS. Le të fillojmë me një element të thjeshtë:

Tani le të supozojmë se duam një grafik byrek që shfaqet me kod të fortë 20% . Ne do të punojmë për ta bërë atë fleksibël më vonë. Së pari, le ta stilojmë elementin si një rreth, i cili do të jetë sfondi ynë (Figura 1):

Figura 1 - Pika jonë e fillimit (grafiku i byrekut që tregon 0%) .byrek ( gjerësia: 100 px; lartësia: 100 px; rreze kufiri: 50%; sfondi: jeshile e verdhë; )

Grafiku ynë i byrekut do të jetë i gjelbër (më konkretisht, jeshile e verdhë) me një sektor kafe (#655) që tregon përqindjen. Mund të tundohemi të përdorim transformime të zhdrejta për pjesën e përqindjes, por siç tregon një eksperiment i vogël, kjo do të jetë një zgjidhje mjaft e ngathët. Në vend të kësaj, ne do të ngjyrosim anën e majtë dhe të djathtë të rrethit tonë dy ngjyra dhe përdorni duke rrotulluar pseudo elementin për të zbuluar vetëm pjesën e rrethit që na nevojitet.

Për të ngjyrosur anën e djathtë të rrethit tonë kafe, ne do të përdorim një gradient të thjeshtë linear:

Sfondi-imazh: linear-gradient (në të djathtë, transparent 50%, #655 0); Figura 2 - Ngjyrosja e anës së djathtë të rrethit tonë kafe me një gradient të thjeshtë linear

Siç mund ta shihni në figurën 2, kjo është gjithçka që na nevojitet. Tani mund të fillojmë të stilojmë pseudoelementin që do të veprojë si maskë:

Byrek::para (përmbajtja: ""; shfaqja: bllok; margjina majtas: 50%; lartësia: 100%; ) Figura 3 - Pseudo-elementi që vepron si maskë e theksuar këtu me kufi të ndërprerë

Në figurën 3, mund të shihni se si ky moment pseudoelementi ynë është i pozicionuar në raport me elementin e grafikut byrek. Tani ajo nuk është ende e stilizuar dhe nuk kryen asnjë funksion. Është thjesht një drejtkëndësh i padukshëm. Para se të fillojmë ta stilojmë, le të bëjmë disa vërejtje:

  • siç duam ne fshehni pjesën kafe të rrethit tonë, atëherë duhet të aplikojmë për pseudoelementin sfond jeshil, duke përdorur ngjyrën e sfondit: trashëgoni për të shmangur dyfishimin kur i caktoni të njëjtën ngjyrë të sfondit si elementi prind;
  • ne e duam atë rrotullohej rreth qendrës së rrethit, e cila është në mes të anës së majtë të pseudo-elementit, kështu që ne duhet të vendosim transform-origjinën në 0 50% ose thjesht majtas;
  • ne nuk duam që ai të jetë një drejtkëndësh, pasi që do të shtrihej përtej skajeve të byrekut, kështu që ose duhet të aplikojmë tejmbushjen: hidden në .pie ose t'i japim një rreze kufi për ta bërë atë gjysmërreth.

Duke i bashkuar të gjitha, marrim stilin e mëposhtëm për pseudo-elementin tonë;

Byrek::para (përmbajtja: ""; ekrani: bllok; margjina majtas: 50%; lartësia: 100%; rreze-kufi: 0 100% 100% 0 / 50%; ngjyra e sfondit: trashëgoj; origjina e transformimit: majtas; ) Figura 4 - Pseudoelementi ynë (treguar me kufi me pika) pas përfundimit të stilimit

Shënim: Mos përdorni sfond: trashëgoni; në vend të ngjyrës së pasme: trashëgoni; pasi kjo do të trashëgojë gjithashtu gradientin!

Tani grafiku ynë i byrekut duket si Figura 4. Këtu fillon argëtimi! Mund të fillojmë rrotullo pseudo element, duke aplikuar transformimin rotate(). Për 20% , të cilin po përpiqemi ta implementojmë, mund të përdorim vlerën 72deg (0.2 × 360 = 72), ose .2turn , që është më e lexueshme. Në figurën 5, mund të shihni se si duket kjo për disa vlera të tjera.

Figura 5 - Grafiku ynë i thjeshtë i byrekut që tregon përqindje të ndryshme, nga e majta në të djathtë: 10% (36 gradë ose 0,1 kthesë), 20% (72 gradë ose 0,2 kthesë), 40% (144 gradë ose .4 kthesë)

Ju mund të mendoni se puna ka përfunduar, por, për fat të keq, jo gjithçka është kaq e thjeshtë. Grafiku ynë i byrekut është i shkëlqyeshëm për të shfaqur përqindjet nga 0 në 50%, por nëse përpiqemi të shfaqim një kthesë prej 60% (duke aplikuar kthesën .6), marrim atë që tregohet në Figurën 6. Por megjithatë, mos e humbni shpresën, ne mundemi rregullojeni dhe le ta bëjmë!

Figura 6 - Grafiku ynë byrek zbërthehet për aksionet mbi 50%(treguar këtu për 60%)

Nëse e konsiderojmë shfaqjen e aksioneve prej 50% -100% si një problem më vete, atëherë mund të shohim se për to mund të përdorim versioni me kokë poshtë i zgjidhjes së mëparshme: pseudoelement ngjyrë kafe që rrotullohet nga 0 në .5 rrotullim përkatësisht. Pra, për një pjesë prej 60%, kodi i pseudo-elementit do të duket si ky:

Byrek::para (përmbajtja: ""; shfaqja: bllok; margjina majtas: 50%; lartësia: 100%; rreze-kufi: 0 100% 100% 0 / 50%; sfond: #655; origjina e transformimit: majtas ; transform: rotate(.1turn); ) Figura 7 - Grafiku ynë tani i saktë i byrekut me një vlerë prej 60%

Në figurën 7 mund të shihni kodin në veprim. Meqenëse tani kemi zhvilluar një mënyrë për të shfaqur çdo përqindje, ne mundemi animate grafikun e byrekut nga 0% në 100% me duke përdorur CSS animacionet, duke krijuar një lloj treguesi progresi:

@keyframes rrotullohet ( në ( transformim: rotate(.5turn); ) ) @keyframes bg ( 50% ( sfond: #655; ) ) .pie::para (përmbajtja: ""; shfaqja: bllok; margjina majtas: 50 %; lartësia: 100%; rreze-kufi: 0 100% 100% 0 / 50%; ngjyra e sfondit: trashëgim; origjina e transformimit: majtas; animacion: rrotullim 3s linear i pafund, bg 6s hap-fund i pafund; )

Gjithçka është mirë, por si t'i stilojmë grafikët e shumëfishtë të byrekut statik me përqindje të ndryshme, që është më e shumta rast i përgjithshëm duke përdorur grafikët? Në mënyrë ideale, ne duam të jemi në gjendje të printojmë diçka si kjo:

20%
60%

Dhe merrni dy tabela byrek, njëra që tregon 20% dhe tjetra tregon 60%. Së pari, ne do të shikojmë se si mund ta bëjmë këtë me stilet inline, dhe më pas mund të shkruajmë gjithmonë një skrip të shkurtër analizues. përmbajtjen e tekstit dhe shtoni stilet e përmendura në linjë për elegancën e kodit, kapsulimin, mirëmbajtjen dhe ndoshta më e rëndësishmja, aksesueshmërinë.

Vështirësia në menaxhimin e përqindjes së një grafiku byrek me stile inline është se kodi CSS që është përgjegjës për vendosjen e përqindjes vendoset në një pseudo element. Siç e dini tashmë, ne nuk mund të vendosim stile inline në pseudo-elemente, kjo është arsyeja pse do të duhet të jemi më kreativë.

shënim: Per perdorim vlerat nga spektri i ngjyrave nuk ka përsëritje dhe llogaritjet komplekse ju mund të përdorni metodën e mëposhtme. Ju mund të përdorni të njëjtën metodë në raste të tjera. Më poshtë është një shembull i thjeshtë dhe i izoluar se si të përdoret kjo metodë.

Zgjidhja vjen nga një nga vendet më të papritura. Ne do të përdorim animacionin që kemi shfaqur tashmë, por do të ndalohet. Në vend që ta ekzekutojmë si një animacion të rregullt, do të përdorim vonesat negative të animacionit vendosni pozicionin në çdo pikë të animacionit dhe rri aty. I befasuar? Po, vlerat negative të vonesës së animacionit nuk lejohen vetëm në specifikim, por edhe shumë të dobishme në raste si kjo.

Meqenëse animacioni ynë është në pauzë, do të shfaqet vetëm korniza e parë e animacionit (përcaktuar nga vlerë negative animacion-vonesa). Përqindja e treguar në grafikun me byrek do të jetë përqindja e vonesës së animacionit tonë në kohëzgjatjen totale. Për shembull, me një kohëzgjatje aktuale prej 6 sekondash, na duhet një vlerë e vonesës së animacionit prej -1,2 s për të treguar një pjesë prej 20%. Për të thjeshtuar llogaritjet, do ta vendosim kohëzgjatjen në 100 sekonda. Mbani në mend se meqenëse animacioni është ndërprerë përgjithmonë, vlera që kemi vendosur për kohëzgjatjen e tij nuk ka asnjë rol tjetër për të luajtur.

Dhe pyetja e fundit: animacioni është duke u aplikuar në elementin pseudo, por ne duam të vendosim stilin inline në elementin .pie. Megjithatë, edhe pse në

nuk ka animacion, mund ta vendosim në animation-delay si një stil inline dhe më pas të përdorim animation-delay: trashëgim; për elementin pseudo. Duke i bashkuar të gjitha, shënimi ynë për grafikët e byrekut 20% dhe 60% duket kështu:

Dhe kodi CSS për këtë animacion bëhet si më poshtë (rregullat për .pie nuk shfaqen, pasi ato mbeten të njëjta):

@keyframes spin ( në ( transform: rotate (.5turn); ) ) @keyframes bg ( 50% ( sfond: #655; ) ) .pie::fore ( /* [stilet e tjera të pandryshuara] */ animacion: rrotullim 50s linear e pafundme, bg 100s step-end infinite; animacion-play-state: në pauzë; animacion-vonesë: trashëgoj; )

Në këtë pikë, ne mund ta konvertojmë shënimin për të përdorur përqindjet si përmbajtje, siç kishim synuar fillimisht të bënim, dhe të shtojmë stilet inline të vonesës së animacionit nëpërmjet një skripti të thjeshtë:

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

Ju lutemi vini re se ne e kemi lënë tekstin të paprekur pasi na nevojitet për akses dhe përdorshmëri. Grafikët tanë të byrekut tani duken si Figura 8. Duhet të fshehim tekstin që mund të vihet në dispozicion me ngjyra: transparente në mënyrë që të qëndrojë të përzgjedhshëm dhe të printueshëm. Për shkëlqim shtesë mundemi vendosni vlerat e përqindjes në qendër të grafikut me byrek në mënyrë që ata të mos jenë brenda vend i rastësishëm kur përdoruesi përpiqet t'i nxjerrë në pah ato. Për ta bërë këtë, na duhet:

Figura 8 - Teksti ynë përpara se ta fshehim

  • konvertoni vlerën e lartësisë së grafikut në lartësinë e vijës (ose shtoni një vlerë të lartësisë së rreshtit të barabartë me lartësinë, por kjo do të ishte dyfishim i kotë i kodit pasi lartësia e rreshtit do të vendoset në lartësinë e llogaritur , që është mirë);
  • caktoni madhësinë dhe pozicionin e pseudo elementit me pozicionim absolut në mënyrë që të mos e shtyjë tekstin poshtë;
  • add text-align: qendër; për të përqendruar tekstin horizontalisht.

Kodi përfundimtar duket si ky:

Byrek ( pozicioni: relative; gjerësia: 100 px; lartësia e vijës: 100 px; rreze-kufi: 50%; sfondi: jeshile e verdhë; sfondi-imazhi: gradient linear (djathtas, transparent 50%, #655 0); ngjyra: transparente ; text-align: në qendër; ) @keyframes rrotullohet ( në ( transformim: rotate(.5turn); ) ) @keyframes bg ( 50% ( sfond: #655; ) ) .pie::para (përmbajtja: ""; pozicioni : absolute; lart: 0; majtas: 50%; gjerësia: 50%; lartësia: 100%; rreze-kufi: 0 100% 100% 0 / 50%; ngjyra e sfondit: trashëgoj; origjina e transformimit: majtas; animacion: rrotullim 50s linear i pafund, bg 100s hap-fund i pafund; animacion-play-state: në pauzë; animacion-vonesë: trashëgoj; )

Zgjidhje e bazuar në SVG

SVG merr vendimin e shumë njerëzve detyrat grafike më e lehtë, dhe grafikët me byrek nuk bëjnë përjashtim. Megjithatë, në vend që të krijojmë një grafik byrek duke përdorur shtigje, e cila do të kërkonte matematikë komplekse, ne do të përdorim një truk të vogël.

Le të fillojmë me një rreth:

Tani le të aplikojmë disa stile bazë për të:

Rrethi (mbushja: jeshile e verdhë; goditje: #655; gjerësia e goditjes: 30; )

shënim: Siç e dini, këto Karakteristikat CSS janë gjithashtu të disponueshme si atribute Elemente SVG që mund të ishin të dobishëm nëse bartja ishte një shqetësim.

Figura 9 - Pika jonë e fillimit: një rreth i gjelbër SVG me një goditje të trashë #655

Ju mund të shihni rrethin tonë të përvijuar në Figurën 9. Goditjet SVG përbëhen nga më shumë se vetëm veçoritë e goditjes dhe gjerësisë së goditjes. Ka shumë veti të tjera më pak të njohura që lidhen me goditjet që ju lejojnë të rregulloni mirë pamjen e tyre. Njëri prej tyre është stroke-dasharray, i cili është krijuar për të krijuar goditje të ndërprera. Për shembull, ne mund ta përdorim atë për këtë:

Stroke-dasharray: 20 10; Figura 10 - Një goditje e thjeshtë me ndërprerje e krijuar me stroke-dasharray

Kjo do të thotë që ne duam të marrim vija me gjatësi 20 me boshllëqe me gjatësi 10, si ato të paraqitura në Figurën 10. Në këtë pikë, mund të pyesni veten nëse ky shembull SVG ka ndonjë lidhje me grafikët e byrekut. Por gjërat bëhen më të qarta kur aplikojmë një goditje me një gjatësi vize 0 dhe boshllëqe më të mëdha se ose të barabarta me e barabartë me gjatësinë perimetri i rrethit tonë (C = 2πr, ose në rastin tonë C = 2π × 30 ≈ 189):

Stroke-dasharray: 0 189; Figura 11 - Disa vlera stroke-dasharray dhe rezultati i tyre; nga e majta në të djathtë: 0 189 ; 40 189; 95189; 150 189

Siç mund ta shihni, në rrethin e parë në Figurën 11, kjo heq goditjen plotësisht dhe ne kemi mbetur vetëm me rrethin e gjelbër. Sidoqoftë, argëtimi fillon kur fillojmë të rrisim vlerën e parë (Figura 11): për shkak të një hendeku kaq të gjatë, nuk do të marrim më goditje me pika, por një goditje që mbulon përqindjen e perimetrit të rrethit që specifikojmë.

Ju mund ta keni kuptuar tashmë se në cilën drejtim po shkojmë: nëse e zvogëlojmë rrezen e rrethit tonë aq sa të mbulohet plotësisht nga goditja e tij, do të përfundojmë me diçka që duket shumë si një grafik byrek. Për shembull, në figurën 12 mund të shihni se si do të dukej kjo kur aplikohet në një rreth me një rreze prej 25 dhe një gjerësi goditjeje (gjerësia e goditjes) 50:

Figura 12 - Imazhi ynë SVG ka filluar të duket si një grafik byrek

Mbani mend: goditjet SVG janë gjithmonë gjysmë brenda dhe gjysma jashtë elementit ku aplikohen. Në të ardhmen, ne do të jemi në gjendje ta kontrollojmë këtë sjellje.

rrethi (mbushja: jeshile e verdhë; goditje: #655; gjerësia e goditjes: 50; brezi i vijës: 60 158; /* 2π × 25 ≈ 158 */ )

Tani ta ktheni këtë imazh në një tabelë byrek si ato që krijuam në zgjidhjen e mëparshme është shumë e lehtë: thjesht shtoni rreth më i madh i gjelbër për goditje në tru Dhe rrotullojeni atë 90° në të kundërt të akrepave të orës në mënyrë që të fillojë nga lart në mes. Për aq sa element është gjithashtu Elementi HTML, thjesht mund të aplikojmë një stil për të:

Svg ( transformimi: rrotullo (-90 gradë); sfondi: jeshile e verdhë; rreze-kufi: 50%; ) Figura 13 - Grafiku i byrekut përfundimtar me SVG

Rezultatin përfundimtar mund ta shihni në Figurën 13. Kjo metodë e bën edhe më të lehtë animimin e grafikut me byrek nga 0% në 100%. Ne vetëm duhet të krijojmë një animacion CSS që ndryshon stroke-dasharray nga 0 158 në 158 158:

@keyframes mbushje ( deri në ( stroke-dasharray: 158 158; ) ) rreth (mbush: yellowgreen; goditje: #655; stroke-width: 50; stroke-dasharray: 0 158; animacion: fillup 5s linear infinite; )

Si një përsosje e mëtejshme, ne mund të vendosim një rreze të caktuar të rrethit në mënyrë që perimetri i tij të jetë (pafundësisht afër) 100, dhe kështu mund të specifikoni gjatësitë e stroke-dasharray si përqindje, pa asnjë llogaritje. Meqenëse perimetri është 2πr, na duhet një rreze prej 100 ÷ 2π ≈ 15.915494309, e cila për nevojat tona mund të rrumbullakoset deri në 16. Gjithashtu do të vendosim dimensionet e SVG në atributin viewBox, në vend të atributet e gjerësisë dhe lartësia për ta bërë atë të përshtatet me dimensionet e enës së tij.

Pas këtyre modifikimeve, faqosja e grafikut të byrekëve të paraqitur në Figurën 13 do të jetë si më poshtë:

Dhe CSS bëhet si kjo:

Svg ( gjerësia: 100 pikselë; lartësia: 100 pikselë; transformimi: rrotullohet (-90 gradë); sfondi: jeshile e verdhë; rrezja e kufirit: 50%; ) rrethi (mbushja: jeshile e verdhë; vija: #655; gjerësia e goditjes: 32; vija-gjerësia: 32 : 38 100; /* për 38% */ )

Shënim, sa e lehtë është tani të ndryshosh përqindjen. Edhe pse edhe me këtë thjeshtësim, ne nuk duam të përsërisim të gjithë atë shënim SVG për çdo grafik byrek. Është koha që JavaScript të na ndihmojë me pak automatizim. Ne do të shkruajmë një skript të vogël për të marrë një shënim të thjeshtë HTML si ky...

20%
60%

Dhe shtoni svg inline brenda çdo elementi .pie me të gjitha elementet e nevojshme dhe atributet. Ai gjithashtu do të shtojë elementin për akses në mënyrë që përdoruesit <a href="https://bumotors.ru/sq/skachat-golosovoi-dvizhok-dlya-android-ekrannyi-diktor-dlya.html">lexuesit e ekranit</a> mund të zbulojë gjithashtu se çfarë përqindje shfaqen. Skenari përfundimtar do të duket kështu:</p><p>$$(".pie").forEach(funksion(pie) (var p = parseFloat(pie.textContent); var NS = "http://www.w3.org/2000/svg"; var svg = dokument. createElementNS(NS, "svg"); var rrethi = document.createElementNS(NS, "rrethi"); titulli var = document.createElementNS(NS, "titulli"); circle.setAttribute ("r", 16); rrethi. setAttribute("cx", 16); circle.setAttribute("cy", 16); circle.setAttribute("stroke-dasharray", p + " 100"); svg.setAttribute("viewBox", "0 0 32 32 "); title.textContent = byrek.textContent; pie.textContent = ""; svg.appendChild(titull); svg.appendChild(rreth); byrek.appendChild(svg); ));</p><p>Ja ku eshte! Ju mund të mendoni se <a href="https://bumotors.ru/sq/podklyuchenie-stilei-css-kak-podklyuchit-css-metody-i-sposoby-podklyuchenii.html">Metoda CSS</a> më mirë pasi kodi i tij është më i thjeshtë dhe më i njohur. Sidoqoftë, metoda SVG ka disa avantazhe mbi zgjidhjen e pastër CSS:</p><ul><li><b>më e lehtë për të shtuar një ngjyrë të tretë</b>: thjesht shtoni një rreth tjetër të goditur dhe lëvizni goditjen e tij me stroke-dashoffset . Ose shtoni gjatësinë e goditjes së tij në gjatësinë e goditjes së rrethit të mëparshëm përpara (poshtë) tij. Si do të shtonit saktësisht një ngjyrë të tretë në grafikun e byrekut të krijuar në mënyrën e parë?</li><li>ne <b>nuk duhet të bëjë ndonjë përpjekje shtesë për të printuar</b>, pasi elementët SVG trajtohen si përmbajtje dhe printohen në të njëjtën mënyrë si elementët <img>. Zgjidhja e parë varet nga sfondi dhe kështu nuk do të printohet;</li><li>ne mundemi <b>ndryshoni ngjyrat me stile inline</b>, që do të thotë se ne mund t'i modifikojmë lehtësisht nëpërmjet <b>skriptet</b>(dmth në varësi të <b>të dhëna të përdoruesit</b>). Zgjidhja e parë mbështetet në pseudo-elementë, të cilët nuk mund të pranojnë stile inline përveçse nëpërmjet trashëgimisë, e cila nuk është gjithmonë e përshtatshme.</li> sfond: konik-gradient(#655 attr(vlera e të dhënave %), jeshile e verdhë 0); <p>Gjithashtu e bën të pabesueshme <a href="https://bumotors.ru/sq/how-to-add-a-photo-in-contact-a-few-simple-waysssss.html">shtim i thjeshtë</a> ngjyra e tretë. Për shembull, për një grafik byrek, <a href="https://bumotors.ru/sq/modelirovanie-informacionnyh-sistem-podobnymi-diagrammami-mozhno.html">si një diagram</a> më lart, do të shtonim vetëm dy pika të tjera ngjyrash:</p><p>Sfondi: gradient konik (rozë e thellë 20%, #fb3 0, #fb3 30%, jeshile e verdhë 0);</p><p>Kjo eshte e gjitha! Lini komente!</p></ul> <p>Me siguri keni hasur në tregues të tillë ngarkimi, veçanërisht në faqet Flash. Ky është një sektor i rrethit që bëhet gjithnjë e më i madh derisa të bëhet një rreth i plotë.</p> <p>Në pamje të parë, detyra duket e thjeshtë: bëni një rreth, rrotullojeni dhe fshihni pjesën pas maskës. Por në realitet, gjithçka rezulton të jetë disi më e ndërlikuar. CSS nuk është i përgatitur për detyra të tilla, edhe kur përdorni paraprocesorë si SASS & Compass. Ne gjithmonë luftojmë kur bëhet fjalë për të krijuar forma të ndryshme, dhe veçanërisht kur përcaktojmë stile dhe animacione për to. Pjesa më e madhe e kohës së punës shpenzohet për këtë. në mënyrë që diçka të funksionojë, dhe semantika e kodit dhe mbështetja e tij sakrifikohen.</p> <h2>Pse e bëjmë?</h2> <p>Përdorimi më i mundshëm i elementeve të tillë është kohëmatësit. Por <a href="https://bumotors.ru/sq/koncepciya-hranilishcha-dannyh-fizicheskie-i-virtualnye.html">këtë koncept</a> mund të përdoret për të bërë një tabelë byrek me një css të vetme.</p> <p>Edhe pse ka disa mjete të mahnitshme për manipulimin e grafikëve të byrekëve (kryesisht në JavaScript), ne do të vazhdojmë ta krijojmë një element të tillë thjesht në CSS dhe madje do ta animojmë atë me disa truke.</p> <p>Semantika e kodit do të jetë kështu! Por shoqërimi mund të bëhet mjaft i përshtatshëm.</p> <h2>HTML</h2> <p>Ne kemi nevojë për 3 elementë të ndryshëm:</p> <ul><li><b>rrotullues:</b> gjysma e rrethit që do të rrotullohet;</li> <li><b>maskë:</b> ky element fsheh rrethin rrotullues gjatë 50% të parë të animacionit;</li> <li><b>mbushës:</b> ky element mbush rrethin gjatë 50% të fundit të animacionit.</li> </ul><p>Dhe të tre elementët duhet të kenë të njëjtin prind për pozicionimin absolut:</p> <p> <div class="wrapper"> <div class="spinner pie"></div> <div class="filler pie"></div> <div class="mask"></div> </div></p> <p>Meqenëse spinner dhe filler janë dy gjysma të të njëjtit rreth, ne do të përdorim klasën .pie për to.</p> <h2>css</h2> <p>Elementi mëmë merr përmasat dhe <a href="https://bumotors.ru/sq/css-raspolozhenie-elementov-css---pozicionirovanie-blokov.html">pozicionim absolut</a> konteksti për kohëmatësin:</p> <p>Mbështjellësi (gjerësia: 250 px; lartësia: 250 px; pozicioni: relative; sfondi: i bardhë; )</p> <p>Është e rëndësishme që gjerësia dhe lartësia të jenë të barabarta për të marrë një rreth dhe gjithçka funksionon.</p> <p>Elementet "tjerr" dhe "mbushës" përdorin <a href="https://bumotors.ru/sq/velcom-kody-nomerov-baza-dannyh-mts.html">kodi i dhënë</a> CSS:</p> <p>Byrek (gjerësia: 50%; lartësia: 100%; pozicioni: absolut; sfondi: #08C; kufiri: 10 px rgba solide (0,0,0,0,4); )</p> <p>Ata kanë një gjerësi të barabartë me 50% të elementit mëmë, pra janë dy pjesë të të njëjtit rreth dhe lartësia e tyre është e barabartë me lartësinë e elementit mëmë. Ne gjithashtu përcaktojmë të njëjtën ngjyrë dhe kufi për ta.</p> <h3>elementi "tjerrë".</h3> <p>Spinner (rrezja e kufirit: 125 px 0 0 125 px; z-indeksi: 200; kufiri-djathtas: asnjë; animacion: rota 10s lineare e pafundme; )</p> <p>Bëjeni atë një gjysmërreth duke përdorur veçorinë e rrezes kufitare në këndin majtas lart dhe poshtë majtas. Ne gjithashtu përcaktojmë një vlerë pozitive për indeksin z për ta vendosur atë në krye të elementit mbushës, por poshtë maskës.</p> <p>Më pas shtojmë një animacion me kohëzgjatje prej 10 sekondash. Ne do të flasim për animacionin më vonë.</p> <h3>elementi "mbushës".</h3> <p>Mbushës (rrezja e kufirit: 0 125 pikselë 125 pikselë 0; indeksi z: 100; kufiri majtas: asnjë; animacion: mbush 10s hapat (1, fundi) i pafund; majtas: 50%; errësirë: 0; )</p> <p>Për këtë element, vendosni rrezen kufitare dhe z-indeksin, hiqni kufirin majtas dhe bëni animacionin të zgjasë 10 sekonda. Për një element të caktuar, funksioni animacion-kohë-funksioni nuk është vendosur në linear, por do të jetë hapat (1, fundi). Kjo do të thotë që animacioni do të ekzekutohet në çast.</p> <p>Meqenëse elementi mbushës nuk supozohet të jetë i dukshëm gjatë gjysmës së parë të animacionit, opaciteti i tij do të jetë 0 dhe pozicioni i tij do të jetë 50% e gjerësisë së elementit prind.</p> <h3>Elementi "maskë".</h3> <p>Maska (gjerësia: 50%; lartësia: 100%; pozicioni: absolute; z-indeksi: 300; errësirë: 1; sfond: trashëgim; animacion: hapa maskë 10s (1, fundi) i pafund; )</p> <p>Maska është e pranishme që nga fillimi i animacionit, kështu që opaciteti i saj është vendosur në 1 dhe sfondi trashëgohet nga elementi prind (pra është i padukshëm). Për të mbuluar elementin rrotullues, ai do të ketë të njëjtat dimensione dhe vetia z-indeks vendoset në 300.</p> <h3>Korniza të animacionit</h3> <p>@keyframes rota ( 0% ( transformim: rrotullim (0deg); ) 100% ( transformim: rrotullim (360deg); ) ) @keyframes mbushje ( 0% ( opacity: 0; ) 50%, 100% ( opacity: 1; ) ) maskë @keyframes ( 0% ( errësirë: 1; ) 50%, 100% ( errësirë: 0; ) )</p> <p>Animacioni i parë (rota) përdoret për elementin spinner. Rrotullohet gradualisht nga 0 në 360 gradë në 10 sekonda.</p> <p>Animacioni i dytë (mbushja) përdoret për elementin mbushës. Ndryshon menjëherë opacitetin nga 0 në 1 pas 5 sekondash.</p> <p>Për elementin maskë përdoret animacioni (maska) e fundit. Ndryshon menjëherë opacitetin nga 1 në 0 pas 5 sekondash.</p> <p>Animacioni duket si ky:</p> <ul><li><b>T0</b>- element rrotullues në të majtë, i maskuar. Elementi mbushës është i fshehur.</li> <li><b>T1</b>- elementi rrotullues fillon të rrotullohet në drejtim të akrepave të orës dhe shfaqet ngadalë nga pas maskës.</li> <li><b>T2</b>- elementi rrotullues r i rrotulluar me 360/10*2 = 72° vazhdon të rrotullohet.</li> <li><b>T3</b>- elementi rrotullues rrotullohet me 360/10*3 = 108° dhe vazhdon të rrotullohet.</li> <li><b>T4</b>- elementi rrotullues i rrotulluar me 360/10*4 = 144° vazhdon të rrotullohet.</li> <li><b>T5</b>- elementi rrotullues i rrotulluar me 360/10*5 = 180° vazhdon të rrotullohet. Në këtë pikë, elementi mbushës është i dukshëm menjëherë dhe maska ​​fshihet.</li> <li><b>T6</b>- elementi rrotullues rrotullohet me 360/10*6 = 216° vazhdon të rrotullohet.</li> <li><b>T7</b>- elementi rrotullues i rrotulluar me 360/10*7 = 252° vazhdon të rrotullohet.</li> <li><b>T8</b>- elementi rrotullues rrotullohet me 360/10*8 = 288° vazhdon të rrotullohet.</li> <li><b>T9</b>- elementi rrotullues rrotullohet me 360/10*9 = 324° vazhdon të rrotullohet.</li> <li><b>T10</b>- elementi rrotullues rrotullohet me 360°. U kthyem në pikën e fillimit. Ne heqim animacionin. Shfaqet maska ​​dhe elementi i mbushjes fshihet.</li> </ul><h2>Bonus</h2> <p>Disa truke shtesë.</p> <h3>Ndalo në lëvizje</h3> <p>Mbështjellës:hover .mbushëse, .mbështjellës:hover .tjerrës, .mbështjellës:hover .maskë (animacion-luaj-gjendje: në pauzë; )</p> <p>Me këtë kod, mund të ndaloni të gjithë animacionin kur rri pezull mbi elementin prind.</p> <h3>Fut përmbajtje</h3> <p>Falë veçorisë z-index, ne mund të shtojmë lehtësisht disa përmbajtje në elementin spinner dhe ta bëjmë atë të rrotullohet. Provoni kodin e mëposhtëm:</p> <p>Spinner:after ( përmbajtja: ""; pozicioni: absolut; gjerësia: 10 px; lartësia: 10 px; rreze-kufi: 50%; sipër: 10 px; djathtas: 10 px; sfond: #fff; kufi: 1 px solid rgba(0,0 ,0,0.4); hije e kutisë: futur 0 0 3px rgba(0,0,0,0.2); )</p> <h2>Paraprocesori ose variablat CSS</h2> <p>Për momentin, kodi është shumë i vështirë për t'u ruajtur. Por nëse përdorim variabla (në paraprocesor ose të brendshëm të pritshëm <a href="https://bumotors.ru/sq/peremennye-v-html-kode-nativnye-peremennye-v-css-uzhe-pora.html">variablat css</a>), gjërat mund të bëhen shumë më të lehta. Për shembull, mund të shtoni variabla për të kontrolluar kohëzgjatjen në vend që të rregulloni kodin në 3 përkufizime animacioni.</p> <p>Nëse dëshironi të përmirësoni mirëmbajtjen e kodit pa përdorur paraprocesorë, mund të krijoni një klasë me një kontroll të kohëzgjatjes së animacionit dhe ta shtoni atë në 3 elementë fëmijë. Për shembull si kjo:</p> <p>Kohëzgjatja e animacionit ( kohëzgjatja e animacionit: 10 sekonda; )</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>disavantazhet</h2> <p>Kjo teknikë ka një sërë disavantazhesh:</p> <ul><li>Gradientët nuk mbështeten.</li> <li>Hijet nuk mbështeten.</li> <li>Asnjë përshtatshmëri. Nëse madhësia e elementit prind ndryshon, atëherë gjithçka do të jetë mirë, përveç rrezes së kufirit. Do të duhet të ndryshohet me dorë.</li> <li>Nuk ka semantikë (4 elementë për një animacion).</li> </ul><h2>Mbështetja e shfletuesit</h2> <p>Meqenëse ne përdorim <a href="https://bumotors.ru/sq/zaderzhka-animacii-css3-primery---obratnaya-animaciya-css-kratkaya.html">animacione CSS</a>, atëherë mbështetja e shfletuesit është mjaft e dobët:</p> <ul><li>Internet Explorer 10</li> <li>Firefox 12+</li> <li>krom</li> <li>Safari 5+</li> <li>Opera 12+</li> <li>iOS Safari 3+</li> <li>Android 2+</li> </ul> <ul><li>Përkthimi</li><li>tutorial</li> </ul><p>Formularët janë një mënyrë e mirë për t'u shtuar pak elementeve në faqen tuaj të internetit. Rrathët janë veçanërisht të mirë në këtë drejtim, sepse ato janë të plota, të thjeshta dhe si byrek. Tani seriozisht, kush nuk i pëlqen byrekët?</p><p>Siç duhet ta keni vënë re nga përvoja juaj e përdorimit të internetit për shumë vite, shumica e elementeve në faqet e internetit janë, në fakt, ose katrorë ose drejtkëndësha. Prandaj, në disa raste, elementë interesantë si rrathët dhe trekëndëshat në dizajnin tuaj mund të jenë mjaft të dobishëm. Ky tutorial do t'ju tregojë se si të ndërtoni një tabelë të animuar byrek si ato që shihni zakonisht në faqet e portofolit. Kjo mund t'ju ndihmojë të theksoni vizualisht aftësitë tuaja, si dhe të demonstroni se cilat detyra mund të përballoni. Hidhini një sy demonstrimit për të parë rezultatin përfundimtar.</p><h3>Pra, le të fillojmë!</h3>Ndërsa shkruaj këtë tutorial, unë do të punoj me Circliful. Ky është një shtojcë jQuery pa pagesë dhe me burim të hapur. Mund ta shkarkoni skedarin kryesor nga Github. Ai përfshin një skedar .js së bashku me fletën përkatëse të stilit CSS. Faqja duhet të përmbajë të dyja për të arritur efektin e rrethit. <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>Statistikat e rrethit të animuar - Demoja e modelit përbindësh

Faqja ime përmban një fletë stilesh të ngjashme styles.css për stilet e mia personale CSS. Ju gjithashtu duhet të bëni një kopje të bibliotekës jQuery. Është e nevojshme që shtojca të funksionojë siç duhet.
Në vetvete, faqja është mjaft e lehtë për t'u strukturuar. Elementet e rrethit përmbahen brenda etiketave div që përdorin atributet HTML5 për të manipuluar të dhënat. Përndryshe, ato mund të ruhen në një funksion jQuery, por nëse doni më shumë kontroll mbi secilin element, atëherë është më e lehtë të punoni në HTML.

photoshop

Ilustruesi

pas efekteve

Kjo është një kopje e rreshtit të parë të rrathëve, i përbërë nga 3 njësi të animuara. Të gjitha këto atribute të të dhënave shpjegohen më tej në dokumentacionin e shtojcave. Secili përfaqëson një opsion që përcakton efektin e animacionit. Më poshtë është një përshkrim i shkurtër i opsioneve që përdor:

  • dimensioni i të dhënave - madhësia totale e gjerësisë / lartësisë së rrethit;
  • të dhëna-tekst - teksti që shfaqet në qendër të çdo rrethi;
  • gjerësia e të dhënave - trashësia e harkut rrotullues të të dhënave;
  • data-fontsize - madhësia e shkronjave të tekstit në qendër;
  • përqindje e të dhënave - një numër nga 0-100 që përfaqëson përqindjet në rrethin tuaj;
  • data-fgcolor - ngjyra e planit të parë të rrethit;
  • data-bgcolor - ngjyra e sfondit të rrethit;
  • data-fill - mbushje e brendshme e ngjyrës së sfondit të rrethit të brendshëm.

Struktura e faqes CSS

Unë nuk insistoj që ju të redaktoni drejtpërdrejt jquery.circliful.css, sigurisht, nëse nuk dëshironi të personalizoni shtojcën. Shumica e ngjyrave mund të ndryshohen drejtpërdrejt nga atributet e të dhënave HTML5, dhe nëse vërtet dëshironi të anashkaloni ndonjë nga stilet Rrethore, Unë do të rekomandoja që ta bëni këtë në fletën tuaj të stilit.
Pasi ju thashë këtë, unë krijova fletën time të stilit për këtë projekt, jo për të rishkruar stile. Rrethore. Vetë faqja e internetit ka nevojë për një strukturë të paracaktuar që është vërtet e lehtë për t'u dizajnuar. Zona e përmbajtjes përqendrohet në një seksion të vogël për një grafik byrek. Çdo rajon është i lëvizshëm lirisht brenda kontejnerit të rreshtit brenda origjinalit #statsdiv.

/** struktura e faqes **/ .wrap ( shfaqja: bllok; marzhi: 0 automatik; gjerësia maksimale: 800 px; ) #intro ( shfaqja: bllok; margjina-fund: 25 px; rreshtimi i tekstit: në qendër; ) #intro p ( madhësia e shkronjave: 1,8em; lartësia e rreshtit: 1,35em; ngjyra: #616161; stili i shkronjave: italic; margjina e poshtme: 25 px; ) #stats ( shfaqja: bllok; gjerësia: 100%; mbushja: 15 px 0; sfond: #f8f8f8; kufiri-lart: 4px solid #c3c3c3; kufiri-fund: 4px solid #c3c3c3; ) #stats .row ( shfaqja: bllok; ).circle-container ( shfaqja: bllok; noton: majtas; margjina-djathtas : 55 px; margjina e poshtme: 45 px; ) .circle-container h3 ( ekrani: bllok; rreshtimi i tekstit: në qendër; madhësia e shkronjave: 2,25em; lartësia e rreshtit: 1,4em; ngjyra: #363636; hije e tekstit: 1px 1px 0 #fff;)

Brenda çdo seksioni, përmbajtja mbahet brenda .wrapdiv për të rregulluar në qendër. Gjithashtu, elementët e rrethit që lëvizin lirshëm kanë nevojë për një enë shtesë. .sqaroj për të mbajtur gjithçka në linjë siç duhet.

/** sqarim **/ .clearfix:after ( përmbajtja: "."; ekrani: bllok; i qartë: të dyja; dukshmëria: e fshehur; lartësia e linjës: 0; lartësia: 0; ) .clearfix ( shfaqja: blloku i brendshëm; ) html .clearfix ( shfaqja: bllok; ) * html .clearfix (lartësia: 1%; )

Kjo klasë qartësoj prej vitesh njihet si tretësirë ​​kontejneri me elementë që lëvizin lirshëm. Zakonisht ato hiqen nga teksti i dokumentit dhe nuk ruajnë vlerën e gjerësisë/lartësisë së tyre origjinale. Por kjo e mban konstante gjerësinë e enës #statistika dhe lë hapësirë ​​që më shumë përmbajtje të vendoset më poshtë në faqe.

Prekjet e fundit

Pra, brumin e gatuajmë, mbushim tavën e byrekut, e fusim në furrë dhe jemi pothuajse gati për të marrë një mostër. Nëse gjithçka duket mjaft mirë, cili është hapi përfundimtar? Ne kemi nevojë për një kod jQuery për të dekoruar këtë projekt.
Hapni etiketën e re të skriptit në fund të kësaj faqeje HTML. Ai do të përmbajë një pjesë të vogël të JavaScript. Meqenëse kam përdorur të gjitha atributet e të dhënave HTML5, nuk kemi nevojë të thërrasim asnjë opsion jQuery. Skripti thjesht duhet të ekzekutojë funksionin Rrethore në çdo divs rrethi. Përdorimi i një emri të dyfishtë të klasës, si p.sh .circlestat e bën procesin shumë të lehtë.

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

Për ata që nuk janë të njohur me sintaksën jQuery, do të jap një përshkrim të shkurtër. Pasi të jetë ngarkuar dokumenti, ne ekzekutojmë një funksion të ri. Qëllimi ynë i brendshëm është çdo element që përdor klasën .circlestat dhe ekzekutoni funksionin rrethore (). Kjo sjell shtojcën Rrethore, i cili krijon efekte animacioni, në veprim dhe aplikon përmbajtje/ngjyra shtesë.

Nuk mund të them se këto qarqe do të jenë gjithmonë zgjidhja më e mirë. Kam parë shumë portofol që bazoheshin në fjalë dhe numra, por jo në vetë punën. Merrni parasysh përdorimin e këtyre rrathëve në raste të rralla dhe provoni t'i huazoni ato për përdorime të tjera jashtë aftësive të thjeshta. Statistikat tuaja nuk duhet të maten në përqindje - ato mund të tregojnë sa vite keni qenë në biznes, numrin total të projekteve tuaja ose numra të tjerë të ngjashëm. Mund të shkarkoni falas një kopje të udhëzuesit tim dhe të eksperimentoni me kodin për t'iu përshtatur më mirë projekteve tuaja.

"Kuzhina" e një zhvilluesi të internetit është disi e ngjashme me gatimin në shtëpi. Zhvilluesi ka qasje në një sërë bibliotekash nga kodi i përfunduar, e cila do ta ndihmojë atë të bëjë një aplikacion në internet në të njëjtën mënyrë që një kuzhinier në shtëpi mund të përdorë produkte të gatshme për të gatuar pjatën e tij në mënyrë më efikase. Në të dyja rastet, cilësia e artikujve të përgatitur paraprakisht duhet të jetë shumë e rëndësishme. Megjithatë, ndonjëherë cilësia sakrifikohet për lehtësi. Mos më keqkuptoni, komoditeti nuk është gjithmonë i keq. Mund të jetë e dobishme kur të mirat dhe të këqijat njihen dhe analizohen mirë. Duke analizuar opsionet për grafikët e byrekut dhe donut në HTML, ne mund të theksojmë vetëm disa:

  1. Grafiku i bazuar në elementin Canvas të krijuar në klient (p.sh. JavaScript)
  2. Grafiku i bazuar në SVG dhe i krijuar nga klienti (p.sh. JavaScript)
  3. Diagrami i bazuar në SVG dhe i krijuar në server

Bibliotekat e gatshme duke përdorur Canvas dhe SVG JavaScript

Bibliotekat JavaScript për vizatimin e grafikëve janë shpesh më të përshtatshme dhe të ngarkuara me një sërë opsionesh interesante si interaktiviteti. Këtu janë disa biblioteka:

  1. D3.js
  2. Chartist.js
  3. Listat e Google

Disa rreshta JavaScript dhe një grup të dhënash do t'ju lejojnë të krijoni një diagram në sit në sekonda. Nuk është çudi që kaq shumë zgjedhin këtë rrugë.

Pra, pse të shqetësoheni dhe të shkruani kod për ta me duart tuaja? Kjo është një pyetje e mrekullueshme që ia kam bërë edhe vetes. Në fund, u sigurova për tre gjëra:

  1. Shumica e bibliotekave JavaScript janë të vështira për t'u gjetur, veçanërisht ato të bazuara në elementin Canvas (me përjashtim të Google Charts)
  2. Nëse informacioni në grafik është shumë i rëndësishëm (siç ishte në situatën time), a duhet të mbështetemi në një skript që funksionon tek klienti për të gjeneruar informacionin? Unë nuk mendoj kështu.
  3. Nëse gërmoj më thellë në kodin SVG dhe i bëj duart e mia pis, mund të mësoj pak më shumë për marrëzitë magjike pas tij. Me fjalë të tjera, procesi i të mësuarit mund të jetë argëtues dhe ia vlen përpjekja.

Situata ime

Ekipi im kishte nevojë për një komponent të thjeshtë që mund të ndërtohej në server dhe ekran informacion të thjeshtë në lidhje me përdorimin e llogarive. Gjithashtu, preferenca jonë ishte lehtësia e këtij komponenti (duke shmangur JavaScript nëse është e mundur); nuk kishte nevojë të ishte tepër i sofistikuar apo ndërveprues, thjesht duhej të shfaqte të dhëna të rëndësishme.

Një shënim shtesë për grafikët e bazuar në elementin Canvas

Ju mund të keni vënë re (nëse jeni njohur me grafikimet për ueb) që unë nuk e kam përfshirë Chart.js në listën e bibliotekave të rekomanduara më sipër. Ndërkohë që mund ta përdorni patjetër, ia vlen të keni parasysh se Chart.js përdor elementin Canvas për të vizatuar grafikët e tij dhe përmbajtja e elementit nuk është pjesë e DOM. Prandaj, ata nuk janë të aksesueshëm për lexuesit e ekranit. Kjo do të thotë që ju duhet të pranoni masat shtesë për t'u siguruar që të dhënat tuaja janë të disponueshme.

Hyrje në grafikët CSS dhe SVG

Grafikët CSS dhe SVG janë në thelb më të aksesueshëm dhe semantikë se teknologjitë e tjera. Por ato mund të jenë komplekse, dhe ndoshta kërkojnë kohë, nëse kodohen me dorë.

CSS ninja Lea Verow ofron disa opsione për krijimin e grafikëve me byrek nga e para në artikullin e saj "Dizajnimi i grafikëve fleksibël, të mirëmbajtur me byrekë me CSS dhe SVG". Metodat e tij mund të aplikohen edhe në grafikët e donutëve.

Robin Randle ka shkruar gjithashtu për krijimin e tabelave thjesht me CSS, ku ai gjithashtu tregon dështimet e tij në qasje.

e pashpjegueshme

Bëra disa google për SVG dhe grafikët e donutëve dhe hasa në artikuj nga Lea Verow dhe Robin Randle (ata janë përmendur më lart) përveç disa të tjerëve. Pothuajse të gjithë diskutuan përdorimin e atributeve stroke-dasharray dhe stroke-dashoffset në SVG për të pozicionuar pjesët e një grafiku. Këto veti janë identike me "stroke" kur krijohen vektorë në programe si Adobe Illustrator.

Disa nga këta artikuj madje diskutuan animacionin në SVG, i cili është i lezetshëm, por gjithashtu jo ai që kërkoja.

Pas kërkimit tim, unë munda ta kuptoja atë duke përdorur nga SVG së bashku me stroke dhe stroke-dasharray mund të më jepnin segmentet e mbivendosura të byrekut që më duheshin. Kuptova gjithashtu se stroke-dashoffset do të më lejonte të "animoj" ose, me fjalë të tjera, të pozicionoja segmentin ku doja në rreth.

Megjithatë, nuk duket se kam gjetur ndonjë shpjegim të qartë se si funksionuan atributet e pikës së goditjes dhe çfarë kishin të bënin me perimetrin e një rrethi. Dhe ajo që ishte më e paarritshme ishte bashkimi i disa elementeve (njëri pas tjetrit) rreth rrethit. Edhe më mirë, cila është formula për marrjen e këtyre pozicioneve relative duke përdorur madhësitë unike/dinamike të segmentit SVG dhe atributet e goditjes?

Kështu, u vendosa të zbuloja vetë.

Shënim: Nëse gjeni ndonjë burim që shpjegon këto koncepte, ju lutemi shpërndajeni.

Si të krijoni grafikun tuaj SVG

Shpjegimi i stroke-dasharray dhe stroke-dashoffset

Le të fillojmë me një "grafikë donut" të thjeshtë SVG.

Do të vini re disa gjëra:

  1. Rrezja (atributi "r") duket absurde! Pse? Doja t'i bëja madhësitë e segmenteve të mia logjike, të kuptueshme dhe të lexueshme. Për ta arritur këtë, vendosa të bazoj gjithçka në 100% (ose një rreth 100). Format SVG janë të shkallëzueshme, kështu që nuk ka rëndësi se sa të mëdha përfundojnë; të paktën matematika këtu do të jetë e thjeshtë. Duke vazhduar te diçka që mbaj mend nga matematika e shkollës së mesme: E di që rrezja e një rrethi është r = C/(2π) ose r = 100/(2π). Rezultati është 15.91549430918952. Numër i çmendur me shumë shifra, po, e di, por më vonë do të na lehtësojë jetën.
  2. Për Kutia e pamjes jepen vlerat "0 0 42 42". Ato duhet të jenë dyfishi i vlerave cx & cy (qendra x dhe qendra y). dhe të jetë pak më i madh se diametri i rrathëve (përfshirë gjerësinë e konturit).
  3. ka me klasën "donut-hole". Kjo është ajo që garantohet për ta bërë qendrën të bardhë. Nëse kjo nuk është e rëndësishme për ju (në rastin e një të thjeshtë grafik me byrek), atëherë ky artikull mund të hiqet.
  4. Gjithashtu ka me klasën "unazë donut". Shërben si sfond gri i hapur në rast se sektorët nuk mbushin 100% të rrethit.

Pra, ne duhet të rregullojmë madhësinë e sektorit në përqindjen e dëshiruar. Le të përdorim 85%:


Sektorët krijohen duke përdorur atributin e goditjes SVG të quajtur stroke-dasharray. Vlera që kemi vendosur në shembullin e mësipërm është "85 15".

Nëse e mendojmë grafikun si një grafik byrek, atëherë nga prania e një sektori prej 85%, mund të gjykojmë pjesën e mbetur prej 15%. Këto dy vlera janë një grup i kufizuar nga hapësira. Ja çfarë ndodh: krijohet një vizë prej 85 njësive, pastaj një hendek prej 15 njësive, më pas një vizë prej 85, një hendek prej 15, e kështu me radhë e kështu me radhë. Por duke qenë se ne përdorim një rreth dhe totali është 100, gjithçka përsëritet përsëri. Nëse nuk e kemi bërë vlerën e dytë në grup në mënyrë që të plotësojë numrin e parë në njëqind, atëherë do të marrim një shirit të tretë (ose fraksion) ose më shumë. Për shembull, këtu është stroke-dasharray nga " 10 10 ":


Pra, në figurën 2 dhe figurën 3, mund të vëreni se stroke-dasharray nuk fillon në krye (në orën 12:00). Në vend të kësaj, në të vërtetë fillon me anën e djathtë(3:00), dhe lëviz në drejtim të akrepave të orës rreth rrethit.

Nëse duam të pozicionojmë (ose të fillojmë) në krye, atëherë duhet të përdorim stroke-dashoffset . Megjithatë, ndryshe nga stroke-dasharray, stroke-dashoffset lëviz në drejtim të kundërt të akrepave të orës. Pra, do të na duhet të vendosim vlerën në "25" (25% nga ana tjetër nga ora 3:00, përsëri në 12:00). Mos harroni se ky nuk është një numër negativ sepse kompensimi lëviz kundër shigjetës.


Si të vendosni feta donut rreth SVG

Tani duhet të shtojmë sektorë shtesë rreth rrethit. Le të përdorim një sektor që zë 15% të rrethit. Përqindja e mbetur për goditje-dasharray do të jetë 85%, pavarësisht nga çdo sektor tjetër. Prandaj, kodi do të duket si ky:

Ne e lamë stroke-dashoffset në 25, kështu që sektori i gjelbër fillon në krye dhe shkon në drejtim të akrepave të orës, duke mbivendosur sektorin e parë (rozë).


Natyrisht, kjo nuk është ajo që ne donim. Ne duam që përqindja e pesëmbëdhjetë (jeshile) të përshtatet mirë në hapësirën e lënë nga përqindja e tetëdhjetë e pestë (rozë). Ne mund të rregullojmë stroke-dashoffset derisa të jemi me fat, por nuk do të ishte aq e lehtë nëse do të kishim dy sektorë të tjerë. Në vend të kësaj, ne kemi nevojë për një formulë:

Rrethi - gjatësia totale e të gjithë sektorëve të mëparshëm + kompensimi i sektorit të parë = kompensimi i sektorit aktual

Duke futur numrat tanë, marrim:


Le të shtojmë më shumë sektorë në grafikun tonë!

E njëjta formulë funksionon për shtimin e sektorëve shtesë. Le ta mbushim grafikun me 40, 30, 20 për qind dhe 10 të mbetura nuk do të përdoren.

Rezultati:


Shtimi i tekstit brenda grafikut

Nuk do të ishte një tabelë donut pa tekst brenda dhe në mes; për këtë është vrima, apo jo? Epo, shtimi i tekstit është i lehtë. Ne thjesht përdorim elementin , e cila është vendase për format SVG.

10 birra

Do të vini re që e kam ndarë tekstin e grafikut në 2 elementë dhe i grupoi ato ). Kjo u bë në mënyrë që të mund t'i vendosim më lehtë titullin dhe numrin njëri mbi tjetrin, si dhe t'i rregullojmë ato si një njësi. I rregullova atributet X dhe Y për të filluar nga qendra e formës në vijën fundore dhe për t'i lidhur ato në të majtë.


Siç mund ta shihni, pozicionimi nuk është fare i duhuri, kështu që ne do të na duhet ta zbukurojmë atë me pak CSS:

Së pari, le të shtojmë fontin Montserrat (vetëm sepse më pëlqen). Pastaj duhet të rregullojmë madhësinë e shkronjave ("madhësia e shkronjave") dhe lartësia e rreshtit ("lartësia e rreshtit"). Pas shtimit të "translateY" në 0.25em, teksti rreshtohet pak vertikalisht, por nuk kemi mbaruar ende.

Ne duhet t'i bëjmë të dyja kutitë e tekstit më të vogla dhe t'i rreshtojmë ato në qendër duke rregulluar madhësinë e shkronjave aq sa duam (0.6em për numrin më të madh dhe 0.2em për titullin duket mirë) dhe duke përdorur veçorinë "text-anchor" me vlerën "mesi".

Tani teksti është në qendër. E tëra që mbetet është ta bëni atë me shkronja të mëdha (është e lehtë) dhe t'i vendosni elementët e tij individualë duke përdorur "translateY" në mënyrë që të grumbullohen siç duhet. Dhe kjo është ajo që kemi tani:


Çështjet e aksesueshmërisë

Siç e përmenda më herët, përmbajtja SVG është pjesë e DOM, kështu që është në thelb më e aksesueshme. Kjo e bën tepër të lehtë ofrimin e kontekstit shtesë për lexuesit e ekranit përmes atributeve dhe elementeve të tipit të titullit.

Niveli i parë i çështjeve të aksesueshmërisë është ta bëjë grafikun SVG më semantik duke e mbështjellë atë në një element

(sepse është një tabelë). Si figurë, ne mund të përfitojmë nga elementi për të dhënë një titull ose përshkrim për grafikun e donutit.

Përveç kësaj, ne mund të shtojmë etiketa të përmbajtjes Dhe <desc>(të cilat janë vendase në SVG) dhe i lidhin ato me titujt e ARIA, ID-të dhe rolin e "sigurimit të më shumë kontekstit për lexuesit e ekranit".</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">Birra në bodrumin tim Katërshe belg Segmenti i grafikut rozë që përfshin 40% të tërësisë, që është 4 Quadrupels belge nga 10 gjithsej. Imperial India Pale Ales Segmenti i grafikut jeshil që përfshin 20% të të gjithë, që është 2 Imperial India Pale Ales nga 10 gjithsej. Stouts Perandorake Ruse Segmenti i grafikut blu që përfshin 3% të tërësisë, që është 3 Ruse Imperial Stout nga 10 gjithsej. 10 birra

Grafiku i donutit që tregon 10 birra gjithsej. Dy birra janë Imperial India Pale Ales, katër birra janë Quadrupels belge dhe tre janë Ruse Imperial Stouts. Birra e fundit e mbetur nuk është e etiketuar.

Ne gjithashtu mund të shtojmë një çelës legjendë për grafikun si pjesë e

, duke e shënuar me rolin "pamje" dhe atributin ari-fshehur, pasi është vërtet i nevojshëm për dukshmëri.

Me një majë magjie CSS Flexbox ne mund ta pozicionojmë çelësin në të djathtë dhe ta rreshtojmë vertikalisht me diagramin. Çfarë do të na japë produktin përfundimtar:


Sepse dizajni CSS me çelësin e aplikuar në pronë me rreze kufitare dhe Flexbox mund të jenë artikuj të veçantë (i dyti kërkon një shpjegim shumë më të gjatë), do t'i ruaj ato tema për më vonë.

rezultatet përfundimtare

Siç e përmenda më herët, shkrimi i kodit për objektet SVG me dorë mund të marrë kohë, veçanërisht kur merrni parasysh faktin se ka shumë biblioteka të shkëlqyera JavaScript atje që do t'i ndërtojnë këto objekte për ju. Por mund të ketë raste (si situata ime) kur ju ose ekipi juaj keni nevojë për një metodë që nuk ndikon në JavaScript, një metodë që do të përpilohet në anën e serverit.

Lajmi i mirë është se sapo të keni marrë vesh në mënyrë të ngjashme, mund të aplikohet nga ju kudo tjetër me kosto minimale përpjekjet. Plus, ndotja e duarve me objekte SVG është mënyrë e mirë mësoni më shumë se si funksionojnë dhe zbuloni përfitimet e përdorimit të tyre.

Rezultatet e mia:

  • Zbatimi i matematikës për diçka të tillë është shumë më argëtues sesa në shkollën e mesme.
  • Duke parë prapa, kuptoj se logjika pas stroke-dasharray dhe stroke-dashoffset nuk është aq e komplikuar sa mendova fillimisht.
  • Mos harroni të shtoni këtu nivele shtesë aksesueshmërisë. Në fund të fundit, aksesueshmëria nuk është vetëm për hir të lexuesve të ekranit. Është gjithashtu e nevojshme për ta bërë përmbajtjen tuaj më të aksesueshme dhe më të konsumuar nga të gjithë njerëzit dhe të gjitha pajisjet (përfshirë Motorë kërkimi). Nëse biblioteka juaj JavaScript nuk ka veçori të aksesueshmërisë, mendoni ta ndryshoni atë.

Artikujt kryesorë të lidhur