为CSS Visual Filters and Transitions 的动画添加自定义加速度

来到新公司

前辈派给我的第一个任务是做一个类似outlook slider的小效果  可以把两个层的变化做成动画。

按照常理说  这个效果需要用flash来做  但是客户要求不能用脚本外的其他东西   幸好是针对ie开发  我想起来ie5.5 beta的新特性

DirectX filters(滤镜)了。没错 M$ 5年前就提供了这个现成的效果。IE啊  你这个让人又恨又爱的东西  你不这么强大又怎么会占这么多资源你。。。你该减肥了你。。。

具体可以参看

http://msdn.microsoft.com/en-us/library/ms673540(VS.85).aspx 

后面的Transitions都是动画效果哦

只要有本地msdn的同学 都可以在本地搜索

   CSS Visual Filters and Transitions

这个索引

 

恩 标准例子如下

 

ContractedBlock.gif ExpandedBlockStart.gif Code
<!-- This element has the filter applied. -->

<DIV ID="oTransContainer" STYLE="position:absolute; top: 0px; left: 0px; width: 300px; 
height:300px;  filter:progid:DXImageTransform.Microsoft.Slide(slideStyle='HIDE', bands=1) "
>

<!-- This is the first content that is displayed. -->

    
<DIV ID="oDIV1" STYLE="position:absolute; top:50px; left:10px; width:240px; height:160px;
    background:gold"
> This is DIV #1  </DIV>

<!-- This content displays after the first content. -->

    
<DIV ID="oDIV2" STYLE="visibility:hidden; position:absolute; top:50px; left:10px; 
    width:240px; height:160px; background: yellowgreen; "
> <BR> This is DIV #2
    
</DIV> 
</DIV>

<BUTTON onclick="fnToggle()">Toggle Transition</BUTTON>

<SCRIPT>
var bTranState = 0;
function fnToggle() {
    oTransContainer.filters[
0].Apply();
    
if (bTranState=='0') { 
        bTranState 
= 1;
        oDIV2.style.visibility
="visible"
        oDIV1.style.visibility
="hidden";}
    
else {  
        bTranState 
= 0;
        oDIV2.style.visibility
="hidden"
        oDIV1.style.visibility
="visible";}
        oTransContainer.filters[
0].Play();}
</SCRIPT>

 

http://samples.msdn.microsoft.com/workshop/samples/author/filter/Slide.htm  点此直接察看效果

 

 

随后问题就来了   前辈要求的页面  并不是这样匀速直线的交换两个桢  而是因受力而加速的样子

这样  Play() 命令肯定是不足以胜任的。   仔细看看参考  我发现了一个不错的切入点 

 

 

Attributes/Properties
Show:
AttributePropertyDescription
bandsbandsSets or retrieves the number of strips into which the content is divided during the transition.
durationDurationSets or retrieves the length of time the transition takes to complete.
enabledEnabledSets or retrieves a value that indicates whether the filter is enabled.
PercentSets or retrieves the point in a transition at which to capture the display for a static filter output.
slideStyleSlideStyleSets or retrieves the method used to reveal the new content.
statusRetrieves the state of the transition.

 

恩。。。。 Percent。。。  看起来很淫荡

只要定时指派正确的percent  就可以控制速度了

我淫荡的笑了

 

于是有了下面的代码 

 

ContractedBlock.gif ExpandedBlockStart.gif Code
<html>


<body>
<script language=Javascript>

var startSpeed=0   //BEGIN SPEED 开始的初始速度
var stepTime=42   //TIME  PER TICK 每tick的的时间
var speeda=0.1    // acceleration 加速度
var IsMoving =false  // lock of "moving"    是否正在移动中 如果在移动中则不处理请求
var NowPercent     // now progress percent目前移动的百分比
var NowSpeed       // now speed 目前的移动速度


    
var bTranState = 0;   // shown layer's index 目前占有显示的层标记
    function fnToggle() {

    
if    (IsMoving ==false)    //lock the action if moving 如果目前并非在移动中 则初始化移动
    {
        
//init 初始化目前的状态
            NowPercent=0     
        NowSpeed
=0
        IsMoving
=true    
        
// init end  初始化结束


        
//apply filter, the modify after "Apply()" and  "Play() or set Psercent"  will make effect to the  resualt  image    
        //应用Filter 必须有这具声明 在apply之后 play或set percent之前的所有操作都将记录为结果
            oTransContainer.filters[0].Apply();    

        
if (bTranState == '0'
        {
                    bTranState 
= 1;
                    oDIV2.style.visibility 
= "visible";
                    oDIV1.style.visibility 
= "hidden";
            }
            
else {
                    bTranState 
= 0;
                    oDIV2.style.visibility 
= "hidden";
                    oDIV1.style.visibility 
= "visible";
        }
        setTimeout(
"Movestep()", stepTime);  //beging movment 根据预定的tick速度进行移动。
        }
     


        

    }



function Movestep()
    {


        
if (IsMoving)
        {
        NowSpeed
=NowSpeed+speeda          //acceleration  add to  speed  先处理加速度
        NowPercent=NowPercent+NowSpeed         //count progress  然后计算本tick的百分比
        if (NowPercent>100) NowPercent=100    //overflow control  if  finish  如果到头了 则防止溢出
        
        oTransContainer.filters[
0].Percent=NowPercent   //apply the percentage 把目前百分比应用
        
        
if (NowPercent!=100
        {    
            setTimeout(
"Movestep()", stepTime);    // next tick call  下一次timer
        }
        
else
        {
            IsMoving
=false                         //  release the action lock 释放操作锁定
        }
}
    
        }
        




function Moveto()
{


};


</script>



<BUTTON onclick="fnToggle()">Toggle Transition</BUTTON>


<DIV ID="oTransContainer" STYLE="position:absolute; top: 0px; left: 0px; width: 300px; 
height:300px;  filter:progid:DXImageTransform.Microsoft.Slide(slideStyle='PUSH', bands=1) "
>

<!-- This is the first content that is displayed. -->

    
<DIV ID="oDIV1" STYLE="position:absolute; top:50px; left:0px; width:300px; height:160px;
    background:gold"
><href=#> This is DIV #1</a>  </DIV>

<!-- This content displays after the first content. -->

    
<DIV ID="oDIV2" STYLE="visibility:hidden; position:absolute; top:50px; left:0px; 
    width:300px; height:160px; background: yellowgreen; "
> <BR> <href=#>This is DIV #2
  
</a>  </DIV> 
</DIV>


</body>
</html>

 

 

 

恩  根据不同条件调整加速度  即可达成想要的各种效果   很有趣

Toggle Transition

 

 

这个故事告诉我们 

1 IE真臃肿阿,好多东西八百辈子永不到一次

2 IE真强大阿,虽然好多东西八百辈子永不到一次

3 知识不在新旧  用到的时候就是宝贵的知识

4 老知识也可以通过再学习发现新的用途

 

-0-  真是个啰嗦的大叔阿,写完了  希望对IE CSS感兴趣的弟妹们有帮助

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值