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