You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
manghe/components/menuIcon.vue

301 lines
6.0 KiB

<template>
<view>
<view id="home" class="home acea-row row-center-wrapper"
:class="[returnShow ? 'p10':'p20', text_opacity >= 1 ? 'opacity':'']" :style="{ marginTop: menuButton.top +'px', width: menuButton.width + 'px'}">
<view v-if="returnShow" class="iconfont icon-xiangzuo" :class="text_opacity >= 1 ? 'opacity':''"
@tap="returns">
</view>
<view class="line" v-if="returnShow"></view>
<view class="animation-box">
<transition name="fade">
<view v-if="!Active" class="iconfont icon-gengduo4" :class="text_opacity >= 1 ? 'opacity':''"
@click="open">
</view>
<!-- <view v-if="Active" class="iconfont icon-guanbi5" @click="open">
</view> -->
</transition>
<transition name="fade" mode="out-in">
<!-- <view v-if="!Active" class="iconfont icon-gengduo4" @click="open">
</view> -->
<view v-if="Active" class="iconfont icon-guanbi5" :class="text_opacity >= 1 ? 'opacity':''"
@click="open">
</view>
</transition>
</view>
<view class="homeCon bg-color" :class="Active === true ? 'active' : ''" v-if="Active" @click="open">
<view class="homeCon-box" v-for="(item,index) in iconList" :key="index"
@click="jumpUrl(item.path,item.jumpType)">
<text class='iconfont' :class="item.iconName">
</text>
<text class="text">{{item.name}}</text>
</view>
</view>
</view>
</view>
</template>
<script>
export default {
name: "menuIcon",
data() {
return {
Active: false,
returnShow: true, //判断顶部返回是否出现
homeTop: 20,
text_opacity: 0,
menuButton:{},
iconList: [{
name: this.$t(`首页`),
iconName: "icon-shouye8",
path: '/pages/index/index',
jumpType: 1
},
{
name: this.$t(`购物车`),
iconName: "icon-gouwuche7",
path: '/pages/order_addcart/order_addcart',
jumpType: 1
},
{
name: this.$t(`搜索`),
iconName: "icon-sousuo6",
path: '/pages/goods/goods_search/index',
jumpType: 0
},
{
name: this.$t(`我的收藏`),
iconName: "icon-shoucang3",
path: '/pages/users/user_goods_collection/index',
jumpType: 0
},
{
name: this.$t(`个人中心`),
iconName: "icon-yonghu1",
path: '/pages/user/index',
jumpType: 1
}
]
};
},
props: {
showMenuIcon: {
type: Boolean,
default: false
},
opacity: {
type: Number,
default: 1
}
},
watch: {
showMenuIcon(e) {
this.Active = e
},
opacity(e) {
this.text_opacity = e
}
},
mounted() {
var pages = getCurrentPages();
this.returnShow = pages.length === 1 ? false : true;
this.$nextTick(() => {
// #ifdef MP
this.menuButton = uni.getMenuButtonBoundingClientRect();
const query = uni.createSelectorQuery().in(this);
query
.select('#home')
.boundingClientRect(data => {
this.homeTop = this.menuButton.top * 2 + this.menuButton.height - data.height + 2;
})
.exec();
// #endif
});
},
methods: {
open() {
this.Active = !this.Active
if (this.Active) this.$emit('open', true)
},
// 后退
returns() {
uni.navigateBack();
},
jumpUrl(url, type) {
(type === 1 ? uni.switchTab : uni.navigateTo)({url})
},
}
}
</script>
<style lang="scss">
.home {
/* #ifdef H5 */
top: 20rpx !important;
/* #endif */
}
.home.opacity {
background: rgba(255, 255, 255, 1);
border: 1px solid #d7d7d7;
}
.home {
color: #333;
position: fixed;
// width: 130rpx;
// padding: 0 20rpx;
height: 62rpx;
z-index: 99;
left: 33rpx;
border: 1px solid #d7d7d7;
background: rgba(255, 255, 255, 0.8);
border-radius: 30rpx;
display: flex;
align-items: center;
justify-content: space-around;
.opacity {
color: #000;
}
.icon-gengduo4,
.icon-guanbi5 {
position: absolute;
width: 40rpx;
font-weight: bold;
}
.icon-xiangzuo{
font-weight: bold;
line-height: 28rpx;
}
.icon-gengduo4 {
font-size: 28rpx;
text-align: center;
}
}
.home .animation-box {
position: relative;
width: 40rpx;
height: 28rpx;
}
.icon-guanbi5 {
font-size: 28rpx;
text-align: center;
}
.home .homeCon {
display: flex;
flex-direction: column;
font-size: 26rpx;
padding: 4rpx;
opacity: 0;
border: 1px solid #f2f2f2;
&::before {
content: "";
width: 0;
height: 0;
border-left: 15rpx solid transparent;
border-right: 15rpx solid transparent;
border-bottom: 17rpx solid #fff;
position: absolute;
top: -15rpx;
right: 66rpx;
border-bottom-color: #f2f2f2;
}
&::after {
content: "";
width: 0;
height: 0;
border-left: 15rpx solid transparent;
border-right: 15rpx solid transparent;
border-bottom: 17rpx solid #fff;
position: absolute;
top: -13rpx;
right: 66rpx;
}
.homeCon-box {
display: flex;
align-items: center;
flex-wrap: nowrap;
width: 100%;
padding: 15rpx 20rpx;
.text {
display: flex;
flex-wrap: nowrap;
}
}
.iconfont {
display: flex;
align-items: center;
padding: 5rpx 3rpx;
margin-right: 5rpx;
}
.homeCon-box:nth-child(even) {
border-top: 1px solid #f2f2f2;
border-bottom: 1px solid #f2f2f2;
}
}
.home .homeCon.active {
position: absolute;
opacity: 1;
top: 75rpx;
animation: bounceInLeft 0.5s cubic-bezier(0.215, 0.310, 0.655, 1.000);
width: max-content;
display: flex;
justify-content: center;
align-items: center;
border-radius: 10rpx;
color: #333;
background: #fff !important;
box-shadow: $uni-index-box-shadow;
}
.home .line {
width: 2rpx;
height: 26rpx;
margin: 0 18rpx 0 16rpx;
background: rgba(255, 255, 255, 1);
}
.home .line.opacity {
color: #050505;
background-color: #050505;
}
.home .icon-xiangzuo {
font-size: 28rpx;
}
.fade-enter-active,
.fade-leave-active {
transition: opacity .3s;
}
.fade-enter,
.fade-leave-to
/* .fade-leave-active below version 2.1.8 */
{
opacity: 0;
}
.p10 {
padding: 0 25rpx;
}
.p20 {
padding: 0 40rpx;
}
</style>