点击Tab栏滑动到屏幕中间位置

点击Tab栏滑动到屏幕中间位置:

使用的组件版本较低,做不出需求的效果,只能自己写

解决方案:

思路:这里主要是通过获取到Tab盒子的节点,react中通过useRef获取到当前节点和子节点,结合scrollTo滑动。scrollTo是有自带样式,可以自行搜索。


react的Hook:

import React, { memo, useEffect, useRef } from "react";

import "./index.less";
export default memo(() => {
  const ulRef = useRef(null);

  const tabs = [
    {
      label: "第1个li"
    },
    {
      label: "第2个li"
    },
    {
      label: "第3个li"
    },
    {
      label: "第4个li"
    },
    {
      label: "第5个li"
    },
    {
      label: "第6个li"
    },
    {
      label: "第7个li"
    }
  ];
  // 获取到当前点击元素的 offsetLeft  - 包裹盒子 offsetWidth 的一半 + 当前点击元素 offsetWidth 的一半
  const tabHandle = (r, index) => {
    let ul = ulRef.current;
    let scroolWidth =
      ul.childNodes[index].offsetLeft - ul.offsetWidth / 2 + ul.childNodes[index].offsetWidth / 2;
    ul.scrollTo({
      left: scroolWidth,
      behavior: "smooth"
    });
  };

  return (
    <div>
      <ul ref={ulRef}>
        {tabs.map((item, index) => (
          <li onClick={(r) => tabHandle(r, index)} key={index}>
            这是第{item.label}</li>
        ))}
      </ul>
    </div>
  );
});

效果如下:
在这里插入图片描述

结合antd的Menu结合:

  const tabbRef = useRef(null);
  
  const renderTabBar = useCallback((props) => {
    return (
      <div className={styles.tabs} ref={tabbRef}>
        {props.tabs.map((item, index) => {
          return (
            <div
              key={index}
              onClick={() => {
                props.goToTab(index);
              }}
            >
              {item.title}
            </div>
          );
        })}
      </div>
    );
  }, []);

  const tabbarOnChange = useCallback(
    (tab, index) => {
      tabbRef.current.scrollTo({
        left:
          tabbRef.current.childNodes[index].offsetLeft -
          window.screen.width / 2 +
          tabbRef.current.childNodes[index].offsetWidth / 2,
        behavior: "smooth"
      });
      setActiveId(tab);
    },
    [tabbRef]
  );

		<Tabs
          renderTabBar={renderTabBar}
          tabs={tabs}  
          onChange={tabbarOnChange}
        >
         ...Tabs子内容
        </Tabs>
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值