• vue.js实现自定义tab滑动切换效果


     前言:在使用uni-app组件时,需求方要求点击头部的tab切换时,首尾两个点击就在最前面和最后面高亮显示即可,中间的要求选中哪个tab哪个tab就在滑到最中间显示。效果图如下: 

    自定义tab滑动切换

    一、代码实现: 

    1. <script>
    2. export default {
    3. name: 'my-tab',
    4. data() {
    5. return {
    6. activeItem: 'tabOne',
    7. tabs: [
    8. {
    9. name: 'tabOne',
    10. label: 'tab切换显示1',
    11. },
    12. {
    13. name: 'tabTwo',
    14. label: 'tab切换显示2',
    15. },
    16. {
    17. name: 'tabThree',
    18. label: 'tab切换显示3',
    19. },
    20. {
    21. name: 'tabFour',
    22. label: 'tab切换显示4',
    23. },
    24. {
    25. name: 'tabFive',
    26. label: 'tab切换显示5',
    27. },
    28. ],
    29. };
    30. },
    31. methods: {
    32. // tab点击
    33. tabClick(item) {
    34. this.activeItem = item.name;
    35. // 触发滑动方法
    36. this.scrollLeftTo(item.name);
    37. },
    38. // 滑动
    39. scrollLeftTo(name) {
    40. const ref = `tab${name}Ref`;
    41. // 获取myTabRef的DOM元素,即类名为my-tab的标签
    42. const nav = this.$refs.myTabRef.$el;
    43. // 获取当前点击的某一个tab的的DOM元素,即类名为my-tab-item的标签
    44. const title = this.$refs[ref][0].$el;
    45. // 计算位移偏差
    46. const to = title.offsetLeft - (nav.offsetWidth - title.offsetWidth) / 2;
    47. nav.scrollLeft = to;
    48. },
    49. },
    50. };
    51. script>
    52. <style lang="scss">
    53. .my-tab {
    54. height: 88rpx;
    55. background: #FFFFFF;
    56. line-height: 88rpx;
    57. display: flex;
    58. overflow-x: scroll;
    59. padding-right: 40rpx;
    60. scroll-behavior: smooth; //平稳的滑动效果
    61. .my-tab-item {
    62. padding: 0 24rpx;
    63. color: #999999;
    64. height: 88rpx;
    65. text-align: center;
    66. flex: 1 0 auto;
    67. &.active {
    68. color: #333333;
    69. .my-tab-text {
    70. position: relative;
    71. &::after {
    72. position: absolute;
    73. left: 50%;
    74. bottom: 0;
    75. content: '';
    76. width: 220rpx;
    77. height: 4rpx;
    78. background: linear-gradient(180deg, #649AFC 0%, #5180F4 100%);
    79. opacity: 1;
    80. border-radius: 2rpx;
    81. transform: translateX(-50%);
    82. }
    83. }
    84. }
    85. }
    86. }
    87. // 隐藏滚动条
    88. ::-webkit-scrollbar {
    89. height: 0;
    90. width: 0;
    91. color: transparent;
    92. }
    93. style>

    二、知识点:

    对于ref的具体介绍我在照片文章有提到:vue.js使用this[ ]()动态获取方法_Lemon今天学习了吗的博客-CSDN博客_vue获取this 

    vm.$refs:获取页面中所有含有ref属性的DOM元素(普通元素)。

                      获取组件实例 ,可以使用组件的所有方法 (使用在组件上)。 

    如this.$refs.myTabRef获取的myTabRef这个组件,可以使用myTabRef上的方法。如图:

    vm.$el:指明 Vue 实例的挂载目标。如this.$refs.myTabRef.$el获取的就是该标签的类名my-tab。如图:

    总结:如果想要获取offsetWidth这个属性,不能直接用$refs,因为组件不是DOM元素,没有offsetWidth属性。需要通过$el来获取组件中的DOM元素。写法如下:

    this.$refs.myTabRef.$el.offsetWidth;  //获取组件上DOM元素的offsetWidth
  • 相关阅读:
    vue中常用的两种路由模式
    swiper高度自适应
    网络安全管理与运维服务
    Linux系统安装Nodejs(详细教程)
    未能将“obj\Debug\IOControl.exe”复制到“bin\Debug\IOControl.exe
    25分钟了解命令执行漏洞【例题+详细讲解】(二)
    【控制】基于白鲸优化算法实现太阳能光伏模型参数估计附matlab代码
    Hive分区表和分桶表
    Json Schema介绍 和 .net 下的实践 - 基于Lateapexearlyspeed.Json.Schema - 基础1 - type关键字和string类型
    运算符+分支+循环语句
  • 原文地址:https://blog.csdn.net/weixin_47978760/article/details/126521458