【CSS3】实例教程3:CSS3动画实例教程(集合贴)

  前端各种奇淫巧计层出不穷,对缺乏创造力和建设性的本人来说,一般都是到需要的时候才会去研究,没办法,信息量暴增的年代,总得有选择性地记忆吧。因为各种特殊原因,不得不用css3写个loading加载的动画效果。在渐变效果上,gif显然层次不够丰富。我对图片处理不在行,不过AE要求很高,于是到网上一搜有解决办法,就不辛苦设计部同事了。

  关于CSS3动画效果,废话两句。或者是我程序写的有问题(我对自己写的东西一直很没自信,我从来不敢对别人说我是敲代码的,我只说我是写页面的),我写的CSS3整屏滑动的效果,相当让人纠结。页面滑动效果流畅,但是当前屏内的图片有撕裂的感觉。整屏滑动,每一屏都是各式各样的图片,各屏之间没有任何衔接。TL建议我图片加载完之后,再进行滑动。于是加了延时进行测试,仍然会有撕裂感觉。因为赶着出DEMO,我只好撤掉CSS3动画,换了一个基于jQuery的动画插件,自己再添点内容(又忍不住抱怨了,前端牛人太多了,TL天天丢插件过来,而且都是我没用过的,鸭梨巨大,唉)。图片加载完之后再滑动,效果相当的流畅,尤其是在ipad2和ipad3上面。下午找了个插件在ipad1上测试CSS3动画,发现并没有撕裂的效果,果然是我自己问题,看来怀疑自己是正确的。准备研究下这个插件,看看跟我自己写的区别在哪。(絮絮叨叨半天,我都不知道自己在说什么。下午看到一个网站,niucha网,多么帅气的名字啊,里面的文章果断很技术,基本没废话。不过话说OS这里是博客哦,那多一点废话也没关系吧。)

--------------------------------------------------------------------------------------------------------------------------------

  我用的是下面第二种方案,然后结合项目设计稿做了适当调整,具体情况原作者已经解释的很清楚了,但为了防止我那悲剧的记性,我还是用最弱的办法,给里面的样式加备注吧。效果图懒得截了。反正,三个DEMO,第一个用图片做的,略显粗糙,第三个纯旋转效果,不够流畅。只有第二个,渐变加上伪旋转,富效果啊。最近天天被逼着用ipad测试,感觉都要被腐蚀了。

@-webkit-keyframes fade {       //命名为 fade 的动画,前面的 -webkit- 是啥就不用废话了吧

 

     from {opacity: 1;}       // 最普通的效果,定义起始关键帧状态。这里,动画开始时 透明度为1,  

 

     to {opacity: 0.25;}     // 结束时 透明度为0.25   

}

div.spinner {

     position: relative;

     width: 30px;

     height: 30px;

     display: inline-block;

}

div.spinner div {

     width: 20%;

     height: 40%;

     background: #000;

     position: absolute;

     left: 100%;

     top: 100%;

     opacity: 0;               // safari中,我将0改为1也没变化,不过在FF里面是有区别的,待测试  

     -webkit-animation: fade 1s linear infinite;   //启动fade动画效果,延时1S,平滑变化,无限次循环  

     -webkit-border-radius: 30px;   //做圆角的关键。其实,只要radius值大于元素宽度的一半就能出漂亮的椭圆了。原理嘛,要扯到数学,远了。  

}

div.spinner div.bar1 {

     -webkit-transform:rotate(0deg) translate(0, -142%);

     -webkit-animation-delay: 0s;     //第一个小椭圆,延时0秒  

}

[......]

div.spinner div.bar12 {

     -webkit-transform:rotate(330deg) translate(0, -142%);   // 旋转330°  

     -webkit-animation-delay: -0.0833s;

}

 //最后一个小椭圆,延时0.0833S,因为是顺时针旋转,那么左侧最后一个小椭圆自然是延时最短的,也就是跟它右边也是第一个小椭圆效果反差最大的。唉,明天还是截个图好了。可以尝试把时间进行各种调整,能看到动画起始点的变化。

困死偶了,明天再来查漏补缺。。。  

--------------------------------------------------------------------------------------------------------------------------------

用css3制作旋转加载动画的几种方法】(尊重被转载者,O(∩_∩)O哈哈~)

原文如下,转载地址:http://www.cnblogs.com/powertoolsteam/archive/2012/04/11/2441735.html

--------------------------------------------------------------------------------------------------------------------------------

以WebKit为核心的浏览器,例如Safari和Chrome,对html5有着很好的支持,在移动平台中这两个浏览器对应的就是IOS和Android。最近在开发一个移动平台的web app,那么就有机会利用css3去实现一些很酷的效果,这些效果原来更多的是利用图片来实现。最近的一个改进就是利用css3制作旋转加载动画。以下将分别介绍几种实现的方案。

方案1,图片辅助

传统做法是直接用动态的GIF图片,这个方案是用PNG图片加上背景颜色来模拟静止的加载图片,然后利用css中的animation处理图片的旋转。相比传统方案,这个方案的好处是可以直接通过修改CSS来改变背景色,可以修改大小和旋转速度。如下是具体的CSS代码:

?  

@-webkit-keyframes rotate {

  from {-webkit-transform:rotate(0deg);}

  to {-webkit-transform:rotate(360deg);}

}

p#spinner {

  height: 30px;

  width: 30px;

  overflow: hidden;

  background: #000;

  -webkit-mask-image: url("data:image/png[...]");

  -webkit-mask-size: 30px 30px;

  -webkit-animation-name: rotate;

  -webkit-animation-duration: 1.5s;

  -webkit-animation-iteration-count: infinite;

  -webkit-animation-timing-function: linear;

}

具体效果查看这里:Demo1

这个方案,只有safari可以很好地支持。chrome下支持不是很好,所以这是一个不太成熟的方案。

方案2, 纯CSS实现

方案的思路是,首先用css渲染12个静态的bar,每个bar间隔30度的角度,给每个bar添加背景变淡的动画,但是相邻bar的动画效果延迟1/12秒,来保证12个bar是按顺序变亮然后变暗。从而模拟出旋转的效果。

这个旋转效果是伪旋转,所有的bar都没有真正做到旋转。

?  

@-webkit-keyframes fade {

    from {opacity: 1;}

    to {opacity: 0.25;}

}

div.spinner {

    position: relative;

    width: 30px;

    height: 30px;

    display: inline-block;

}

div.spinner div {

    width: 20%;

    height: 40%;

    background: #000;

    position: absolute;

    left: 100%;

    top: 100%;

    opacity: 0;

    -webkit-animation: fade 1s linear infinite;

    -webkit-border-radius: 30px;

}

div.spinner div.bar1 {

    -webkit-transform:rotate(0deg) translate(0, -142%);

        -webkit-animation-delay: 0s;

}

[......]

div.spinner div.bar12 {

    -webkit-transform:rotate(330deg) translate(0, -142%);

    -webkit-animation-delay: -0.0833s;

}

具体效果查看这里:Demo2

safari和chrome都能很好地渲染这个效果,并且也很容易定义实际大小,因为所有的bar的高度,宽度有是用百分比来定义的。缺点也很明显,需要定义12个bar,并且每个bar都要定义独立的css,相对来说html和css的代码量有点多。

方案3,这个方案类似sencha touch中实现的效果

方案的基本思想是:首先利用html和css呈现4个bar,再通过css的伪元素: before和:after定义每个bar的前后内容,这样使得由原始的4个bar产生12个bar的效果,其次通过css设置让12个bar的透明度逐渐递减,最后应用css3中旋转动画达到实际loading的效果。

?  

.x-loading-spinner {

    font-size: 250%;

    height: 1em;

    width: 1em;

    position: relative;

    -webkit-transform-origin: 0.5em 0.5em;

}

.x-loading-spinner > span, .x-loading-spinner > span:before, .x-loading-spinner > span:after {

    display: block;

    position: absolute;

    width: 0.1em;

    height: 0.25em;

    top: 0;

    -webkit-transform-origin: 0.05em 0.5em;

    -webkit-border-radius: 0.05em;

    border-radius: 0.05em;

    content: " ";

}

.x-loading-spinner > span.x-loading-top {

    background-color: rgba(170, 170, 170, 0.99);

}

.x-loading-spinner > span.x-loading-top::after {

    background-color: rgba(170, 170, 170, 0.9);

}

.x-loading-spinner > span.x-loading-left::before {

    background-color: rgba(170, 170, 170, 0.8);

}

.x-loading-spinner > span.x-loading-left {

    background-color: rgba(170, 170, 170, 0.7);

}

.x-loading-spinner > span.x-loading-left::after {

    background-color: rgba(170, 170, 170, 0.6);

}

.x-loading-spinner > span.x-loading-bottom::before {

    background-color: rgba(170, 170, 170, 0.5);

}

.x-loading-spinner > span.x-loading-bottom {

    background-color: rgba(170, 170, 170, 0.4);

}

.x-loading-spinner > span.x-loading-bottom::after {

    background-color: rgba(170, 170, 170, 0.35);

}

.x-loading-spinner > span.x-loading-right::before {

    background-color: rgba(170, 170, 170, 0.3);

}

.x-loading-spinner > span.x-loading-right {

    background-color: rgba(170, 170, 170, 0.25);

}

.x-loading-spinner > span.x-loading-right::after {

    background-color: rgba(170, 170, 170, 0.2);

}

.x-loading-spinner > span.x-loading-top::before {

    background-color: rgba(170, 170, 170, 0.15);

}

.x-loading-spinner > span {

    left: 50%;

    margin-left: -0.05em;

}

.x-loading-spinner > span.x-loading-top {

    -webkit-transform: rotate(0deg);

    -moz-transform: rotate(0deg);

}

.x-loading-spinner > span.x-loading-right {

    -webkit-transform: rotate(90deg);

    -moz-transform: rotate(90deg);

}

.x-loading-spinner > span.x-loading-bottom {

    -webkit-transform: rotate(180deg);

    -moz-transform: rotate(180deg);

}

.x-loading-spinner > span.x-loading-left {

    -webkit-transform: rotate(270deg);

    -moz-transform: rotate(270deg);

}

.x-loading-spinner > span::before {

    -webkit-transform: rotate(30deg);

    -moz-transform: rotate(30deg);

}

.x-loading-spinner > span::after {

    -webkit-transform: rotate(-30deg);

    -moz-transform: rotate(-30deg);

}

.x-loading-spinner {

    -webkit-animation-name: x-loading-spinner-rotate;

    -webkit-animation-duration: 0.5s;

    -webkit-animation-iteration-count: infinite;

    -webkit-animation-timing-function: linear;

}

 

@-webkit-keyframes x-loading-spinner-rotate {

    from {

    -webkit-transform: rotate(30deg);

    }

    to {

    -webkit-transform: rotate(330deg);

    }

}

具体效果查看这里:Demo3

这个方案是3个方案中应用css技术最彻底的一个,html的代码最少,并且也真正做到了旋转效果。缺点是不易扩展,chrome浏览器支持不是很理想。

综上分析,方案1浏览器支持不好,但是实现简单,方案2的html代码太多,但扩展好,浏览器支持不错,方案3的扩展性不好,浏览器支持也不好,但是较好地利用了css的特性。

如果开发桌面web系统,推荐方案2,如果是mobile系统,则方案2和方案3各有优势。

http://www.dkankan.com/archives/625?replytocom=27

1.要实现一个div有两面,然后rotateX,可以在js里决定何时触发该动画,以及修改front和back面的内容。

 

相关js代码

document.getElementById(‘person’+tempJson.posIndex).style.cssText=’-webkit-transform:rotateX(‘+(this.animateState[tempJson.posIndex]*180)+’deg)’;

//给person类选择器所在的div添加style,添加-webkit-transform的状态改变。因为person中有指定transition,所以可以产生动画。

记得这边是指定末态时的各属性值,不是增量!

index,css3 代码

<title>最近来访Demo</title>
<meta http-equiv=”content-type” content=”text/html; charset=UTF-8″ />
<style type=text/css>
.container{
width:163px;
height: 160px;
background: url(./images/bg.jpg) no-repeat 0px 0px;
padding: 2px;
overflow: hidden;
}
.person{
position: relative;
float:left;
margin-left: 3px;
margin-bottom: 3px;
width:50px;
height:50px;

}

//刚开始的时候要隐藏back
.face.back{
display: none;
}

@media all and (-webkit-transform-3d) { //判定浏览器是否支持3d属性
/* Use the media query to determine if 3D transforms are supported */
.container {
-webkit-perspective: 1000;  //?
}
.person {
width: 50px;
height: 50px;

//定义person上的3d动画,监听-webkit-transform 属性,动画间隔为1s,动画方式为ease-in-out (先慢,后快,然后再慢)
-webkit-transform-style: preserve-3d;
-webkit-transition: -webkit-transform 1s ease-in-out;
}
.face {
position: absolute;
width: 100%;
height: 100%;
-webkit-backface-visibility: hidden;  

//隐藏背面,否则动画的过程中出现闪的情况
}

//back面需要选择180,然后隐藏背面,也就是说转过去的时候能够看到back的内容,并且即使是rotateX,back面里的内容也是正的。??
.face.back {
display: block;
-webkit-transform: rotateX(180deg);
-webkit-box-sizing: border-box;
/* -webkit-border-radius: 10px; */

}
}

 

.person .info{
height: 10px;
width: 100%;
text-align: center;
font-size: 8px;
background-color: rgba(51,204,253,0.35);
}

//name和time这种图片上的信息,不能够设置为position:absolute;否则会导转到back面的时候,front面的name和time也同时显示出来了。应该是因为这二者脱离文档流的原因。
.person .name{

margin-top: 27px;
color:#ffff00;

}
.person .time{
margin-top:3px;
color:#66FF00;
}
</style>
<div id=”feedback face” style=”width:100%;height:auto;”></div>
<div class=”container”>
<div class=”person” id=’person0′>
<div class=’front face’><div class=’img’></div><div class=’name info’></div><div class=’time info’></div></div>
<div class=’back face’><div class=’img’></div><div class=’name info’></div><div class=’time info’></div></div>
</div>
<div class=”person” id=’person1′>
<div class=’front face’><div class=’img’></div><div class=’name info’></div><div class=’time info’></div></div>
<div class=’back face’><div class=’img’></div><div class=’name info’></div><div class=’time info’></div></div>
</div>
<div class=”person” id=’person2′>
<div class=’front face’><div class=’img’></div><div class=’name info’></div><div class=’time info’></div></div>
<div class=’back face’><div class=’img’></div><div class=’name info’></div><div class=’time info’></div></div>
</div>
<div class=”person” id=’person3′>
<div class=’front face’><div class=’img’></div><div class=’name info’></div><div class=’time info’></div></div>
<div class=’back face’><div class=’img’></div><div class=’name info’></div><div class=’time info’></div></div>
</div>
<div class=”person” id=’person4′>
<div class=’front face’><div class=’img’></div><div class=’name info’></div><div class=’time info’></div></div>
<div class=’back face’><div class=’img’></div><div class=’name info’></div><div class=’time info’></div></div>
</div>
<div class=”person” id=’person5′>
<div class=’front face’><div class=’img’></div><div class=’name info’></div><div class=’time info’></div></div>
<div class=’back face’><div class=’img’></div><div class=’name info’></div><div class=’time info’></div></div>
</div>
<div class=”person” id=’person6′>
<div class=’front face’><div class=’img’></div><div class=’name info’></div><div class=’time info’></div></div>
<div class=’back face’><div class=’img’></div><div class=’name info’></div><div class=’time info’></div></div>
</div>
<div class=”person” id=’person7′>
<div class=’front face’><div class=’img’></div><div class=’name info’></div><div class=’time info’></div></div>
<div class=’back face’><div class=’img’></div><div class=’name info’></div><div class=’time info’></div></div>
</div>
<div class=”person” id=’person8′>
<div class=’front face’><div class=’img’></div><div class=’name info’></div><div class=’time info’></div></div>
<div class=’back face’><div class=’img’></div><div class=’name info’></div><div class=’time info’></div></div>
</div>
</div>

<script src=”honeyLife.js” type=text/javascript ></script>

转载于:https://my.oschina.net/maomi/blog/73078

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值