这是一款jQuery和css3可扩展的图片幻灯片插件。我们经常能看到“50%平均分割布局”:屏幕的50%宽是图片,50%宽是文字。这种模式可以在我们这个幻灯片插件中使用。
通常情况下,用户不能和图片进行交互。但是如果你想显示更多的图片该怎么办呢?一个解决方案是在点击时触发一个模态窗口来显示幻灯片。现在通过CSS Transitions为我们提供了更好的用户体验方案。这是一种新的用于扩展图像的方法,通过覆盖相邻的内容和将额外内容向下推进来使其全屏显示,从而将它变成一个全屏幻灯片。
HTML结构
html结构包含两个主要的<div>(.cd-slider-wrapper和.cd-item-info):。第一个div包含图片幻灯片,第二个div包含一些标题、说明文本等。它们都被包含在 section.cd-single-item中。其他的内容包含在section .cd-content中。
< section class = "cd-single-item" > < div class = "cd-slider-wrapper" > < ul class = "cd-slider" > < li class = "selected" >< img src = "img/img-1.jpg" alt = "Product Image 1" ></ li > < li >< img src = "img/img-2.jpg" alt = "Product Image 1" ></ li > < li >< img src = "img/img-3.jpg" alt = "Product Image 2" ></ li > </ ul > <!-- cd-slider --> < ul class = "cd-slider-navigation" > < li >< a href = "#0" class = "cd-prev inactive" >Next</ a ></ li > < li >< a href = "#0" class = "cd-next" >Prev</ a ></ li > </ ul > <!-- cd-slider-navigation --> < a href = "#0" class = "cd-close" >Close</ a > </ div > <!-- cd-slider-wrapper --> < div class = "cd-item-info" > < h2 >Produt Title</ h2 > < p >Lorem ipsum dolor sit amet...</ p > < button class = "add-to-cart" >Add to cart</ button > </ div > <!-- cd-item-info --> </ section > <!-- cd-single-item --> < section class = "cd-content" > <!-- other content here --> </ section > |
注意:幻灯片的前后导航按钮.cd-slider-pagination不是直接插入到Html中,而是在运行时使用jQuery将其插入。
CSS样式
在小屏幕上,css样式十分简单:.cd-slider-wrapper和.cd-item-info都被设置为100%宽度。
在桌面设备上(屏幕大小超过1024px),我们为.cd-item-info设置position: absolute 和width: 50% ,并将其放在屏幕的右边。
对于.cd-slider-wrapper元素,我们设置其width: 50%。当用户点击了图片幻灯片,我们为.cd-single-item添加.cd-slider-active class:.cd-slider-wrapper的宽度将被设置为100%。通过这个方法,.cd-slider-wrapper将变大,覆盖掉.cd-item-info,并将额外内容向下推进。通过在宽度值上使用CSS3 Transition来使动画变得更加平滑。
@media only screen and ( min-width : 1024px ) { .cd-slider-wrapper { transition : width 0.4 s; width : 50% ; } .cd-slider-active .cd-slider-wrapper { width : 100% ; } } @media only screen and ( min-width : 1024px ) { .cd-item-info { position : absolute ; width : 50% ; top : 0 ; right : 0 ; padding : 60px 60px 0 ; } } |
另外,因为.cd-item-info是position: absolute的,.cd-single-item元素的高度仅仅通过幻灯片图片的高度来设置。因此,.cd-item-info要比幻灯片图片的高度要小。
JAVASCRIPT
我们通过jQuery来在用户点击图片时切换到幻灯片模式。另外,我们为幻灯片实现一个基本的滑动方案(可以通过键盘和触摸导航,拥有前后导航和按钮导航)。
jQuery(document).ready( function ($){ var itemInfoWrapper = $( '.cd-single-item' ), slides = $( '.cd-slider li' ), slidesWrapper = $( '.cd-slider' ), // create slider pagination sliderPagination = createSliderPagination(slides); slidesWrapper.on( 'click' , function (event){ //enlarge slider images if ( !itemInfoWrapper.hasClass( 'cd-slider-active' ) && $(event.target).is( '.cd-slider' )) { itemInfoWrapper.addClass( 'cd-slider-active' ).one( 'webkitTransitionEnd otransitionend oTransitionEnd msTransitionEnd transitionend' , function (){ $( 'body,html' ).animate({ 'scrollTop' :slidesWrapper.offset().top}, 200); }); } }); $( '.cd-slider-wrapper .cd-close' ).on( 'click' , function (){ //shrink slider images itemInfoWrapper.removeClass( 'cd-slider-active' ); }); //update visible slide $( '.cd-next' ).on( 'click' , function (){ nextSlide(); }); $( '.cd-prev' ).on( 'click' , function (){ prevSlide(); }); $(document).keyup( function (event){ if (event.which== '37' && itemInfoWrapper.hasClass( 'cd-slider-active' ) && !$( '.cd-slider .selected' ).is( ':first-child' )) { prevSlide(); } else if ( event.which== '39' && itemInfoWrapper.hasClass( 'cd-slider-active' ) && !$( '.cd-slider .selected' ).is( ':last-child' )) { nextSlide(); } else if (event.which== '27' ) { itemInfoWrapper.removeClass( 'cd-slider-active' ); } }); slidesWrapper.on( 'swipeleft' , function (){ var bool = enableSwipe(); if (!$( '.cd-slider .selected' ).is( ':last-child' ) && bool) {nextSlide();} }); slidesWrapper.on( 'swiperight' , function (){ var bool = enableSwipe(); if (!$( '.cd-slider .selected' ).is( ':first-child' ) && bool) {prevSlide();} }); sliderPagination.on( 'click' , function (){ var selectedDot = $( this ); if (!selectedDot.hasClass( 'selected' )) { var selectedPosition = selectedDot.index(), activePosition = $( '.cd-slider .selected' ).index(); if ( activePosition < selectedPosition) { nextSlide(selectedPosition); } else { prevSlide(selectedPosition); } } }); function createSliderPagination($slides){ var wrapper = $( '<ul class="cd-slider-pagination"></ul>' ).insertAfter( '.cd-slider-navigation' ); $slides.each( function (index){ var dotWrapper = (index == 0) ? $( '<li class="selected"></li>' ) : $( '<li></li>' ), dot = $( '<a href="#0"></a>' ).appendTo(dotWrapper); dotWrapper.appendTo(wrapper); dot.text(index+1); }); return wrapper.children( 'li' ); } function nextSlide($n){ var visibleSlide = $( '.cd-slider .selected' ), navigationDot = $( '.cd-slider-pagination .selected' ); if ( typeof $n === 'undefined' ) $n = visibleSlide.index() + 1; visibleSlide.removeClass( 'selected' ); slides.eq($n).addClass( 'selected' ).prevAll().addClass( 'move-left' ); navigationDot.removeClass( 'selected' ) sliderPagination.eq($n).addClass( 'selected' ); updateNavigation(slides.eq($n)); } function prevSlide($n){ var visibleSlide = $( '.cd-slider .selected' ), navigationDot = $( '.cd-slider-pagination .selected' ); if ( typeof $n === 'undefined' ) $n = visibleSlide.index() - 1; visibleSlide.removeClass( 'selected' ) slides.eq($n).addClass( 'selected' ).removeClass( 'move-left' ).nextAll().removeClass( 'move-left' ); navigationDot.removeClass( 'selected' ); sliderPagination.eq($n).addClass( 'selected' ); updateNavigation(slides.eq($n)); } function updateNavigation($active) { $( '.cd-prev' ).toggleClass( 'inactive' , $active.is( ':first-child' )); $( '.cd-next' ).toggleClass( 'inactive' , $active.is( ':last-child' )); } function enableSwipe() { var mq = window.getComputedStyle(document.querySelector( '.cd-slider' ), '::before' ).getPropertyValue( 'content' ); return ( mq== 'mobile' || itemInfoWrapper.hasClass( 'cd-slider-active' )); } }); |