在vue应用开发中,我们经常需要实现提示框、下拉菜单、弹出层这样的交互效果。以前要实现这些功能很麻烦,需要自己处理定位、动画、边缘检测等问题。现在有了floating-vue,这些问题都变得简单了。
floating-vue是Vue.js核心团队开发的组件库,连Vue的创始人尤雨溪都亲自推荐和使用。它专门为Vue应用设计,能帮你快速实现专业的浮动交互效果。
floating-vue是一个专门处理弹层组件的Vue库。基于Floating UI构建,提供了精准的定位能力和丰富的自定义选项。无论是简单的文字提示,还是复杂的下拉菜单,都能轻松应对。
完美支持Vue 3:完全兼容Vue 3的Composition api
智能定位:自动调整位置,不会超出屏幕边界
高度可定制:可以自定义主题和样式
体积小巧:只有几KB大小,不影响性能
TypeScript支持:提供完整的类型定义
多种组件:支持提示框、下拉菜单、弹出层等
两种使用方式:既可以用指令,也可以用组件
使用你喜欢的包管理器安装:
pnpm add floating-vue
# 或者
npm install floating-vue
# 或者
yarn add floating-vue
1. 全局注册
在main.js中注册插件:
import { createApp } from 'vue'
import App from './App.vue'
import FloatingVue from 'floating-vue'
import 'floating-vue/dist/style.css'
const app = createApp(App)
// 全局注册插件
app.use(FloatingVue)
app.mount('#app')
2. 使用v-tooltip指令
这是最简单的使用方式:
<template>
<div class="demo">
<button v-tooltip="'这是一个提示信息'">鼠标悬停我</button>
</div>
</template>
组件使用方式
除了指令,还可以用组件的方式,这样更灵活。
VTooltip 组件
<template>
<div class="demo">
<VTooltip>
<button>鼠标悬停我</button>
<template #popper>
<div class="tooltip-content">
<p>这是一个自定义样式的提示框</p>
<span>可以放任何内容</span>
</div>
</template>
</VTooltip>
</div>
</template>
VMenu 组件
适合实现菜单:
<template>
<div class="demo">
<VMenu>
<button>打开菜单</button>
<template #popper>
<div class="menu-content">
<button class="menu-item">菜单项1</button>
<button class="menu-item">菜单项2</button>
<button class="menu-item">菜单项3</button>
</div>
</template>
</VMenu>
</div>
</template>
<style>
.menu-content {
padding: 8px 0;
background: white;
border-radius: 6px;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
min-width: 120px;
}
.menu-item {
width: 100%;
padding: 8px 16px;
border: none;
background: none;
text-align: left;
cursor: pointer;
}
.menu-item:hover {
background: #f5f5f5;
}
</style>
VDropdown 组件
实现下拉选择:
<template>
<div class="demo">
<VDropdown>
<button>选择选项</button>
<template #popper>
<div class="dropdown-content">
<div class="dropdown-item">选项一</div>
<div class="dropdown-item">选项二</div>
<div class="dropdown-item">选项三</div>
</div>
</template>
</VDropdown>
</div>
</template>
<style>
.dropdown-content {
padding: 8px 0;
background: white;
border-radius: 6px;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
}
.dropdown-item {
padding: 8px 16px;
cursor: pointer;
}
.dropdown-item:hover {
background: #f0f0f0;
}
</style>
常用配置选项
floating-vue提供了丰富的配置选项:
<template>
<button
v-tooltip="{
content: '这是一个提示',
placement: 'top', // 显示位置:top, bottom, left, right
delay: { // 延迟显示
show: 500,
hide: 0
},
distance: 10, // 与触发元素的距离
triggers: ['hover'], // 触发方式:hover, click, focus
theme: 'custom' // 自定义主题
}"
>
配置丰富的按钮
</button>
</template>
你可以完全自定义弹层的样式:
1. 定义自定义主题
在main.js中:
app.use(FloatingVue, {
themes: {
// 自定义主题
'my-theme': {
$extend: 'tooltip',
$resetCss: true,
},
// 深色主题
'dark': {
$extend: 'tooltip',
$resetCss: true,
}
}
})
2. 使用自定义样式
<template>
<button
v-tooltip="{
content: '自定义样式的提示',
theme: 'my-theme'
}"
>
自定义主题按钮
</button>
</template>
<style>
/* 自定义主题样式 */
.v-popper--theme-my-theme .v-popper__inner {
background: linear-gradient(135deg, #667eea, #764ba2);
color: white;
border-radius: 8px;
padding: 12px 16px;
font-weight: 500;
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.15);
}
.v-popper--theme-my-theme .v-popper__arrow-inner {
border-color: #667eea;
}
/* 深色主题 */
.v-popper--theme-dark .v-popper__inner {
background: #333;
color: white;
border-radius: 6px;
padding: 8px 12px;
}
</style>
1. 手动控制显示隐藏
<template>
<div>
<button @click="showTooltip = !showTooltip">
切换提示
</button>
<button
v-tooltip="{
content: '手动控制的提示',
shown: showTooltip
}"
>
目标元素
</button>
</div>
</template>
<script setup>
import { ref } from 'vue'
const showTooltip = ref(false)
</script>
2. 动态内容
<template>
<button
v-tooltip="dynamicContent"
>
动态内容
</button>
</template>
<script setup>
import { ref, computed } from 'vue'
const count = ref(0)
const dynamicContent = computed(() => ({
content: `当前计数:${count.value}`,
placement: 'top'
}))
</script>
1. 表单验证提示
<template>
<div>
<input
v-model="email"
placeholder="请输入邮箱"
v-tooltip="{
content: emailError,
shown: !!emailError,
theme: 'error',
triggers: []
}"
/>
</div>
</template>
<script setup>
import { ref, computed } from 'vue'
const email = ref('')
const emailError = computed(() => {
if (!email.value) return '邮箱不能为空'
if (!email.value.includes('@')) return '邮箱格式不正确'
return ''
})
</script>
<style>
.v-popper--theme-error .v-popper__inner {
background: #ff4757;
color: white;
}
</style>
2. 复杂下拉菜单
<template>
<VDropdown>
<button class="user-avatar">
<img src="/avatar.jpg" alt="用户头像">
</button>
<template #popper>
<div class="user-menu">
<div class="user-info">
<p class="username">用户名</p>
<p class="email">user@example.com</p>
</div>
<div class="menu-divider"></div>
<button class="menu-item">个人资料</button>
<button class="menu-item">设置</button>
<div class="menu-divider"></div>
<button class="menu-item logout">退出登录</button>
</div>
</template>
</VDropdown>
</template>
按需引入:如果只用部分功能,可以考虑按需引入
性能优化:避免在大量元素上使用tooltip
移动端适配:在移动设备上考虑使用click触发
无障碍访问:为重要提示添加ARIA属性
floating-vue确实是一个优秀的Vue弹层组件库。它的优势很明显:
使用简单,几分钟就能上手
功能丰富,满足各种需求
定位精准,不会出现显示不全的问题
样式自定义灵活,能完美匹配项目设计
性能良好,不影响页面流畅度
无论是简单的文字提示,还是复杂的交互菜单,floating-vue都能很好地胜任。如果你在Vue项目中需要实现弹层效果,floating-vue绝对值得尝试。
官方还提供了主题编辑器,可以在线调试样式:https://floating-vue.starpad.dev/theme-editor
这个工具能帮你快速找到理想的样式配置,大大提升开发效率。
本文内容仅供个人学习/研究/参考使用,不构成任何决策建议或专业指导。分享/转载时请标明原文来源,同时请勿将内容用于商业售卖、虚假宣传等非学习用途哦~感谢您的理解与支持!
onPullDownRefresh 监听该页面用户下拉刷新事件 需要在 pages.json 里 开启 enablePullDownRefresh,当处理完数据刷新后,uni.stopPullDownRefresh 可以停止当前页面的下拉刷新
实现的原理是通过获取①获取滚动条当前的位置②获取当前可视范围的高度 ③获取文档完整的高度 ;(一)获取滚动条当前的位置 ;(二)获取当前可视范围的高度
swiper没有这个功能:小程序竖向swiper滚动到底部,再往下拉判断到底的功能。 本妹子为了完成“下拉到底就弹框”的业务,想了下面的办法,给小伙伴们分享下。
微信h5页面下拉露出网页来源的解决办法:将document的touchmove事件禁止掉,备注:要加上 passive: false,不然会出现以下报错
移动端禁止下拉 露出网址或广告;目前自测安卓 微信内、uc、小米浏览器 效果都不错。
内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!