在layui2.5.6中使用layui.carousel这个轮播图组件,如果是静态固定数量的内容,这样使用是很正常的。
但是,需求总是超乎想想,当轮播图要动态增加内容时。正常人都是直接再次render一下,但是这样就会产生显示问题。比如这样一个例子。
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <title>layui在线调试</title> <link rel="stylesheet" href="//res.layui.com/layui/dist/css/layui.css?t=1598935358933" media="all"> <style> body{margin: 10px;} .demo-carousel{height: 200px; line-height: 200px; text-align: center;} </style> </head> <body> <div class="layui-tab layui-tab-brief" lay-filter="demo"> <ul class="layui-tab-title"> <li class="layui-this">演示说明</li> </ul> <div class="layui-tab-content"> <div class="layui-tab-item layui-show"> <div class="layui-carousel" id="test1"> <div carousel-item> <div><p class="layui-bg-green demo-carousel">在这里,你将以最直观的形式体验 layui!</p></div> <div><p class="layui-bg-red demo-carousel">在编辑器中可以执行 layui 相关的一切代码</p></div> <div><p class="layui-bg-blue demo-carousel">你也可以点击左侧导航针对性地试验我们提供的示例</p></div> <div><p class="layui-bg-orange demo-carousel">如果最左侧的导航的高度超出了你的屏幕</p></div> <div><p class="layui-bg-cyan demo-carousel">你可以将鼠标移入导航区域,然后滑动鼠标滚轮即可</p></div> </div> </div> </div> </div> </div> <blockquote class="layui-elem-quote layui-quote-nm layui-hide" id="footer">layui {{ layui.v }} 提供强力驱动</blockquote> <script src="//res.layui.com/layui/dist/layui.js?t=1598935358933"></script> <script> layui.config({ version: '1598935358933' //为了更新 js 缓存,可忽略 }); layui.use(['laydate', 'laypage', 'layer', 'table', 'carousel', 'upload', 'element', 'slider'], function(){ var laydate = layui.laydate //日期 ,laypage = layui.laypage //分页 ,layer = layui.layer //弹层 ,table = layui.table //表格 ,carousel = layui.carousel //轮播 ,upload = layui.upload //上传 ,element = layui.element //元素操作 ,slider = layui.slider //滑块 ,$=layui.jquery //监听Tab切换 element.on('tab(demo)', function(data){ layer.tips('切换了 '+ data.index +':'+ this.innerHTML, this, { tips: 1 }); }); //执行一个轮播实例 carousel.render({ elem: '#test1' ,width: '100%' //设置容器宽度 ,height: 200 ,arrow: 'none' //不显示箭头 ,anim: 'fade' //切换动画方式 }); setTimeout(function(){ carousel.render({ elem: '#test1' ,width: '100%' //设置容器宽度 ,height: 200 ,arrow: 'none' //不显示箭头 ,anim: 'fade' //切换动画方式 }); },1500); }); </script> </body> </html>
从gif图可以看见出现一直不同步的感觉。再审查元素。
从这个审查元素的图可以清晰发现,短时间内快速切换了两次,就此可猜测是两个轮播实例在操作导致了。因此我们要避免对于同一个元素进行多次render,layui文档carousel部分最后有个reload方法,可以使用来进行轮播图的更新。修改一下示例代码再次执行。
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <title>layui在线调试</title> <link rel="stylesheet" href="//res.layui.com/layui/dist/css/layui.css?t=1598935358933" media="all"> <style> body{margin: 10px;} .demo-carousel{height: 200px; line-height: 200px; text-align: center;} </style> </head> <body> <div class="layui-tab layui-tab-brief" lay-filter="demo"> <ul class="layui-tab-title"> <li class="layui-this">演示说明</li> </ul> <div class="layui-tab-content"> <div class="layui-tab-item layui-show"> <div class="layui-carousel" id="test1"> <div carousel-item> <div><p class="layui-bg-green demo-carousel">在这里,你将以最直观的形式体验 layui!</p></div> <div><p class="layui-bg-red demo-carousel">在编辑器中可以执行 layui 相关的一切代码</p></div> <div><p class="layui-bg-blue demo-carousel">你也可以点击左侧导航针对性地试验我们提供的示例</p></div> <div><p class="layui-bg-orange demo-carousel">如果最左侧的导航的高度超出了你的屏幕</p></div> <div><p class="layui-bg-cyan demo-carousel">你可以将鼠标移入导航区域,然后滑动鼠标滚轮即可</p></div> </div> </div> </div> </div> </div> <blockquote class="layui-elem-quote layui-quote-nm layui-hide" id="footer">layui {{ layui.v }} 提供强力驱动</blockquote> <script src="//res.layui.com/layui/dist/layui.js?t=1598935358933"></script> <script> layui.config({ version: '1598935358933' //为了更新 js 缓存,可忽略 }); layui.use(['laydate', 'laypage', 'layer', 'table', 'carousel', 'upload', 'element', 'slider'], function(){ var laydate = layui.laydate //日期 ,laypage = layui.laypage //分页 ,layer = layui.layer //弹层 ,table = layui.table //表格 ,carousel = layui.carousel //轮播 ,upload = layui.upload //上传 ,element = layui.element //元素操作 ,slider = layui.slider //滑块 ,$=layui.jquery //监听Tab切换 element.on('tab(demo)', function(data){ layer.tips('切换了 '+ data.index +':'+ this.innerHTML, this, { tips: 1 }); }); //执行一个轮播实例 //这里的实例对象tar怎么保存就根据个人实际情况来处理 var tar= carousel.render({ elem: '#test1' ,width: '100%' //设置容器宽度 ,height: 200 ,arrow: 'none' //不显示箭头 ,anim: 'fade' //切换动画方式 }); setTimeout(function(){ $("#test1").children().append('<div><p class="layui-bg-cyan demo-carousel">这是额外增加的</p></div>'); tar.reload();//没有改变参数,直接执行,有的话像render一样的参数 },2000); }); </script> </body> </html>
最后的效果。
可以看见5个点变成6个点,切换显示正常,就是有个小缺点,重置后会从第一个重新开始,计时也是。那么,可以在切换事件中记录一下当前下标,重置时将下标参数index传入。在这里就不进行演示。