小仙儿 2020-06-25
实现原理:父元素为定宽定高相对定位,且overflow:hidden,子元素为绝对定位高度继承父元素,宽度可计算或设置一个大值,通过绝对定位的left来决定显示的子元素
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Carousel</title> <link rel="stylesheet" href="../css/reset.css"> </head> <style> .carousel-wrap { position: relative; width: 600px; height: 80px; margin: 40px auto; } .carousel-wrap .current { position: absolute; left: 0; top: -5px; width: 112px; height: 85px; background: url("../images/carousel-cur.png") no-repeat center center; cursor: pointer; z-index: 103; } .carousel-container { position: relative; width: 600px; height: 80px; text-align: center; overflow: hidden; } .carousel-container .carousel-list { position: absolute; width: 800px; height: 80px; left: 0; } .carousel-container .carousel-list li { position: relative; float: left; cursor: pointer; width: 112px; height: 80px; margin-right: 10px; overflow: hidden; } .carousel-container .carousel-list li em { position: absolute; bottom: 0; left: 0; width: 112px; height: 26px; background-color: #000; opacity: 0.6; z-index: 102; } .carousel-container .carousel-list li p { position: absolute; bottom: 0; width: 112px; height: 26px; line-height: 26px; text-align: center; z-index: 103; } .carousel-container .carousel-list li p a { color: #fff; font-size: 12px; } .carousel-container .carousel-list li img { position: absolute; top: 0; left: 0; right: 0; bottom: 0; margin: auto; height: 80px; z-index: 100; } .carousel-container .carousel-list li img:hover { transform: scale(1.05); transition: all .3s ease; -webkit-transition: all .3s ease; -moz-transition: all .3s ease; -ms-transition: all .3s ease; -o-transition: all .3s ease; } .carousel-container .arrow { position: absolute; width: 22px; height: 33px; z-index: 104; background: url("../images/arrow.png"); } .carousel-container .arrow.next { background-position: -23px 0; top: 20px; right: 0; } .carousel-container .arrow.previous { background-position: 0 0; top: 20px; left: 0; } .carousel-container .current { position: absolute; left: 0; width: 114px; height: 84px; border: 2px solid #ddd; } </style> <body> <div class="carousel-wrap"> <div class="current" id="carouselCurrent"></div> <div class="carousel-container"> <ul class="carousel-list" id="carouselList"> <li> <p><a href="javascript:;">样板间1</a></p> <em></em> <img src="../images/112x80_1.png" alt=""> </li> <li> <p><a href="javascript:;">全景看房2</a></p> <em></em> <img src="../images/112x80_2.jpg" alt=""> </li> <li> <p><a href="javascript:;">活动现场3</a></p> <em></em> <img src="../images/112x80_3.png" alt=""> </li> <li> <p><a href="javascript:;">证件照4</a></p> <em></em> <img src="../images/112x80_4.jpg" alt=""> </li> <li> <p><a href="javascript:;">户型5</a></p> <em></em> <img src="../images/112x80_5.jpg" alt=""> </li> <li> <p><a href="javascript:;">交通图6</a></p> <em></em> <img src="../images/112x80_6.jpg" alt=""> </li> <li> <p><a href="javascript:;">实景图7</a></p> <em></em> <img src="../images/112x80_7.jpg" alt=""> </li> <li> <p><a href="javascript:;">视频8</a></p> <em></em> <img src="../images/112x80_8.png" alt=""> </li> <li> <p><a href="javascript:;">证件9</a></p> <em></em> <img src="../images/112x80_9.jpg" alt=""> </li> <li> <p><a href="javascript:;">证件10</a></p> <em></em> <img src="../images/112x80_9.jpg" alt=""> </li> </ul> <a href="javascript:;" class="arrow previous" id="arrowPrev"></a> <a href="javascript:;" class="arrow next" id="arrowNext"></a> </div> </div> </body> <script src="../JavaScript/jquery.min.js" type="text/javascript"></script> <script> $(document).ready(function () { let arrowPrev = $(‘#arrowPrev‘); let arrowNext = $(‘#arrowNext‘); let carouselList = $(‘#carouselList‘); let carouselCurrent = $(‘#carouselCurrent‘); let listLength = $(‘#carouselList li‘).length; //轮播总数 let showLength = 5; let stepWidth = 122; let fixCurPonit = (showLength - 1) * stepWidth; //488 let pointCurWidth = stepWidth - (listLength - showLength) * stepWidth; let pointPicWidth = (showLength - listLength) * stepWidth; carouselList.css(‘width‘, (listLength + 1) * 112 + ‘px‘) arrowPrev.click(function () { move(stepWidth); }); arrowNext.click(function () { move(-stepWidth); }); function move(offset) { let picLeft = parseFloat(carouselList.css(‘left‘)); let curLeft = parseFloat(carouselCurrent.css(‘left‘)); if (picLeft < pointCurWidth && curLeft < fixCurPonit) { let newCurLeft = curLeft - offset; //carouselCurrent.css(‘left‘, `${newCurLeft}px`); carouselCurrent.animate({ left: `${newCurLeft}px` }, 300); } else if (picLeft === pointPicWidth && curLeft === fixCurPonit) { carouselCurrent.css(‘left‘, ‘0‘); carouselList.css(‘left‘, ‘0‘); } else { let newPicLeft = picLeft + offset; //carouselList.css(‘left‘, `${newPicLeft}px`); carouselList.animate({ left: `${newPicLeft}px` }, 300) } } }) </script> </html>