html 高性能 简易轮播图

目标

实现简易轮播图动画效果

设计理念

  • 无论有多少个轮播图,仅使用常数个轮播图tab,通过js替换更新dom内容,实现性能优化;
  • 使用bfc避免回流,(重绘是基本上无法避免,不在考虑);
  • 使用transform实现动画调用GPU加速。

注意:以下代码仅仅实现简易轮播效果,具体场景需要具体分析。

效果

代码

html 复制代码
<div class="wrap" id="wrap">
</div>

<script>

//测试显示元素
  const showList=[
    '1','2','3','4'
  ]

  function createElement(){
    const show=document.createElement('div')
    show.classList.add('box')
    show.classList.add('hide')
    return show
  }
  function getShow(){
    let index=-1
    return function (){
      ++index
      index%=showList.length
      return showList[index]
    }
  }
  const getData=getShow()
  
  // 使用fragment 将多个dom一次性添加 提高性能
  const fragment=document.createDocumentFragment()
  let dom1=createElement()
  dom1.innerText=getData()
  dom1.classList.replace('hide','show')
  let dom2=createElement()
  fragment.appendChild(dom1)
  fragment.appendChild(dom2)
  document.getElementById('wrap').appendChild(fragment)
//切换代码
  function next() {
    dom1.classList.replace('show','hide')
    // 实现内容更迭 这里仅仅是设置文本 
    dom2.innerText=getData()
    dom2.classList.replace('hide','show')
	
	//交换 使 dom1始终是下一个将要隐藏元素
	//交换 使 dom2始终是下一个将要显示元素
    let temp=dom1
    dom1=dom2
    dom2=temp
  }

  setInterval(next,1500)


</script>


<style>
  @keyframes show {
    from{
      transform: translateX(100%);
    }
    to{
      transform: translateX(0);
    }
  }
  @keyframes hide {
    from{
      transform: translateX(0);
    }
    to{
      transform: translateX(-100%);
    }
  }

  .wrap {
    height: 200px;
    width: 500px;
    background: #4671ff;
    position: relative;
    
    /* bfc 使之不影响其他元素布局 不会引起回流 */
    overflow: hidden;
  }

  .wrap .box{
    height: 100%;
    width: 100%;
    background: #730e0e;
    position: absolute;
    top: 0;
    left: 0;
    display: flex;
    justify-content: center;
    align-items: center;
    font-size: 50px;
    color: white;
  }
  .show{
    animation: show .8s;
  }

  .hide{
    animation: hide .8s;
   
    /* 动画完成后隐藏到右边 */
    transform: translateX(100%);
  }
</style>
相关推荐
徐小夕几秒前
花了4个月时间,我写了一款支持AI的协同Word文档编辑器
前端·vue.js·后端
岁月向前1 小时前
小组件获取主App数据的几种方案
前端
用户47949283569151 小时前
TypeScript 和 JavaScript 的 'use strict' 有啥不同
前端·javascript·typescript
恒创科技HK1 小时前
香港服务器速度快慢受何影响?
运维·服务器·前端
bubiyoushang8882 小时前
MATLAB实现直流电法和大地电磁法的一维正演计算
前端·javascript·matlab
Mintopia2 小时前
🧠 AIGC模型的增量训练技术:Web应用如何低成本迭代能力?
前端·javascript·aigc
Mintopia2 小时前
🧩 Next.js在国内环境的登录机制设计:科学、务实、又带点“国风味”的安全艺术
前端·javascript·全栈
雨过天晴而后无语2 小时前
Windchill中MVC选中事件级联另一MVC内容
java·javascript·html·mvc
qq. 28040339842 小时前
react hooks
前端·javascript·react.js
LHX sir3 小时前
什么是UIOTOS?
前端·前端框架·编辑器·团队开发·个人开发·web