swiper-tab.vue 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. <template>
  2. <view class="uni-tab-bar">
  3. <scroll-view class="scroll-view content-scroll" scroll-x scroll-with-animation :scroll-left="scrollLeft">
  4. <block v-for="(tab,index) in tabBars" :key="index">
  5. <view class="scroll-view-item scroll-item" :class="{'active':tabIndex==index}" @tap="tabtap(index)">
  6. <view class="d-flex a-center j-center">{{tab.name}}</view>
  7. <view class="d-flex a-center j-center">({{tab.personNum}}人,{{tab.orderNum}}单)</view>
  8. </view>
  9. </block>
  10. </scroll-view>
  11. </view>
  12. </template>
  13. <script>
  14. export default {
  15. data() {
  16. return {
  17. contentScrollW: 0, // 导航区宽度
  18. scrollLeft: 0, // 横向滚动条位置
  19. }
  20. },
  21. props: {
  22. tabBars: Array,
  23. tabIndex: Number
  24. },
  25. mounted() {
  26. // 获取标题区域宽度,和每个子元素节点的宽度
  27. this.getScrollW()
  28. },
  29. methods: {
  30. tabtap(index) {
  31. this.scrollLeft = this.tabBars[index].left - this.contentScrollW / 2 + this.tabBars[index].width / 2;
  32. this.$emit('tabtap', index);
  33. },
  34. // 获取标题区域宽度,和每个子元素节点的宽度以及元素距离左边栏的距离
  35. getScrollW() {
  36. const query = uni.createSelectorQuery().in(this);
  37. query.select('.content-scroll').boundingClientRect(data => {
  38. // 拿到 scroll-view 组件宽度
  39. this.contentScrollW = data.width
  40. }).exec();
  41. query.selectAll('.scroll-item').boundingClientRect(data => {
  42. let dataLen = data.length;
  43. for (let i = 0; i < dataLen; i++) {
  44. // scroll-view 子元素组件距离左边栏的距离
  45. this.tabBars[i].left = data[i].left;
  46. // scroll-view 子元素组件宽度
  47. this.tabBars[i].width = data[i].width
  48. }
  49. }).exec()
  50. },
  51. }
  52. }
  53. </script>
  54. <style>
  55. /* 横向滚动选项Start */
  56. .scroll-view {
  57. white-space: nowrap;
  58. width: 100%;
  59. }
  60. .scroll-view .scroll-view-item {
  61. display: inline-block;
  62. width: 40%;
  63. font-size: 30rpx;
  64. padding: 10upx 20upx;
  65. box-sizing: border-box;
  66. border: ;
  67. }
  68. .scroll-view .scroll-view-item.active {
  69. border-bottom: 10rpx solid #007AFF;
  70. }
  71. .scroll-view .scroll-view-item>view:nth-of-type(2) {
  72. font-size: 24rpx;
  73. }
  74. /* 横向滚动选项Start */
  75. </style>