GJM :JS + CSS3 打造炫酷3D相册

中秋主题的3D旋转相册

如图,这是通过Javascript和css3来实现的。整个案例只有不到80行代码,我希望通过这个案例,让正处于迷茫期的js初学者感受到学习的乐趣。我会尽可能讲得详细,不需要你对css和js有多么高深的理解,你也可以跟着一步步做出来。如果你是为了讨女票开心,那么也完全可以把图片换成对方的照片,在某个特别的时刻给对方一个惊喜哦 ~

css3的强大使得网页的展示变得空前得丰富起来,再配合简单的js代码,就可以实现这个效果。好了,话不多说,让我们开始吧。

1. 页面模板

<!doctype html>
<html lang="en">
 <head>
  <meta charset="UTF-8" />
  <title>中秋节快乐</title>
  <style>

  </style>
 </head>
 <body>

 </body>

 <script>

 </script>
</html>

** 1.1 ** :这句话的含义是,设置网页编码为utf-8,确保中文可以正常显示。

1.2. :设置网页的标题。

就是它:

1.3. : 在style里面可以编写css样式,所谓的css就是相当于给dom元素披上了一层美丽的外衣。

1.4. : 在body区域里面添加dom元素,也就是一个网页的主题框架。比如div,p,a标签等,就是放在这个部分的。

1.5. :这是js脚本区域,单纯的说,就是为了动态地控制body区域里面的标签元素。之所以放在body的下面,是为了保证浏览器先把所有的dom元素都渲染完毕,才进行js操作。

2.调背景色

在style块里面给整个页面渲染成黑色调

*{padding:0px;margin:0px;} /*这是为了消除默认dom元素的内外边距,使得我们写css的时候更精确*/
body{background:#000;}

000是纯黑色

F00是纯红色

0F0是纯绿色

00F是纯蓝色

顺便提一下,#FFF肯定就是纯白色了。

在本案例中,我们将背景色设置为纯黑色。

3.制作3D相框

我们我们画一个id为photos的div作为相框来装载所有的图片。

<div id="photos"></div>

这句话一写,页面上啥也没有,div连宽度和高度都没有,这个时候,我们就要用css来给div添加一件美丽的外衣了。

#photos{
    width:110px;            /*宽度*/
    height:180px;          /*高度*/
    border:1px solid #ccc;  /*加一个灰色边框*/
    margin:160px auto;     /*水平居中,高度距离顶部100px*/
}

这样还是平面的效果,没有3D的感觉,如果你不相信,我们可以用transform属性让它沿着Y轴起来,看看是不是3D的。

transform:rotateY(0deg);

这句话表示将div盒子沿着Y轴旋转0度。

让我们用谷歌浏览器打开(或者其他浏览器,不要太老就行),打开调试模式(大部分浏览器都是直接按一下F12就可以了),进入这样的界面。

按一下这里的箭头,就可以查看dom元素了。

把鼠标滑到div上,点击。

然后右边就会出来这样的界面,里面有这个div所有的样式。

我们找到 transform:rotateY(0deg); 这一行,然后可以动态地改变它的值,我们点几下,选中 0deg 这几个字,再按键盘上的向上箭头,就会这样:

哇,转起来了,好神奇!

我当初知道有这么个名堂的时候,心里就特别兴奋。

这还是2D的,没有3D效果,如何添加3D效果呢?

我们加上这两个属性,

transform-style:preserve-3d;/*设置3d环境*/
perspective:800px;      /*设置景深为800px*/

所谓的景深, 简单说来,就是对好焦的范围。它能决定是把背景模糊化来突出拍摄对象,还是拍出清晰的背景。我看到网上是这么说的,喜欢摄影的朋友应该很了解。

为了突出效果,我们添加一张图片,顺便给图片加上一点倒影效果。

<div id="photos">
    <img src="img/1.jpg"  />
</div>
#photos img{
    width:100%;
    height:100%;
    position:absolute;
    box-shadow:0 0 8px #eaeaea;
    box-shadow: 1px -1px 6px #666;
    border-radius:4px;
    -webkit-box-reflect:below 3px -webkit-linear-gradient(top,rgba(0,0,0,0) 40%,rgba(0,0,0,0.5));
    cursor:pointer;
}

效果:

看起来有点效果了吧。

我一共准备了8张图片,现在将剩余的图片也添加进来。

<div id="photos">
    <img src="img/1.jpg"  />
    <img src="img/2.jpg"  />
    <img src="img/3.jpg"  />
    <img src="img/4.jpg"  />
    <img src="img/5.jpg"  />
    <img src="img/6.jpg"  />
    <img src="img/7.jpg"  />
    <img src="img/8.jpg"  />
</div>

到目前为止,所有的图片都是叠在一起的,我们思考如何将他们分散开来,围城一圈呢?

4.将图片散开,围成一圈

在3维坐标中,不仅有X轴,Y轴,还有Z轴。我们首先要明白Z轴是什么概念,Y轴是左右旋转,上面已经演示过了,不难想到X轴应该就是上下旋转,那么Z轴呢?

我们先把倒影去掉,看起来清楚些。

/*-webkit-box-reflect:below 3px -webkit-linear-gradient(top,rgba(0,0,0,0) 40%,rgba(0,0,0,0.5));*/

好,让我们来一探究竟:

哇,原来如此!

Z轴就是垂直于横切面的一条轴!

我们现在不需要绕着Z轴旋转,试试让相册沿着Z轴移动一段距离如何?

translateZ可以帮我们实现这一个效果。

回到正题。

我们的目的是让所有的图片分散开来,那么第一步就是让每一张图片均匀地根据Y轴转过一个角度。这个角度是多少呢?

一圈是360度,除以图片的张数,就是每一张图片转过的角度了。

我们用js来实现:

var photosDom = document.getElementById(‘photos‘);
//获取图片数组
var images = photosDom.getElementsByTagName(‘img‘);
//获取图片数量
var len = images.length;
//计算每张图片按Y轴旋转的角度
var deg = Math.floor(360 / len);
for(var i = 0; i < len;i++){
    images[i].style = ‘transform : rotateY(‘ + deg * i + ‘deg)‘; //deg前面不要加空格
}

代码是比较明了的,就是一个除法运算,然后给每一张图片增加一个旋转样式即可。

效果:

可见,每一张图片都转过了一定的角度。

也就是说,这个时候,每张图片的Z轴都不一样了!

如果你还是觉得有难度,没关系,我们拿其中一张图片来举例,让它沿着它自己的Z轴向外移动。然后你就明白了。

for(var i = 0; i < len;i++){
    images[i].style = ‘transform : rotateY(‘ + deg * i + ‘deg)‘; //deg前面不要加空格

    if(i == 1){
        images[i].style = ‘transform : rotateY(‘ + deg * i + ‘deg) translateZ(300px)‘;
    }
}

显而易见了,就是这么回事,那么解决方案自己就出来了,我们只需要在每一张图片根据Y轴旋转的时候,就让它沿着Z轴“飘”出来就可以啦!

距离稍微大一点,就380px吧。

for(var i = 0; i < len;i++){
    images[i].style = ‘transform : rotateY(‘ + deg * i + ‘deg) translateZ(380px)‘; //deg前面不要加空格
}

这样有点太水平了,我们让整个相册往下一点,达到一种稍微有点俯视的效果。让相册根据X轴往下移动个10px就可以了哦。

transform:rotateX(-10deg);

这样效果就出来了。

5.绘制透明酷炫底盘

本案例中,在相册底部,还有一个透明的底盘,现在我们开始实现这个效果。

<div id="photos">
    <img src="img/1.jpg"  />
    <img src="img/2.jpg"  />
    <img src="img/3.jpg"  />
    <img src="img/4.jpg"  />
    <img src="img/5.jpg"  />
    <img src="img/6.jpg"  />
    <img src="img/7.jpg"  />
    <img src="img/8.jpg"  />
    <div></div>
</div>

其实,它就是一个放在photos里面的div。我们通过定位布局和css3特性就可以实现了。

上代码:

#photos div{
    width:1200px;
    height:1200px;
    border-radius:50%;
    position:absolute;
    top:102%;
    left:50%;
    margin-left:-600px;
    margin-top:-600px;
    transform:rotateX(90deg);
    background:-webkit-radial-gradient(center center,600px 600px,rgba(158,158,222,0.5),rgba(0,0,0,0));
}

top属性是一点点调出来的,你也可以用浏览器的调试模式一点点来调整高度。

效果:

6.自动旋转

最后一步,还是由js代码来收尾,我们使用js的定时器setInterval,每隔30毫秒就让整个相册转过一个非常小的角度就行了。

var x = 0;
setInterval(function(){
    photosDom.style.transform = "rotateX(-10deg) rotateY("+ (x++) * 0.2 +"deg)";
},30);

代码应该还是比较明了的。

最终效果就出来了:

今天做了一点小修改,我把photos的margin由之前的100px auto变为160px auto了。

从效果来看,相册在旋转的过程中,会有一定的偏移,虽然我个人觉得这样的效果也挺有趣的,不过,如果你不希望它的位置发生偏移的话,只需要在photos外边在逃一层div,然后把景深移到外层div就ok啦。

演示地址:http://s-335245.gotocdn.com:8080/demo.html?path=3d

时间: 2024-10-10 09:10:25

GJM :JS + CSS3 打造炫酷3D相册的相关文章

js和CSS3炫酷3D相册展示

<!doctype html> <html> <head> <meta charset="UTF"> <title>js和CSS3炫酷3D相册展示</title> <style> *{margin:0;padding:0;} body{background:url(img/bg.jpg);width:100%;height:100%;overflow:hidden;}; h1{width:277;hei

JParticles 2.0 发布,打造炫酷的粒子特效

JParticles 2.0 发布,打造炫酷的粒子特效.不好意思哈,在这么繁花似锦的世界里,标题不得不取得吸引眼球一点哈,不然...还是不啰嗦了,我们进入正题吧 简单介绍一下 JParticles 2.0 版本之前还叫 Particleground.js,相信在用的朋友应该不会陌生,关于 1.x 版本的宣传文案可以移步看这里哈,或许可以帮助你了解 JParticles 2.0 的一些东西. 我们一贯的理念 我们(我/笑哭)一贯的理念是信仰:"The Write Less, Do More&quo

Android 自定义控件玩转字体变色 打造炫酷ViewPager指示器

Android 自定义控件玩转字体变色 打造炫酷ViewPager指示器

打造炫酷通用的ViewPager指示器 - Adapter模式适配所有

1.概述 上一期我们已经写了一篇 打造炫酷通用的ViewPager指示器 - 玩转字体变色 可是这种效果虽然绚烂可以装装A和C之间,但是在实际的大多数效果中并不常见,只是在内涵段子中有这个效果而已,那么这一期我们就用Adapter适配器模式适配所有的效果,堪称终结者.附视频地址:等这个周末吧 2.效果实现 2.1 整合上一个实例: 我还是还是拿上一个实例来做演示吧.这里我贴几种常见的效果,首先声明Android自带的有这个控件叫TabLayout,大家可以自己用用试试看好用不?我也用过但是不做任

Android 教你打造炫酷的ViewPagerIndicator 不仅仅是高仿MIUI

1.概述 哈,今天给大家带来一个ViewPagerIndicator的制作,相信大家在做tabIndicator的时候,大多数人都用过 TabPageIndicator,并且很多知名APP都使用过这个开源的指示器.大家有没有想过如何自己去实现这样的一个指示器,并且代码会有多复杂 呢~~~今天,我就带领大家来从无到有的实现这样一个指示器,当然了,不准备一模一样,搞得没有创新似的,再看标题,跟MIUI相关,所以我们准备做一个 特性与TabPageIndicator一致的,但是样子和MIUI的Tab一

一款基于jQuery和CSS3炫酷3D旋转画廊特效插件

这是一款效果炫酷的jQuery和CSS3 3D旋转画廊特效插件.该3D画廊插件可以通过前后导航按钮来切换图片,效果就像旋转木马一样.它还带有点击放大图片,显示图片标题和用键盘操作等功能. 在线预览   源码下载 简要教程 这是一款效果非常炫酷的jQuery和CSS3 3D旋转画廊特效插件.第一个DEMO是一个简单的例子,使用CSS3来制作3d旋转效果,然后用js来控制前后导航按钮.第二个DEMO是第一个DEMO的升级版,它增加了图片标题.查看图片.键盘控制等其它功能. HTML结构 这个3D画廊

纯CSS3炫酷3D折叠面板动画特效

这是一款效果非常炫酷的CSS3 3D折叠面板动画特效.该折叠面板特效当鼠标移动到图片上时,一个面板会以3d折叠的方式在顶部展开,并显示图片的标题等信息..这个效果使用3D CSS animations 来制作折叠面板的动画,纯CSS,没有使用javascript. 在线演示:http://www.htmleaf.com/Demo/201501251276.html 下载地址:http://www.htmleaf.com/css3/css3donghua/201501251275.html

jQuery炫酷3d旋转木马特效插件

这是一款使用TweenMax.js制作的jQuery超酷3D旋转木马特效.该旋转木马特效可以感应鼠标的位置而使旋转木马做出相应的变化,效果非常炫酷. 在线演示:http://www.htmleaf.com/Demo/201502231410.html 下载地址:http://www.htmleaf.com/jQuery/Slideshow-Scroller/201502231409.html

jQuery炫酷3D旋转幻灯片特效插件

iPresenter是一款效果非常炫酷的jQuery和CSS3 3D旋转幻灯片特效插件.你可以使用它来制作产品展示.图片画廊或者各种幻灯片和轮播图特效. 这款幻灯片插件的特点有: 高度灵活和可定制性. 灵活的用户界面的设计. 在单个HTML页面中允许存在多个实例. 可以定制每一个slider的easing效果. 多语言支持. 可以在 iOS 和 Android 上正常工作. 可以选择自动播放模式下鼠标悬停时停止播放幻灯片. 非常容易调整尺寸. 兼容外部字体(如谷歌字体). 有预加载进度条显示.