| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153 | <template>	<view @tap="backToTop" class="u-back-top" :class="['u-back-top--mode--' + mode]" :style="[{		bottom: bottom + 'rpx',		right: right + 'rpx',		borderRadius: mode == 'circle' ? '10000rpx' : '8rpx',		zIndex: uZIndex,		opacity: opacity	}, customStyle]">		<view class="u-back-top__content" v-if="!$slots.default && !$slots.$default">			<u-icon @click="backToTop" :name="icon" :custom-style="iconStyle"></u-icon>			<view class="u-back-top__content__tips">				{{tips}}			</view>		</view>		<slot v-else />	</view></template><script>	export default {		name: 'u-back-top',		props: {			// 返回顶部的形状,circle-圆形,square-方形			mode: {				type: String,				default: 'circle'			},			// 自定义图标			icon: {				type: String,				default: 'arrow-upward'			},			// 提示文字			tips: {				type: String,				default: ''			},			// 返回顶部滚动时间			duration: {				type: [Number, String],				default: 100			},			// 滚动距离			scrollTop: {				type: [Number, String],				default: 0			},			// 距离顶部多少距离显示,单位rpx			top: {				type: [Number, String],				default: 400			},			// 返回顶部按钮到底部的距离,单位rpx			bottom: {				type: [Number, String],				default: 200			},			// 返回顶部按钮到右边的距离,单位rpx			right: {				type: [Number, String],				default: 40			},			// 层级			zIndex: {				type: [Number, String],				default: '9'			},			// 图标的样式,对象形式			iconStyle: {				type: Object,				default() {					return {						color: '#909399',						fontSize: '38rpx'					}				}			},			// 整个组件的样式			customStyle: {				type: Object,				default() {					return {}				}			}		},		watch: {			showBackTop(nVal, oVal) {				// 当组件的显示与隐藏状态发生跳变时,修改组件的层级和不透明度				// 让组件有显示和消失的动画效果,如果用v-if控制组件状态,将无设置动画效果				if(nVal) {					this.uZIndex = this.zIndex;					this.opacity = 1;				} else {					this.uZIndex = -1;					this.opacity = 0;				}			}		},		computed: {			showBackTop() {				// 由于scrollTop为页面的滚动距离,默认为px单位,这里将用于传入的top(rpx)值				// 转为px用于比较,如果滚动条到顶的距离大于设定的距离,就显示返回顶部的按钮				return this.scrollTop > uni.upx2px(this.top);			},		},		data() {			return {				// 不透明度,为了让组件有一个显示和隐藏的过渡动画				opacity: 0,				// 组件的z-index值,隐藏时设置为-1,就会看不到				uZIndex: -1			}		},		methods: {			backToTop() {				uni.pageScrollTo({					scrollTop: 0,					duration: this.duration				});			}		}	}</script><style lang="scss" scoped>	@import "../../libs/css/style.components.scss";		.u-back-top {		width: 80rpx;		height: 80rpx;		position: fixed;		z-index: 9;		@include vue-flex;		flex-direction: column;		justify-content: center;		background-color: #E1E1E1;		color: $u-content-color;		align-items: center;		transition: opacity 0.4s;				&__content {			@include vue-flex;			flex-direction: column;			align-items: center;						&__tips {				font-size: 24rpx;				transform: scale(0.8);				line-height: 1;			}		}	}</style>
 |