CSS3实现3D轮播图
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 | .stage{ |
拉开与中心的距离
当所有图片都以同一个旋转中心旋转后,其实是没有立体感的,这时候就需要用到这个属性translateZ1
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/)
饼状loading效果
垂直和水平居中
水平居中是最简单的,在设置了大小的元素上加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
4width:0;
height:0;
border:50px solid #000;
border-radius:50px;
可以用border-top-color来设置圆的颜色,这样一个圆就可以有四种颜色,那么四分之三圆就是一部分的颜色设为透明transparent。
中间的圆饼其实是一个红色和粉红色的底圆和一个红半圆,一个粉红半圆实现的,半圆其实就是两部分的border颜色设为transparent
一个红色和粉红色的底圆:1
2
3
4
5
6
7
8width: 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
6width: 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
js控制运动框架animation
目标:做一个通过按钮控制旋转的动画,下面的是效果图:
想想都很简单,就写个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
24var 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常用知识整理
mongoDB常用知识整理
数据库恢复
cd bin
进去bin目录,在该目录下有工具mongorestore
,mongoimport
,mongodump
,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})