一个响应灵敏、移动友好的全屏背景幻灯片,配有圆形旋转器控件,您可以通过单击/点击缩略图在图像之间切换。
1.在文档中加载必要的JavaScript库。依赖项:
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/2.1.3/TweenMax.min.js"></script> <script src="https://unpkg.com/[email protected]/imagesloaded.pkgd.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/2.1.3/plugins/CSSPlugin.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/2.1.3/plugins/TextPlugin.min.js"></script>
2.将图像添加到幻灯片中。
<section class="slideshow"> <!-- Thumbnail Rotator --> <ul class="navigation"> <li class="navigation-item active"> <span class="rotate-holder"></span> <span class="background-holder" style="background-image: url(1.jpg);"></span> </li> <li class="navigation-item"> <span class="rotate-holder"></span> <span class="background-holder" style="background-image: url(2.jpg);"></span> </li> <li class="navigation-item"> <span class="rotate-holder"></span> <span class="background-holder" style="background-image: url(3.jpg);"></span> </li> ... </ul> <!-- Slideshow --> <div class="detail"> <div class="detail-item active"> <div class="headline">Image 1</div> <div class="background" style="background-image: url(1.jpg); height: 100vh;"></div> <div class="background" style="background-image: url(1.jpg); height: 100vh; background-size: cover; background-position: center;"></div> </div> <div class="detail-item"> <div class="headline">Image 2</div> <div class="background" style="background-image: url(2.jpg);"></div> </div> <div class="detail-item"> <div class="headline">Image 3</div> <div class="background" style="background-image: url(3.jpg);"></div> </div> ... </div> </section>
3.必要的CSS样式。
body section.slideshow { position: relative; display: block; width: 100%; height: 100%; height: 100vh; margin: 0 auto; visibility: hidden; overflow: hidden; } body section.slideshow ul.navigation { position: absolute; display: block; width: 640px; height: 640px; padding: 0; margin: 0; left: -230px; top: 50%; margin-top: -320px; z-index: 10; } body section.slideshow ul.navigation li.navigation-item { position: absolute; display: inline-block; overflow: hidden; width: 120px; height: 120px; padding: 10px; text-align: center; cursor: pointer; border-radius: 50%; transition: border 0.6s ease-in-out; } body section.slideshow ul.navigation li.navigation-item .rotate-holder { position: fixed; display: block; width: 0; height: 0; left: -9999px; top: -9999px; } body section.slideshow ul.navigation li.navigation-item .background-holder { position: absolute; display: block; width: 100%; height: 100%; top: 0; right: 0; bottom: 0; left: 0; border-radius: 50%; background-repeat: no-repeat; background-position: center center; background-size: cover; opacity: 1; visibility: visible; transition: opacity 0.6s ease-in-out, visibility 0.6s ease-in-out; } body section.slideshow ul.navigation li.navigation-item:hover .background-holder { opacity: 0.75; } body section.slideshow ul.navigation li.navigation-item.active .background-holder { opacity: 0; visibility: hidden; } body section.slideshow .detail { position: absolute; display: block; width: 100%; height: 100%; top: 0; right: 0; bottom: 0; left: 0; z-index: 8; } body section.slideshow .detail .detail-item { position: absolute; display: block; width: 100%; height: 100%; top: 0; right: 0; bottom: 0; left: 0; opacity: 0; visibility: hidden; transition: opacity 0.3s ease-in-out, visibility 0.3s ease-in-out; } body section.slideshow .detail .detail-item .headline { position: absolute; display: block; width: 100%; max-width: calc(100% - 480px); height: 126px; top: 50%; left: 50%; transform: translate(-50%, -50%); overflow: visible; white-space: nowrap; box-sizing: border-box; z-index: 2; } body section.slideshow .detail .detail-item .headline .letter { position: relative; display: inline-block; opacity: 0; visibility: hidden; color: #FFFFFF; font-size: 132px; line-height: 110px; font-weight: 900; font-kerning: none; white-space: nowrap; box-sizing: border-box; text-transform: uppercase; } body section.slideshow .detail .detail-item .background { position: absolute; display: block; width: 100%; width: calc(100% + 100px); height: 100%; height: calc(100% + 100px); top: 0; right: 0; bottom: 0; left: 0; overflow: visible; background-repeat: no-repeat; background-position: center center; background-size: cover; z-index: 1; } body section.slideshow .detail .detail-item .background::before { content: ""; background: linear-gradient(to right, black 0%, rgba(0, 0, 0, 0) 90%); position: absolute; display: block; width: 100%; height: 100%; top: 0; right: 0; bottom: 0; left: 0; z-index: 2; } body section.slideshow .detail .detail-item.active { opacity: 1; visibility: visible; }
4.启用幻灯片放映。
$('.slideshow').imagesLoaded({ background: true }) .done( function() { // hide loader $('.loader').addClass('is-loaded'); // init variables var slideshow = $(".slideshow"), navigation = $(".navigation"), navigationItem = $(".navigation-item"), detailItem = $(".detail-item"), rotation, type = '_short'; // prepare letters $('.headline').each(function() { $(this).html($(this).text().replace(/([^\x00-\x80]|\w)/g, "<span class='letter'>$&</span>")); }); // prepare navigation and set navigation items on the right place navigationItem.each(function(index, elem) { TweenMax.set(elem, { left: navigation.width() / 2 - navigationItem.width() / 2 - 10, rotation: 90 + (index * 360 / navigationItem.length), transformOrigin: "50% " + navigation.width() / 2 + "px" }); TweenMax.set($(elem).find('.rotate-holder'), { text: String(index * 360 / navigationItem.length) }); TweenMax.set($(elem).find('.background-holder'), { rotation: -90 - (index * 360 / navigationItem.length), }); }); // set tween values function setTweenValues() { rotation = Number($(this).find('.rotate-holder').text()); } // do tween function doTween(target) { var targetIndex = navigationItem.index(target), timeline = new TimelineMax(); // add/remove class "active" from navigation & detail navigationItem.each(function() { $(this).removeClass('active'); if ($(this).index() == $(target).index()) { $(this).addClass('active'); } }); detailItem.each(function() { $(this).removeClass('active'); if ($(this).index() == $(target).index()) { $(this).addClass('active'); } }); timeline .to(navigation, 0.6, { rotation: -rotation + type, transformOrigin: "50% 50%", ease: Sine.easeInOut }) .staggerTo(navigationItem.find('.background-holder'), 0.6, { cycle: { //function that returns a value rotation: function(index, element) { return -90 - Number($(element).prev('.rotate-holder').text()) + rotation + type; } }, transformOrigin: "50% 50%", ease: Sine.easeInOut, }, 0, '-=0.6') .staggerFromTo($('.active').find('.letter'), 0.3, { autoAlpha: 0, x: -100, }, { autoAlpha: 1, x: 0, ease: Sine.easeInOut, }, 0.025, '-=0.3') .fromTo($('.active').find('.background'), 0.9, { autoAlpha: 0, x: -100, }, { autoAlpha: 1, x: 0, ease: Sine.easeInOut, }, 0.05, '+=0.3'); } // click/hover on items navigationItem.on('mouseenter', setTweenValues); navigationItem.on('click', function() { doTween($(this)); }) // on load show slideshow as well as first "active" navigation/detail item TweenMax.to(slideshow, 1, { autoAlpha: 1 }); TweenMax.to($('.active').find('.letter'), 0.7, { autoAlpha: 1, x: 0 }); TweenMax.to($('.active').find('.background'), 0.7, { autoAlpha: 1, x: 0 }); }); // fast fix for resize window and refresh view, attention: not use in production, only for demo purposes! (function () { var width = window.innerWidth; window.addEventListener('resize', function () { if (window.innerWidth !== width) { window.location.reload(true); } }); })();