码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 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
  • 相关阅读:
    B-2:Linux系统渗透提权
    Java:软件开发中最流行的Java框架是什么?
    业务拆分——微服务拆分独立出来的步骤
    领先实践|全球最大红酒App如何用设计冲刺创新vivino模式
    如何使用Jenkins持续集成构建接口自动化测试--配置邮件通知
    SpringBoot整合Kafka的快速使用教程
    通过xhr实现文件上传功能,使用jQuery实现文件上传功能
    蔚来-软件开发工程师一面记录
    国货拟人AI绘图;500+AI岗位合辑;百川x亚马逊AI黑客松;企业级AI行业图谱;100+LLM面试题与答案 | ShowMeAI日报
    如何在SAP GUI中快速执行新的事务代码
  • 原文地址:https://blog.csdn.net/weixin_47978760/article/details/126521458
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号