--- title: Use Teleport to Avoid CSS Positioning Issues impact: MEDIUM impactDescription: Modals and overlays can break when parent elements have transform, perspective, or filter CSS properties type: best-practice tags: [vue3, teleport, modal, css, z-index, positioning] --- # Use Teleport to Avoid CSS Positioning Issues **Impact: MEDIUM** - CSS `position: fixed` only positions relative to the viewport when no ancestor has `transform`, `perspective`, or `filter` properties. Without Teleport, modals nested deep in the DOM can break when parent elements use these CSS properties. This is a common issue when using CSS animations on parent elements or when modals are deeply nested in component hierarchies. ## Task Checklist - [ ] Use `` for modals, tooltips, and other fixed-position overlays - [ ] Teleport to a container outside the Vue app hierarchy (e.g., `body` or `#modals`) - [ ] Avoid relying on `z-index` alone for stacking - teleport ensures proper layering **Problem - Without Teleport:** ```vue ``` **Solution - With Teleport:** ```vue ``` ## Z-Index Stacking Context Issues Even without transform/filter, deeply nested elements create stacking contexts that constrain z-index: ```vue ``` **Solution:** ```vue ``` ## When to Use Teleport | UI Element | Should Teleport? | Reason | |------------|-----------------|--------| | Full-screen modals | Yes | Fixed positioning, need to escape stacking contexts | | Tooltips | Often | May need to escape overflow: hidden containers | | Dropdowns | Sometimes | Depends on container overflow/positioning | | Notifications/toasts | Yes | Should appear above all content | | Inline popups | Usually no | Position relative to trigger element | ## Reference - [Vue.js Teleport - Basic Usage](https://vuejs.org/guide/built-ins/teleport.html#basic-usage) - [MDN - Stacking Context](https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_positioned_layout/Understanding_z-index/Stacking_context)