这是一款基于SVG clipPath(剪裁路径)和mask遮罩元素的炫酷jQuery幻灯片特效。该幻灯片利用圆形的前后导航按钮,在用户点击按钮时,按钮会平滑放大,显示出下一张幻灯片。
使用方法
HTML结构
该幻灯片的HTML结构包括2个部分:ul.cd-radial-slider
是幻灯片的slides,ul.cd-radial-slider-navigation
是导航按钮。
ul.cd-radial-slider
中的列表项又包括2个部分:.svg-wrapper
是一个SVG容器,它里面有一个<clipPath>
元素,用于改变幻灯片的剪裁区域。另外一个是<image>
元素,它的clip-path
属性是<clipPath>
元素的ID。
另外使用.cd-round-mask
来包裹两个<mask>
元素。
< div class = "cd-radial-slider-wrapper" > < ul class = "cd-radial-slider" data-radius1 = "60" data-radius2 = "1364" data-centerx1 = "110" data-centerx2 = "1290" > < li class = "visible" > < div class = "svg-wrapper" > < svg viewBox = "0 0 1400 800" > < title >Animated SVG</ title > < defs > < clipPath id = "cd-image-1" > < circle id = "cd-circle-1" cx = "110" cy = "400" r = "1364" /> </ clipPath > </ defs > < image height = '800px' width = "1400px" clip-path = "url(#cd-image-1)" xlink:href = "img/img-1.jpg" ></ image > </ svg > </ div > <!-- .svg-wrapper --> < div class = "cd-slider-content" > < div class = "wrapper" > < div > < h2 >Slide #1 Title</ h2 > < p >Lorem ipsum dolor sit amet, consectetur.</ p > < a href = "#0" class = "cd-btn" >Learn More</ a > </ div > </ div > </ div > <!-- .cd-slider-content --> </ li > < li class = "next-slide" > <!-- ... --> </ li > <!-- additional slides here --> </ ul > <!-- .cd-radial-slider --> < ul class = "cd-slider-navigation" > < li >< a href = "#0" class = "next" >Next</ a ></ li > < li >< a href = "#0" class = "prev" >Prev</ a ></ li > </ ul > <!-- .cd-slider-navigation --> < div class = "cd-round-mask" > < svg viewBox = "0 0 1400 800" > < defs > < mask id = "cd-left-mask" height = '800px' width = "1400px" x = "0" y = "0" maskUnits = "userSpaceOnUse" > < path fill = "white" d = "M0,0v800h1400V0H0z M110,460c-33.137,0-60-26.863-60-60s26.863-60,60-60s60,26.863,60,60S143.137,460,110,460z" /> </ mask > < mask id = "cd-right-mask" height = '800px' width = "1400px" x = "0" y = "0" maskUnits = "userSpaceOnUse" > < path fill = "white" d = "M0,0v800h1400V0H0z M1290,460c-33.137,0-60-26.863-60-60s26.863-60,60-60s60,26.863,60,60S1323.137,460,1290,460z" /> </ mask > </ defs > </ svg > </ div > </ div > <!-- .cd-radial-slider-wrapper --> |
CSS样式
幻灯片的样式也非常简单:所有的slide的透明度都为0,定位方式使用绝对定位,它们通过left:0;top:0;
设置为相互堆叠在一起,.visible
class类会被添加到当前选择的slide上,使该slide的定位方式从绝对定位变为相对定位,同时在剪裁动画期间,会为slide添加一个.is-animating
class类,用于改变它的z-index值。
有2个辅助class类用于制作圆形导航动画:.scale-down
class用于在新的slide被选择的时候,隐藏前一个slide。.move-up
class用于导航被点击的时候创建点击效果。
.cd-radial-slider > li { position : absolute ; top : 0 ; left : 0 ; width : 100% ; opacity : 0 ; transition : transform . 2 s; } .cd-radial-slider > li. visible { position : relative ; opacity : 1 ; } .cd-radial-slider > li.is-animating, .cd-radial-slider > li.prev-slide, .cd-radial-slider > li.next-slide { opacity : 1 ; } .cd-radial-slider > li.is-animating { z-index : 2 ; } .cd-radial-slider > li.scale-down, .cd-radial-slider > li.move-up { z-index : 3 ; } .cd-radial-slider > li.move-up { animation : cd-clicked . 2 s; } .cd-radial-slider > li.scale-down { transform : scale ( 0 ); } .cd-radial-slider > li.next-slide { transform-origin : 92.14% 50% ; } .cd-radial-slider > li.prev-slide { transform-origin : 7.86% 50% ; } |
JavaScript
在Js代码中,创建了一个radialSlider
对象,并使用bindEvents
方法来为幻灯片的导航点击绑定事件。
var radialSlider = function (element) { this .element = element; this .slider = this .element.find( '.cd-radial-slider' ); this .slides = this .slider.children( 'li' ); //... this .navigation = this .element.find( '.cd-radial-slider-navigation' ); //... this .bindEvents(); } radialSlider.prototype.bindEvents = function () { var self = this ; //update visible slide when clicking the navigation round elements this .navigation.on( 'click' , function (event){ if ( !self.animating ) { self.animating = true ; event.preventDefault(); var direction = ( $(event.target).hasClass( 'next' ) ) ? 'next' : 'prev' ; //update radialSlider index properties self.updateIndexes(direction); //show new slide self.updateSlides(direction); } }); } |
为了使图片剪裁区域产生动画,代码中动态修改<clipPath>
元素中的&lr;circle>
元素的r
属性。
在.cd-radial-slider
元素中有2个data属性:data-radius1
和data-radius2
,它们分别用于接收圆形的初始值和最终值。另外data-centerx1
和data-centerx2
属性用于使<circle>
元素居中。
在Js代码中使用Snap.svg的animate()
方法来最终圆形的扩展动画效果。
clipPathVisible.animate( { 'r' : radius2}, duration, customMinaAnimation, function (){ //callback function here }); |
为了在当前选择的幻灯片上应用遮罩效果,Js代码中动态修改了<image>
元素的样式,例如,为了使下一个幻灯片可见,使用下面的代码:
this .slides.eq( this .visibleIndex).find( 'image' ) .attr( 'style' , 'mask: url(#' + this .rightMask.attr( 'id' )+ ')' ); |
this.slides.eq(this.visibleIndex)
是可见的幻灯片slide,this.rightMask.attr('id')
是<mask>
元素的ID。
网盘下载密码:8svt