He rite tonu te ahuatanga, he ripanga raraunga kei roto i te ipu ka taea te panuku. Kei ia rarangi he tahua mahi, he takaiho iti me etahi whiringa, penei i te Whakatika, Tārite, me te Mukua. Ka hangaia e koe, he pai te mahi i roto i te noho mokemoke, katahi ka tukuna e tetahi ki roto i taua div ka taea te panuku ka pakaru nga mea. Kua kite ahau i tenei pepeke tika i roto i nga turanga waehere rereke e toru: te ipu, te taapu, me te anga, he rereke katoa. Ko te bug, ahakoa, he tino rite. Ka tapahia te takahanga ki te taha o te ipu. Ka whakaatu mai ranei i muri i nga ihirangi e tika ana kei raro iho. Ka pai ranei kia panuku te kaiwhakamahi, katahi ka paheke. Ka tae koe ki te tohu-z: 9999. I etahi wa ka awhina, engari i etahi wa kaore he mahi. Ko taua rereketanga te tohu tuatahi kei te tupu tetahi mea hohonu. Ko te take ka hoki tonu mai, e toru nga punaha tirotiro motuhake e uru ana, a ko te nuinga o nga kaiwhakawhanake e mohio ana ki ia takitahi engari kaua rawa e whakaaro ki te aha ka tukituki nga mea e toru: te waipuke, te whakatakoto i nga horopaki, me nga poraka kei roto.
Ina mohio koe ki te mahi tahi e toru, ka mutu te ahua ohorere. Ko te tikanga, ka taea te tohu. Ko nga mea e toru i tino take ai tenei Kia ata tirohia ia o aua taonga. Te Raruke Puka Ina tautuhia e koe te puhake: huna, puhake: panuku, puhake ranei: aunoa i runga i tetahi huānga, ka tapahia e te kaitirotiro nga mea katoa e toro atu ana ki tua atu o ona rohe, tae atu ki nga uri kua tino tuunga. .panuku-ipu { waipuke: auto; teitei: 300px; /* Ma tenei ka tope i te takaiho, tu tonu */ }
.takaiho { tūranga: tino; /* Kare he aha -- i tapahia tonu e te .scroll-container */ }
I miharo ahau i te wa tuatahi i tutaki ahau. Ka mau ahau ki te tuunga: ma te tino ka tuku tetahi huānga kia mawhiti mai i te tapahi ipu. Kaore. I roto i te mahi, ko te tikanga ka taea te tapahi i tetahi tahua tino tuunga e tetahi tupuna he uara puhake kore e kitea, ahakoa ehara taua tupuna i te poraka kei roto i te tahua. He punaha motuhake te tapahi me te tuunga. Ka tukituki noa ratou i nga huarahi e ahua matapōkere noa kia mohio koe ki nga mea e rua.
Anei he tauira React ma te whakamahi i te createPortal:
kawemai { createPortal } mai i 'react-dom'; kawemai { useState, useEffect, useRef } from 'react';
mahi Whakataka({ anchorRef, isOpen, tamariki }) { const [tūnga, setPosition] = useState({ runga: 0, maui: 0 });
useEffect(() => { if ( isOpen && anchorRef.current) { const rect = anchorRef.current.getBoundingClientRect(); Tautuhinga({ runga: rect.bottom + window.scrollY, maui: rect.left + window.scrollX, }); } }, [Tuwhera, anchorRef]);
ki te (!Tuwhera) whakahokia null;
hoki mai waihangaPortal(
A, ko te tikanga, kaore e taea e taatau te wareware i te urunga. Ko nga huānga mau ka puta mai i runga i nga ihirangi me taea tonu te toro atu ki te papapātuhi. Mena karekau te ota arotahi e nuku noa ki roto i te takaiho tuturu, me whakahaere e koe ma te whakamahi waehere. He mea tika ano kia tirohia e kore e noho ki runga ake i etahi atu ihirangi tauwhitiwhiti me te kore he huarahi ki te whakakore. Ka ngaua koe e tera i te whakamatautau papapātuhi. CSS Punga Turanga: Kei hea taku whakaaro kei te anga tenei Ko te CSS Anchor Positioning te huarahi e tino hiahia ana ahau inaianei. Kaore au i tino mohio he aha te nui o te spec i tino whakamahia i taku tirohanga tuatahi. Ka taea e koe te whakaatu i te hononga i waenga i te takahanga me tana keu i roto i te CSS, a ma te kaitirotiro e whakahaere nga taunga. .keu { ingoa-punga: --taku-keu; }
.takaiho-tahua { tūranga: tino; tūranga-punga: --taku-keu; runga: punga(raro); maui: punga(maui); tūnga-try-fallbacks: pore-paraka, pore-roto; }
Ko te taonga tuunga-try-fallbacks te mea e pai ai te whakamahi i runga i te tatauranga a-ringa. Ka ngana te kaitirotiro ki etahi atu tuunga i mua i te tuku, no reira ka huri aunoa te takahanga kei raro o te tauranga tirohanga ki runga, kaua e tapahia. He pakari te tautoko tirotiro i roto i nga kaitirotiro a Chromium me te tipu haere i Safari. Kei te hiahia a Firefox ki tetahi polyfill. Ko te @oddbird/css-anchor-positioning package e kapi ana i te kaupapa matua. Kua whiua e ahau nga keehi taha tahora me nga mea e hiahia ana ki te hokinga mai kaore au i whakaaro, na reira kia pai ake te whakapai ake, honoa ranei ki tetahiTakahuri JavaScript mo Firefox. I roto i te poto, te whakaari engari kaore ano i te ao. Whakamātautauhia i roto i o tirotiro tirotiro. A, mo te whai waahi, ko te whakapuaki i te hononga ataata i roto i te CSS kaore e korero ki te rakau urunga tetahi mea. aria-controls, aria-expanded, aria-haspopup — kei a koe tonu tera waahanga. I etahi wa ka neke noa te whakatika i te huānga I mua i te toronga ki te tomokanga, ki te hanga tatauranga ruruku ranei, ka patai au i tetahi patai i te tuatahi: Me noho tonu tenei takahanga ki roto i te ipu panuku? Ki te kore, ko te neke i te tohu ki tetahi takai taumata teitei ka whakakore katoa i te raru, me te kore JavaScript me te kore he tatauranga taurite. Kaore tenei e taea i nga wa katoa. Mena ka whakauruhia te paatene me te takaiho ki roto i te waahanga kotahi, ko te neke i tetahi me te kore tetahi atu ko te whakaaro ano i te API katoa. Engari ka taea e koe te mahi, kaore he mea hei patuiro. Karekau noa te raru. He aha te CSS hou e kore e whakaoti Kua tae mai a CSS ki konei, engari kei reira tonu nga waahi ka tukuna koe ki raro. Ko te turanga: he mea whakatika me te huri i nga take kei reira tonu. Kei roto i te waahanga, ko te tikanga kaore he mahinga CSS. Mena kei te whakamahi koe i te whare pukapuka hākoritanga e takai ana i to tahora ki tetahi huānga kua huri, kei te hoki koe ki te hiahia kuaha, tuunga punga ranei. Ko te tuunga Punga CSS he mea pai, engari he hou. Ka rite ki te korero i mua, kei te hiahia tonu a Firefox ki te polyfill i te wa e tuhi ana ahau i tenei. Kua whiua e ahau nga keehi taha tahora me te mea e hiahiatia ana nga whakamuri kaore au i whakaaro. Mena kei te hiahia koe ki te whanonga rite puta noa i nga kaitirotiro katoa i tenei ra, kei te toro tonu koe mo te JavaScript mo nga waahanga uaua. Ko te taapiri kua whakarereketia e au taku rerenga mahi ko te HTML Popover API, kei te waatea i nga kaitirotiro hou katoa. Ko nga huānga me te huanga popover ka tukuna ki te paparanga o runga o te kaitirotiro, i runga ake i nga mea katoa, kaore he tuunga JavaScript e hiahiatia ana.
Ko te whakahaere mawhiti, te whakakore-a-paa-waho, me nga tohutoro urunga totika he utu kore utu mo nga mea penei i nga aki taputapu, nga widget whakakitenga, me nga whakakikorua ngawari. Koinei te taputapu tuatahi ka tae atu ahau inaianei. E ai ki tera, kaore e whakaoti i te tuunga. Ka whakaoti te paparanga. Kei te hiahia tonu koe ki te tuunga punga, ki te JavaScript ranei hei whakahāngai i te popover ki tana keu. Ko te Popover API te whakahaere i te paparanga. Ko te tuunga punga ka hapai i te tuunga. Ka whakamahia ngatahi, ka kapi i te nuinga o nga mea i tae atu koe mo te whare pukapuka hei mahi. He Aratohu Whakatau Mo To Turanga I muri i enei mea katoa i te huarahi uaua, koinei taku tino whakaaro mo te whiringa inaianei.
Whakamahia he tomokanga. Ka whakamahia e au i te wa e noho hohonu ana te keu ki roto i nga ipu pukapuka kohanga. I whakamahia e ahau tenei tauira mo nga tahua mahi ripanga, ka honoa ki te whakaora arotahi me nga arowhai urunga. Koinei te waahanga tino pono, engari ko te wa tahua mo te taapiri waea. Whakamahia te tuunga tuturu. Ko tenei mo te wa kei roto koe i te vanilla JavaScript, he anga maamaa ranei ka taea te manatoko kaore he tipuna e tono huringa, whiriwhiringa ranei. He ngawari ki te whakarite me te ngawari ki te patuiro, mena ka mau tonu taua here. Whakamahia te CSS Anchor Positioning.Reach mo tenei ina whakaaetia e to kaitirotiro. Mena ka hiahiatia he tautoko Firefox, honoa ki te @oddbird polyfill. Koinei te waahi kei te anga whakamua te turanga, ka mutu ka waiho hei huarahi haere maau. Whakaritea ano te DOM.Whakamahia tenei ina whakaaehia e te hoahoanga, ka hiahia koe ki te uaua o te wa whakahaere. E whakapono ana ahau koinei pea te whiringa tino iti. Whakakotahitia nga tauira.Mahia tenei ina hiahia koe ki te tuunga punga hei huarahi tuatahi ki a koe, honoa ki te takahuri JavaScript mo nga kaitirotiro kore tautoko. He tomokanga ranei mo te whakaurunga DOM e hono ana ki te getBoundingClientRect() mo te tika o te ruruku.
Whakamutunga I whakamahia e ahau tenei pepeha hei take kotahi noa - he mea hei papaki me te neke atu. Engari i te wa i noho roa ai ahau ki te mohio ki nga punaha e toru e uru mai ana - ko te kopa puhake, te whakatakoto i nga horopaki, me nga poraka kei roto - ka mutu te ahua ohorere. Ka taea e au te titiro ki te takahanga kua pakaru, ka kitea tonu ko wai te tupuna. Ko taua huringa i roto i taku panui i te DOM ko te tino tangohanga. Karekau he whakautu tika. Ko nga mea i tutukihia e au i runga i nga mea ka taea e au te whakahaere i roto i te turanga waehere: nga tomokanga i te wa e kore e kitea te rakau tipuna; te whakatakotoranga i te wa he ma me te ngawari; te neke i te huānga i te wa kaore he mea i aukati i ahau; me te tuunga punga inaianei,kei hea ka taea e au. Ko nga mea katoa ka whakatauhia e koe, kaua e kiia ko te urunga ko te taahiraa whakamutunga. Ki taku wheako, koinei tonu te wa ka pekehia. Ko nga hononga ARIA, te whakahaere arotahi, te whanonga papapātuhi - ehara i te mea maamaa. Ko ratou tetahi o nga mea e tino mahi ana te mea. Tirohia te waehere puna katoa i roto i taku repo GitHub. Panuitanga Atu Ko enei nga tohutoro i hoki mai ano ahau ki te mahi i tenei:
Te Horopaki Tāpae (MDN) "CSS Anchor Positioning Guide", Juan Diego Rodriguez "Te tiimata me te Popover API", Godstime Aburu UI māngi (floating-ui.com) CSS Overflow (MDN)