React实现类似淘宝tab居中切换效果的示例代码


Posted in Javascript onJune 02, 2020

效果

React实现类似淘宝tab居中切换效果的示例代码 

DOM布局

const label = {
 lettersort: false,
 paramname: "label",
 paramid: 0,
 title: "车源列表筛选项",
 option: [{
   value: 1,
   text: "全部"
  },
  {
   value: 2,
   text: "本地求购"
  },
  {
   value: 3,
   text: "精准收车"
  },
  {
   value: 4,
   text: "全国收车"
  },
  {
   value: 5,
   text: "同行询价"
  },
  {
   value: 6,
   text: "可批可售"
  },
  {
   value: 7,
   text: "车抵贷款"
  },
  {
   value: 8,
   text: "消费贷款"
  },
  {
   value: 9,
   text: "商家库容"
  },
  {
   value: 10,
   text: "代理合作"
  },
  {
   value: 11,
   text: "过户转籍"
  },
  {
   value: 12,
   text: "寻车拖车"
  },
  {
   value: 13,
   text: "解压抵押"
  },
  {
   value: 14,
   text: "抵押核验"
  }
 ]
}
filterDom = () => {
  let filterJson = label;
  let arr = filterJson.option;
  return (
    <div ref="filterBar" className="filter-list">
      {arr.map((item, index) => {
        if (item.value == this.state.filterSelect) {
          return (
            <div
              ref={item.value}
              className="filter-item active"
              key={index}
              value={item.value}>
              {item.text}
              <div className="zhishi"></div>
            </div>
          );
        } else {
          return (
            <div
              className="filter-item"
              onClick={() => {
                this.filterBarClick(item);
              }}
              ref={item.value}
              key={index}
              value={item.value}>
              {item.text}
            </div>
          );
        }
      })}
    </div>
  );
};
render(){
 return(
  <div>
   ...
   <div className="filter-content" style={{ display: this.state.filterBarShow }}>
     {this.filterDom()}
     <div className="shadow"></div>
     {/* 按钮和占位 */}
     <div
       className="filte-btn-content"
       onClick={() => {
         this.filterBtnClick();
       }}>
       <div className="filte-btn"></div>
     </div>
   </div>
   ...
  </div>
 )
}

scss样式表

.filter {
 width: 100%;
 // position: fixed;
}
.filter-content {
  overflow: hidden;
  padding-right: pxToRem(27px);
  position: relative;
  background: #fff;
  .filter-list {
    display: flex;
    overflow-x: auto;
    justify-content: space-between;
    height: pxToRem(90px);
    color: #333333;
    align-items: center;
    -webkit-overflow-scrolling: touch;
    font-size: pxToRem(32px);
    font-family:PingFangSC-Light,PingFang SC;
    font-weight:300;
    background: #fff;
    margin-right: pxToRem(100px);
    .filter-item {
      text-align: center;
      display: flex;
      // flex-basis: 17px;
      flex-shrink: 0;
      white-space: nowrap;
      padding: 0 pxToRem(25px);
      background: #fff;
      height: pxToRem(90px);
      align-items: center;
      justify-content: center;
    }
    .active{
      font-size: pxToRem(36px);
      font-weight: 600;
      height: pxToRem(90px);
      display: flex;
      align-items: center;
      justify-content: center;
      position: relative;
      flex: 1;
      flex-direction: column;
    }
    .zhishi{
      background: url("./../img/zhishi.png");
      background-repeat: no-repeat;
      background-size: 100%;
      width: pxToRem(25px);
      height: pxToRem(6px);
      position: absolute;
      bottom: pxToRem(10px);;
      left: 50%;
      transform: translate(-50%, 0);
      z-index: 999;
    }
  }
  
  .shadow{
    height: pxToRem(90px);
    width: pxToRem(133px);
    position: absolute;
    right: pxToRem(101px);
    top: 0;
    background:linear-gradient(270deg,rgba(255,255,255,1) 0%,rgba(255,255,255,0.14) 100%);
    pointer-events: none;
  }
  .filte-btn{
    background: url("./../img/shaixuan.png");
    background-repeat: no-repeat;
    background-size: 100%;
    width: pxToRem(40px);
    height: pxToRem(40px);
  }
  .filte-btn-content {
    height: pxToRem(90px);
    position: absolute;
    right: pxToRem(27px);
    top: 0;
    background: #fff;
    width: pxToRem(74px);
    display: flex;
    align-items: center;
    justify-content: flex-end;
  }
}

实现

想要居中展示首先是需要找到中心点,然后在点击是计算偏移量,把对应的标签滚动到中心位置

filterBarClick = param => {
    const { value, text } = param;
    this.setState({
      filterSelect: value
    });
    let dom = this.refs;
    //获取点击时当前标签的DOM
    let valDom = dom[value];
    //获取标签父元素DOM
    let contentDom = dom.filterBar;
    //计算当前标签到最左侧的宽度
    let valLeft = valDom.offsetLeft;
    //计算当前标签本身的宽度
    let valWidth = valDom.clientWidth;
    //当前标签中心点到最左侧的距离
    let valCenter = valLeft + valWidth / 2;
    //可视屏幕宽度
    let clientWidth = document.querySelector('body').offsetWidth;
    //可视屏幕中心点(减去的30是列表两边的15像素的留白)
    let center = (clientWidth - 30) / 2;
    //计算当前标签中心点和屏幕中心点的偏移量 然后滚动相应的距离
    if (valCenter > center) {
      contentDom.scrollTo({
        left: valCenter - center,
        behavior: 'smooth'
      });
    } else {
      contentDom.scrollTo({
        left: 0,
        behavior: 'smooth'
      });
    }
  };

总结

到此这篇关于React实现类似淘宝tab居中切换效果的文章就介绍到这了,更多相关react tab居中切换内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
将HTML自动转为JS代码
Jun 26 Javascript
extjs grid设置某列背景颜色和字体颜色的方法
Sep 03 Javascript
基于jQuery的图片大小自动适应实现代码
Nov 17 Javascript
jquery实现页面图片等比例放大缩小功能
Feb 12 Javascript
javascript中的return和闭包函数浅析
Jun 06 Javascript
JS打开新窗口防止被浏览器阻止的方法
Jan 03 Javascript
JS实现的数组全排列输出算法
Mar 19 Javascript
chrome浏览器当表单自动填充时如何去除浏览器自动添加的默认样式
Oct 09 Javascript
深入理解Java线程编程中的阻塞队列容器
Dec 07 Javascript
JS使用JSON作为参数实例分析
Jun 23 Javascript
JS实现的视频弹幕效果示例
Aug 17 Javascript
基于JavaScript实现年月日三级联动
Jun 22 Javascript
实例分析javascript中的异步
Jun 02 #Javascript
vue + node如何通过一个Txt文件批量生成MP3并压缩成Zip
Jun 02 #Javascript
js简单实现自动生成表格功能示例
Jun 02 #Javascript
JS中准确判断变量类型的方法
Jun 01 #Javascript
Vuex中的Mutations的具体使用方法
Jun 01 #Javascript
vue使用自定义事件的表单输入组件用法详解【日期组件与货币组件】
Jun 01 #Javascript
Bootstrap table 服务器端分页功能实现方法示例
Jun 01 #Javascript
You might like
php4的session功能评述(三)
2006/10/09 PHP
在PHP中使用Sockets 从Usenet中获取文件
2008/01/10 PHP
PHP 计算代码执行耗时的代码修正网上普遍错误
2011/05/14 PHP
PHP应用JSON技巧讲解
2013/02/03 PHP
JavaScript中使用构造函数实现继承的代码
2010/08/12 Javascript
javascript中的变量作用域以及变量提升详细介绍
2013/10/24 Javascript
JQuery each打印JS对象的方法
2013/11/13 Javascript
jq实现左侧显示图片右侧文字滑动切换效果
2015/08/04 Javascript
详解JavaScript中常用的函数类型
2015/11/18 Javascript
js 求时间差的实现代码
2016/04/26 Javascript
JavaScript操作表单实例讲解(上)
2016/06/20 Javascript
javascript基本数据类型及类型检测常用方法小结
2016/12/14 Javascript
详解VUE中v-bind的基本用法
2017/07/13 Javascript
javaScript动态添加Li元素的实例
2018/02/24 Javascript
基于jQuery使用Ajax动态执行模糊查询功能
2018/07/05 jQuery
javascript实现小型区块链功能
2019/04/03 Javascript
微信小程序本地存储实现每日签到、连续签到功能
2019/10/09 Javascript
VUE中使用HTTP库Axios方法详解
2020/02/05 Javascript
Python使用asyncio包处理并发详解
2017/09/09 Python
Flask 让jsonify返回的json串支持中文显示的方法
2018/03/26 Python
对pytorch网络层结构的数组化详解
2018/12/08 Python
keras之权重初始化方式
2020/05/21 Python
Python:__eq__和__str__函数的使用示例
2020/09/26 Python
htnl5利用svg页面高斯模糊的方法
2018/07/20 HTML / CSS
日本最大的眼镜购物网站:Oh My Glasses
2016/11/13 全球购物
Java如何调用外部Exe程序
2015/07/04 面试题
学历公证委托书
2014/04/09 职场文书
我有一个梦想演讲稿
2014/05/05 职场文书
师德师风个人总结
2015/02/06 职场文书
财务稽核岗位职责
2015/04/13 职场文书
亮剑观后感600字
2015/06/05 职场文书
焦裕禄纪念馆观后感
2015/06/09 职场文书
给校长的建议书范文
2015/09/14 职场文书
大学学习委员竞选稿
2015/11/20 职场文书
python3实现Dijkstra算法最短路径的实现
2021/05/12 Python
mysql 8.0.24 安装配置方法图文教程
2021/05/12 MySQL