Floating Vue 및 Tailwind가 포함된 Vue 드롭다운 메뉴
16831 단어 javascriptuxvuewebdev
floating-vue
가 Dropdown 구성 요소를 제공하지만 스타일을 지정하고 키보드 탐색과 같은 추가 기능을 추가하는 것은 사용자에게 달려 있습니다.우리가 만들 것
Dropdown
의 floating-vue
구성 요소를 기반으로 사용하고 그 위에 키보드 기능을 추가합니다. 그런 다음 해당 구성 요소를 사용하여 Tailwind를 사용하여 드롭다운 메뉴를 만듭니다.최종 결과는 Bootstrap's Dropdown component 과 유사합니다.
그럼 시작하겠습니다!
드롭다운 구성요소
다행스럽게도 Vue.js는 ""기술을 사용하여 모든 구성 요소를 쉽게 확장할 수 있습니다. 따라서 최종 구성 요소에는
floating-vue
드롭다운의 모든 기능과 다음이 포함됩니다.Space
및 Enter
키를 사용하여 드롭다운을 열고 닫습니다Esc
키Dropdown.vue
<template>
<FloatingVueDropdown ref="popoverRef" :distance="14" :triggers="['click']" theme="dropdown-menu" placement="bottom-start" auto-hide @show="onShow" @hide="onHide">
<template v-for="(_, slot) in $slots" #[slot]="scope">
<slot :name="slot" v-bind="scope || {}" />
</template>
</FloatingVueDropdown>
</template>
<script setup>
import { Dropdown as FloatingVueDropdown } from 'floating-vue';
import { onBeforeUnmount, ref } from 'vue';
const popoverRef = ref(null);
const props = defineProps({
itemSelector: {
type: String,
default: 'li > a:not(:disabled)',
},
});
const popoverKeydown = (e) => {
const popover = popoverRef.value;
if (!popover) {
return;
}
if (['ArrowUp', 'ArrowDown'].includes(e.key)) {
e.preventDefault();
const items = [...popover.$refs.popperContent.$el.querySelectorAll(props.itemSelector)];
if (!items.length) {
return;
}
let index = items.indexOf(e.target);
index = e.key === 'ArrowDown' ? index + 1 : index - 1;
items[index]?.focus();
}
if ((e.key === 'Enter' || e.key === ' ') && e.target === popover.$refs.popperContent.$el) {
e.preventDefault();
popover.hide();
}
};
const onShow = () => {
document.addEventListener('keydown', popoverKeydown);
};
const onHide = () => {
document.removeEventListener('keydown', popoverKeydown);
const popover = popoverRef.value;
popover?.$refs.popper.$_targetNodes[0].focus();
};
onBeforeUnmount(() => {
document.removeEventListener('keydown', popoverKeydown);
});
</script>
<style>
.v-popper--theme-dropdown-menu .v-popper__arrow-container {
display: none;
}
</style>
가장 중요한 부분의 분해
floating-vue
드롭다운 구성 요소로 전달합니다.<FloatingVueDropdown>
<template v-for="(_, slot) in $slots" #[slot]="scope">
<slot :name="slot" v-bind="scope || {}" />
</template>
</FloatingVueDropdown>
일부 구성 요소 기본값 설정
ref="popoverRef"
- 팝오버ref
는 DOM 관련 작업에 필요합니다. :distance="14"
- 드롭다운 트리거와 드롭다운 메뉴 사이의 거리를 설정합니다:triggers="['click']"
- 클릭 시 드롭다운 열기theme="dropdown-menu"
- 기본적으로 모든 기본 스타일floating-vue
Dropdown
을 제거하여 테마를 자체 테마로 설정합니다. placement="bottom-start"
- 드롭다운의 기본 배치auto-hide @show="onShow"
- Dropdown
가 표시될 때 실행되는 메서드@hide="onHide"
- Dropdown
가 숨겨질 때 실행되는 메서드itemSelector
prop - 구성 요소가 키보드 탐색이 순환하는 드롭다운 항목을 가져오기 위해 내부적으로 사용하는 선택기입니다. popoverKeydown
메서드 - 이 메서드는 드롭다운이 표시될 때 document
keydown
리스너로 등록되며(onShow
메서드에서) 모든 키보드 기능을 포함합니다. 위쪽/아래쪽 화살표 키 누름을 듣고 방향에 따라 항목에 대한 드롭다운 항목 설정Array
focus
을 순환합니다. 또한 Enter
및 Space
키 누름을 수신하여 드롭다운 트리거에서 발생하면 드롭다운을 엽니다. e.preventDefault();
의 사용법에 주목하십시오. 이것은 드롭다운이 열려 있을 때 위/아래 키를 사용하는 동안 페이지가 스크롤되지 않도록 하기 위한 것입니다. onHide
메서드는 document
keydown
리스너를 제거하고 포커스를 드롭다운 트리거로 되돌립니다. 구조 및 스타일링
기본
Dropdown
구성 요소가 준비되었으므로 이를 사용하여 Tailwind를 사용하여 드롭다운 메뉴를 만들어 보겠습니다!App.vue
<template>
<Dropdown class="inline" popper-class="w-64 bg-white border rounded-lg shadow-md">
<!-- Dropdown trigger -->
<button
class="inline-block px-6 py-3 bg-blue-600 text-white leading-tight rounded hover:bg-blue-700 focus:bg-blue-700 focus:outline-none focus:ring-0 active:bg-blue-800 transition duration-150 ease-in-out"
>
Dropdown button
</button>
<!-- Dropdown content -->
<template #popper="{ hide }">
<ul class="py-1 text-gray-70">
<li>
<a href="#" class="block py-2 px-4 hover:bg-gray-100 focus:bg-gray-100 outline-none" @click="hide">
Click me to close
</a>
</li>
<li>
<a href="#" class="block py-2 px-4 hover:bg-gray-100 focus:bg-gray-100 outline-none">Menu item</a>
</li>
<li>
<a href="#" class="block py-2 px-4 hover:bg-gray-100 focus:bg-gray-100 outline-none">Another menu item</a>
</li>
</ul>
</template>
</Dropdown>
</template>
<script setup>
import Dropdown from './Dropdown.vue'
</script>
그게 다야!
다음은 thisStackblitz here의 최종 결과에 대한 실제 예입니다.
Vue 프로젝트로 가져올 준비가 된
floating-vue
의 드롭다운 구성 요소인 vue-simple-dropdown 을 확인하고 싶을 수도 있습니다!
Reference
이 문제에 관하여(Floating Vue 및 Tailwind가 포함된 Vue 드롭다운 메뉴), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/kouts/a-vue-dropdown-menu-with-floating-vue-tailwind-5gg4텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)