CSS
To customize the style of your poppers, you have many CSS classes available.
Theme classes
Each theme has a corresponding CSS class:
(themeName) => `v-popper--theme-${themeName}`For example, the info-tooltip theme will have the CSS class v-popper--theme-info-tooltip.
If a theme extends another theme, the CSS class of this parent theme will also be included. For example:
Vue.use(VTooltip, { themes: { 'info-tooltip': { $extend: 'tooltip', }, }, })The themeClasses will be:
[ 'v-popper--theme-info-tooltip', 'v-popper--theme-tooltip', ]This works for any level of inheritance:
Vue.use(VTooltip, { themes: { 'info-tooltip': { $extend: 'tooltip', }, 'other-tooltip': { $extend: 'info-tooltip', } }, })The themeClasses will be:
[ 'v-popper--theme-other-tooltip', 'v-popper--theme-info-tooltip', 'v-popper--theme-tooltip', ]You can prevent a theme from including the parent classes with $resetCss:
Vue.use(VTooltip, { themes: { 'info-tooltip': { $extend: 'tooltip', $resetCss: true, }, }, })The themeClasses will be:
[ 'v-popper--theme-info-tooltip', ]Main content
By default, the popper components will have the v-popper class plus the associated themeClasses.
Dynamic class:
v-popper--shown: when the popper is shown.
HTML result:
<div class="v-popper"> <!-- themeClasses, 'v-popper--shown' --> <!-- Default slot --> </div>Popper content
By default, multiple elements are mounted in the popper content:
popper: the root element of the popper. This will be positioned by popperjs.wrapper: an intermediary element to allow transforming both the content and the arrow (useful for zoom transitions).inner: the main popper content. Ideal target for main styles such as background, border, text color...arrow-container: contains the arrow graphics. This will be positioned by popperjs.arrow-outer: the bigger arrow. Visible by default. If you want a border, should use the border color - otherwise, should use the background color.arrow-inner: the smaller arrow, useful to simulate a border. Hidden by default. The defaultdropdowntheme makes it visible to display the default border. Should use the background color.
HTML result:
<div class="v-popper__popper"> <!-- themeClasses, props.popperClass, 'v-popper__popper--shown', 'v-popper__popper--hidden', 'v-popper__popper--skip-transition', 'v-popper__popper--arrow-overflow', 'v-popper__popper--no-positioning', 'v-popper__popper--show-from', 'v-popper__popper--show-to', 'v-popper__popper--hide-from', 'v-popper__popper--hide-to' --> <div class="v-popper__wrapper"> <div class="v-popper__inner"> <div> <!-- Popper slot --> </div> </div> <div class="v-popper__arrow-container"> <div class="v-popper__arrow-outer" /> <div class="v-popper__arrow-inner" /> </div> </div> </div>You probably want to put a default padding on all dropdowns and menus:
.v-popper--theme-dropdown .v-popper__inner { padding: 6px; }The popper element has several dynamic classes:
v-popper__popper--shown: the popper is shown.v-popper__popper--hidden: the popper is hidden.v-popper__popper--skip-transition: the transition should be skipped.v-popper__popper--arrow-overflow: the arrow is overflowing past the reference, and should probably be hidden.v-popper__popper--no-positioning: positioning is disabled withpositioningDisabledprop.
Full example style:
.v-popper--theme-my-theme .v-popper__inner { background: #fff; color: black; padding: 24px; border-radius: 6px; border: 1px solid #ddd; box-shadow: 0 6px 30px rgba(0, 0, 0, .1); } .v-popper--theme-my-theme .v-popper__arrow-inner { visibility: visible; border-color: #fff; } .v-popper--theme-my-theme .v-popper__arrow-outer { border-color: #ddd; } /* Transition */ .v-popper--theme-my-theme.v-popper__popper--hidden { visibility: hidden; opacity: 0; transition: opacity .15s, visibility .15s; } .v-popper--theme-my-theme.v-popper__popper--shown { visibility: visible; opacity: 1; transition: opacity .15s; } .v-popper--theme-my-theme.v-popper__popper--skip-transition { transition: none !important; }Advanced transitions
The popper element also has dynamic classes working similarly to the Vue transition system:
v-popper__popper--show-from: (for advanced transition) initial style when shown.v-popper__popper--show-to: (for advanced transition) final style when shown.v-popper__popper--hide-from: (for advanced transition) initial style when hidden.v-popper__popper--hide-to: (for advanced transition) final style when hidden.
They allow you to create advanced transitions.
Showing:
| Class | Frame 1 | Frame 2 |
|---|---|---|
v-popper__popper--show-from | true | false |
v-popper__popper--show-to | false | true |
v-popper__popper--hidden-from | false | false |
v-popper__popper--hidden-to | false | false |
Hidding:
| Class | Frame 1 | Frame 2 |
|---|---|---|
v-popper__popper--show-from | false | false |
v-popper__popper--show-to | false | false |
v-popper__popper--hidden-from | true | false |
v-popper__popper--hidden-to | false | true |
Zoom show only example
<VDropdown compute-transform-origin />.v-popper__popper.v-popper__popper--show-from .v-popper__wrapper { transform: scale(.5); } .v-popper__popper.v-popper__popper--show-to .v-popper__wrapper { transform: none; transition: transform .15s; }Tooltip directive
The v-tooltip directive adds the v-popper--has-tooltip to the target element. For example:
<button v-tooltip="'Some info'"> Click me </button>Result:
<button class="v-popper--has-tooltip"> Click me </button>The popper content root element also has the following dynamic classes:
v-popper--tooltip-loading: the tooltip content is loading (when thecontentis a function that returns a promise). Example result:
<div class="v-popper__popper v-popper--tooltip-loading"> <div class="v-popper__wrapper"> <div class="v-popper__inner"> <div> <!-- Tooltip text here --> </div> </div> <div class="v-popper__arrow-container"> <div class="v-popper__arrow-outer" /> <div class="v-popper__arrow-inner" /> </div> </div> </div>data-popper-shown
When the popper is shown, the target elements automatically get the popper-shown data property:
<!-- Popper is shown --> <button data-popper-shown=""> Click me </button>You can for example use this to style it with CSS:
button[data-popper-shown] { background: #f00; }
Floating Vue