<template> <view class="u-float-button" :style="{ position: 'fixed', top: top, bottom: bottom, right: right, }"> <view class="u-float-button__main" @click="clickHandler" :style="{ backgroundColor: backgroundColor, color: color, flexDirection: 'row', justifyContent: 'center', alignItems: 'center', width: width, height: height, borderRadius: '50%', borderColor: borderColor, }"> <slot :showList="showList"> <up-icon class="cursor-pointer" :class="{'show-list': showList}" name="plus" :color="color"></up-icon> </slot> <view v-if="showList" class="u-float-button__list" :style="{ bottom: height }"> <slot name="list"> <template v-for="item in list"> <view class="u-float-button__item" :style="{ backgroundColor: item?.backgroundColor ? item?.backgroundColor : backgroundColor, color: item?.color ? item?.color : color, flexDirection: 'row', justifyContent: 'center', alignItems: 'center', width: width, height: height, borderRadius: '50%', borderColor: item?.borderColor ? item?.borderColor : borderColor, }" @click="itemClick(item, index)"> <up-icon :name="item.name" :color="item?.color ? item?.color : color"></up-icon> </view> </template> </slot> </view> </view> </view> </template> <script> import { mpMixin } from '../../libs/mixin/mpMixin'; import { mixin } from '../../libs/mixin/mixin'; import { addStyle, addUnit, deepMerge } from '../../libs/function/index'; /** * FloatButton 悬浮按钮 * @description 悬浮按钮常用于屏幕右下角点击展开的操作菜单 * @tutorial https://ijry.github.io/uview-plus/components/floatButton.html * @property {String} backgroundColor 背景颜色 * @event {Function} click 点击触发事件 * @example <up-float-button></up-float-button> */ export default { name: 'u-float-button', // #ifdef MP mixins: [mpMixin, mixin], // #endif // #ifndef MP mixins: [mpMixin, mixin], // #endif emits: ['click', 'item-click'], computed: { }, props: { // 背景颜色 backgroundColor: { type: String, default: '#2979ff' }, // 文字颜色 color: { type: String, default: '#fff' }, // 宽度 width: { type: String, default: '50px' }, // 高度 height: { type: String, default: '50px' }, // 边框颜色,默认为空字符串表示无边框 borderColor: { type: String, default: '' }, // 右侧偏移量 right: { type: [String, Number], default: '30px' }, // 顶部偏移量,未提供默认值,可能需要根据具体情况设置 top: { type: [String, Number], default: '', }, // 底部偏移量 bottom: { type: String, default: '' }, // 是否为菜单项 isMenu: { type: Boolean, default: false }, list: { type: Array, default: () => { return [] } } }, data() { return { showList: false } }, methods: { addStyle, clickHandler(e) { if (this.isMenu) { this.showList = !this.showList this.$emit('click', e) } else { this.$emit('click', e) } }, itemClick(item, index) { this.$emit('item-click', { ...item, index }) } } } </script> <style lang="scss" scoped> @import '../../libs/css/components.scss'; .u-float-button { z-index: 999; .show-list { transform: rotate(45deg); } &__list { position: absolute; bottom: 0px; display: flex; flex-direction: column; >view { margin: 5px 0px; } } } </style>