Popup
- Komponent
-
IPopup
Popup är en ramverkskomponent som används tillsammans med andra komponenter för att kunna visa en komponent som overlay eller inline.
Styling
Som standard har popup enbart box-shadow
när den är overlay och konsumenten ansvarar för all annan styling samt layout.
För att ändra styling beroende på om popup är overlay eller inline så kan du använda klass selector .popup--overlay
och .popup--inline
.
.popup--overlay .my-awesome-popup {
width: 25rem;
}
.popup--inline .my-awesome-popup {
width: 100%;
}
Fokushantering
Som standard hanterar popup fokus själv genom att flytta fokus till första tabbningsbara element när den öppnas, samt att fokus återställs när popup stängs.
Om du behöver sätta fokus på ett annat element när popup öppnas kan du
använda focus-element
som tar en funktion som returnerar det element du vill ska få fokus.
<i-popup
+ :focus-element="() => myFocusElement"
>
Du kan stänga av den automatiska fokushanteringen genom att sätta set-focus
till false
.
För att själv sätta fokus i detta fallet kan du lyssna på "open"
eventet
som sänds när popup är synlig och beräkning av position är klar.
<i-popup
+ :set-focus="false"
+ @open="onOpenSetFocus"
>
Teleport
Komponenten teleporteras till body-elementet som standard när den visas som overlay.
Detta kan ändras till valfritt element genom att ändra värdet för config.teleportTarget
.
Container
Container är den yta som begränsar området som en popup måste hålla sig inom. Popupens position kommer inte hamna utanför containern (med undantag för om ingen lämplig position kan hittas).
Containern kommer att väljas utfrån följande lista (i ordning):
- Explicit element som skickas med
container
prop. - En förälder med klassen
popup__container
. - Default-värde från
config.popupContainer
.
Positionering
Detta interaktiva exempel visar hur positionering beter sig vid olika placeringar och scrollningar.
Positioneringen föredrar:
- Placera popup under istället för ovanför ankare.
- Placera popup så den linjerar med vänster kant över höger kant.
- "A" - popup under och linjering mot vänster kant.
- "B" - popup under och linjering mot höger kant.
- "C" - popup ovanför och linjering mot vänster kant.
- "D" - popup ovanför och linjering mot höger kant.
- "E" - popup höger om ankaren vertikalt centrerad.
- "F" - popup vänster om ankaren vertikalt centrerad.
- "G" - popup höger om ankaren linjering i toppen av begränsade ytan.
- "H" - popup vänster om ankaren linjering i toppen av begränsade ytan.
- "I" - popup vertikalt och horisontellt centrerad i begränsade ytan.
Ifall ingen av ovanstående positioner fungerar kommer en fallback användas.
- Om
inline
är satt tillnever
positioneras popup under ankare utan linjering. - Om
inline
är satt tillauto
kommer popup visas inline under ankare.
I följande exempel visas tre varianter:
Viewport
: använder<body>
som yta och fönster som viewportContainer
: använder container som yta, ingen viewportViewport + container
: använder container som yta, fönster som viewport
Skrollning
När popup öppnas som inline kommer den att skrolla så att den är synlig i fönstret.
Popup använder först och främst sin närmaste förälder med klassen scroll-target
som skrollyta.
Om popup inte hittar en förälder med scroll-target
så kommer den istället använda fönstret (window
).
API
Props
-
isOpen: boolean
-
Toggle open/closed popup.
-
anchor: HTMLElement | null | undefined
Optional -
DOM element to position popup at.
Default:
undefined
-
inline: string
Optional -
Type of inline behaviour.
"auto"
changes between overlay or inline depending on window size."always"
forces the popup to always be inline."never"
forces the popup to never be inline.
Default:
"auto"
-
container: HTMLElement | null | undefined
Optional -
Which element to use as container.
Default:
undefined
-
viewport: HTMLElement
Optional -
Which element to use as viewport.
Default:
function() { return document.documentElement; }
-
keyboardTrap: boolean
Optional -
Prevents tabbing outside of component.
Default:
true
-
focusElement: () => HTMLElement | null
Optional -
Function that returns the element that will receive focus
Default:
null
-
setFocus: boolean
Optional -
Set focus on first tabbable element (or element in the
focusElement
prop if provided) when opened.Default:
true
Events
-
open
-
Emitted when popup is visible and placement is fully calculated.
-
close
-
Emitted when clicked outside of popup.
Slots
-
default
-
‐
Bindings:
toggleIsOpen: unknown
placement: unknown