vue-use-popperjs
Version:
Vue 3 popper solution powered by @popperjs
221 lines (169 loc) • 4.46 kB
Markdown
# Vue-use-popperjs
Vue-popper-js is complete popper solution powered by [@popperjs](https://popper.js.org/).
[](https://www.npmjs.com/package/vue-use-popperjs)
[](https://github.com/iendeavor/vue-use-popperjs/actions/workflows/ci.yml)
## Features
- Fully customizable popover with **hook function**
- (Vue 3 only) **Popper component**, with built-in support for [**Component**](https://v3.vuejs.org/api/built-in-components.html#component), [**Teleport**](https://v3.vuejs.org/api/built-in-components.html#teleport), and [**Transition**](https://v3.vuejs.org/api/built-in-components.html#transition)
## Documentation
To check out [live examples](https://iendeavor.github.io/vue-use-popperjs/playground.html) and docs, visit [here](https://iendeavor.github.io/vue-use-popperjs)
## Installation
### Hook only
For vue@2 + @vue/composition-api
```shell
$ yarn add vue-use-popperjs@^1 @vue/composition-api
```
For vue@3:
```shell
$ yarn add vue-use-popperjs@^1
```
### Hook + Component
For vue@3:
```shell
$ yarn add vue-use-popperjs
# $ yarn add vue-use-popperjs@^2
```
> vue-use-popperjs@^2 only works with vue@3.
## Basic Usage
### Hook
```html
<template>
<button ref="button">Hover me!</button>
<span ref="tooltip">Tooltip</span>
</template>
<script lang="ts">
import { defineComponent, ref } from "vue";
import { usePopperjs } from "vue-use-popperjs";
export default defineComponent({
setup() {
const button = ref();
const tooltip = ref();
usePopperjs(button, tooltip);
return { button, tooltip };
},
});
</script>
<style scoped>
.vue-use-popperjs-none {
display: none;
}
</style>
```
Vue-use-popperjs automatically add `.vue-use-popperjs-none` class to popper when it is hidden, you can add following css to hide poppers:
```css
.vue-use-popperjs-none {
display: none;
}
```
### Component
```html
<template>
<Popper reference-is="button" popper-is="span">
<template #reference>Hover me!</template>
Tooltip
</Popper>
</template>
<script lang="ts">
import { defineComponent } from "vue";
import { Popper } from "vue-use-popperjs";
export default defineComponent({
components: {
Popper,
},
});
</script>
```
## Advanced Usage
### Component
```html
<template>
<Popper
reference-is="span"
:reference-props="{ id: 'popcorn' }"
popper-is="span"
:popper-props="{ id: 'tooltip' }"
:teleport-props="{ to: 'body' }"
:transition-props="{ name: 'fade' }"
:modifiers="modifiers"
>
Tooltip
<div id="arrow" data-popper-arrow></div>
</Popper>
</template>
<script lang="ts">
import { defineComponent } from "vue";
import { Popper } from "vue-use-popperjs";
export default defineComponent({
components: {
Popper,
},
setup() {
const modifiers = [
{
name: "offset",
options: {
offset: [0, 8],
},
},
];
return { modifiers };
},
});
</script>
<style>
.fade-enter-active,
.fade-leave-active {
transition: opacity 0.5s ease;
}
.fade-enter-from,
.fade-leave-to {
opacity: 0;
}
#popcorn {
display: inline-block;
width: 134px;
height: 120px;
background-image: url("https://popper.js.org/images/popcorn-box.svg");
}
#tooltip {
display: inline-block;
background: #643045;
color: #ffffff;
font-weight: bold;
padding: 5px 10px;
font-size: 13px;
border-radius: 4px;
}
#arrow,
#arrow::before {
position: absolute;
width: 8px;
height: 8px;
background: inherit;
}
#arrow {
visibility: hidden;
}
#arrow::before {
visibility: visible;
content: "";
transform: rotate(45deg);
}
[data-popper-placement^="top"] #arrow {
bottom: -4px;
}
[data-popper-placement^="bottom"] #arrow {
top: -4px;
}
[data-popper-placement^="left"] #arrow {
right: -4px;
}
[data-popper-placement^="right"] #arrow {
left: -4px;
}
</style>
```
## About
<a href="https://www.buymeacoffee.com/iendeavor" target="_blank"><img src="https://cdn.buymeacoffee.com/buttons/default-orange.png" alt="Buy Me A Coffee" height="41" width="174"></a>
Distributed under the MIT license. See LICENSE for more information.
https://github.com/iendeavor