• 展示页效果


    学习妙味课堂的展示页效果

    效果预览:展示页

    知识点预备:

    【1】transform-style属性

    transform-style属性指定了它的子元素看起来是存在3D空间中,还是存在2D空间中,如果存在2D空间中,则它的子元素不能存在3D中。

    注意:因为该属性不会被(自动)继承,所以必须为元素所有非叶后代节点设置该属性。

    语法:transform-style: flat | preserve-3d

     preserve-3d指定子元素定位在三维空间内

     flat指定子元素位于此元素所在平面内。

    【2】perspective属性

    MDN官方文档说明:

    perspective 属性指定了观察者与z=0平面的距离,使具有三维位置变换的元素产生透视效果。z>0的三维元素比正常大,而z<0时则比正常小,大小程度由该属性的值决定。

    举栗子:

     1     <style>
     2         #wrap{
     3 
     4             position: relative;
     5         }
     6         #wrap img{
     7             position: absolute;
     8             top: 100px;
     9             left: 400px;
    10             transform: rotateY(40deg);
    11         }
    12     </style>
    13 </head>
    14 <body>
    15     <div id="wrap">
    16         <img src="img/0.png" />
    17 
    18     </div>
    19 
    20     
    21 </body>

    效果:

    这里我们没有设置perspective属性看不到什么变化,那我们将这个属性加上看看有什么变化

    代码:

     1     <style>
     2         #wrap{
     3             perspective: 1200px;
     4             position: relative;
     5         }
     6         #wrap img{
     7             position: absolute;
     8             top: 100px;
     9             left: 400px;
    10             transform: rotateY(40deg);
    11         }
    12     </style>
    13 </head>
    14 <body>
    15     <div id="wrap">
    16         <img src="img/0.png" />
    17 
    18     </div>    
    19 </body>

    效果:

    可以看到有很大的变化。难道第一张图片没有旋转吗?不,它旋转了,只是离得我们太远看不到而已。设置perspective这个属性就是将镜头拉到一定距离。

    【3】transition属性

    语法:transition: property duration timing-function delay;

    详细解析:留个位置(这两天会为transition属性单独写一个博客)

    我们这里用到了 duration  和 timing-function 。

    1 transition: .7s ease-in-out;

    意思是这个元素的的动画花费0.7s,并且慢速开始,慢速结束。

    准备工作完毕,开始正式写代码

    第一步

    写基本的结构和样式,直接看代码

      1     <style>
      2         body{
      3              margin: 0;
      4              background-color: #999;
      5          }
      6         #wrap{
      7         height: 500px;
      8         background: url(img/bg.png) no-repeat center;
      9         background-size: 1800px 500px;
     10         position: relative;
     11         transform-style: preserve-3d;
     12         perspective: 800px;
     13         margin-top: 100px;
     14         }
     15         img{
     16         border: none;
     17         /*垂直对齐方式*/
     18         vertical-align: top;
     19         }
     20         #wrap img{
     21             width: 300px;
     22             height: 200px;
     23             position: absolute;
     24             left: 50%;
     25             top: 50%;
     26             margin-left: -150px;
     27             margin-top: -100px;
     28             transition: .7s ease-in-out;
     29         }
     30     </style>
     31 </head>
     32 <body>
     33     <div id="wrap">
     34         <img src = "img/0.png">
     35         <img src = "img/1.png">
     36         <img src = "img/2.png">
     37         <img src = "img/3.png">
     38         <img src = "img/4.png">
     39         <img src = "img/5.png">
     40         <img src = "img/6.png">
     41     </div>
     42 </body>

    第二步:

    写tab()函数,这个函数的作用接受一个n值,并根据这个n值来设置每个图片的位置和样式。

    先来看看设置的变量

    1         var imgs = document.getElementsByTagName('img');
    2         //默认的最中间的图片的序号
    3         var now = 3;
    4         //你想要看的图片的序号,即鼠标点击的图片序号
    5         var target = 0;
    6         //开关,设置它是为了让用户点击一个图片后要等到这个动画效果完成后,才可以继续点击
    7         var onoff = true;

    tab()函数

     1         function tab(n){
     2             //除了最中间的每边都有三个div,他们都是对称的,所以只循环三次
     3             for(var i = 0;i < 3;i++){
     4 
     5                 var Left = n - 1 - i;
     6                 //  如果是这样的情况 4 5 6  0  1 2 3
     7                 if(Left < 0){
     8                     Left = Left + 7;
     9                 }
    10                 //给左边的div设置位置
    11                 imgs[Left].style.transform = "translateX("+(-150*(i+1))+"px) translateZ("+(200-i*100)+"px) rotateY(30deg)"
    12 
    13                 var Right = n + 1 + i;
    14                 // 如果是这样的情况 3 4 5  6  0 1 2 
    15                 if(Right > 6){
    16                     Right = Right - 7;
    17                 }
    18                 //给右边的div设置位置
    19                 imgs[Right].style.transform = "translateX("+(150*(i+1))+"px) translateZ("+(200-i*100)+"px) rotateY(-30deg)"
    20             }
    21             //最中间的div设置它的Z轴距离,使它到最前面
    22             imgs[n].style.transform = "translateZ(300px)";
    23         }

    代码不难就是修改一些CSS3中的属性

    第三步

    当你点击一个图片时,这个图片运动到到最中间的位置有两种方法:goNext()和goPrev()

     1         //向后切换图片
     2         function goNext(){
     3             now ++;
     4             //如果中间的图片时最后一张,它的下一张是第一张
     5             if(now > 6){
     6                 now =0;
     7             }
     8             tab(now);
     9             //切换完成,结束函数
    10             if(now == target){
    11                 //切换完成,用户可以点击图片
    12                 onoff = true;
    13                 return;
    14             }
    15             //如果没有到点击的图片时,继续向后走
    16             setTimeout(function(){
    17                 goNext();
    18             },1000);
    19         }
    20 
    21         //向前切换图片
    22         function goPrev(){
    23             now --;
    24             //如果中间的图片是第一张,它的上一张是第六张
    25             if(now < 0){
    26                 now = 6;
    27             }
    28             tab(now);
    29             //切换完成,结束函数
    30             if(now == target){
    31                 //切换完成,用户可以点击图片
    32                 onoff = true;
    33                 return;
    34             }
    35             //如果没有到点击的图片时,继续向前走
    36             setTimeout(function(){
    37                 goPrev();
    38             },1000);
    39         }

    第四步

    写if语句来判断被点击的图片用那种方式到最中间的位置

     1         for(var i = 0;i < imgs.length;i++){
     2             imgs[i].index = i;
     3             imgs[i].onclick = function(){
     4                 if(!onoff){
     5                     return;
     6                 }
     7                 onoff = false;
     8                 target = this.index;
     9                 if(target > now){
    10                     if(target - now <= 3){
    11                         goNext();
    12                     }
    13                     else{
    14                         goPrev();
    15                     }
    16                 }
    17                 if(target < now){
    18                     if(now - target <= 3){
    19                         goPrev();
    20                     }else{
    21                         goNext();
    22                     }
    23                 }
    24                 
    25             }
    26         }

    第五步

    第五步应该是写开关,因为第四步基本效果已经完成了。但是还是有一个小bug,就是在图片切换过程中如果继续点击图片,整个图片的布局会变。所以引入开关,不让用户在动画还未完成前点击。

    总结:难度不大,对CSS3中的属性不熟悉。对如何选择goNext()或者goPrve()绕了一会,最后在纸上画出各种情况后才懂。

    源码:

      1 <!DOCTYPE html>
      2 <html lang="en">
      3 <head>
      4     <meta charset="UTF-8">
      5     <title>Document</title>
      6     <style>
      7         body{
      8              margin: 0;
      9              background-color: #999;
     10          }
     11         #wrap{
     12         height: 500px;
     13         background: url(img/bg.png) no-repeat center;
     14         background-size: 1800px 500px;
     15         position: relative;
     16         transform-style: preserve-3d;
     17         perspective: 800px;
     18         margin-top: 100px;
     19         }
     20         img{
     21         border: none;
     22         /*垂直对齐方式*/
     23         vertical-align: top;
     24         }
     25         #wrap img{
     26              300px;
     27             height: 200px;
     28             position: absolute;
     29             left: 50%;
     30             top: 50%;
     31             margin-left: -150px;
     32             margin-top: -100px;
     33             transition: .7s ease-in-out;
     34         }
     35     </style>
     36 </head>
     37 <body>
     38     <div id="wrap">
     39         <img src = "img/0.png">
     40         <img src = "img/1.png">
     41         <img src = "img/2.png">
     42         <img src = "img/3.png">
     43         <img src = "img/4.png">
     44         <img src = "img/5.png">
     45         <img src = "img/6.png">
     46     </div>
     47     <script>
     48         var imgs = document.getElementsByTagName('img');
     49         //默认的最中间的图片的序号
     50         var now = 3;
     51         //你想要看的图片的序号,即鼠标点击的图片序号
     52         var target = 0;
     53         //开关,设置它是为了让用户点击一个图片后要等到这个动画效果完成后,才可以继续点击
     54         var onoff = true;
     55 
     56         setTimeout(function(){
     57             tab(now);
     58         },100);
     59         
     60 
     61         for(var i = 0;i < imgs.length;i++){
     62             imgs[i].index = i;
     63             imgs[i].onclick = function(){
     64                 if(!onoff){
     65                     return;
     66                 }
     67                 onoff = false;
     68                 target = this.index;
     69                 if(target > now){
     70                     if(target - now <= 3){
     71                         goNext();
     72                     }
     73                     else{
     74                         goPrev();
     75                     }
     76                 }
     77                 if(target < now){
     78                     if(now - target <= 3){
     79                         goPrev();
     80                     }else{
     81                         goNext();
     82                     }
     83                 }
     84                 
     85             }
     86         }
     87 
     88         //   0 1 2  3  4 5 6
     89         function tab(n){
     90             //除了最中间的每边都有三个div,他们都是对称的,所以只循环三次
     91             for(var i = 0;i < 3;i++){
     92 
     93                 var Left = n - 1 - i;
     94                 // 4 5 6  0  1 2 3
     95                 if(Left < 0){
     96                     Left = Left + 7;
     97                 }
     98                 //给左边的div设置位置
     99                 imgs[Left].style.transform = "translateX("+(-150*(i+1))+"px) translateZ("+(200-i*100)+"px) rotateY(30deg)"
    100 
    101                 var Right = n + 1 + i;
    102                 // 3 4 5  6  0 1 2 
    103                 if(Right > 6){
    104                     Right = Right - 7;
    105                 }
    106                 //给右边的div设置位置
    107                 imgs[Right].style.transform = "translateX("+(150*(i+1))+"px) translateZ("+(200-i*100)+"px) rotateY(-30deg)"
    108             }
    109             //最中间的div设置它的Z轴距离,使它到最前面
    110             imgs[n].style.transform = "translateZ(300px)";
    111         }
    112 
    113         //向后切换图片
    114         function goNext(){
    115             now ++;
    116             //中间的图片时最后一张,它的下一张是第一张
    117             if(now > 6){
    118                 now =0;
    119             }
    120             tab(now);
    121             //切换完成,结束函数
    122             if(now == target){
    123                 //切换完成,用户可以点击图片
    124                 onoff = true;
    125                 return;
    126             }
    127             //如果没有到想看的图片时,继续向后走
    128             setTimeout(function(){
    129                 goNext();
    130             },1000);
    131         }
    132 
    133         //向前切换图片
    134         function goPrev(){
    135             now --;
    136             //中间的图片是第一张,它的上一张是第六张
    137             if(now < 0){
    138                 now = 6;
    139             }
    140             tab(now);
    141             //切换完成,结束函数
    142             if(now == target){
    143                 //切换完成,用户可以点击图片
    144                 onoff = true;
    145                 return;
    146             }
    147             //如果没有到想看的图片时,继续向前走
    148             setTimeout(function(){
    149                 goPrev();
    150             },1000);
    151         }
    152     </script>
    153 </body>
    154 </html>
    
    
    
  • 相关阅读:
    Git远程库版本回滚
    微软Connect(); 2017大会梳理:Azure、数据、AI开发工具
    【实验手册】使用Visual Studio Code 开发.NET Core应用程序
    Ocelot API网关的实现剖析
    微软Tech Summit 2017,等你来打Call
    “.Net 社区大会”(dotnetConf) 2017 Day 1 Keynote: .NET Everywhere
    .NET平台微服务项目汇集
    .Net Core下通过Proxy 模式 使用 WCF
    .NET Core 2.0 正式发布信息汇总
    Visual Studio 2017 : client version 1.22 is too old
  • 原文地址:https://www.cnblogs.com/qqandfqr/p/6084854.html
Copyright © 2020-2023  润新知