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>
相关推荐
程序员爱钓鱼2 小时前
Go语言实战案例 — 项目实战篇:简易博客系统(支持评论)
前端·后端·go
excel9 小时前
ES6 中函数的双重调用方式:fn() 与 fn\...``
前端
可乐爱宅着9 小时前
全栈框架next.js入手指南
前端·next.js
你的人类朋友10 小时前
什么是API签名?
前端·后端·安全
会豪12 小时前
Electron-Vite (一)快速构建桌面应用
前端
中微子12 小时前
React 执行阶段与渲染机制详解(基于 React 18+ 官方文档)
前端
唐某人丶12 小时前
教你如何用 JS 实现 Agent 系统(2)—— 开发 ReAct 版本的“深度搜索”
前端·人工智能·aigc
中微子12 小时前
深入剖析 useState产生的 setState的完整执行流程
前端
遂心_13 小时前
JavaScript 函数参数传递机制:一道经典面试题解析
前端·javascript
小徐_233313 小时前
uni-app vue3 也能使用 Echarts?Wot Starter 是这样做的!
前端·uni-app·echarts