0%

CSS3 3D旋转图片轮播

想学好3D变换,必须先理解表示空间方向的XYZ轴,这个其实很容易理解,毕竟高中做了辣么多的函数方程题,要注意的是Z轴,向着自己的方向就是Z的方向。

变形transform

旋转:transform : rotateX()/rotateY()/rotateZ()
这个项目很明显是用rotateY(angle)

关键的perspective属性

这个单词的意思是视角,故名思义,就是眼睛的位置,有两种写法:
1.写在舞台元素上,也就是动画元素的父元素上

1
2
3
.stage{
perspective: 800px;
}

2.写在动画元素上,写在transform属性里
1
2
3
.stage .box{
transform:perspective(800px) rotate(60deg);
}

视角的位置不一样,看到的景物也是有区别的,换个角度思考也是这个说法。
其实上面的两种写法是有区别的,前者视角在舞台的中心,后者则是在动画元素的中心。

定义视角位置

1
2
3
4
.stage{
perspective: 800px;
perspective-origin:25% 250px;
}

拉开与中心的距离

当所有图片都以同一个旋转中心旋转后,其实是没有立体感的,这时候就需要用到这个属性translateZ

1
2
3
.stage .box{
transform: rotate(60deg) translateZ(500px);
}

js控制transform属性

1
aImg[i].style.webkitTransform = "rotateY("+ ( - (count*60 - i*60) )+  "deg) translateZ(" + 483+"px)";

需要注意的是,aImg[i].style.webkitTransform只能用来设置css的transform属性,并不能用alert打印出来。同offsetLeft也left一样。

[参考](http://www.zhangxinxu.com/wordpress/2012/09/css3-3d-transform-perspective-animate-transition/)

垂直和水平居中

水平居中是最简单的,在设置了大小的元素上加margin:0 auto
关键是垂直居中
使用定位position:absolution; //脱离文档流
top: 50%; //这时顶部处于中央位置
margin-top: -(height/2) px;
或者第三句可以使用位移:transfrom:translateY(-50%)

另一种方法是使用flex布局
在居中元素的父元素上:display:flex;
align-items:center; //垂直居中
justify: center; //水平居中
可是flex布局存在兼容性问题 ,慎用!
参考:http://www.cnblogs.com/yugege/p/5246652.html

让脱离了文档流的p标签垂直和水平居中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<nav class="mynav">
<div>
<p><span></span><span></span><span></span></p>
</div>
</nav>

<style>
.mynav{
height: 100px;
width: 100%;
margin-top: 70px;
}
.mynav div{
height: 100%;
position: relative; //垂直
text-align: center; //水平
}
.mynav p{
width: 100%; //水平
position: absolute; //垂直
top: 50%; //垂直
margin-top: -12px; //垂直
}
.mynav p span{
display: inline-block;
width: 24px;
height: 24px;
border-radius: 50%;
-webkit-border-radius: 50%;
background-color: #000;
margin-right: 20px;

}
</style>

思路

查看效果

这个loading效果分两部份,第一部分是四分之三圆,第二部份是中间的圆饼。
首先如何画圆呢?
一般是在一个正方形的div上设置border-radius=圆的半径
可是现在是用另外的方法,用border来画圆

1
2
3
4
width:0;
height:0;
border:50px solid #000;
border-radius:50px;

可以用border-top-color来设置圆的颜色,这样一个圆就可以有四种颜色,那么四分之三圆就是一部分的颜色设为透明transparent。
中间的圆饼其实是一个红色和粉红色的底圆和一个红半圆,一个粉红半圆实现的,半圆其实就是两部分的border颜色设为transparent

一个红色和粉红色的底圆:

1
2
3
4
5
6
7
8
width: 0;
height: 0;
border-radius: 50px;
border:50px solid;
border-top-color: rgb(251,139,189);
border-left-color: rgb(255,41,140);
border-right-color: rgb(251,139,189);
border-bottom-color: rgb(255,41,140);

一个红半圆:

1
2
3
4
5
6
width: 0;
height: 0;
border-radius: 50px;
border: solid rgb(251,139,189) 50px ;
border-right-color: transparent;
border-bottom-color: transparent;

分析这个效果,其实是一开始是个红色的圆,然后粉色圆在慢慢出来,等整个圆是粉红色时,红圆慢慢出来。
我们可以这样两个半圆重叠,红色在其上,都放在底圆上,在动画框架的第一个过程上红圆转180deg,第二过程粉红圆转180deg,红圆继续保持位置,这个过程开始事时粉红圆的z - index大于红圆。第三个过程,红圆z-index还是小于粉红圆,红圆在转。第四个过程开始,红圆z-index大于粉红圆,粉红圆在转。

对比下面的两个动画框架:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
@keyframes red-rotate{
0% {
transform: rotate(-45deg);
}
25% {
transform: rotate(-225deg);
}
50% {
transform: rotate(-225deg);
z-index: 2;
}
75% {
transform: rotate(-405deg);
z-index: 3;
}
100% {
transform: rotate(-405deg);
}
}
@keyframes pink-rotate{
0% {
transform: rotate(-45deg);
}
25% {
transform: rotate(-45deg);
}
50% {
transform: rotate(-225deg);
z-index: 3;
}
75% {
transform: rotate(-225deg);
z-index: 3;
}
75.001% {
transform: rotate(-225deg);
z-index: 2;
}
100% {
transform: rotate(-405deg);
}
}

最后两个动画框架同时开始就大功告成了!

js控制运动框架animation

目标:做一个通过按钮控制旋转的动画,下面的是效果图:
image

想想都很简单,就写个css框架,然后用js给img节点添加animation样式。
所以一开始是这样的的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/*旋转动画*/
@keyframes rotation{
from{
transform: rotate(0deg);
-webkit-transform: rotate(0deg);
-moz-transform: rotate(0deg);
-o-transform: rotate(0deg);
}
to{
transform: rotate(360deg);
-webkit-transform: rotate(360deg);
-moz-transform: rotate(360deg);
-o-transform: rotate(360deg);
}
}

1
2
3
$positer.css('animation', 'rotation 30s linear infinite'); //开始旋转动画

$positer.css('animation', ''); //停止旋转动画

然而,问题就来了。停止的时候图片直接回归原始状态。
这得咋办呢?难道要写一个动画框架,用定时器去使transform的rotate去转动吗?
好说干就干

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
var deg = 0;  //记录旋转角度
var rotateTimer;

function startRotation($obj, speed) {
clearInterval(rotateTimer);
rotateTimer = setInterval(function(){
deg++;
if(deg >= 360){
deg = 0
}

$obj.css('-webkit-transform', 'rotate('+ deg +'deg)');
}, speed)

}
function stopRotation() {
clearInterval(rotateTimer);
}

//调用
var $positer = $('#playerPage .positer img');

startRotation($positer, 80); //转
stopRotation() //停

哈哈,就是这么简单。
。。。
阿西吧,旧的问题解决了,只是新的问题来的开始而已。这时,播放的动画没有想animation那么流畅,一卡一卡的。天啊,这怎么解决,假如有个属性控制animation的播放不就好了嘛,那用搞这么多事情。

一百度,果真有!

1
animation-play-state: paused || running;

代码:

1
2
3
4
5
6
7
8
#playerPage .positer img{
animation: rotation 30s linear infinite;
-webkit-animation: rotation 30s linear infinite;
-moz-animation: rotation 30s linear infinite;
animation-play-state: paused;
-webkit-animation-play-state: paused;
-moz-animation-play-state: paused;
}

1
2
3
$positer.css('animation-play-state', 'running'); //开始旋转动画

$positer.css('animation-play-state', 'paused'); //停止旋转

mongoDB常用知识整理

数据库恢复

cd bin 

进去bin目录,在该目录下有工具mongorestoremongoimportmongodump,mongoexport
恢复数据库主要用mongorestore

使用命令:mongorestore -d baifuCommune_db --noIndexRestore C://pathname
--noIndexRestore 是忽略数据库版本不同引起的索引问题
-d后接数据库名
C://pathname是数据库目录

注入此类请参考:mongoDB数据库导入、导出、备份

mongoDB基础命令

show dbs
use dbname
show collections
db.collectionName.insert({x :  1})
for(i = 3; i< 100; i++)db.collectionName.insert({ x : 1})
db.collectionName.find()
db.collectionName.find({ x : 1 })
db.collectionName.find().count()


db.collectionsName.find().skip(3).limit(2).sort({ x : 1 })
db.collectionName.drop()
db.collectionName.update({ x : 1}, { x : 999 })    第二个json对象替换掉原有的对象
db.collectionName.update({ z : 100}, { $set : { y : 99} })   只是更新了y值
db.collectionName.update({ y : 100}, { y : 999 }, true)    假如更新的数据不存在就插入新数据
db.collectionName.update({ x : 1}, { $set : { x : 999} }, false, true)   将第四个参数设为true,更新多条x为1的数据
db.collectionName.remove( { x : 2 } )   删除x为2的数据

db.collectionName.getIndexes()    获取索引
db.collectioname.ensureIndex( { x : 1 } )     创建索引   
db,collectionName.ensureIndex( { x : 1  }, { exprieAfterSeconds : 30} )  x为key,1表示升序,相反-1表示降序,exprieAfterSeconds 值为秒数,表示索引失效被删除的时间,到了时间不一定准时被删除


db.collectionName.ensureIndex( { "article"  : "text"} )  创建全文索引
db.collectionName.find( $text : { $search : { " aa  bb  cc "}})  全文查询,默认是或查询
db.collectionName.find( $text : { $search : { " aa  bb  -cc "}}   包含aa或bb,但不包含cc
db.collectionName.find( $text : { $search : { "  \"aa\"  \" bb\"   \"cc\" " } } )  反斜杠是转义符, 既包含   
db.collectionName.find( $text : { $search : { " aa  bb  cc "} }, { score :{$meta : "textScore"}}  ).sort({ score :{$meta : "textScore"})   相识度查询,文档里 会增加一个相识度的值,sort排序

地理位置查询
db.collectionName.ensureIndex({ "w"  : "2d"})
db.collectionName.insert( { w : [ 12, 12]})   经纬度  -180--180  -90--90
db.collectionName.find( { w :{$near : [1,1]}})    返回一百个距离这个点最近的地点
db.collectionName.find( { w :{$ geowithin : { $box : [ [0,0], [3,3] ]} } })    矩形内的点
db.collectionName.find( { w :{$ geowithin : { $center : [ [0,0], 5 ]} } })   圆型
db.collectionName.find( { w :{$ geowithin : { $ ploygon : [ [0,0], [3,3], [5,5] ]} } })  多边形
db.runCommand({ geoNear : "collectionName", near : [1,3], maxDistance : 10, num: 10})