Ssenariýa hemişe diýen ýaly birmeňzeş, bu aýlanyp bolýan gapyň içindäki maglumatlar tablisasy. Her hatarda hereket menýusy, Edit, Dublikat we Delete ýaly käbir opsiýalary bar. Ony gurýarsyňyz, üzňelikde ajaýyp işleýän ýaly, soňam kimdir biri ony aýlap bolýan diwanyň içine salýar we zatlar ýykylýar. Bu takyk ýalňyşlygy üç dürli kod bazasynda gördüm: konteýner, stakan we çarçuwa, hemmesi üýtgeşik. Bugalňyşlyk düýbünden birmeňzeş. Açylýan zat konteýneriň gyrasyna gysylýar. Ora-da logiki taýdan aşakda bolmaly mazmunyň aňyrsynda görkezilýär. Ora-da ulanyjy aýlanýança, soňam süýşýänçä gowy işleýär. Z-index: 9999-a ýetýärsiňiz. Käwagt kömek edýär, ýöne başga wagtlar düýbünden hiç zat etmeýär. Bu gapma-garşylyk, has çuňňur bir zadyň bolup geçýändigi baradaky ilkinji maglumat. Yzyna gaýdyp gelmeginiň sebäbi üç sany aýratyn brauzer ulgamynyň gatnaşmagydyr we işläp düzüjileriň köpüsi hersine özbaşdak düşünýärler, ýöne üçüsi hem çaknyşanda näme boljagy hakda hiç wagt pikir etmeýärler: aşmak, kontekstleri düzmek we bloklary öz içine almak.

Üçüsiniň hem özara täsirleşýändigine düşüneniňizden soň, şowsuzlyk reesimleri tötänleýin duýulmagyny bes edýär. Aslynda, öňünden aýdyp bolýar. Aslynda sebäp bolýan üç zat Geliň, şol zatlaryň hersine jikme-jik seredeliň. Artmak meselesi Haçan-da üstaşyr: gizlenen, aşýan: aýlamak ýa-da aşmak: bir elemente awtomatik sazlasaňyz, brauzer düýbünden ýerleşýän nesilleri hem öz içine alýan çäkleri uzadýar. .scroll-konteýner { aşmak: awto; beýikligi: 300px; / * Bu aşak düşmegi, doly duralgany keser * / }

.Dropdown { ýagdaýy: mutlak; / * Möhüm däl - henizem .scroll-konteýner tarapyndan kesildi * / }

Bu meni ilkinji gezek ylganymda geň galdyrdy. Positionagdaýy çakladym: mutlak bir elementiň konteýneriň kesilmeginden gaçmagyna ýol açar. Beýle däl. Iş ýüzünde, bu düýbünden ýerleşýän menýu, görünmeýän artykmaç gymmaty bolan islendik ata-baba tarapyndan kesilip bilner, hatda şol ata-baba menýuda blok ýok bolsa-da. Kesmek we ýerleşdirmek aýratyn ulgamlardyr. Diňe ikisine düşünýänçäňiz düýbünden tötänleýin görünýän görnüşde çaknyşýarlar.

Ine, createPortal ulanyp, React mysaly:

'react-dom' -den {createPortal import import et; 'reaksiýa' -dan {useState, useEffect, useRef import import et;

Dropdown funksiýasy ({anchorRef, isOpen, çagalar}) { const [pozisiýa, setPosition] = useState ({ýokarky: 0, çep: 0});

useEffect (() => { if (isOpen && anchorRef.current) { const rect = anchorRef.current.getBoundingClientRect (); setPosition ({ ýokarky: rect.bottom + windows.scrollY, çep: rect.left + windows.scrollX, }); } }, [isOpen, anchorRef]);

eger (! isOpen) gaýdyp gelse;

createPortal ( {çagalar}

, resminama ); }

Elbetde, elýeterliligi äsgermezlik edip bilmeris. Mazmunyň üstünde görünýän kesgitlenen elementler henizem klawiatura elýeterli bolmaly. Fokus tertibi kesgitlenen aşak gaçma tebigy ýagdaýda geçmese, kod ulanyp dolandyrmaly bolarsyňyz. Şeýle hem, beýleki interaktiw mazmunyň üstünde oturmajakdygyny barlamaly. Bu klawiatura synagynda sizi dişleýär. CSS labyryň ýerleşişi: Meniň pikirimçe, bu nirä barýar CSS labyrynyň ýerleşişi häzirki wagtda iň gyzyklanýan ugrum. Ilkinji gezek seredenimde, spektriň näçeräk ulanylýandygyna ynanmadym. Açylýan we triggeriň arasyndaky baglanyşygy göni CSS-de yglan etmäge mümkinçilik berýär we brauzer koordinatlary dolandyrýar. .trigger { labyryň ady: --my-trigger; }

.dropdown-menu { ýagdaýy: mutlak; pozisiýa-labyr: --my-trigger; ýokarky: labyr (aşaky); çep: labyr (çepde); pozisiýa-synanyşyk-yza gaýtmak: flip-blok, flip-inline; }

Positionerleşiş-synanyşyk-yzyna gaýtarmak häsiýeti, el bilen hasaplamagyň üstünde bu gymmaty döredýär. Brauzer bermezden ozal başga ýerleri ýerleşdirmäge synanyşýar, şonuň üçin görnüşiň aşagyndaky aşak düşme kesilmegiň ýerine awtomatiki usulda ýokaryk süýşýär. Brauzer goldawy, Hrom esasly brauzerlerde gaty berk we Safari-de ösýär. Firefox-a polifill gerek. @ Oddbird / css-labyr-ýerleşdiriş bukjasy esasy spesifikasiýany öz içine alýar. Düzülen gyralary gördüm, munuň garaşylmadyk ýalňyşlyklaryny talap edýärdim, şonuň üçin ony öňe gidişlik hökmünde görüň ýa-da aFirefox üçin JavaScript yza gaýdyp gelmek. Gysgaça aýdylanda, geljegi uly, ýöne entek uniwersal däl. Maksatly brauzerleriňizde synap görüň. Elýeterlilik barada aýdylanda, CSS-de wizual gatnaşygy yglan etmek, elýeterlilik agajyna hiç zat aýtmaýar. aria-dolandyryşlar, aria-giňeldilen, aria-haspopup - bu bölek henizem size. Käwagt düzediş diňe elementi herekete getirýär Portala ýetmezden ýa-da koordinat hasaplamalary etmezden ozal hemişe bir sorag berýärin: Bu aşak gaçma hakykatdanam aýlaw konteýneriniň içinde ýaşamalymy? Eger beýle bolmasa, belligi has ýokary derejeli örtüge geçirmek, JavaScript we koordinat hasaplamalary bolmazdan meseläni bütinleý ýok ​​edýär. Bu hemişe mümkin däl. Eger düwme we aşak gaçma şol bir komponentde jemlenen bolsa, birini beýlekisiz hereket etmek, tutuş API-ni täzeden gözden geçirmegi aňladýar. Itöne muny edip bilseň, düzetjek zat ýok. Mesele ýok. Häzirki zaman CSS henizem çözüp bilenok CSS bu ýerde uzak ýol geçdi, ýöne henizem sizi peseldýän ýerler bar. Positionerleşýän ýeri: kesgitlenen we üýtgedilen meseleler henizem bar. Bu bilgeşleýin, CSS işiniň ýokdugyny aňladýar. Tertibiňizi üýtgedilen elemente gurşap alýan animasiýa kitaphanasyny ulanýan bolsaňyz, portallara ýa-da labyr ýerleşişine mätäç bolarsyňyz. CSS labyrynyň ýerleşişi geljegi uly, ýöne täze. Öň hem belläp geçişimiz ýaly, Firefox muny ýazýan wagtym henizem polifill gerek. Men munuň bilen garaşylmadyk ýalňyşlyklary talap edýän düzüliş gyralaryny gördüm. Häzirki wagtda ähli brauzerlerde yzygiderli özüni alyp barmak zerur bolsa, kyn bölekler üçin JavaScript-e ýetip bilersiňiz. Aslynda iş tertibimi üýtgeden goşmaçam, häzirki zaman brauzerleriň hemmesinde elýeterli HTML Popover API. Açylýan atributly elementler, brauzeriň ýokarky gatlagynda, hemme zatdan öňürti, JavaScript ýerleşişiniň zerurlygy ýok.

Açmak

Işlemekden gaçmak, basmakdan çykmak we berk elýeterlilik semantikasy gurallar, aç-açan gurallar we ýönekeý örtükler ýaly zatlar üçin mugt bolýar. Bu häzirlikçe ýeten ilkinji guralym. Saidagny, ýerleşişi çözüp bilmez. Gatlaklygy çözýär. Bir popover-i triggerine deňlemek üçin henizem labyryň ýerleşişi ýa-da JavaScript gerek. “Popover API” gatlagy dolandyrýar. Gämi ýerleşdirişi ýerleşdirýär. Bilelikde ulanylanda, kitaphanada ýerine ýetirmek üçin ozal ýeten zatlaryňyzyň köpüsini öz içine alýar. Youragdaýyňyz üçin karar gollanmasy Bularyň hemmesini kyn ýoldan geçirenden soň, ine, häzir saýlamak hakda nähili pikir edýändigim.

Portal ulanyň. Haçan-da trigger höwürtgelenen aýlaw gaplarynda çuňňur ýaşasa, ulanmaýaryn. Bu nagşy stoluň hereket menýulary üçin ulandym we ünsi dikeltmek we elýeterlilik barlaglary bilen jübütledim. Bu iň ygtybarly wariant, ýöne goşmaça sim üçin býudjet wagty. Kesgitlenen pozisiýany ulanyň. Bu vanil JavaScript-de ýa-da ýeňil çarçuwada bolanyňyzda we hiç bir ata-babanyň üýtgeşme ýa-da süzgüç ulanmaýandygyny barlap bilersiňiz. Şol çäklendirmäni saklaýança gurmak ýönekeý we düzeltmek ýönekeý. CSS Anchor Positioning ulanyň. Brauzer goldawyňyz rugsat bereninde munuň üçin ýetiň. Firefox goldawy zerur bolsa, ony @oddbird polifill bilen jübütläň. Ine, platforma ahyrsoňy ugraýar we ahyrsoňy siziň çemeleşmäňize öwrüler. DOM-ny täzeden guruň. Arhitektura rugsat bereninde ulanyň we iş wagtynyň çylşyrymlylygyny isleýärsiňiz. Munuň iň pes derejeli wariantydygyna ynanýaryn. Nagyşlary birleşdiriň. Goldaw berilmeýän brauzerler üçin JavaScript yza gaýtarylmagy bilen jübütlenen esasy çemeleşme hökmünde labyryň ýerleşdirilmegini isleseňiz ediň. Ora-da koordinat takyklygy üçin getBoundingClientRect () bilen jübütlenen DOM ýerleşdiriş portaly.

Netije Men bu näsazlygy bir gezeklik mesele hökmünde görýärdim - ýamajak we dowam etdirmeli bir zat. Involvedöne bir gezek onuň bilen baglanyşykly üç ulgamyň hemmesine düşünmek üçin ýeterlik uzak oturanymdan soň - suw joşmagy, kontekstleri düzmek we bloklary saklamak - tötänleýin duýulmagyny bes etdi. Döwülen damja seredip, haýsy atanyň jogapkärdigini derrew yzarlap bilýärdim. DOM-y nädip okandygymdaky bu üýtgeşiklik hakyky ýol boldy. Rightekeje dogry jogap ýok. Nämä ýetenim, kod bazasynda nämäni dolandyryp biljekdigime baglydy: ata-baba agajynyň öňünden aýdyp bolmaýan portallary; arassa we ýönekeý bolanda kesgitli ýerleşiş; hiç zat päsgel bermedik elementi herekete getirmek; labyryň ýerleşişi,men nirede Näme saýlasaňyzam, elýeterliligi soňky ädim hökmünde kabul etmäň. Meniň tejribämde, edil haçan atylýar. ARIA gatnaşyklary, fokus dolandyryşy, klawiaturanyň özüni alyp barşy - bular sypaýy däl. Olar hakykatdanam işleýän zadyň bir bölegi. GitHub repo-da doly çeşme koduny gözden geçiriň. Goşmaça okamak Bu üstünde işleýän wagtym gaýdyp gelýän salgylanmalar:

Gözleg mazmuny (MDN) “CSS labyry ýerleşdiriş gollanmasy”, Huan Diego Rodriges “Popover API-den başlamak”, Godstime Aburu Loüzýän UI (floating-ui.com) CSS akymy (MDN)

You May Also Like

Enjoyed This Article?

Get weekly tips on growing your audience and monetizing your content — straight to your inbox.

No spam. Join 138,000+ creators. Unsubscribe anytime.

Create Your Free Bio Page

Join 138,000+ creators on Seemless.

Get Started Free