图片/图形

平面图片转换为3D模型动画jQuery特效

阿里云


现在许多浏览器都支持 CSS 3D transformations。我们可以为我们的网页添加许多有趣的动画效果。这一款 jQuery 和 css3 平面图片转换为 3d 模型动画效果就是非常好的动画效果。它模仿平面 app 屏幕转换为 3d 模型的动画。这个插件的灵感来自于 Prismic.io 。

HTML 结构

html 结构包含两个主要的 div(.cd-product-intro 和.cd-product-mockup)。第一个 div 放置的是一些介绍详细(标题,按钮等)。第二个 div 是我们的 3d 模型。

也想出现在这里?联系我们
创客主机
  1. <section class="cd-product">
  2.   <div class="cd-product-intro">
  3.     <h1><!-- Product name --></h1>
  4.     <p><!-- Product description --></p>
  5.     <div class="cd-triggers">
  6.       <a href="#0" class="cd-btn">Download</a>
  7.       <a href="#cd-product-tour" id="cd-start" class="cd-btn">Start</a>
  8.     </div>
  9.   </div> <!-- cd-product-intro -->
  10.  
  11.   <div id="cd-product-tour" class="cd-product-mockup">
  12.     <img src="img/cd-app-image.png" alt="Preview image"> <!-- mockup image -->
  13.     <ul class="cd-points-container">
  14.  
  15.       <li class="cd-single-point">
  16.         <a class="cd-img-replace" href="#0">More info</a>
  17.         <div class="cd-more-info cd-left">
  18.           <h2><!-- Point of interest title --></h2>
  19.           <p><!-- Point of interest description --></p>
  20.           <a href="#0" class="cd-close-info cd-img-replace">Close</a>
  21.         </div>
  22.       </li> <!-- .cd-single-point -->
  23.  
  24.       <!-- other points of interest here -->
  25.  
  26.     </ul> <!-- .cd-points-container -->
  27.  
  28.     <div class="cd-3d-right-side"></div> 
  29.     <div class="cd-3d-bottom-side"></div>
  30.  
  31.   </div> <!-- .cd-product-mockup -->
  32. </section> <!-- .cd-product -->

两个额外的 div.cd-3d-right-side 和.cd-3d-bottom-side 是用来制作 3d 模型的边部。.cd-product-mockup::before 用来制作模型的阴影。

CSS 代码

对于一个小屏幕而言,下面的 css 代码是非常简单的(你可以自行添加更多的效果)。在桌面设备(屏幕分辨率大于 1170px),我们为产品介绍( .cd-product-intro)设置 position: absolute 和 width: 50%,并且设置 left:0 以使它放置的屏幕的左边。
注意:我们使用 .cd-product-intro::before 伪元素是为了在 jQuery 中检测当前的 css 媒体查询:这个技巧是将不同的内容分配到不同的媒体查询中。更多关于这方面的内容,请参阅:Triggering JavaScript Actions With CSS Media Queries。

  1. .cd-product-intro::before {
  2.   /* never visible - this is used in jQuery to check the current MQ */
  3.   content: 'mobile';
  4.   display: none;
  5. }
  6. @media only screen and (min-width: 1170px) {
  7.   .cd-product-intro {
  8.     position: absolute;
  9.     left: 0;
  10.     width: 50%;
  11.     padding: 0;
  12.     text-align: left;
  13.     transition: transform 0.6s, opacity 0.6s;
  14.   }
  15.   .cd-product-intro::before {
  16.     /* never visible - this is used in jQuery to check the current MQ */
  17.     content: 'desktop';
  18.   }
  19. }

对于模型 div .cd-product-mockup,我们设置 width: 450px 和 margin: 0 auto 使它相对于容器居中。然后使用 CSS 3D transformations 使它旋转。

  1. .cd-product-mockup {
  2.   width: 90%;
  3.   /* set here the max-width for the mockup */
  4.   max-width: 450px;
  5.   margin: 0 auto;
  6. }
  7. @media only screen and (min-width: 1170px) {
  8.   .cd-product-mockup {
  9.     transform-style: preserve-3d;
  10.     transform-origin: center top;
  11.     transform: rotateX(-60deg) rotateZ(-40deg) translateX(50px) translateY(300px);
  12.     transition: transform 0.6s;
  13.   }
  14. }

使用 transform-style: preserve-3d 来确保.cd-3d-right-side 和 .cd-3d-bottom-side 被放置到正确的 3d 面上。为了制作 3d 滑动效果,我们将模型的底部(.cd-3d-bottom-side)和侧边(.cd-3d-right-side)设置为背景图片。并为它们添加一些额外的 css 来旋转它们。

  1. @media only screen and (min-width: 1170px) {
  2.   .cd-3d-right-side, .cd-3d-bottom-side {
  3.     display: block;
  4.     position: absolute;
  5.     left: 0;
  6.     background-image: url(../img/cd-app-image.png);
  7.     /* Firefox bug - 3D CSS transform, jagged edges */
  8.     outline: 1px solid transparent;
  9.   }
  10.   .cd-3d-right-side {
  11.     top: -1px;
  12.     width: 10px;
  13.     height: 100%;
  14.     background-size: auto 100%;
  15.     transform-origin: left center;
  16.     transform: translateZ(-1px) translateY(1px) rotateY(-90deg);
  17.   }
  18.   .cd-3d-bottom-side {
  19.     bottom: 0;
  20.     width: 100%;
  21.     height: 10px;
  22.     background-position: bottom center;
  23.     background-size: 100% auto;
  24.     transform-origin: center bottom;
  25.     transform: translateZ(-1px) rotateX(-90deg);
  26.   }
  27. }

我们使用 .cd-product-mockup::before 伪元素来制作模型的阴影。

  1. @media only screen and (min-width: 1170px) {
  2.   .cd-product-mockup::before {
  3.     /* mockup shadow */
  4.     display: block;
  5.     content: '';
  6.     position: absolute;
  7.     top: 0;
  8.     left: 0;
  9.     width: 0;
  10.     /* play with these values to create a realistic shadow */
  11.     height: 45%;
  12.     box-shadow: 0px 0px 30px 225px rgba(0, 0, 0, 0.1);
  13.     transform: translateZ(-100px) translateY(480px);
  14.  
  15.     transition: transform 0.6s;
  16.   }
  17. }

注意:IE11 级以下的 IE 版本不支持 transform-style: preserve-3d。当用户点击了开始按钮,我们为.cd-product 添加 class .is-product-tour,这时.cd-product-intro 被 translateX(-50%) , .cd-product-tour 被 translateX(0)。我们还通过 CSS3 transitions 来改变透明度的值以使动画过渡变得平滑。

JAVASCRIPT

我们使用 jQuery 来在用户点击触发按钮时添加、移除 class。当替换点击按钮时,.cd-product 被添加 class.is-product-tour。通过为 .cd-single-point 添加/移除 class .is-open 来显示和隐藏地标的显示信息。

  1. jQuery(document).ready(function($){
  2.   //open interest point description
  3.   $('.cd-single-point').children('a').on('click', function(){
  4.     var selectedPoint = $(this).parent('li');
  5.     if( selectedPoint.hasClass('is-open') ) {
  6.       selectedPoint.removeClass('is-open').addClass('visited');
  7.     } else {
  8.       selectedPoint.addClass('is-open').siblings('.cd-single-point.is-open').removeClass('is-open').addClass('visited');
  9.     }
  10.   });
  11.   //close interest point description
  12.   $('.cd-close-info').on('click', function(event){
  13.     event.preventDefault();
  14.     $(this).parents('.cd-single-point').eq(0).removeClass('is-open').addClass('visited');
  15.   });
  16.  
  17.   //on desktop, switch from product intro div to product mockup div
  18.   $('#cd-start').on('click', function(event){
  19.     event.preventDefault();
  20.     //detect the CSS media query using .cd-product-intro::before content value
  21.     var mq = window.getComputedStyle(document.querySelector('.cd-product-intro'), '::before').getPropertyValue('content');
  22.     if(mq == 'mobile') {
  23.       $('body,html').animate({'scrollTop': $($(this).attr('href')).offset().top }, 200); 
  24.     } else {
  25.       $('.cd-product').addClass('is-product-tour').one('webkitTransitionEnd otransitionend oTransitionEnd msTransitionEnd transitionend', function(){
  26.         $('.cd-close-product-tour').addClass('is-visible');
  27.         $('.cd-points-container').addClass('points-enlarged').one('webkitAnimationEnd oanimationend msAnimationEnd animationend', function(){
  28.           $(this).addClass('points-pulsing');
  29.         });
  30.       });
  31.     }
  32.   });
  33.   //on desktop, switch from product mockup div to product intro div
  34.   $('.cd-close-product-tour').on('click', function(){
  35.     $('.cd-product').removeClass('is-product-tour');
  36.     $('.cd-close-product-tour').removeClass('is-visible');
  37.     $('.cd-points-container').removeClass('points-enlarged points-pulsing');
  38.   });
  39. });

平面图片转换为 3D 模型动画 jQuery 特效

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

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

发表回复

热销模板

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

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