可控动画

<!DOCTYPE html>
<html>
    <!--
    简述:做一个可控动画,能够根据用户输入判断是逐帧播放还是完全播放,同时也能够根据输入前进或者后退。
    要点分析:
        监听交互:单击,触摸,滚动等等
        识别临界值:位移等。临界值内逐帧并且放弃交互时回退到交互前的状态;临界值外则动画完全播放。
        动画:可在前进和后退之间切换(可通过传参);可逐帧播放(帧可以是小动画)
        优化效率
    相关交互:
        下拉时:逐帧退和整节退
        上拉时:逐帧前进和整节前进
        放弃操作:超过临界值(动画完成)和未超过临界值(动画回退)。
    动画关键点:帧和节都可进退,同时进退皆可控。
-->

    <head>
        <meta charset="UTF-8">
        <title>可控动画</title>
    </head>
    <style>
        ul,
        li {
            list-style: none;
            padding: 0;
            margin: 0;
        }
        
        ul {
            font-size: 0;
        }
        .btn-wrap{
            text-align: center;
            margin-top: 20px;
        }
        .window {
            width: 300px;
            height: 200px;
            overflow: hidden;
            margin: 60px auto;
            border: 1px solid red;
        }
        
        .canvas {
            width: 1200px;
            height: 200px;
        }
        
        .canvas img {
            height: 200px;
            width: 300px;
        }
        
        ul li {
            display: inline-block;
            width: 300px;
            text-align: center;
            background-color: greenyellow;
        }
    </style>
    <body>
        <div>
            <div class="btn-wrap">
                <button id="move">逐帧前进</button>
                <button id="single-reverse">逐帧后退</button>
                <button id="play">整节前进</button>
                <button id="reverse">整节后退</button>
            </div>
            <div class="window">
                <div class="canvas" id="main">
                    <ul>
                        <li class="item"><img draggable="false" src="img/img1.jpg"></li>
                        <li class="item"><img draggable="false" src="img/img2.jpg"></li>
                        <li class="item"><img draggable="false" src="img/img3.jpg"></li>
                    </ul>
                </div>
            </div>
        </div>
    </body>
    <script>
//变量定义
        var canvas = document.getElementsByClassName('canvas')[0],
            main=document.getElementById("main"),//画布元素,也就是移动主体。
            items=document.getElementsByClassName('item'),
            item_len=items.length,
            value = false,//是否在临界值之外,true为在临界值之外,false为临界值之内。
            key=false,//鼠标是否按下
            index=0,//当前是第几节动画
            reverse = false,//节动画是否反方向播放
            single_reverse=false,//帧动画是否反方向播放
            frameTime = 13,//帧与帧之间播放间隔
            stepDistance = (300 / (3000 / 30)), //每次移动的小距离,也就是每帧位移,单位为像素。
            stepDistanceSum = 0; //移动的总距离
//交互
        //顺序播放
        document.getElementById('play').onclick = function() {
            index++;//每单击一次播放一节
            if(index>item_len){
                index=0;//如果节动画完全播放完毕,从头开始播放
            };
            reverse = false;
            value = true;
            littleMove(index);
        };
        //倒叙播放
        document.getElementById('reverse').onclick = function() {
            index--;//每单击一次后退一节
            if(index<0){
                index=0;
            };
            value = true;
            reverse = true;
            littleMove(index);
        };
        //正向移动帧,没有实际意义,用于临界值之内的帧移动
        document.getElementById('move').onclick = function() {
            value = false;
            reverse = false;
            single_reverse=false;
            littleMove(index);
        };
        //反向移动帧,没有实际意义,用于临界值之内的帧后退
        document.getElementById('single-reverse').onclick = function() {
            value = false;
            reverse = false;
            single_reverse=true;
            littleMove(index);
        };
        main.onmousedown=function(e){
            var e = e || event;
            key=true;
        };
        main.onmouseup=function(){
            key=false;
        };
        main.addEventListener('mousemove',function(e){
            var e = e || event;
            if(key){
                //鼠标被按下
                if(stepDistanceSum<50){
                    //并且小于临界值,一帧一帧播放动画
                    value = false;
                    reverse = false;
                    single_reverse=false;
                    littleMove(index);
                }else{
                    //临界值之外,播放完整节动画
                    reverse = false;
                    value = true;
                    littleMove(index);
                }
            }
        });
//动画函数
        function littleMove(index) {
//            console.log('进入littleMove函数');
            if(!value) {
                if(stepDistanceSum<=300*(item_len-1)){
                    //临界值之内,每次交互移动一次
                    if((stepDistanceSum-(300*index))<300) {//如果小于300则一直可以帧移动
                        if(single_reverse){
                            stepDistanceSum -= stepDistance;
                            canvas.style.marginLeft = -stepDistanceSum + 'px';
                        }else{
                            stepDistanceSum += stepDistance;
                            canvas.style.marginLeft = -stepDistanceSum + 'px';
                        }
                    } else {
                    }
                }else{
                    clearInterval(interval);
                }
                
            } else {
                //临界值外,小节动画一次性播放完毕
                var interval = setInterval(function() {
                    if(stepDistanceSum<=300*(item_len-1)){//未超过边界
//                        console.log('边界之内');
                        if(stepDistanceSum%300==0){
                            clearInterval(interval);
                        };
                        if(reverse) {
                            if(stepDistanceSum<0){
                                clearInterval(interval);
                            }else{
                                canvas.style.marginLeft =  +stepDistanceSum + 'px';
                                console.log(stepDistanceSum);
                                stepDistanceSum -= stepDistance;
                                console.log(stepDistanceSum);
                            }
                            
                        } else {
                            canvas.style.marginLeft = -stepDistanceSum + 'px';
                            stepDistanceSum += stepDistance;
                        }
                    }else{//超过边界,从头开始
                        clearInterval(interval);
                        stepDistanceSum=0;
                    }
                }, frameTime)
            }
        };
    </script>
</html>

 

转载于:https://www.cnblogs.com/benxiaohai-microcosm/p/6964123.html

智慧档案馆建设方案旨在通过先进的信息技术和智能化手段,全面提升档案管理的效率和安全性,满足现代档案管理的需求。方案涵盖了软件、硬件、网络及安全、分布式存储、数据保护、机房建设等多个方面,确保档案馆在数字化、智能化转型中具备高效、安全、可扩展的能力。 在软件部分,智慧档案馆平台集成了档案接收、管理、保存、智能库房管理、辅助鉴定、编研、统计、内部利用、电子阅览室智能服务等功能模块。通过智能化的档案接收和管理流程,系统能够高效处理各类档案数据,支持历史数据迁移、数字化成果接收、征集档案接收等操作。智能库房管理模块通过虚拟库房、调卷归卷管理、温湿度管理等功能,确保实体档案的安全保管和高效利用。此外,系统还提供了智能辅助鉴定、编研、统计等功能,帮助档案馆实现档案的智能化管理和利用。 硬件部分则包括网络及安全设备、分布式存储、数据保护一体机、离线备份设备、机房建设等。网络及安全设备如核心交换机、汇聚交换机、下一代防火墙、终端安全管理系统等,确保了档案馆网络的高效运行和数据的安全防护。分布式存储系统通过全分布式架构和数据冗余技术,提供了高可伸缩性和高可用性,支持多副本或EC冗余机制,确保数据的安全性和快速重构。数据保护一体机和离线备份设备则通过多种备份和恢复机制,确保数据的完整性和可恢复性。机房建设部分则通过UPS、精密配电柜、精密空调、冷通道机柜等设备,确保机房的稳定运行和高效管理。 智慧档案馆建设方案不仅顺应了国家档案信息化建设的政策要求,还结合了云计算、区块链等新技术,确保了系统的先进性和安全性。通过智能化的档案管理和高效的数据保护机制,档案馆能够更好地服务于公众,提升档案利用效率,实现档案资源的共建共享。这一方案不仅是档案数字化转型的重要举措,也为未来档案馆的智能化发展奠定了坚实基础。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值