scroll-top.vue 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. <template>
  2. <view class="tui-scroll-top" :style="{bottom:bottom+'rpx',right:right+'rpx'}" v-show="visible && toggle" @tap.stop="goTop">
  3. <image class="tui-scroll-top-img" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAYAAAA6/NlyAAACKklEQVRoQ+3b61HDMAwAYGkC1AlgBEaADcoEtBNQNoAJKBNQJqAbsAIjlAkiJhBnruG4XBO/1TNVfjZx4k+yXJ+bIpzYgSfmBQP/94xbhocZJqJLADhrJPNfzPwx1dfJDBPRHBHfGsH+dFNEbph5O9ZnH3iDiLeNgV+ZeZEKPq0Muyjta3jeSJa3WTXcCDKqm/a1FBWuBi9WzzAR3QFAPye4mnvWjJsamIgIAN4R0S1kfg8RcQuFa2ZmDbgKeAzbAzXR1cE+rDa6KjgUq4muBo7FaqGrgCcmqCUivgwmrUOfVZvIioOnsMy8mc1m8hfcdR0S0eJAIKqgi4J9WAc9BN6v2VXQxcAh2CmwFroIOBTrA2ugs8Ex2BBwbXQWOBYbCq6JTganYGPAtdBJ4FRsLLgGOhqcg00Bl0ZHgXOxqeCS6GBwCWwOuBQ6CFwKmwsugQ4FrxDxabjod2vj2F2KsaVlzH1G1t73zLz23ScJLCLLFGyJDPegIVpEioLdfpSL3gUAbFKxJcH98AYA97PKDgBWIftiQRn2DZOY8yWGdMzzhtcaOCd6IW0tw12nOspUH1Z60goZUVbDKVHKaWM1bDWcM378bW3S8sco7wqrYavhvBHka2017ItQ7nmrYavh3DE03V69holoh4jnrlsi8snMbhdF7TgGeI2I7l0tB35k5gc1LcBx/vNARFcA4LagJl/mrhEI9QzXQMTc08Ax0WrxWstwi1mL6fM3Q1/xTKsOmbgAAAAASUVORK5CYII="></image>
  4. </view>
  5. </template>
  6. <script>
  7. export default {
  8. name: "tuiScrollTop",
  9. props: {
  10. //回顶部按钮距离底部距离 rpx
  11. bottom: {
  12. type: Number,
  13. default: 120
  14. },
  15. //回顶部按钮距离右侧距离 rpx
  16. right: {
  17. type: Number,
  18. default: 24
  19. },
  20. //距离顶部多少距离显示 px
  21. top: {
  22. type: Number,
  23. default: 100
  24. },
  25. //滚动时间
  26. duration:{
  27. type: Number,
  28. default: 120
  29. },
  30. //滚动距离
  31. scrollTop: {
  32. type: Number
  33. }
  34. },
  35. watch: {
  36. scrollTop(newValue, oldValue) {
  37. this.change();
  38. }
  39. },
  40. data() {
  41. return {
  42. //判断是否显示
  43. visible: false,
  44. //控制显示,主要解决调用api滚到顶部fixed元素抖动的问题
  45. toggle: true
  46. };
  47. },
  48. methods: {
  49. goTop: function() {
  50. this.toggle = false;
  51. uni.pageScrollTo({
  52. scrollTop: 0,
  53. duration: this.duration
  54. })
  55. setTimeout(() => {
  56. this.toggle = true
  57. }, 220)
  58. },
  59. change() {
  60. let show = this.scrollTop > this.top;
  61. if ((show && this.visible) || (!show && !this.visible)) {
  62. return
  63. }
  64. this.visible = show
  65. }
  66. }
  67. }
  68. </script>
  69. <style>
  70. .tui-scroll-top {
  71. width: 76rpx;
  72. height: 76rpx;
  73. background: rgba(255, 255, 255, .98);
  74. border: 1rpx solid #BCBCBC;
  75. display: flex;
  76. align-items: center;
  77. justify-content: center;
  78. border-radius: 50%;
  79. position: fixed;
  80. z-index: 999999;
  81. /* -webkit-transform: translateZ(0);
  82. transform: translateZ(0); */
  83. /* -webkit-overflow-scroll: touch; */
  84. }
  85. .tui-scroll-top-img {
  86. width: 48rpx;
  87. height: 48rpx;
  88. display: block;
  89. }
  90. </style>