| 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>
 
 
  |