为什么80%的码农都做不了架构师?>>>   

介绍:之前在runjs分享了个3d云,今天在这分享个制作过程。这是个简化版,为了减轻浏览器打开时的压力去掉了云流动效果和鼠标滚轴效果。

1.创建一个模型和相机

首先,定义两个div:viewport和world。其他剩余元素动态创建。viewport全屏铺开,用它作为相机的一个平面。这里的相机你可以认为是真实世界里一块薄玻璃。我们可以移动玻璃的位置,来使我们看到不同的视角。world元素用来放置我们的一些css 3d效果。代码如下:

<div id="viewport"><div id="world"></div>
</div>

接下来对css属性进行定义:

#viewport {-webkit-perspective: 400; -moz-perspective: 400; -o-perspective: 400; position: absolute;left: 0;top: 0;right: 0;bottom: 0;overflow: hidden;background-image: linear-gradient(bottom, rgb(69,132,180) 28%, rgb(31,71,120) 64%);background-image: -o-linear-gradient(bottom, rgb(69,132,180) 28%, rgb(31,71,120) 64%);background-image: -moz-linear-gradient(bottom, rgb(69,132,180) 28%, rgb(31,71,120) 64%);background-image: -webkit-linear-gradient(bottom, rgb(69,132,180) 28%, rgb(31,71,120) 64%);background-image: -ms-linear-gradient(bottom, rgb(69,132,180) 28%, rgb(31,71,120) 64%);background-image: -webkit-gradient(linear,left bottom,left top,color-stop(0.28, rgb(69,132,180)),color-stop(0.64, rgb(31,71,120)));}#world {position: absolute;left: 50%;top: 50%;margin-left: -256px;margin-top: -256px;height: 512px;width: 512px;background-color: rgba( 255, 0, 0, .2 );-webkit-transform-style: preserve-3d;-moz-transform-style: preserve-3d;-o-transform-style: preserve-3d;}

viewport的属性定义主要是模仿天空的效果,world模仿一个块状元素

添加鼠标移动效果:

 /*定义变量worldXAngle,worldYAngle表示world的x轴,y轴旋转偏移d代表着景深
*/
var world = document.getElementById( 'world' ),viewport = document.getElementById( 'viewport' ),worldXAngle = 0,worldYAngle = 0,d = 0;/*鼠标移动位置的事件监听器从-180到180,包括垂直和水平
*/
window.addEventListener( 'mousemove', function( e ) {worldYAngle = -( .5 - ( e.clientX / window.innerWidth ) ) * 180;worldXAngle = ( .5 - ( e.clientY / window.innerHeight ) ) * 180;updateView();
} );/*修改world的变换属性通过d像素改变world x,y,z轴各个属性值
*/
function updateView() {var t = 'translateZ( ' + d + 'px ) rotateX( ' + worldXAngle + 'deg) rotateY( ' + worldYAngle + 'deg)';world.style.webkitTransform = t;world.style.MozTransform = t;world.style.oTransform = t;}

2.向模型中添加对象

现在开始向world模型中添加真正的3D内容了,在world的相对空间内添加一些细碎的div。div的属性如下:

.cloudBase {background-color: rgba( 255, 0, 255, .5 );position: absolute;left: 256px;top: 256px;width: 20px;height: 20px;margin-left: -10px;margin-top: -10px;}

接下来我们使用generate()和 createCloud()来填充world元素,如下在js中添加下面两个方法:

/*清理前一次渲染的div并且生成新的div
*/
function generate() {objects = [];if ( world.hasChildNodes() ) {while ( world.childNodes.length >= 1 ) {world.removeChild( world.firstChild );       } }for( var j = 0; j < 5; j++ ) {objects.push( createCloud() );}}
/*生成“云朵”div,随机分布,区间在-256到256之间
*/
function createCloud() {var div = document.createElement( 'div'  );div.className = 'cloudBase';var x = 256 - ( Math.random() * 512 );var y = 256 - ( Math.random() * 512 );var z = 256 - ( Math.random() * 512 );var t = 'translateX( ' + x + 'px ) translateY( ' + y + 'px ) translateZ( ' + z + 'px )';div.style.webkitTransform = t;div.style.MozTransform = t;div.style.oTransform = t;world.appendChild( div );return div;}

3.为对象创建层

接下来我们为每一个cloudBase div添加一个绝对定位的.cloudLayer层div。.cloudLayer属性如下:

.cloudLayer {position: absolute;left: 50%;top: 50%;width: 256px;height: 256px;margin-left: -128px;margin-top: -128px;background-color: rgba( 0, 255, 255, .1 );-webkit-transition: opacity .5s ease-out;-moz-transition: opacity .5s ease-out;-o-transition: opacity .5s ease-out;}

oh,这个地方还要重新改一下createCloud()方法,让他也能随机生成几个“云层”。

/*生成“云朵”div,随机分布,区间在-256到256之间
*/
function createCloud() {var div = document.createElement( 'div'  );div.className = 'cloudBase';var x = 256 - ( Math.random() * 512 );var y = 256 - ( Math.random() * 512 );var z = 256 - ( Math.random() * 512 );var t = 'translateX( ' + x + 'px ) translateY( ' + y + 'px ) translateZ( ' + z + 'px )';div.style.webkitTransform = t;div.style.MozTransform = t;div.style.oTransform = t;world.appendChild( div );for( var j = 0; j < 5 + Math.round( Math.random() * 10 ); j++ ) {var cloud = document.createElement( 'div' );cloud.className = 'cloudLayer';var x = 256 - ( Math.random() * 512 );var y = 256 - ( Math.random() * 512 );var z = 100 - ( Math.random() * 200 );var a = Math.random() * 360;var s = .25 + Math.random();x *= .2; y *= .2;cloud.data = { x: x,y: y,z: z,a: a,s: s};var t = 'translateX( ' + x + 'px ) translateY( ' + y + 'px ) translateZ( ' + z + 'px ) rotateZ( ' + a + 'deg ) scale( ' + s + ' )';cloud.style.webkitTransform = t;cloud.style.MozTransform = t;cloud.style.oTransform = t;div.appendChild( cloud );layers.push( cloud );}return div;}

现在你应该能看到成片的“云朵”了,虽然他们还是规则的几何形状,no hashion!不要急,接下来我们给他们点立体效果看看。

4.制作3D效果

魔术即将上演,定义个layer[]数据把所有world中的layer放到这个数组中,然后在新添加在update方法中遍历数组,动态的给world中元素的位置赋值。update()方法如下:

function update (){for( var j = 0; j < layers.length; j++ ) {var layer = layers[ j ];layer.data.a += layer.data.speed;var t = 'translateX( ' + layer.data.x + 'px ) translateY( ' + layer.data.y + 'px ) translateZ( ' + layer.data.z + 'px ) rotateY( ' + ( - worldYAngle ) + 'deg ) rotateX( ' + ( - worldXAngle ) + 'deg ) scale( ' + layer.data.s + ')';layer.style.webkitTransform = t;layer.style.MozTransform = t;layer.style.oTransform = t;}requestAnimationFrame( update );}

现在看起来有了3D效果,但是还是一堆图形,no hashion!丑小鸭如何变白天鹅呢?

5.终结者

最后一步很简单啦,把layer中的backgroud-image替换成一张云的图片就行啦(当然你也可以换成其他图片,比如暴风,血浆,甚至狗屎),最好是png透明格式的。只需改下createCloud。

/*生成“云朵”div,随机分布,区间在-256到256之间
*/function createCloud() {var div = document.createElement( 'div'  );div.className = 'cloudBase';var x = 256 - ( Math.random() * 512 );var y = 256 - ( Math.random() * 512 );var z = 256 - ( Math.random() * 512 );var t = 'translateX( ' + x + 'px ) translateY( ' + y + 'px ) translateZ( ' + z + 'px )';div.style.webkitTransform = t;div.style.MozTransform = t;div.style.oTransform = t;world.appendChild( div );for( var j = 0; j < 5 + Math.round( Math.random() * 10 ); j++ ) {var cloud = document.createElement( 'img' );cloud.style.opacity = 0;var r = Math.random();var src = 'cloud.png';( function( img ) { img.addEventListener( 'load', function() {img.style.opacity = .8;} ) } )( cloud );cloud.setAttribute( 'src', src );cloud.className = 'cloudLayer';var x = 256 - ( Math.random() * 512 );var y = 256 - ( Math.random() * 512 );var z = 100 - ( Math.random() * 200 );var a = Math.random() * 360;var s = .25 + Math.random();x *= .2; y *= .2;cloud.data = { x: x,y: y,z: z,a: a,s: s,speed: .1 * Math.random()};var t = 'translateX( ' + x + 'px ) translateY( ' + y + 'px ) translateZ( ' + z + 'px ) rotateZ( ' + a + 'deg ) scale( ' + s + ' )';cloud.style.webkitTransform = t;cloud.style.MozTransform = t;cloud.style.oTransform = t;div.appendChild( cloud );layers.push( cloud );}return div;}

c哈看下效果,一朵朵云像棉花糖一样盛开了!

不够完美,还带有边框,没关系接下来我们把这些边框去掉。

.cloudLayer {
background-color: rgba( 0, 255, 255, .1 );
}
#world {
background-color: rgba( 255, 0, 0, .2 );
}
.cloudBase {background-color: rgba( 255, 0, 255, .5 );
}

把这三个背景去掉,ok啦!

效果演示地址:http://runjs.cn/detail/wudd1hfo

http://runjs.cn/detail/cgsofbsg 爆炸效果

转载于:https://my.oschina.net/mousai/blog/131796

手把手教你做一个CSS 3D云相关推荐

  1. python手机版做小游戏代码大全-Python大牛手把手教你做一个小游戏,萌新福利!...

    原标题:Python大牛手把手教你做一个小游戏,萌新福利! 引言 最近python语言大火,除了在科学计算领域python有用武之地之外,在游戏.后台等方面,python也大放异彩,本篇博文将按照正规 ...

  2. 手把手教你做一个自己的chrome扩展程序

    手把手教你做一个自己的chrome扩展程序 [目录] first.效果 1.收藏夹修改 (1).鼠标移动到收藏夹上的动作效果 (2).收藏夹框 (3)百度搜索框功能 2.右上文字修改 3.背景图片修改 ...

  3. 手把手教你做一个Java贪吃蛇小游戏

    大家好,我是孙不坚1208,这篇博客给大家分享一下:如何做一个贪吃蛇小游戏(Java版)的exe应用程序,希望能给需要帮助的朋友带来方便. 手把手教你做一个Java贪吃蛇小游戏的exe应用程序 一.J ...

  4. Blender图解教程:手把手教你做一个马里奥金币 之 图片转法线贴图法(附模型下载)

    <Blender图解教程:手把手教你做一个马里奥金币 之 比较传统的方法>介绍了一种用Blender制作法线贴图的流程,本文介绍一种更加省事的方法. 步骤 效果图 概要 步骤 1. 建模 ...

  5. 手把手教你做一个物联网视频监控项目(三)流媒体方案实现

    往期文章 手把手教你做一个物联网视频监控项目(一) 介绍 手把手教你做一个物联网视频监控项目(二)MJPG-streamer方案实现 文章目录 前言 一.软硬件准备 二.流媒体方案的实现之FFmpeg ...

  6. 手把手教你做一个jsp servlet mysql实现的学生签到考勤请假管理系统附带视频开发教程和完整源码

    今天给大家演示的是一款由jsp+servlet+my色口数据库实现的学生请假签到考勤管理系统,采用了MVC的设计模式,结构层次非常清晰,此外系统还有完整的开发教程. 下面我们先来看看文档结构: 下面来 ...

  7. 手把手教你做一个自定义表格标签

    如果你用公司的平台进行开发的话,许多时候向按钮,输入框,树,菜单等都是直接用一个标签设置几个属性就可以了.全局上样式是统一的,而且容易维护. 之前我已经发使用自定义标签来做数据字典的示例,也就是说自定 ...

  8. R数据分析:跟随top期刊手把手教你做一个临床预测模型

    临床预测模型也是大家比较感兴趣的,今天就带着大家看一篇临床预测模型的文章,并且用一个例子给大家过一遍做法. 这篇文章来自护理领域顶级期刊的文章,文章名在下面 Ballesta-Castillejos ...

  9. 手把手教你做一个非常酷的PoV显示器(附源码)

    关注+星标公众号,不错过精彩内容 来源 | DF创客社区 作者 | Amal Shajan 今天为大家分享一个DIY产品,如下: 前两天天我在浏览购物网站的时候,被一个购物清单吸引住了, 5个ATti ...

最新文章

  1. React setState流程解析
  2. Leetcode 162. 寻找峰值 解题思路及C++实现
  3. 如何从无到有搭建to B平台?
  4. 服务器系统安装iis7.0,Windows2003服务器架IIS7.0怎么安装
  5. 三维重建:点绕特定轴旋转公式
  6. Xamarin支持微软HoloLens混合现实开发
  7. redis——实战关注
  8. centos arm linux gcc,CentOS安装arm-linux-gcc交叉编译器
  9. 面试基础算法及编程 第二弹(链表相关:主要考察指针的应用)
  10. android升序降序按钮,创建一个按钮,将排序MYSQL查询升序和降序
  11. 用 lastIndexOf()、substr()、split()方法截取一段字符串
  12. 在spark-shell中编写wordcont
  13. Android WebView重定向问题的解决方案
  14. 我买了个阿里云服务器并在上面部署了一个项目
  15. Moodle安装指导手册
  16. 高通BMS的研究 高通电量计
  17. 计算机it是什么,IT是什么意思
  18. 详细的苹果快捷键,赶快保存吧!
  19. 趣头条视频解析去水印原理分析过程及源码,简单又有趣
  20. R 回归 虚拟变量na_R语言 | 生存分析之R包survival的单变量和多变量Cox回归

热门文章

  1. Python 对象序列化
  2. 视频教程-实战Go语言:基于开源数据的成语应用-Go语言
  3. php fsockopen http,fsockopen与HTTP 1.1/HTTP 1.0
  4. Python帮你完成美术作业——图片转灰度,字符画,素描手绘风格
  5. 市面上哪款蓝牙耳机音质比较好?推荐四款不错的蓝牙耳机
  6. Pycharm恢复 还原 默认视图
  7. mysql substring用法_MySQL数据库中系统函数SUBSTRING功能简介
  8. hadoop常用命令
  9. Golang编程百例-Golang输出特殊图案
  10. iPhone不再孤独,Palm Pre为伴——互联网的未来在手中。,互联网营销