jQuery使用数据绑定的方式来执行元素的动画【原】

网页排版中如果有大量的元素动画并且使用jquery的animate来生成,写出来的js代码又多又乱;
换一种方式:把动画的属性绑定到动画元素上,再写一个通用的方法去读取这些属性然后自动的生成对应的动画;
或许这样可以省点力气,看起来也更加直观。

<!DOCTYPE html>
<html>
<head>
    <title>使用数据绑定的方式来执行元素的动画</title>
    <meta charset="utf-8">
</head>
<style>
    *{margin: 0;padding: 0;}
    body{background: #eee;}
    ul,
    ol{list-style: none;}
    .container{position: relative;width: 600px;height: 600px;margin: 50px auto;}
    .container ul{position: relative;height: 100%;}
    .container ul li{position: absolute;opacity: .3;filter: alpha(opacity=30);border-radius: 10%;}
    .container ul li.item-1{top: 0;left: 0;width: 200px;height: 200px;background: #f03;}
    .container ul li.item-2{top: 0;right: 0;width: 160px;height: 160px;background: #cf0;}
    .container ul li.item-3{right: 0;bottom: 0;width: 120px;height: 120px;background: #069;}
    .container ul li.item-4{bottom: 0;left: 0;width: 80px;height: 80px;background: #f60;}
    .container .btn{position: absolute;top: 50%;right: 0;width: 100px;margin-top: -20px;background: #fff;border-radius: 3px;cursor: pointer;font: 14px/40px "Consolas";color: #333;text-align: center;letter-spacing: 1px;}
    .container .btn.start{right: 0;}
    .container .btn.reset{left: 0;}

</style>
<body>
    <div class="container">
        <ul>
            <li class="item-1" data-animate="{top: 300, left: 300, marginLeft: -100, marginTop: -100, opacity: 0.8, borderRadius: 50%}"></li>
            <li class="item-2" data-animate="{top: 300, right: 300, marginRight: -80, marginTop: -80, opacity: 0.8, borderRadius: 50%}"></li>
            <li class="item-3" data-animate="{bottom: 300, right: 300, marginRight: -60,  marginBottom: -60,  opacity: 0.8, borderRadius: 50%}"></li>
            <li class="item-4" data-animate="{bottom: 300, left: 300, marginLeft: -40,  marginBottom: -40,  opacity: 0.8, borderRadius: 50%}"></li>
        </ul>
        <a class="btn start">Animate</a>
        <a class="btn reset">Reset</a>
    </div>
</body>
<script type="text/javascript" src="http://cdn.bootcss.com/jquery/1.11.3/jquery.min.js"></script>
<script>
    $.fn.dataAnimate = function(duration, callback) {
        // 把元素绑定的动画数据从字符串类型转换为对象类型
        String.prototype.stringToObj = function() {
            var obj = {},
                arr = this.replace(/(^\s+)|(\s+$)/g, ‘‘)
                .replace(/(\{)|(\})/g, ‘‘)
                .split(‘,‘);

            for (var i = 0, len = arr.length; i < len; i++) {
                var key = arr[i].split(‘:‘)[0].replace(/(^\s+)|(\s+$)/g, ‘‘),
                    value = arr[i].split(‘:‘)[1].replace(/(^\s+)|(\s+$)/g, ‘‘);

                obj[key] = value;
            }

            return obj;
        };

        var isAnimateBack;

        if (arguments[0] === ‘back‘) {
            isAnimateBack = true;
        }

        if (typeof duration === ‘function‘) {
            callback = arguments[0];
            duration = 300;
        }

        /**
         * 在ie8中
         * 元素的right属性, bottom属性
         * 从百分比过渡到像素时会出现异常,尽量不要使用这两个属性
         */
        return this.each(function() {
            var targetProp = {}, initProp = {};

            if (!isAnimateBack) {
                if ($(this).data(‘animate‘)) {
                    targetProp = $(this).data(‘animate‘).stringToObj();
                }

                for (var key in targetProp) {
                    initProp[key] = $(this).css(key);
                }
                $(this).data(‘animateBack‘, initProp);
            } else {
                targetProp = $(this).data(‘animateBack‘);
            }

            $(this).stop(true, false).animate(targetProp, {
                duration: duration,
                complete: function() {
                    if (callback) {
                        callback.call(this);
                    }
                }
            });
        });
    };

    $(‘.btn‘).click(function() {
        if ($(this).hasClass(‘start‘)) {
           $(‘ul li‘).dataAnimate();
        } else {
            $(‘ul li‘).dataAnimate(‘back‘);
        }
    });

</script>
</html>
时间: 2024-12-20 01:19:19

jQuery使用数据绑定的方式来执行元素的动画【原】的相关文章

[jQuery编程挑战]001:实现页面元素加速动画效果

要求: 页面包含两个HTML元素:一个按钮,一个小方块 动画要求:点击按钮,小方块从页面坐标300,300,加速移动到0,0 相关知识点: jQuery动画方法animate easing参数的设置 <!DOCTYPE html> <html lang="zh"> <head> <meta charset="utf-8"> <title>实现页面元素加速动画效果</title> <styl

[记录]jquery validate 不用submit方式验证表单或单个元素

jquery validate 不用submit方式验证表单或单个元素 jQuery validate的版本: v1.14.0 var result = $('#myForm').validate({ errorElement : 'span', errorClass : 'help-block error', rules:{ }, message:{ } }).form(); 具体的内容可以参考官网文档:http://jqueryvalidation.org/documentation/#li

Jquery 在页面加载后执行的几种方式

这篇文章主要介绍了Jquery 在页面加载后执行的几种方式,需要的朋友可以参考下 方式1: $(function(){ initPublish(); }); 说明: initPublish() 即为你要运行的JS函数:这段代码,放在页面最低端. 方式2: $(document).ready(function () { // add your code here initPublish(); $(.a).click( function (){ // add your code here }); }

使用jQuery匹配文档中所有的li元素,返回一个jQuery对象,然后通过数组下标的方式读取jQuery集合中第1个DOM元素,此时返回的是DOM对象,然后调用DOM属性innerHTML,读取该元素 包含的文本信息

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"><head> <meta htt

JavaScript之jQuery-4 jQuery事件(页面加载后执行、事件处理、事件冒泡、事件对象、模拟操作)

一.jQuery 页面加载后执行 代码执行的时机选择 - $(document).ready()方法和 window.onload事件具有相似的功能,但是在执行时机方面是有区别的 - window.onload 事件是在网页中所有的元素(包括元素的所有关联文件)完全加载到浏览器后才执行 - $(document).ready()方法注册的事件处理程序,在DOM完全加载后就可以调用 - 一般来讲, $(document).ready()的执行要优于window.onload事件 - 需要注意的是,

jQuery 常见操作实现方式

一篇 jQuery 常用方法及函数的文章留存备忘. jQuery 常见操作实现方式 $("标签名") //取html元素 document.getElementsByTagName("") $("#ID") //取单个控件document.getElementById("") $("div #ID") //取某个控件中 控件 $("#ID #ID") // 通过控件ID取其中的控件 $(

转:jQuery 常见操作实现方式

http://www.cnblogs.com/guomingfeng/articles/2038707.html 一个优秀的 JavaScript 框架,一篇 jQuery 常用方法及函数的文章留存备忘. jQuery 常见操作实现方式 $("标签名") //取html元素 document.getElementsByTagName("") $("#ID") //取单个控件document.getElementById("")

关于jQuery中,animate、slide、fade等动画的连续触发、滞后反复执行的bug的个人解决办法

照例,现在开头讲个这个问题发生的背景吧: 因为最近要做个操作选项的呼出,然后就想到了用默认隐藏,鼠标划过的时候显示的方法. 刚开始打算添加一个class="active",直接触发mouseover(或者mouseenter)的时候add,mouseout(或者mouseleave)的时候remove,这个解决方法很简单,也很实用,但是体验上可能不是那么酷炫(好吧,这个词用的,瞬间感觉好low啊),所以就想到了用animate或者slide这些jQuery的动画,然后一开始讲真,这个插

Jquery表单提交方式

1.使用调用submit方法 function tes1(){ //执行判断 if(校验通过){ $("#formId").submit(); }else{ return; } } 2.使用ajaxSubmit 方法,用到jquery.form.js $("#picForm").ajaxSubmit({ type: "post", dataType: "text", success: function(result){ ale