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 相关文章推荐
js同时按下两个方向键
Dec 01 Javascript
js 页面输出值
Nov 30 Javascript
javascript字符串替换及字符串分割示例代码
Dec 12 Javascript
javascript实现加载xml文件的方法
Nov 24 Javascript
jQuery焦点图左右转换效果
Dec 12 Javascript
Angular2使用jQuery的方法教程
May 28 jQuery
详解使用Typescript开发node.js项目(简单的环境配置)
Oct 09 Javascript
浅谈Angular 中何时取消订阅
Nov 22 Javascript
vue从一个页面跳转到另一个页面并携带参数的解决方法
Aug 12 Javascript
JavaScript遍历数组的方法代码实例
Jan 14 Javascript
vue使用swiper实现左右滑动切换图片
Oct 16 Javascript
详解vue-router的导航钩子(导航守卫)
Nov 02 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
详解PHP处理密码的几种方式
2016/11/30 PHP
让你的网站可编辑的实现js代码
2009/10/19 Javascript
JS中confirm,alert,prompt函数使用区别分析
2010/04/01 Javascript
jQuery中replaceAll()方法用法实例
2015/01/16 Javascript
js实现文本框只允许输入数字并限制数字大小的方法
2015/08/19 Javascript
js生成随机数的过程解析
2015/11/24 Javascript
jQuery窗口拖动功能的实现代码
2017/02/04 Javascript
input框中自动展示当前日期yyyy/mm/dd的实现方法
2017/07/06 Javascript
Vue2.0设置全局样式(less/sass和css)
2017/11/18 Javascript
Javascript中的奇葩知识,你知道吗?
2021/01/25 Javascript
[03:12]TI9战队档案 - Virtus Pro
2019/08/20 DOTA
python使用append合并两个数组的方法
2015/04/28 Python
python虚拟环境的安装配置图文教程
2017/10/20 Python
Python Flask基础教程示例代码
2018/02/07 Python
python数据处理 根据颜色对图片进行分类的方法
2018/12/08 Python
Django框架 查询Extra功能实现解析
2019/09/04 Python
Python3离线安装Requests模块问题
2019/10/13 Python
pytorch实现mnist分类的示例讲解
2020/01/10 Python
python如何提取英语pdf内容并翻译
2020/03/03 Python
DRF使用simple JWT身份验证的实现
2021/01/14 Python
Flask处理Web表单的实现方法
2021/01/31 Python
python如何修改文件时间属性
2021/02/05 Python
阿迪达斯法国官方网站:adidas法国
2018/03/20 全球购物
优秀英语专业毕业生求职信
2013/11/23 职场文书
周鸿祎:教你写创业计划书
2013/12/30 职场文书
仓库管理专业个人的自我评价
2013/12/30 职场文书
制作部班长职位说明书
2014/02/26 职场文书
青年文明号服务承诺
2014/03/31 职场文书
电工技术比武方案
2014/05/11 职场文书
2015年党员创先争优公开承诺书
2015/04/27 职场文书
运动会加油稿50字
2015/07/21 职场文书
Python绘制地图神器folium的新人入门指南
2021/05/23 Python
pandas中DataFrame数据合并连接(merge、join、concat)
2021/05/30 Python
Python常用配置文件ini、json、yaml读写总结
2021/07/09 Python
浅谈克隆 JavaScript
2021/11/02 Javascript
PHP面试题 wakeup魔法 Ezpop pop序列化与反序列化
2022/04/11 PHP