JS——缓慢动画封装案例

手风琴

1、排他思想

2、ul宽度需要大一点,防止li撑开跑下去

3、一个变大其他所有变小,变小不能太小,不然会出现空白

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        * {
            padding: 0;
            margin: 0;
        }

        div {
            width: 1200px;
            margin: 150px auto;
            border: 1px solid #CC6153;
            overflow: hidden;
        }

        ul {
            width: 1300px;
            height: 460px;
            list-style: none;
        }

        li {
            float: left;
            width: 240px;
            height: 460px;
        }
    </style>
</head>
<body>
<div>
    <ul>
        <li></li>
        <li></li>
        <li></li>
        <li></li>
        <li></li>
    </ul>
</div>
<script>
    var div = document.getElementsByTagName("div")[0];
    var ul = div.children[0];
    var liArr = ul.children;
    for (var i = 0; i < liArr.length; i++) {
        liArr[i].style.background = "url(‘images/" + (i + 6) + ".jpg‘) no-repeat";
        liArr[i].onmouseover = function () {
            for (var j = 0; j < liArr.length; j++) {
                animate(liArr[j], {"width": 120});
            }
            animate(this, {"width": 800})
        }
        liArr[i].onmouseout = function (ev) {
            for (var j = 0; j < liArr.length; j++) {
                animate(liArr[j], {"width": 240});
            }
        }
    }

    //参数变为2个,将属性atrr和值都存储到json中
    function animate(ele, json, fn) {
        //先清定时器
        clearInterval(ele.timer);
        ele.timer = setInterval(function () {
            //开闭原则
            var bool = true;
            //遍历属性和值,分别单独处理json
            //attr == k(键)    target == json[k](值)
            for (var k in json) {
                //四部
                var leader = parseInt(getStyle(ele, k)) || 0;
                //1.获取步长
                var step = (json[k] - leader) / 10;
                //2.二次加工步长
                step = step > 0 ? Math.ceil(step) : Math.floor(step);
                leader = leader + step;
                //3.赋值
                ele.style[k] = leader + "px";
                //4.清除定时器
                //判断: 目标值和当前值的差大于步长,就不能跳出循环
                //不考虑小数的情况:目标位置和当前位置不相等,就不能清除清除定时器。
                // if (json[k] !== leader) {
                //     bool = false;
                // }
                if (Math.abs(json[k] - leader) > Math.abs(step)) {
                    bool = false;
                }
            }
            console.log(1);
            //只有所有的属性都到了指定位置,bool值才不会变成false;
            if (bool) {
                for (k in json) {
                    ele.style[k] = json[k] + "px";
                }
                clearInterval(ele.timer);
                //所有程序执行完毕之后执行回调函数
                //现在只有传递了回调函数,才能执行
                if (fn) {
                    fn();
                }
            }
        }, 5);
    }

    function getStyle(ele, attr) {
        if (window.getComputedStyle) {
            return window.getComputedStyle(ele, null)[attr];
        }
        return ele.currentStyle[attr];
    }
</script>
</body>
</html>

仿360开机

1、首先下盒子高度变为0,之后整体盒子宽度变为0

2、本例子没有用图片,最好盒子以图片形式为好

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        * {
            padding: 0;
            margin: 0;
        }

        .box {
            width: 200px;
            height: 300px;
            position: fixed;
            bottom: 0;
            right: 0;
        }

        span {
            position: absolute;
            top: 0;
            right: 0;
            width: 20px;
            height: 20px;
            font: 400 18px/20px "simsun";
            text-align: center;
            background-color: #ccc;
        }

        .up, .down {
            width: 200px;
            height: 150px;
            font: 400 23px/150px "simsun";
            text-align: center;
            background-color: #ccc;
        }

    </style>
</head>
<body>
<div class="box">
    <span>×</span>
    <div class="up">上盒子</div>
    <div class="down">下盒子</div>
</div>
<script>
    var span = document.getElementsByTagName("span")[0];
    var box = span.parentNode;
    var down = box.children[2];
    //开始让下盒子的高度变成0 之后让大盒子宽度变为0
    span.onclick = function () {
        animate(down, {"height": 0}, function () {
            animate(box, {"width": 0})
        });
    }

    //参数变为2个,将属性atrr和值都存储到json中
    function animate(ele, json, fn) {
        //先清定时器
        clearInterval(ele.timer);
        ele.timer = setInterval(function () {
            //开闭原则
            var bool = true;
            //遍历属性和值,分别单独处理json
            //attr == k(键)    target == json[k](值)
            for (var k in json) {
                //四部
                var leader = parseInt(getStyle(ele, k)) || 0;
                //1.获取步长
                var step = (json[k] - leader) / 10;
                //2.二次加工步长
                step = step > 0 ? Math.ceil(step) : Math.floor(step);
                leader = leader + step;
                //3.赋值
                ele.style[k] = leader + "px";
                //4.清除定时器
                //判断: 目标值和当前值的差大于步长,就不能跳出循环
                //不考虑小数的情况:目标位置和当前位置不相等,就不能清除清除定时器。
                // if (json[k] !== leader) {
                //     bool = false;
                // }
                if (Math.abs(json[k] - leader) > Math.abs(step)) {
                    bool = false;
                }
            }
            console.log(1);
            //只有所有的属性都到了指定位置,bool值才不会变成false;
            if (bool) {
                for (k in json) {
                    ele.style[k] = json[k] + "px";
                }
                clearInterval(ele.timer);
                ele.style.display = "none";
                //所有程序执行完毕之后执行回调函数
                //现在只有传递了回调函数,才能执行
                if (fn) {
                    fn();
                }
            }
        }, 15);
    }

    function getStyle(ele, attr) {
        if (window.getComputedStyle) {
            return window.getComputedStyle(ele, null)[attr];
        }
        return ele.currentStyle[attr];
    }
</script>
</body>
</html>

时间: 2024-10-03 19:20:01

JS——缓慢动画封装案例的相关文章

03 canvas帧动画封装案例

sprite.js /** * Created by suxiaoxia on 2017/7/15. */ function sprite(option) { this._init(option); } sprite.prototype = { /*初始化*/ _init:function (option) { this.x = option.x || 0; this.y = option.y || 0; this.w = option.w || 40; this.h = option.h ||

原生JS面向对象思想封装轮播图组件

原生JS面向对象思想封装轮播图组件 在前端页面开发过程中,页面中的轮播图特效很常见,因此我就想封装一个自己的原生JS的轮播图组件.有了这个需求就开始着手准备了,代码当然是以简洁为目标,轮播图的各个功能实现都分别分为不同的模块.目前我封装的这个版本还不适配移动端,只适配PC端. 主要的功能有:自动轮播,点击某一张图片对应的小圆点就跳转到指定图片,有前后切换按钮.使用的时候只需要传入图片的路径以及每张图片分别所对应的跳转路径还有目标盒子ID就可以了,还可以自定义每张图轮播的延时,不过延时参数不是必须

js运动动画

今天简单的学了一下js运动动画,再此感谢慕课网的这位老师http://www.imooc.com/view/167,讲的很不错. 下面是我整理出来的结果. 知识点一:速度动画. 1.首先第一步实现速度运动动画,封装一个函数,用到的知识是setInterval(function(){ oDiv.style.left=oDiv.offsetLeft+10+"px"; },30). 对于这里为什么要用到offsetLeft,我特意百度了一下,http://www.cnblogs.com/wo

强大的CSS3/JS:帧动画的多种实现方式与性能对比

Web动画形式 首先我们来了解一下Web有哪些动画形式 1\. CSS3动画 Transform(变形) Transition(过渡) Animation(动画) 2\. JS动画(操作DOM.修改CSS属性值) 3\. Canvas动画 4\. SVG动画 5\. 以Three.js为首的3D动画 以上各种动画形式都可以制作出一种类型的动画,那就是帧动画,也叫序列帧动画,定格动画,逐帧动画等,这里我们统一用帧动画来表述. 这里推荐一下我的前端学习交流扣qun:767273102 ,里面都是学习

Vue的动画封装

问题:如果在slot标签上使用v-show,程序功能是无法实现的,必须改成v-if. 原因:slot实际是一个抽象元素,有点类似template,本质并不是一个元素. 而v-show是通过控制元素的display来进行显示和隐藏的,slot本身不是元素,所以压根就不会有display这个css属性 所以,slot显示隐藏,要使用v-if. css动画在<style>中定义,js动画在@before-enter="handleBeforEnter"中定义 步骤: 1.定义一个

echarts &nbsp; js 模板制作 地图 案例分享

今天分享一个 echarts   js 模板制作 地图 案例,有类似需求的筒子可以参考 O(∩_∩)O 需求:因为最近管理的全国各地代理服务器越来越多,有时上级需要看下我们的代理分布,比如带宽,比如供应商,如果用纯excel不是很直观,就套用了前端的Js模板,修改了些代码,填充部分值进去,就出来基本效果了. 上效果图: 基本上把全国各地的资源情况很直观的显示出来了,这里只填充了部分值,后期会将值存入mysql,并且用上ajax 来塞值,这里就列个基本的效果图. 5分钟上手echarts,官网教程

JS类的封装及实现代码

js并不是一种面向对向的语言, 没有提供对类的支持, 因此我们不能像在传统的语言里那样 用class来定义类, 但我们可以利用js的闭包封装机制来实现js类, 我们来封装一个简的Shape类. 1. 定义js类 js并不是一种面向对向的语言, 没有提供对类的支持, 因此我们不能像在传统的语言里那样 用class来定义类, 但我们可以利用js的闭包封装机制来实现js类, 我们来封装一个简的Shape类. 代码如下: function ShapeBase() { this.show = functi

Eclipse保存验证JS缓慢

EclipseSave保存js文件的时候验证JS的时间很长( 使用extjs).Eclipse – Validation – JavaScript Validator 的 Manual和Build都没用 最后找到在项目路径下面的.project文件中配置了一些验证信息. org.eclipse.wst.jsdt.core.javascriptValidator—————————————————————————org.eclipse.wst.jsdt.core.jsNature 去掉上面两部份就好

用JS添加文本框案例代码

<!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"> <head> <meta http-equiv="Content-