图片/图形

jQuery+css3弹性3D分组图片翻转展示特效

阿里云


这是一款炫酷的 jQuery 和 css3 弹性 3d 图片翻转分组展示特效。内容分组过滤对于一些网站来说是非常重要的,如商务网站和图片站。如何使组图片切换时不必刷新网页呢?最好的方法是使用 CSS3 3D Transforms 来在用户选择某组类别时翻转图片。这款插件在 IE9 以下的 IE 浏览器中看不到效果。

HTML 结构

html 结构使用一个 nav 作为 wrapper,在里面使用无序列表作为分组图片。在插件中只用三个分组,但是你会发现使用了 4 个列表项,第一个列表项是一个占位,它将被用来在移动设备上制作选择按钮(通过 jQuery)。在大屏幕上这个占位将被移除(display:none)。

也想出现在这里?联系我们
创客主机
  1. <nav>
  2.     <ul>
  3.         <li class="placeholder"> 
  4.             <a href="#0">Option 1</a> <!-- default option on mobile -->
  5.         </li> 
  6.  
  7.         <li>
  8.             <a href="#0">Option 1</a>
  9.         </li>
  10.  
  11.         <li>
  12.             <a href="#0">Option 2</a>
  13.         </li>
  14.  
  15.         <li>
  16.             <a href="#0">Option 3</a>
  17.         </li>
  18.     </ul>
  19. </nav>

在每个分组中,又使用一个无序列表来作为图片画廊。这个无序列表的 ul 元素将被用于旋转,它里面的 li 元素将和它一起呗旋转。

  1. <ul>
  2.     <li>
  3.         <ul> <!-- this is the element that will rotate -->
  4.             <li>
  5.                 <img src="img/thumb-1.jpg" alt="thumbnail">
  6.             </li>
  7.             <li>
  8.                 <img src="img/thumb-2.jpg" alt="thumbnail">
  9.             </li>
  10.             <li>
  11.                 <img src="img/thumb-3.jpg" alt="thumbnail">
  12.             </li>
  13.         </ul>
  14.     </li>
  15.     <li>
  16.         <ul> <!-- this is the element that will rotate -->
  17.             <li>
  18.                 <img src="img/thumb-1.jpg" alt="thumbnail">
  19.             </li>
  20.             <li>
  21.                 <img src="img/thumb-2.jpg" alt="thumbnail">
  22.             </li>
  23.             <li>
  24.                 <img src="img/thumb-3.jpg" alt="thumbnail">
  25.             </li>
  26.         </ul>
  27.     </li>
  28.     <!-- ... -->
  29. </ul>

CSS 代码

包含图片的无序列表的第一个列表项是可见的,我们给它 class.is-visible。

  1. li.is-visible { /* the front item, visible by default */
  2.   position: relative;
  3.   z-index: 5;
  4. }

在同一个无序列表中,将使用绝对定位,这意味着其他列表项的高度将依赖与第一个列表项的高度。另外两个 class 是 .is-hidden 和 .is-selected 。 .is-hidden 将隐藏所有的列表项。 .is-selected 将使被选择的分组被显示。注意:这里使用 CSS3 transformation(180deg rotation)来旋转 ul 元素。

  1. li.is-hidden { /* the hidden items, right behind the front one */
  2.   position: absolute;
  3.   top: 0;
  4.   left: 0;
  5.   height: 100%;
  6.   width: 100%;
  7.   z-index: 1;
  8.   transform: rotateY(180deg); 
  9. }
  10.  
  11. li.is-selected { /* the next item that will be visible */
  12.   z-index: 3 !important;
  13. }

当用户点击分组按钮时,我们使用 jQuery 为 ul 添加.is-switched 来使它旋转。

  1. ul.is-switched li.is-visible {
  2.   transform: rotateY(180deg);
  3.   animation: cd-rotate 0.5s;
  4. }
  5.  
  6. ul.is-switched li.is-hidden {
  7.   transform: rotateY(0);
  8.   animation: cd-rotate-inverse 0.5s;
  9.   opacity: 0;
  10. }
  11.  
  12. ul.is-switched li.is-selected {
  13.   opacity: 1;
  14. }

我们使用 CSS3 Animations 来制作弹性效果,这不会影响到 CSS3 transitions 的旋转效果。

  1. @keyframes cd-rotate {
  2.   0% {
  3.     transform: perspective(800px) rotateY(0);
  4.   }
  5.  
  6.   70% { /* this creates the bounce effect */
  7.     transform: perspective(800px) rotateY(200deg);
  8.   }
  9.  
  10.   100% {
  11.     transform: perspective(800px) rotateY(180deg);
  12.   }
  13. }
  14.  
  15. @keyframes cd-rotate-inverse {
  16.   0% {
  17.     transform: perspective(800px) rotateY(-180deg);
  18.   }
  19.  
  20.   70% {
  21.     transform: perspective(800px) rotateY(20deg);
  22.   }
  23.  
  24.   100% {
  25.     transform: perspective(800px) rotateY(0);
  26.   }
  27. }

你也许会有些奇怪:为什么不直接将旋转应用到 ul 元素上?因为那样做需要使用到 transform-style: preserve-3d。看起来这样做更简单,但是别忘记了,IE11 以下的浏览器不支持 transform-style: preserve-3d。

JAVASCRIPT

  1. jQuery(document).ready(function($){
  2.   //wrap each one of your filter in a .cd-gallery-container
  3.   bouncy_filter($('.cd-gallery-container'));
  4.  
  5.   function bouncy_filter($container) {
  6.     $container.each(function(){
  7.       var $this = $(this);
  8.       var filter_list_container = $this.children('.cd-filter'),
  9.         filter_values = filter_list_container.find('li:not(.placeholder) a'),
  10.         filter_list_placeholder = filter_list_container.find('.placeholder a'),
  11.         filter_list_placeholder_text = filter_list_placeholder.text(), 
  12.         filter_list_placeholder_default_value = 'Select',
  13.         gallery_item_wrapper = $this.children('.cd-gallery').find('.cd-item-wrapper');
  14.  
  15.       //store gallery items
  16.       var gallery_elements = {};
  17.       filter_values.each(function(){
  18.         var filter_type = $(this).data('type');
  19.         gallery_elements[filter_type] = gallery_item_wrapper.find('li[data-type="'+filter_type+'"]');
  20.       });
  21.  
  22.       //detect click event
  23.       filter_list_container.on('click', function(event){
  24.         event.preventDefault();
  25.         //detect which filter item was selected
  26.         var selected_filter = $(event.target).data('type');
  27.  
  28.         //check if user has clicked the placeholder item (for mobile version)
  29.         if( $(event.target).is(filter_list_placeholder) || $(event.target).is(filter_list_container) ) {
  30.  
  31.           (filter_list_placeholder_default_value == filter_list_placeholder.text()) ? filter_list_placeholder.text(filter_list_placeholder_text) : filter_list_placeholder.text(filter_list_placeholder_default_value) ;
  32.           filter_list_container.toggleClass('is-open');
  33.  
  34.         //check if user has clicked a filter already selected 
  35.         } else if( filter_list_placeholder.data('type') == selected_filter ) {
  36.  
  37.           filter_list_placeholder.text($(event.target).text()) ;
  38.           filter_list_container.removeClass('is-open'); 
  39.  
  40.         } else {
  41.           //close the dropdown (mobile version) and change placeholder text/data-type value
  42.           filter_list_container.removeClass('is-open');
  43.           filter_list_placeholder.text($(event.target).text()).data('type', selected_filter);
  44.           filter_list_placeholder_text = $(event.target).text();
  45.  
  46.           //add class selected to the selected filter item
  47.           filter_values.removeClass('selected');
  48.           $(event.target).addClass('selected');
  49.  
  50.           //give higher z-index to the gallery items selected by the filter
  51.           show_selected_items(gallery_elements[selected_filter]);
  52.  
  53.           //rotate each item-wrapper of the gallery
  54.           //at the end of the animation hide the not-selected items in the gallery amd rotate back the item-wrappers
  55.  
  56.           // fallback added for IE9
  57.           var is_explorer_9 = navigator.userAgent.indexOf('MSIE 9') > -1;
  58.  
  59.           if( is_explorer_9 ) {
  60.             hide_not_selected_items(gallery_elements, selected_filter);
  61.             gallery_item_wrapper.removeClass('is-switched');
  62.           } else {
  63.             gallery_item_wrapper.addClass('is-switched').eq(0).one('webkitAnimationEnd oanimationend msAnimationEnd animationend', function() {   
  64.               hide_not_selected_items(gallery_elements, selected_filter);
  65.               gallery_item_wrapper.removeClass('is-switched');
  66.             });
  67.           }
  68.         }
  69.       });
  70.     });
  71.   }
  72. });
  73.  
  74. function show_selected_items(selected_elements) {
  75.   selected_elements.addClass('is-selected');
  76. }
  77.  
  78. function hide_not_selected_items(gallery_containers, filter) {
  79.   $.each(gallery_containers, function(key, value){
  80.       if ( key != filter ) {  
  81.       $(this).removeClass('is-visible is-selected').addClass('is-hidden');
  82.  
  83.     } else {
  84.       $(this).addClass('is-visible').removeClass('is-hidden is-selected');
  85.     }
  86.   });
  87. }

jQuery+css3 弹性 3D 分组图片翻转展示特效

已有 425 人购买
查看演示升级 VIP立刻购买

演示地址 下载地址
收藏
(0)

发表回复

热销模板

Ashade - 作品展示摄影相册WordPress汉化主题
LensNews

本站承接 WordPress / PbootCMS / DedeCMS 等
系统建站、仿站、开发、定制等业务!