| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131 | <template>  <u-transition      mode="fade"      :customStyle="backTopStyle"      :show="show"  >    <view        class="u-back-top"        :style="[contentStyle]"        v-if="!$slots.default && !$slots.$default"        @click="backToTop"    >      <u-icon          :name="icon"          :custom-style="iconStyle"      ></u-icon>      <text          v-if="text"          class="u-back-top__text"      >{{ text }}      </text>    </view>    <slot v-else/>  </u-transition></template><script>import props from './props.js';// #ifdef APP-NVUEconst dom = weex.requireModule('dom')// #endif/** * backTop 返回顶部 * @description 本组件一个用于长页面,滑动一定距离后,出现返回顶部按钮,方便快速返回顶部的场景。 * @tutorial https://uviewui.com/components/backTop.html * * @property {String}      mode      返回顶部的形状,circle-圆形,square-方形 (默认 'circle' ) * @property {String}      icon    自定义图标 (默认 'arrow-upward' ) 见官方文档示例 * @property {String}      text    提示文字 * @property {String | Number}  duration  返回顶部滚动时间 (默认 100) * @property {String | Number}  scrollTop  滚动距离 (默认 0 ) * @property {String | Number}  top      距离顶部多少距离显示,单位px (默认 400 ) * @property {String | Number}  bottom    返回顶部按钮到底部的距离,单位px (默认 100 ) * @property {String | Number}  right      返回顶部按钮到右边的距离,单位px (默认 20 ) * @property {String | Number}  zIndex    层级   (默认 9 ) * @property {Object<Object>}    iconStyle  图标的样式,对象形式   (默认 {color: '#909399',fontSize: '19px'}) * @property {Object}      customStyle  定义需要用到的外部样式 * * @example <u-back-top :scrollTop="scrollTop"></u-back-top> */export default {  name: 'u-back-top',  mixins: [uni.$u.mpMixin, uni.$u.mixin, props],  computed: {    backTopStyle() {      // 动画组件样式      const style = {        bottom: uni.$u.addUnit(this.bottom),        right: uni.$u.addUnit(this.right),        width: '40px',        height: '40px',        position: 'fixed',        zIndex: 10,      }      return style    },    show() {      return uni.$u.getPx(this.scrollTop) > uni.$u.getPx(this.top)    },    contentStyle() {      const style = {}      let radius = 0      // 是否圆形      if (this.mode === 'circle') {        radius = '100px'      } else {        radius = '4px'      }      // 为了兼容安卓nvue,只能这么分开写      style.borderTopLeftRadius = radius      style.borderTopRightRadius = radius      style.borderBottomLeftRadius = radius      style.borderBottomRightRadius = radius      return uni.$u.deepMerge(style, uni.$u.addStyle(this.customStyle))    }  },  methods: {    backToTop() {      // #ifdef APP-NVUE      if (!this.$parent.$refs['u-back-top']) {        uni.$u.error(`nvue页面需要给页面最外层元素设置"ref='u-back-top'`)      }      dom.scrollToElement(this.$parent.$refs['u-back-top'], {        offset: 0      })      // #endif      // #ifndef APP-NVUE      uni.pageScrollTo({        scrollTop: 0,        duration: this.duration      });      // #endif      this.$emit('click')    }  }}</script><style lang="scss" scoped>@import '../../libs/css/components.scss';$u-back-top-flex: 1 !default;$u-back-top-height: 100% !default;$u-back-top-background-color: #E1E1E1 !default;$u-back-top-tips-font-size: 12px !default;.u-back-top {  @include flex;  flex-direction: column;  align-items: center;  flex: $u-back-top-flex;  height: $u-back-top-height;  justify-content: center;  background-color: $u-back-top-background-color;  &__tips {    font-size: $u-back-top-tips-font-size;    transform: scale(0.8);  }}</style>
 |