Qhov xwm txheej yuav luag ib txwm zoo ib yam, uas yog lub rooj ntaub ntawv hauv ib lub thawv scrollable. Txhua kab muaj cov ntawv qhia ua haujlwm, ib qho me me nrog qee qhov kev xaiv, xws li Kho kom raug, Duplicate, thiab Rho tawm. Koj tsim nws, nws zoo li ua haujlwm zoo kawg nkaus hauv kev sib cais, thiab tom qab ntawd ib tus neeg muab nws tso rau hauv qhov scrollable div thiab cov khoom poob sib nrug. Kuv tau pom cov kab no tseeb hauv peb qhov sib txawv codebases: lub thawv, pawg, thiab lub moj khaum, txhua yam sib txawv. Txawm li cas los xij, tus kab mob no zoo ib yam nkaus. Lub dropdown tau clipped ntawm lub thawv ntim khoom ntug. Los yog nws qhia txog qab cov ntsiab lus uas yuav tsum muaj kev xav hauv qab nws. Los yog nws ua haujlwm zoo kom txog thaum tus neeg siv scrolls, thiab tom qab ntawd nws drifts. Koj ncav cuag z-index: 9999. Qee lub sij hawm nws pab, tab sis lwm zaus nws tsis muaj dab tsi kiag li. Qhov kev tsis sib haum xeeb ntawd yog thawj qhov qhia tias ib yam dab tsi ntxaum tshwm sim. Yog vim li cas nws tseem rov qab los yog tias peb qhov browser cais tau koom nrog, thiab cov neeg tsim khoom feem ntau nkag siab txhua tus ntawm nws tus kheej tab sis tsis txhob xav txog dab tsi tshwm sim thaum tag nrho peb qhov kev sib tsoo: hla dhau, stacking cov ntsiab lus, thiab muaj cov blocks.
Thaum koj nkag siab tias peb qhov kev sib cuam tshuam li cas, hom kev ua tsis tiav yuav tsum tsis txhob hnov qab. Qhov tseeb, lawv dhau los ua kwv yees. Peb Yam Uas Ua Tau Qhov no Cia peb saib txhua yam ntawm cov khoom no kom ntxaws. Qhov teeb meem Overflow Thaum koj teem caij hla: zais, hla: scroll, lossis dhau: pib ntawm ib lub caij, tus browser yuav clip txhua yam uas txuas mus dhau nws cov ciam teb, suav nrog cov xeeb leej xeeb ntxwv kiag li. .scroll-container { overflow: auto; qhov siab: 300px; /* Qhov no yuav clip lub dropdown, tag nrho nres */ }
.dropdown { txoj hauj lwm: kiag li; /* Tsis muaj teeb meem -- tseem clipped los ntawm .scroll-container */ }
Qhov ntawd ua rau kuv xav tsis thoob thaum thawj zaug kuv tau khiav mus rau hauv. Kuv xav tias txoj hauj lwm: kiag li yuav cia lub caij khiav ntawm lub thawv clipping. Tsis yog. Hauv kev xyaum, qhov ntawd txhais tau hais tias cov ntawv qhia zaub mov tiag tiag tuaj yeem raug txiav tawm los ntawm ib tus poj koob yawm txwv uas tsis pom muaj txiaj ntsig, txawm tias tus poj koob yawm txwv tsis yog cov ntawv qhia zaub mov muaj qhov thaiv. Clipping thiab positioning yog cais systems. Lawv tsuas yog tshwm sim los sib tsoo nyob rau hauv txoj kev uas zoo nkaus li random kom txog thaum koj to taub ob qho tib si.
Nov yog React piv txwv siv createPortal:
import {createPortal } los ntawm 'react-dom'; import { useState, useEffect, useRef } los ntawm 'react';
muaj nuj nqi Dropdown({ anchorRef, isOpen, me nyuam }) { const [txoj hauj lwm, setPosition] = useState({ top: 0, laug: 0 });
useEffect(() => { yog (isOpen && anchorRef.current) { const rect = anchorRef.current.getBoundingClientRect(); setPosition({ saum: rect.bottom + window.scrollY, sab laug: rect.left + window.scrollX, }); } }, [isOpen, anchorRef]);
yog (!isOpen) rov null;
rov qab createPortal(
Thiab, tau kawg, peb tsis tuaj yeem tsis quav ntsej txog kev siv tau. Tsau cov ntsiab lus uas tshwm sim dhau cov ntsiab lus tseem yuav yog cov keyboard ncav cuag. Yog tias qhov kev txiav txim kom pom tseeb tsis tau txav mus rau hauv qhov poob qis, koj yuav tsum tau tswj nws siv cov cai. Nws tseem tsim nyog xyuas tias nws tsis zaum dhau lwm cov ntsiab lus sib tham nrog tsis muaj txoj hauv kev tso nws. Qhov ntawd tom koj hauv kev sim keyboard. CSS Anchor Positioning: Qhov twg kuv xav tias Qhov no yog Lub taub hau CSS Anchor Positioning yog cov kev taw qhia uas kuv nyiam tshaj plaws tam sim no. Kuv tsis paub meej npaum li cas ntawm cov spec tau siv tau thaum kuv xub saib nws. Nws tso cai rau koj tshaj tawm txoj kev sib raug zoo ntawm kev poob qis thiab nws qhov tshwm sim ncaj qha hauv CSS, thiab qhov browser tswj hwm cov kev tswj hwm. .trigger { thauj tog rau nkoj-npe: --my-trigger; }
.dropdown-menu { txoj hauj lwm: kiag li; txoj hauj lwm-txheej txheem: --my-trigger; sab saum toj: thauj tog rau nkoj (hauv qab); sab laug: thauj tog rau nkoj (sab laug); txoj hauj lwm-sim-fallbacks: flip-block, flip-inline; }
Txoj hauj lwm-sim-fallbacks cov cuab yeej yog dab tsi ua rau qhov no tsim nyog siv tshaj li kev suav phau ntawv. Tus browser sim lwm qhov chaw ua ntej tso tseg, yog li qhov kev poob qis hauv qab ntawm qhov chaw saib tau hloov mus rau sab saud es tsis txhob txiav tawm. Kev txhawb nqa browser yog ruaj khov hauv Chromium-based browsers thiab loj hlob hauv Safari. Firefox xav tau polyfill. Lub @oddbird/css-anchor-positioning pob npog cov ntsiab lus tshwj xeeb. Kuv tau ntaus layout ntug rooj plaub nrog nws uas yuav tsum tau fallbacks kuv tsis tau xav txog, yog li kho nws raws li ib tug txhim khu kev qha kev txhim kho los yog ua ke nrog ib tugJavaScript fallback rau Firefox. Nyob rau hauv luv luv, cog lus tab sis tsis universal tseem. Ntsuas hauv koj lub hom phiaj browsers. Thiab raws li kev nkag mus tau muaj kev txhawj xeeb, tshaj tawm kev sib raug zoo hauv CSS tsis qhia txog kev nkag mus rau tsob ntoo dab tsi. aria-controls, aria-expanded, aria-haspopup - qhov ntawd tseem nyob ntawm koj. Qee lub sij hawm Kev Kho tsuas yog txav lub ntsiab Ua ntej ncav cuag lub portal lossis ua kev sib koom ua ke, kuv ib txwm nug ib lo lus nug ua ntej: Puas yog qhov kev poob qis no yuav tsum tau nyob hauv lub thawv scroll? Yog tias nws tsis yog, txav lub cim mus rau qib siab dua wrapper tshem tawm qhov teeb meem tag nrho, tsis muaj JavaScript thiab tsis muaj kev sib koom ua ke. Qhov no tsis yog ib txwm ua tau. Yog hais tias lub pob thiab lub dropdown yog encapsulated nyob rau hauv tib lub tivthaiv, txav ib yam tsis muaj lwm yam txhais tau tias rethinking tag nrho API. Tab sis thaum koj tuaj yeem ua tau, tsis muaj dab tsi los daws qhov teeb meem. Qhov teeb meem tsuas yog tsis muaj. Dab tsi niaj hnub CSS tseem tsis daws CSS tau los ntev ntawm no, tab sis tseem muaj qhov chaw nws cia koj poob. Txoj hauj lwm: tsau thiab hloov cov teeb meem tseem muaj. Nws yog nyob rau hauv spec txhob txwm, uas txhais tau tias tsis muaj CSS workaround muaj. Yog tias koj siv lub tsev qiv ntawv animation uas qhwv koj cov layout hauv cov khoom hloov pauv, koj rov qab mus rau qhov xav tau portals lossis thauj tog rau nkoj. CSS Anchor Positioning tau cog lus tseg, tab sis tshiab. Raws li tau hais ua ntej, Firefox tseem xav tau polyfill thaum kuv sau qhov no. Kuv tau ntaus layout ntug rooj plaub nrog nws uas yuav tsum tau fallbacks kuv tsis tau xav txog. Yog tias koj xav tau tus cwj pwm zoo ib yam thoob plaws txhua qhov browser niaj hnub no, koj tseem tab tom ncav cuag JavaScript rau qhov tsis yooj yim. Qhov sib ntxiv uas kuv tau hloov pauv kuv txoj haujlwm ua haujlwm yog HTML Popover API, tam sim no muaj nyob hauv txhua qhov browser niaj hnub. Cov ntsiab lus nrog tus cwj pwm popover ua rau hauv qhov browser txheej sab saum toj, saum toj no txhua yam, tsis muaj JavaScript qhov xav tau.
Kev khiav tawm tuav, tso tawm-rau-nias-tawm sab nraud, thiab cov khoom siv nkag tau yooj yim tuaj yeem dawb rau tej yam xws li cov lus qhia, nthuav tawm widgets, thiab yooj yim overlays. Nws yog thawj lub cuab yeej uas kuv mus txog tam sim no. Hais tias, nws tsis daws qhov chaw. Nws daws cov txheej txheem. Koj tseem xav tau qhov chaw thauj tog rau nkoj lossis JavaScript los kho qhov popover rau nws qhov tshwm sim. Popover API tswj cov txheej txheem. Anchor positioning tuav qhov kev tso kawm. Siv ua ke, lawv npog feem ntau ntawm yam koj tau ua dhau los ua rau lub tsev qiv ntawv ua. Daim Ntawv Qhia Kev Txiav Txim Rau Koj Qhov Teeb Meem Tom qab dhau tag nrho cov kev nyuaj no, ntawm no yog li cas kuv xav txog qhov kev xaiv tam sim no.
Siv lub portal.Kuv yuav siv qhov no thaum tus txhais lus nyob sib sib zog nqus nyob rau hauv nested scroll ntim. Kuv tau siv cov qauv no rau cov ntawv qhia zaub mov thiab ua ke nrog kev kho kom pom tseeb thiab kev txheeb xyuas kev nkag mus tau yooj yim. Nws yog qhov kev xaiv zoo tshaj plaws, tab sis lub sijhawm siv nyiaj rau kev xaim ntxiv. Siv qhov chaw ruaj khov.Qhov no yog rau thaum koj nyob hauv vanilla JavaScript lossis lub teeb yuag thiab tuaj yeem txheeb xyuas tsis muaj poj koob yawm txwv siv hloov pauv lossis lim. Nws yog ib qho yooj yim los teeb tsa thiab yooj yim rau kev debug, tsuav yog qhov kev txwv ntawd tuav. Siv CSS Anchor Positioning.Reach rau qhov no thaum koj qhov kev txhawb nqa browser tso cai rau nws. Yog xav tau kev txhawb nqa Firefox, ua ke nrog @oddbird polyfill. Qhov no yog qhov twg lub platform yog thaum kawg mus thiab yuav nws thiaj li dhau los ua koj txoj kev mus kom ze. Restructure lub DOM.Siv qhov no thaum lub architecture tso cai rau nws, thiab koj xav xoom runtime complexity. Kuv ntseeg tias nws yuav yog qhov kev xaiv tsis zoo tshaj plaws. Ua ke cov qauv.Ua qhov no thaum koj xav tau qhov chaw thauj tog rau nkoj raws li koj txoj hauv kev tseem ceeb, ua ke nrog JavaScript poob rau cov browsers tsis txhawb nqa. Los yog lub portal rau DOM kev tso kawm ua ke nrog getBoundingClientRect() rau kev sib koom tes raug.
Xaus Kuv tau siv los kho tus kab mob no ua qhov teeb meem ib leeg - ib yam dab tsi los kho thiab txav mus los. Tab sis ib zaug kuv zaum nrog nws ntev txaus kom nkag siab txog tag nrho peb lub tshuab cuam tshuam - hla kev hlais, ntim cov ntsiab lus, thiab muaj cov blocks - nws nres tsis zoo. Kuv tuaj yeem saib qhov kev poob qis thiab tam sim ntawd taug qab tus poj koob yawm txwv yog lub luag haujlwm. Qhov kev hloov ntawd hauv qhov kuv nyeem DOM yog qhov kev tshem tawm tiag tiag. Tsis muaj ib lo lus teb tiag. Qhov kuv mus txog yog nyob ntawm seb kuv tuaj yeem tswj tau li cas hauv codebase: portals thaum tsob ntoo yawm txiv tsis tuaj yeem xav txog; kho qhov chaw thaum nws huv si thiab yooj yim; txav lub caij thaum tsis muaj dab tsi nres kuv; thiab thauj tog rau nkoj tam sim no,kuv tuaj yeem nyob qhov twg. Txawm koj xaiv qhov twg los xij, tsis txhob kho kev nkag mus tau raws li qib kawg. Hauv kuv qhov kev paub, qhov ntawd yog raws nraim thaum nws tau hla. Kev sib raug zoo ARIA, kev tswj xyuas kom pom tseeb, tus cwj pwm ntawm cov keyboard - cov no tsis yog polished. Lawv yog ib feem ntawm qhov ua rau qhov ua tau tiag tiag. Tshawb xyuas tag nrho cov cai hauv kuv GitHub repo. Nyeem ntxiv Cov no yog cov ntaub ntawv kuv tau khaws cia rov qab los thaum ua haujlwm los ntawm qhov no:
Cov ntsiab lus ntawm Stacking (MDN) "CSS Anchor Positioning Guide", Juan Diego Rodriguez "Tau Pib Nrog Popover API", Godstime Aburu Floating UI (floating-ui.com) CSS Overflow (MDN)