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>
相关推荐
深蓝AI5 小时前
Meta 开源用了八年的设计系统 astryx:连坐两天 GitHub 总榜第一,组件库开始写给 agent 的说明书
前端·人工智能
IT_陈寒5 小时前
Vue的watch把我坑惨了,原来要这样用才靠谱
前端·人工智能·后端
1-1=05 小时前
Vue 3 模板语
前端·javascript·vue.js
用户7610304473716 小时前
【转战智能眼镜开发】ROKID AIUI 小游戏 亚马逊标枪项目实战讲解
前端
风卿6 小时前
看着AI写代码太孤独了,来欣赏星云吧:一个DSH 装饰插件
前端·javascript
牧艺6 小时前
弹层不用再手算坐标了:CSS Anchor Positioning 从原理到可上线
前端·javascript·css
用户老李6 小时前
YOLO 目标检测自学教程 07:YOLOv3——多尺度预测
前端
moshuying7 小时前
ESP32 墨水屏金价牌(上):从点亮到把图片推过去
前端
李剑一7 小时前
别再抬杠,前端岗已经没了!无论前后端,我们最终都要成“全干”工程师
前端·面试
Highcharts.js7 小时前
Highcharts 仪表盘与速度仪图表库介绍
前端·信息可视化·仪表板·highcharts·图表开发·图表库·仪表可视化