作者: admin

  • iframe跨域相互传值–messageEvent.js

    postMessage是用于两个窗口(iframe)之间交换数据的,如果我们同时打开着百度和谷歌两个页面,是不是说这两者之间就可以通信了?No,no,no,事实并非如此,就算百度和谷歌俩页面有通信的意愿也不行。两个窗口能通信的前提是,一个窗口以iframe的形式存在于另一个窗口,或者一个窗口是从另一个窗口通过window.open()或者超链接的形式打开的(同样可以用window.opener获取源窗口);换句话说,你要交换数据,必须能获取目标窗口(target window)的引用,不然两个窗口之间毫无联系,想通信也无能为力。

    http://www.cnblogs.com/zichi/p/4638096.html

     

    iframe跨域属于前端的知识范围,跟服务器没关系,是利用postMessage实现的。

    postMessage 是 HTML5 新方法,它可以实现跨域窗口之间通讯。到目前为止,只有 IE8+, Firefox 3, Opera 9, Chrome 3和 Safari 4 支持,而本篇文章主要讲述 postMessage 方法与 message 事件跨浏览器实现。

    postMessage 方法 JSONP 技术不一样,前者是前端擅长跨域文档数据即时通讯,后者擅长针对跨域服务端数据通讯,postMessage 应用场景能说明这个区别:

     

    应用场景举例
    1、webOS 使用 iframe 嵌入第三方应用,此时 webOS 与应用需要实时接收/发送各自的消息与响应事件。
    2、页面弹出一个由 iframe 层,嵌入第三方提供的图片上传页面,文件上传完毕后需要获取返回图片地址插入到编辑器。
    3、iframe 跨域高度自适应。可以500%提高开发效率的前端UI框架!

    虽然postMessage只兼容IE8,但是利用messageEvent.js可以模拟HTML5的功能实现。

    具体查看:http://www.iteye.com/topic/1135851

    https://sdeno.com/?p=5063

     

    message_cross

    上图端口不同说明,属于跨域

     

    本地部署:

    <script src="jquery-1.8.3.min.js"></script>
    <script src="messageEvent.min.js"></script>
    <script>
     $(function(){
     
       var iframe = document.getElementById('ifr'); //获取子页的iframe
     
       $('button').click(function(){ //发送消息
           messageEvent.postMessage(iframe.contentWindow, $('#txt').val(), '*'); 
       });
     
        messageEvent.add(function (event) { //接收消息
            $('#txt').val(event.data)
        });
     
     });
    </script>
    </head>
    
    <body>
    <fieldset>
    <legend>我是本地页面</legend>
    输入要传递的值:<input id="txt" type="text"/> <br>
    <button>回调</button><br><br>
    </fieldset>
    
    
    <fieldset>
    <legend>我是远程页面</legend>
    <iframe id="ifr" src="http://localhost:53791/cross_iframe/b.html"></iframe>
    </fieldset>

     

    远程部署:

    <script src="jquery-1.8.3.min.js"></script>
    <script src="messageEvent.min.js"></script>
    <script>
    $(function(){
       messageEvent.add(function (event) {
          $('input').val(event.data);
       });
    
       $('button').click(function(){
         messageEvent.postMessage(window.parent, $('input').val(), '*');
       });
    
    });
    </script>
    </head>
    
    <body>
      <input type="text" placeholder="等待父页面传值过来">
    
      <button>回调</button><br><br>
    </body>

    注意:如果要考虑IE6/7的兼容请把messageEvent-proxy.html放在messageEvent.js能获取到的路径下,具体查看源码。

     

    页面若引用 jQuery 库,你可以用 bind 方法或者 message 方法绑定事件:

    //接收
    jQuery(window).bind('message', function (event) { 
       alert(event.data) 
    });
    
    jQuery(window).message(function (event) { 
       alert(event.data) 
    });
    
    
    //发送
    jQuery.postMessage(iframe.contentWindow, 'hello world', '*');   //父页向子页面发送
    jQuery.postMessage(window.parent, 'hello world', '*');  //子页向父页发送

    来自:https://code.google.com/archive/p/message-event/

    本地下载:messageEvent0.2.2

    本地测试包下载:messageEvent

     

     

  • iframe自适应高度

    操作iframe要分两种情况:

    1、在跨域情况下:

    仅仅是父页面想要传值给子页面,参考:《iframe跨域、同域

    如果在跨域中用iframe获取src中的页面的高度用普通的方法是无法获取都的,必须要有权限修改src中跨域的页面,和同时设置本地页面才行。如:

    本地:
    <iframe scrolling="no" src="https://www.baidu.com/1.html"></iframe>  //跨域访问https://www.baidu.com/1.html
    
    <script src="jquery.min.js"></script>
    <script src="set-iframe-height-parent-min.js" async></script>
    
    <script>
    if (window.console && typeof console.log === 'function') {
       $(window)
        .on('setIframeHeight:shrinked', function (e, data) {
           console.log('iframe shrinked', data);
        })
        .on('setIframeHeight:enlarged', function (e, data) {
           console.log('iframe enlarged', data);
        });
    }
    </script>
    ---------------------------------------------------------
    远程:www.baidu.com下的页面1.html
    //页面底部加
    <script src="jquery.min.js"></script>
    <script src="set-iframe-height-child-min.js" async></script>

    部署以上环境好后,浏览本地页面就会发现iframe的高度会根据www.baidu.com下的页面1.html的html高度的变化而设置。这样就实现了跨域自适应高度效果,经过测试此方法仅兼容IE9。

    https://github.com/FaiblUG/setIframeHeight

    setIframeHeight-master

     

    跨域和非跨域都能让iframe自适应高度还有另外一个款插件可以实现iframeResizer.min.js,不兼容IE8,兼容IE9以上

    https://github.com/davidjbradshaw/iframe-resizer

    下载包以及测试包:iframeResizer

     

     

     

    2、非跨域情况下:

    在非跨域情况可以简单的通过DOM来获取内容,可以参考:《iframe获取父、子窗口的方法

  • 推荐:动画库GSAP|中文手册

    jquery animate 动画

    gasp

    如果只是简单的动画效果可以借助jquery的animate就可以,如果是复杂又不想损耗性能又要充分发挥HTML5性能推荐使用
    GSAP是一套高性能的HTML5脚本工具。总之很好用兼容性也很好。
    GSAP全称是GreenSock Animation Platform包括以下代码:

    TweenLite:是一个极其快、轻量级、灵活的动画工具,为GSAP的底层服务。

    TweenMax:是TweenLite的扩展,添加了很多有用的功能如:repeat(), repeatDelay(), yoyo()更多,还默认包括了一些有用的插件。
    任意的插件也能在TweenLite上运行。TweenMax免去了你加载一些插件,如: CSSPlugin, RoundPropsPlugin, BezierPlugin, AttrPlugin, DirectionalRotationPlugin,EasePack, TimelineLite, and TimelineMax。TweenMax和TweenLite语法完全一样。

    TimelineLite:是一个强大的排序工具。官方解释的抽象,用我自己的话来说就是一个链式工具,如jquery一样写法都是可以这样写,$(‘dom’).width().css().eq().animate。
    这工具就是起到这样的作用,也有点类似队列动画的效果,上一个动画执行完成才能到下一个动画执行。避免了还要去一个个计算delay的时间才实现队列动画效果。TimelineLite也有自己的很多方法。

    TimelineMax:是TimelineLite的扩展,又在TimelineLite基础上添加了很多有用的方法。TimelineMax文档

    部分效果能兼容IE7/8,基本动画还是能兼容,兼容性还是不错的。

    实际用处
    jquery的animate的效果很有限,仅支持如height、width、left、top和scrollTop等一些基础效果。如果需要做transforms、color和number的过渡效果jquery
    就不支持了非常遗憾。所以GSAP弥补了jquery的animate不足的地方。

    效果演示:demo 

     

    代码概况:

    var mov=new TweenMax.to(
      '#box', //操作对象
      2, //动画持续时间
      {
        css:{
          left:100,
          opacity:0.3
        },
        startAt:{left:10}, //初始化
        delay:0, //1秒后开始执行动画
        ease:Back.easeOut, //加速度效果
        repeat:0, //多循环1次,也就是一共重复执行了2次同样的动画,-1就会无限重复循环
        repeatDelay:0, //每次重复循环时间3秒,需要配合repeat属性
        yoyo:false, //如果true,动画的循环是倒序,需要配合repeat属性
        paused:false, //如果true,动画暂停
        overwrite:'auto',
        onStart:function(){ //动画开始前回调
           document.title='开始前执行'
        },
        onStartParams:["{self}", "参数"],
        onComplete:function(a,b){ //动画结束后回调
           document.title='动画完成'
        },
        onCompleteParams:["{self}", "param2"], //为onComplete传参数,其中{self}值的是mov
        immediateRender:true,
        onUpdate:function(a,b){ //初始化执行一次,动画过程回调,以后动画有运动都还会不停的执行,直到动画结束才停止
          // console.log(a.isActive());
        },
        onUpdateParams:["{self}", "参数"], //为onUpdate提供参数
        useFrames:false
     });

     

    链式写法:GASP的链式写法要靠TimelineLite来实现的,如:

    var tl = new TimelineMax({repeat:-1, delay:0, repeatDelay:2}); //公共属性可以写这里
    tl.to('#box',10,{left:100,borderColor:'red'})  //独立属性可以各自写
      .to('#box',2,{top:100,borderColor:'yellow'});
    
    或者
    
    推荐这样写,直观点
    var tl = new TimelineMax({repeat:2, repeatDelay:1});
        tl.add( TweenMax.to(element, 1, {left:100}) );
        tl.add( TweenMax.to(element, 1, {top:50}) );
        tl.add( TweenMax.to(element, 1, {opacity:0}) );

     

    GASP也对jquery的animate功能进行扩展,添加了一个jquery.gsap.js,加载此插件后就可以像写jquery一样去写GASP了就免去了学习新的API,参考《代替jquery的animate属性插件–jquery.gsap.js

     

    批量操作动画

    TweenMax.staggerFrom('.box', 5, {y:"150"}, 5); //动画逆播,获取全部class为box的元素,动画时间5秒,从y是150的位置开始到0,每个元素之间间隔5秒
    TweenMax.staggerTo('.box', 1, {y:"+=150", opacity:0}, 0.2); //按顺序播放
    TweenMax.staggerFromTo('.box', 5, {y:"150",x:'100'},{y:"00",x:'0'}, 5); //自行设置开始结束播放
    
    TweenMax.staggerFrom('.box', 2, {
      cycle:{
        y:[50,-50], //第一个元素从50开始,第二个元素从-50开始,以此类推
        y:function(i){
           console.log(this); //this是dom元素本身
           return i * 20; //i是当前元素的索引
        }
     }
    },2);

     

    属性链式写法

     box.repeat(2).yoyo(true).repeatDelay(0.5).play();

     

    延迟回调,指定几秒后才发生回调

    TweenMax.delayedCall(3, myFunction, [true, "param2"]);
    
    function myFunction(param1, param2) {
     console.log(param1, param2);
    }

     

    myAnimation.duration() //获取动画运行的时间
    myAnimation.duration(10) //重新设置动画运行的时间
    
    myAnimation.timeScale(2) //速度的设置,2倍速度,效果相当于把duration的时间改小是一样的
    
    myAnimation.endTime() //提前获取动画运动消耗的时间
    
    mov.eventCallback("onComplete", myFunction, ["param1","param2"])
    function myFunction(param1, param2) {
     document.title=111;
    }
    
    myAnimation.isActive() //是否在动画中
    
    TweenMax.globalTimeScale() //获取当前正常速度
    TweenMax.globalTimeScale(0.5) //设置全局速度是原来速度慢一半
    TweenMax.globalTimeScale(2) //比原来速度快2倍
    
    mov.kill({left:true}); //禁用动画某一个种过渡属性
    
    TweenMax.killAll(是否强制完成,是否禁用动画,是否禁用delayedCalls回调,是否禁用timelines);
    TweenMax.killAll(true,false,false,false); //默认值都为false,如果第一个参数值为true,意思就是强制他们一定要完成效果或者是回调
    TweenMax.killAll(false,true,false,false); //所有过渡动画都停止
    TweenMax.killAll(true, true, false, false); //强制动画瞬间结束,并且保留动画结束的时的效果
    
    TweenMax.killChildTweensOf( document.getElementById("fa") ); //父元素fa下的所有元素都禁止运动
    
    mov.pause(6,true); //暂停在第6秒时候的动画,并且禁用任何回调
    mov.paused(false); //恢复暂停
    mov.paused(true); //暂停
    mov.paused(); //获取动画是否暂停
    
    TweenMax.pauseAll(tweens,delayedCalls,timelines);
    
    mov.play(10,true); //从10秒开始动画,并且禁用任何回调
    mov.progress( 0.5 ,true); //从进度的百分之50%后开始动画,并且禁用任何回调
    
     .repeat() //循环
     .repeatDelay() //循环间隔时间
    
    mov.restart(true); //包括delay时间也重置
    mov.restart(false); //忽略delay时间,动画立马执行
    
    mov.resume(2); //重置,从2秒时刻开始
    
    mov.reverse(0); //动画从结束状态开始倒退回开始状态
    mov.reverse(-10); //动画从倒数第10秒开始逆播
    mov.reversed(false); //禁止动画逆播
    
    mov.startTime(2); //过几秒后开始动画,类似于delay属性优先于delay
    mov.time(5); //从第5秒开始动画,忽略delay属性
    mov.totalDuration(2); //动画持续时间

    更多API自行去官网看

    全部GASP插件集合打包:https://github.com/thealrivera/GSAP_UI

    百度下载: http://pan.baidu.com/s/1nv9zU7v

    国内各个版本下载:http://www.bootcdn.cn/gsap/

    本地下载:GSAP_UI-master

    如果想去官网下载使用,有些功能是需要注册会员收费的!!

     

  • 代替jquery的animate属性插件–jquery.gsap.js

    取代 jquery animate

    jquery.gsap_thumb

    jquery的动画属性animate执行的效率低,因为考虑兼容性做了很多判断的原因。现在出现了许多特效执行的效率远远高于jquery。之前也有介绍过一插件《velocity.js中文手册 velocity取代jQuery animate()的插件》。

    加上jquery本身也没有颜色渐变也不支持transforms属性的渐变。

    现在介绍另一个插件jquery.gsap.js,核心是TweenMax.js它才是动画执行代码而且版本必须大于1.8.0,与其说介绍jquery.gsap.js还不如说介绍TweenMax.js。jquery.gsap.js是基于TweenMax.js上扩展的好处就是API跟jquery的animate一样不需要去重新学习新的API这也是它跟velocity.js一样的优点,兼容性很好,也不需要去写专门的兼容前缀样式,如-0-,webkit-.

    关于TweenMax.js后面还会继续介绍它,因为它有自己的API可以选择性的使用jquery.gsap.js辅助插件,还有其他很多强大的插件。

    首先加载:

    加载方式一:(推荐)
    <script src="jquery-1.8.3.min.js"></script>
    <script src="TweenMax.min.js"></script>
    <script src="jquery.gsap.min.js"></script>
    
    或者:
    
    加载方式二:
    <script src="jquery-1.8.3.min.js"></script>
    <script src="js/plugins/CSSPlugin.min.js"></script>
    <script src="js/easing/EasePack.min.js"></script>
    <script src="js/TweenLite.min.js"></script> 
    <script src="js/jquery.gsap.min.js"></script>

    代码风格:

    $("#box").animate(
    { 
      x:'10px',
      scaleX:'3',
      skipGSAP:true,  //禁用GSAP
    }, 
    {
      duration:1000, //1秒内完成动画
      easing:"easeOutStrong", //加速度
      complete:function(){ //动画执行完毕后回调
        document.title=111
      }
    });

     

    另一种风格:

    $('#box').animate(
      {
       css:{
         left:100,
         opacity:0.3
       },
       startAt:{left:10}, //初始化
       delay:0, //1秒后开始执行动画
       ease:Back.easeOut, //加速度效果
       repeat:0, //多循环1次,也就是一共重复执行了2次同样的动画,-1就会无限重复循环
       repeatDelay:0, //每次重复循环时间3秒,需要配合repeat属性
       yoyo:false, //如果true,动画的循环是倒序,需要配合repeat属性
       paused:false, //如果true,动画暂停
       overwrite:'auto',
       onStart:function(){ //动画开始前回调
         document.title='开始前执行'
       },
       onStartParams:["{self}", "参数"],
       onComplete:function(a,b){ //动画结束后回调
         document.title='动画完成'
       },
       onCompleteParams:["{self}", "param2"], //为onComplete传参数,其中{self}值的是mov
       immediateRender:true,
       onUpdate:function(a,b){ //初始化执行一次,动画过程回调,以后动画有运动都还会不停的执行,直到动画结束才停止
         // console.log(a.isActive());
       },
       onUpdateParams:["{self}", "参数"], //为onUpdate提供参数
       useFrames:false
      }
    );

     

    链式写法:

    $('#box').animate({
       left:100,
       borderColor:'red'
    },{
       duration:5000
    })
    .animate({
       top:100,
       borderColor:'yellow'
    },{
       duration:2000
    });

    API文档参考:《推荐:动画库GSAP

     

    2D、3Dtransforms

    旋转:
     rotationX rotationY rotationZ
     不指定坐标默认以rotationZ旋转
     {rotationX:'30deg'}
    缩放: 
     scaleX, scaleY
     {scaleX:'3'} //宽为原来的3倍
    倾斜:
     skewX, skewY
     {skewX:'30deg'}
    位移:
     x, y
     {x:'30px'}
    深景色
     {perspective:'500px'}
     旋转中心
    {transformOrigin:"left top"}
    {transformOrigin:"left 50% -200"} //左偏移50%又减去200

     

     颜色渐变

    字体颜色
    {color:'red'}
    背景颜色
    {backgroundColor:'red'}
    边框颜色
    {borderColor:'red'}

     

    阴影

    字体阴影
    { textShadow:"10px 10px 10px red"}
    { textShadow:"10px 10px 10px rgba(255, 255, 255, 0.5)"}
    元素阴影
    boxShadow: "10px 10px 10px 10px #000"

     

    圆角

    borderRadius:"25px"

     

    图片背景定位

    backgroundPosition:"-25px -25px"

     

    clip 剪切/裁剪  //提供4种案例效果

    {clip:"rect(50px 100px 50px 0px)"} //中间开始到上下展示
    {clip:"rect(100px 0px 100px 0px)"} //左下开始到右上展示
    {clip:"rect(50px 50px 50px 50px)"} //中间到四周
    {clip:"rect(0px 100px 100px 100px)"} //右到左

     

     禁用TweenMax效果,但保留jquery的animate自带效果

    $("#box").animate({
       x:'290px',  //没效果
       backgroundColor:'yellow',  //没效果
       left:'290px', //jquery自带的有效果
       skipGSAP:true //禁用GSAP
     }, {
       duration:1000,
       complete:function(){
       document.title=111
      }
    });

     

    className 增/删类名

    $('.box').animate({
      className:'+=av' //效果为clas="box av"
      className:'-=av' //如果之前是clas="box av" 那么现在是clas="box"
    });

     

    动画停止

    可以用jquery自带的stop()是兼容的

     

  • 元素交错视觉差特效–shake.min.js

    鼠标 移动 元素 移动 视觉差

    github404

    效果就跟github出现的404页面效果一样

    随便输入一个地址报错进入404:https://github.com/sdfsgggdf

    现在提供一个简单插件shake.min.js同样能实现效果,兼容IE8以上浏览器

    用法:

    <script src="js/shake.js"></script>
    <script>
      var layers = $('.plaxify');
        $.each(layers, function(index, layer){
          $(layer).plaxify({
            xRange: $(layer).data('xrange') || 0,
            yRange: $(layer).data('yrange') || 0,
            invert: $(layer).data('invert') || false
           });
        });
     $.plax.enable();
    </script>
    
    
    <img class="plaxify"  data-xrange="8" data-yrange="3" style="position: absolute;">  //加指定的class名  data-xrange, data-yrange支持负值

    效果演示:https://sdeno.com/wp-content/uploads/2016/05/404/1.html