<!-- 回到顶部的按钮 --> 
 | 
<template> 
 | 
    <image 
 | 
        v-if="mOption.src" 
 | 
        class="mescroll-totop" 
 | 
        :class="[value ? 'mescroll-totop-in' : 'mescroll-totop-out', {'mescroll-totop-safearea': mOption.safearea}]" 
 | 
        :style="{'z-index':mOption.zIndex, 'left': left, 'right': right, 'bottom':addUnit(mOption.bottom), 'width':addUnit(mOption.width), 'border-radius':addUnit(mOption.radius)}" 
 | 
        :src="mOption.src" 
 | 
        mode="widthFix" 
 | 
        @click="toTopClick" 
 | 
    /> 
 | 
</template> 
 | 
  
 | 
<script> 
 | 
export default { 
 | 
    props: { 
 | 
        // up.toTop的配置项 
 | 
        option: Object, 
 | 
        // 是否显示 
 | 
        value: false 
 | 
    }, 
 | 
    computed: { 
 | 
        // 支付宝小程序需写成计算属性,prop定义default仍报错 
 | 
        mOption(){ 
 | 
            return this.option || {} 
 | 
        }, 
 | 
        // 优先显示左边 
 | 
        left(){ 
 | 
            return this.mOption.left ? this.addUnit(this.mOption.left) : 'auto'; 
 | 
        }, 
 | 
        // 右边距离 (优先显示左边) 
 | 
        right() { 
 | 
            return this.mOption.left ? 'auto' : this.addUnit(this.mOption.right); 
 | 
        } 
 | 
    }, 
 | 
    methods: { 
 | 
        addUnit(num){ 
 | 
            if(!num) return 0; 
 | 
            if(typeof num === 'number') return num + 'rpx'; 
 | 
            return num 
 | 
        }, 
 | 
        toTopClick() { 
 | 
            this.$emit('input', false); // 使v-model生效 
 | 
            this.$emit('click'); // 派发点击事件 
 | 
        } 
 | 
    } 
 | 
}; 
 | 
</script> 
 | 
  
 | 
<style> 
 | 
/* 回到顶部的按钮 */ 
 | 
.mescroll-totop { 
 | 
    z-index: 9990; 
 | 
    position: fixed !important; /* 加上important避免编译到H5,在多mescroll中定位失效 */ 
 | 
    right: 20rpx; 
 | 
    bottom: 120rpx; 
 | 
    width: 72rpx; 
 | 
    height: auto; 
 | 
    border-radius: 50%; 
 | 
    opacity: 0; 
 | 
    transition: opacity 0.5s; /* 过渡 */ 
 | 
    margin-bottom: var(--window-bottom); /* css变量 */ 
 | 
} 
 | 
  
 | 
/* 适配 iPhoneX */ 
 | 
@supports (bottom: constant(safe-area-inset-bottom)) or (bottom: env(safe-area-inset-bottom)) { 
 | 
    .mescroll-totop-safearea { 
 | 
        margin-bottom: calc(var(--window-bottom) + constant(safe-area-inset-bottom)); /* window-bottom + 适配 iPhoneX */ 
 | 
        margin-bottom: calc(var(--window-bottom) + env(safe-area-inset-bottom)); 
 | 
    } 
 | 
} 
 | 
  
 | 
/* 显示 -- 淡入 */ 
 | 
.mescroll-totop-in { 
 | 
    opacity: 1; 
 | 
} 
 | 
  
 | 
/* 隐藏 -- 淡出且不接收事件*/ 
 | 
.mescroll-totop-out { 
 | 
    opacity: 0; 
 | 
    pointer-events: none; 
 | 
} 
 | 
</style> 
 |