zoukankan      html  css  js  c++  java
  • jQ插件--时间线插件和拖拽API

      这个时间轴是工作上用到的,自己写了一个, qq空间有时间轴的控件, 百度文库也有时间轴的控件

      百度的时间轴大概是这样的:

      

      用户点击对应的锚链接,  那个三角会滚动, 然后左侧的界面也会滚动;

      实际的效果如下图,用户点击左侧的按钮或者右侧的input,滚动条都会主动滚动, 这里有个小技巧就是用after和before伪类生成三角形, 用户点击按钮的滚动效果直接用jq的animate方法:

      

      点击查看DEMO:打开

    <!--
    //设置内容;
    window.onWebMessage( '{"type":"setItems","data":{"items":[{"name":1111},{"name":2222}]}}' ) ;
    
    //设置内容, 对应的item对象如果active为true为激活态;
    window.onWebMessage( '{"type":"setItems","data":{"items":[{"name":1000},{"name":1111},{"name":2222},{"name":3333,"active":true}]}}' ) ;
    
    //设置某个第n个位置的item;
    window.onWebMessage('{"type":"setItem","data":[2,{ "name" : "add-item"}]}');
    
    //激活第三个锚链接为选中态;
    window.onWebMessage( '{"type":"active","data":2}' )
    
    //获取目前的数据:
    window.onWebMessage( '{"type":"getItem"}' );
    -->
    
    <html>
        <head>
            <meta charset="utf-8" />
            <script src="http://cdn.bootcss.com/jquery/2.1.4/jquery.js"></script>
        </head>
        <style>
            /*初始的reset样式*/
            *{
                margin:0;
                padding:0;
            }
            .time-line-wrap{
                position: relative;
                 400px;
                margin:0 auto;
            }
            ul{
                list-style: none;
            }
            body,html{
                height: 100%;
            }
            body{
                -webkit-user-select: none;
                -moz-user-select: none;
                -ms-user-select: none;
                user-select: none;
            }
    
    
            /*样式开始*/
            .scroll-time-line{
                height:100%;
                overflow: hidden;
            }
            .time-line-wrap{
                position: relative;
            }
            .time-line-ul{
                position: relative;
            }
            /**
            时间轴的轴用伪类实现;
            */
            .time-line-ul::before{
                display: block;
                position:absolute;
                content:"";
                height:100%;
                1;
                left:27px;
                top:0;
                background: #eee;
            }
            .time-line-ul li{
                padding:14px;
                position: relative;
            }
            .time-line-ul input {
                vertical-align: super;
                border-radius: 4px;
                border:1px solid #eee;
                padding:4px;
                line-height: 22px;
                margin-left:10px;
            }
            /**
            使用after和before伪类实现input前面的三角形;
            */
            .time-line-ul li::before{
                position: absolute;
                content: "";
                display: block;
                top: 21px;
                left: 40px;
                 0px;
                height: 0px;
                border: 10px solid rgba(0, 0, 0, 0);
                border-right: 10px solid #EEE;
            }
            .time-line-ul li::after{
                position: absolute;
                content: "";
                display: block;
                top: 21px;
                left: 41px;
                 0px;
                height: 0px;
                border: 10px solid rgba(0, 0, 0, 0);
                border-right: 10px solid #fff;
            }
            /**
            默认时间轴锚链接的样式
            */
            .time-line-icon{
                 26px;
                height: 28px;
                display: inline-block;
                background: url(http://images0.cnblogs.com/blog2015/497865/201507/131424386411828.png);
            }
            /**
            鼠标移动上来,或者锚链接有active时候的背景图样式
            */
            .time-line-icon.active,.time-line-icon:hover{
                background-position: 0px 28px;
            }
        </style>
    
        <!--模板,勿删!-->
        <script type="text/tempate" id="li-tpl">
            <% for(var i=0; i<items.length; i++ ) {%>
                <li class="li-<%=i%>">
                    <a href="###" class="time-line-icon <% if(items[i].active){ %> <%="active"%> <%}%> "></a>
                    <input type="text" value="<%=items[i].name%>"/>
                </li>
            <% } %>
        </script>
    
        <body>
            <!--
            滚动出现在这个div里面
            -->
            <div class="scroll-time-line">
    
                <!---
                时间轴相关的html结构
                -->
                <div class="time-line-wrap">
                    <ul class="time-line-ul">
                        <li>
                            <a href="###" class="time-line-icon"></a> <input type="text" value="2015"/>
                        </li>
                        <li>
                            <a href="###" class="time-line-icon"></a> <input type="text" value="2015"/>
                        </li>
                        <li>
                            <a href="###" class="time-line-icon"></a> <input type="text" value="2015"/>
                        </li>
                        <li>
                            <a href="###" class="time-line-icon"></a> <input type="text" value="2015"/>
                        </li>
                        <li>
                            <a href="###" class="time-line-icon"></a> <input type="text" value="2015"/>
                        </li>
                        <li>
                            <a href="###" class="time-line-icon"></a> <input type="text" value="2015"/>
                        </li>
                        <li>
                            <a href="###" class="time-line-icon"></a> <input type="text" value="2015"/>
                        </li>
                        <li>
                            <a href="###" class="time-line-icon"></a> <input type="text" value="2015"/>
                        </li>
                        <li>
                            <a href="###" class="time-line-icon"></a> <input type="text" value="2015"/>
                        </li>
                        <li>
                            <a href="###" class="time-line-icon"></a> <input type="text" value="2015"/>
                        </li>
                        <li>
                            <a href="###" class="time-line-icon"></a> <input type="text" value="2015"/>
                        </li>
                        <li>
                            <a href="###" class="time-line-icon"></a> <input type="text" value="2015"/>
                        </li>
                        <li>
                            <a href="###" class="time-line-icon"></a> <input type="text" value="2015"/>
                        </li>
                        <li>
                            <a href="###" class="time-line-icon"></a> <input type="text" value="2015"/>
                        </li>
                        <li>
                            <a href="###" class="time-line-icon"></a> <input type="text" value="2015"/>
                        </li>
                        <li>
                            <a href="###" class="time-line-icon"></a> <input type="text" value="2015"/>
                        <li>
                            <a href="###" class="time-line-icon"></a> <input type="text" value="2015"/>
                        </li>
                        <li>
                            <a href="###" class="time-line-icon"></a> <input type="text" value="2015"/>
                        </li>
                        <li>
                            <a href="###" class="time-line-icon"></a> <input type="text" value="2015"/>
                        </li>
                        <li>
                            <a href="###" class="time-line-icon"></a> <input type="text" value="2015"/>
                        </li>
                        <li>
                            <a href="###" class="time-line-icon"></a> <input type="text" value="2015"/>
                        </li>
                    </ul>
                </div>
                <!---
                时间轴相关的html结构结束
                -->
            </div>
            <script>
                //模板引擎的代码
                (function () {
                    //underscore抄的模板引擎;
                    var escaper = /\|'|
    |
    |	|u2028|u2029/g;
    
                    var escapes = {
                        "'":      "'",
                        '\':     '\',
                        '
    ':     'r',
                        '
    ':     'n',
                        '	':     't',
                        'u2028': 'u2028',
                        'u2029': 'u2029'
                    };
    
                    $.templateSettings = {
                        evaluate    : /<%([sS]+?)%>/g,
                        interpolate : /<%=([sS]+?)%>/g,
                        escape      : /<%-([sS]+?)%>/g
                    }
                    $.template = function(text, data, settings) {
                        var render;
                        settings = $.extend({}, settings, $.templateSettings);
    
                        // Combine delimiters into one regular expression via alternation.
                        var matcher = new RegExp([
                            (settings.escape || noMatch).source,
                            (settings.interpolate || noMatch).source,
                            (settings.evaluate || noMatch).source
                        ].join('|') + '|$', 'g');
    
                        // Compile the template source, escaping string literals appropriately.
                        var index = 0;
                        var source = "__p+='";
                        text.replace(matcher, function(match, escape, interpolate, evaluate, offset) {
                            source += text.slice(index, offset)
                                    .replace(escaper, function(match) { return '\' + escapes[match]; });
    
                            if (escape) {
                                source += "'+
    ((__t=(" + escape + "))==null?'':_.escape(__t))+
    '";
                            }
                            if (interpolate) {
                                source += "'+
    ((__t=(" + interpolate + "))==null?'':__t)+
    '";
                            }
                            if (evaluate) {
                                source += "';
    " + evaluate + "
    __p+='";
                            }
                            index = offset + match.length;
                            return match;
                        });
                        source += "';
    ";
    
                        // If a variable is not specified, place data values in local scope.
                        if (!settings.variable) source = 'with(obj||{}){
    ' + source + '}
    ';
    
                        source = "var __t,__p='',__j=Array.prototype.join," +
                                "print=function(){__p+=__j.call(arguments,'');};
    " +
                                source + "return __p;
    ";
    
                        try {
                            render = new Function(settings.variable || 'obj', '_', source);
                        } catch (e) {
                            e.source = source;
                            throw e;
                        }
    
                        if (data) return render(data, _);
                        var template = function(data) {
                            return render.call(this, data);
                        };
    
                        // Provide the compiled function source as a convenience for precompilation.
                        template.source = 'function(' + (settings.variable || 'obj') + '){
    ' + source + '}';
    
                        return template;
                    };
                })();
    
                (function( fn ) {
    
                    $( fn.call( $ ,$) );
    
                })(function ($) {
    
                    $.timeLineSetting = {
                        offsetTop : 100
                    };
                    $.extend($.fn, {
                        timeLine : function() {
                            $.each(this, function() {
    
                                var _this = this;
    
                                $(this).delegate(".time-line-ul>li", "click", function( ev ) {
    
                                    $(".time-line-icon.active").removeClass("active");
    
                                    $(this).find(".time-line-icon").addClass("active");
    
                                    $(_this).animate({scrollTop: this.offsetTop - $.timeLineSetting.offsetTop},300);
    
                                    ev.preventDefault();
    
                                });
                            });
                        }
                    });
                });
                $(function() {
                    var compile= $.template( $("#li-tpl").html() || "");
    
                    //与客户端的交互事件;
                    var orginalData = {};
                    window.onWebMessage = function( msg ) {
                        msg = JSON.parse(msg);
                        switch( msg.type ) {
                            case "setItems" :
                                $(".time-line-ul").html( compile(msg.data) );
                                //结构化复制;
                                orginalData = JSON.parse(JSON.stringify(msg.data));
                                break;
    
                            case "setItem" :
                                orginalData.items&&orginalData.items.splice(msg.data[0],0,msg.data[1]);
                                $(".time-line-ul").html( compile(orginalData) );
                                break;
    
                            case "getItem" :
                                    alert(JSON.stringify( orginalData ));
                                break;
    
                            case "active" :
                                $(".time-line-icon.active").removeClass("active");
                                $(".time-line-ul>li").eq( msg.data).find(".time-line-icon").addClass("active")
                                break;
    
                        };
    
                    };
    
                    //启用插件;
                    $(".scroll-time-line").timeLine();
                })
            </script>
        </body>
    </html>
    View Code

       模板用了underscore,tempate方法挂到了$下, 作为$的工具方法(依赖于jQuery),模板的js代码直接放这里方便一些小项目直接用:

                //模板引擎的代码
                (function () {
                    //underscore抄的模板引擎;
                    var escaper = /\|'|
    |
    |	|u2028|u2029/g;
    
                    var escapes = {
                        "'":      "'",
                        '\':     '\',
                        '
    ':     'r',
                        '
    ':     'n',
                        '	':     't',
                        'u2028': 'u2028',
                        'u2029': 'u2029'
                    };
    
                    $.templateSettings = {
                        evaluate    : /<%([sS]+?)%>/g,
                        interpolate : /<%=([sS]+?)%>/g,
                        escape      : /<%-([sS]+?)%>/g
                    }
                    $.template = function(text, data, settings) {
                        var render;
                        settings = $.extend({}, settings, $.templateSettings);
    
                        // Combine delimiters into one regular expression via alternation.
                        var matcher = new RegExp([
                            (settings.escape || noMatch).source,
                            (settings.interpolate || noMatch).source,
                            (settings.evaluate || noMatch).source
                        ].join('|') + '|$', 'g');
    
                        // Compile the template source, escaping string literals appropriately.
                        var index = 0;
                        var source = "__p+='";
                        text.replace(matcher, function(match, escape, interpolate, evaluate, offset) {
                            source += text.slice(index, offset)
                                    .replace(escaper, function(match) { return '\' + escapes[match]; });
    
                            if (escape) {
                                source += "'+
    ((__t=(" + escape + "))==null?'':_.escape(__t))+
    '";
                            }
                            if (interpolate) {
                                source += "'+
    ((__t=(" + interpolate + "))==null?'':__t)+
    '";
                            }
                            if (evaluate) {
                                source += "';
    " + evaluate + "
    __p+='";
                            }
                            index = offset + match.length;
                            return match;
                        });
                        source += "';
    ";
    
                        // If a variable is not specified, place data values in local scope.
                        if (!settings.variable) source = 'with(obj||{}){
    ' + source + '}
    ';
    
                        source = "var __t,__p='',__j=Array.prototype.join," +
                                "print=function(){__p+=__j.call(arguments,'');};
    " +
                                source + "return __p;
    ";
    
                        try {
                            render = new Function(settings.variable || 'obj', '_', source);
                        } catch (e) {
                            e.source = source;
                            throw e;
                        }
    
                        if (data) return render(data, _);
                        var template = function(data) {
                            return render.call(this, data);
                        };
    
                        // Provide the compiled function source as a convenience for precompilation.
                        template.source = 'function(' + (settings.variable || 'obj') + '){
    ' + source + '}';
    
                        return template;
                    };
                })();
    View Code

      

      模板的使用的DEMO如下, 也可以参考官方的文档:http://underscorejs.org/#template

    <html>
        <head>
            <body>
                <script src="http://cdn.bootcss.com/jquery/2.1.4/jquery.js"></script>
                <script>
                //模板引擎的代码
                (function () {
                    //underscore抄的模板引擎;
                    var escaper = /\|'|
    |
    |	|u2028|u2029/g;
    
                    var escapes = {
                        "'":      "'",
                        '\':     '\',
                        '
    ':     'r',
                        '
    ':     'n',
                        '	':     't',
                        'u2028': 'u2028',
                        'u2029': 'u2029'
                    };
    
                    $.templateSettings = {
                        evaluate    : /<%([sS]+?)%>/g,
                        interpolate : /<%=([sS]+?)%>/g,
                        escape      : /<%-([sS]+?)%>/g
                    }
                    $.template = function(text, data, settings) {
                        var render;
                        settings = $.extend({}, settings, $.templateSettings);
    
                        // Combine delimiters into one regular expression via alternation.
                        var matcher = new RegExp([
                            (settings.escape || noMatch).source,
                            (settings.interpolate || noMatch).source,
                            (settings.evaluate || noMatch).source
                        ].join('|') + '|$', 'g');
    
                        // Compile the template source, escaping string literals appropriately.
                        var index = 0;
                        var source = "__p+='";
                        text.replace(matcher, function(match, escape, interpolate, evaluate, offset) {
                            source += text.slice(index, offset)
                                    .replace(escaper, function(match) { return '\' + escapes[match]; });
    
                            if (escape) {
                                source += "'+
    ((__t=(" + escape + "))==null?'':_.escape(__t))+
    '";
                            }
                            if (interpolate) {
                                source += "'+
    ((__t=(" + interpolate + "))==null?'':__t)+
    '";
                            }
                            if (evaluate) {
                                source += "';
    " + evaluate + "
    __p+='";
                            }
                            index = offset + match.length;
                            return match;
                        });
                        source += "';
    ";
    
                        // If a variable is not specified, place data values in local scope.
                        if (!settings.variable) source = 'with(obj||{}){
    ' + source + '}
    ';
    
                        source = "var __t,__p='',__j=Array.prototype.join," +
                                "print=function(){__p+=__j.call(arguments,'');};
    " +
                                source + "return __p;
    ";
    
                        try {
                            render = new Function(settings.variable || 'obj', '_', source);
                        } catch (e) {
                            e.source = source;
                            throw e;
                        }
    
                        if (data) return render(data, _);
                        var template = function(data) {
                            return render.call(this, data);
                        };
    
                        // Provide the compiled function source as a convenience for precompilation.
                        template.source = 'function(' + (settings.variable || 'obj') + '){
    ' + source + '}';
    
                        return template;
                    };
                })();
                </script>
                <script>
                //会输出 <div>haahah</div>;
                console.log( $.template('<div><%=data%></div>')( {data:"haahah"} ) );
                </script>
            </body>
        </head>
    </html>

      修改了时间轴的样式, 又为这个插件添加了拖拽的方法,代码一下变得好乱, 顺便普及一下拖拽的事件, ondrop, ondragover,ondrag, 如果要让元素可以拖拽, 就要为要拖拽的元素添加draggable="true",   元素可以拖拽以后 , 要为可以拖放到的的DIV或者其他块元素,绑定一个dragover方法, 这个方法就做一件事, ev.preventDefault(), 看代码撒:

    <!DOCTYPE HTML>
    <html>
    <head>
        <meta charset="utf-8"/>
        <style type="text/css">
            #div1 {488px;height:70px;padding:10px;border:1px solid #aaaaaa;}
        </style>
        <script type="text/javascript">
            //当元素dragover时候一定要阻止默认事件, 否则把当前拖拽的元素就无法drop;
            function dragover(ev)
            {
                console.log(ev);
                ev.preventDefault();
            }
    
            //对于拖拽事件最重要的一个事件属性就是dataTransfer;
            function drag(ev)
            {
                console.log(ev);
                ev.dataTransfer.setData("Text",ev.target.id);
            }
    
            function drop(ev)
            {
                console.log(ev);
                var data=ev.dataTransfer.getData("Text");
                ev.target.appendChild(document.getElementById(data));
            }
        </script>
    </head>
    <body>
    
    <p>请把图片拖放到矩形中:</p>
    
    <div id="div1" ondrop="drop(event)" ondragover="dragover(event)"></div>
    <br />
    <img id="drag1" src="http://images0.cnblogs.com/news/24442/201507/081152502219706.gif" draggable="true" ondragstart="drag(event)" />
    
    </body>
    </html>
    View Code

      另外一个DEMO:

    <!DOCTYPE HTML>
    <html>
    <head>
        <meta charset="utf-8"/>
        <style type="text/css">
        </style>
    </head>
    <body>
        <p>What fruits do you like?</p>
        <ol ondragstart="dragStartHandler(event)">
            <li draggable="true" data-value="fruit-apple">Apples</li>
            <li draggable="true" data-value="fruit-orange">Oranges</li>
            <li draggable="true" data-value="fruit-pear">Pears</li>
        </ol>
        <script>
            var internalDNDType = 'text/x-example'; // set this to something specific to your site
            function dragStartHandler(event) {
                if (event.target instanceof HTMLLIElement) {
                    // use the element's data-value="" attribute as the value to be moving:
                    event.dataTransfer.setData(internalDNDType, event.target.dataset.value);
                    event.dataTransfer.effectAllowed = 'move'; // only allow moves
                } else {
                    event.preventDefault(); // don't allow selection to be dragged
                }
            }
        </script>
    
        <p>Drop your favorite fruits below:</p>
        <ol ondrop="dropHandler(event)" ondragover="dragover(event)">
            <!-- don't forget to change the "text/x-example" type to something
            specific to your site -->
            <li>drop</li>
        </ol>
        <script>
            var internalDNDType = 'text/x-example'; // set this to something specific to your site
            function dropHandler(event) {
                var li = document.createElement('li');
                var data = event.dataTransfer.getData(internalDNDType);
                if (data == 'fruit-apple') {
                    li.textContent = 'Apples';
                } else if (data == 'fruit-orange') {
                    li.textContent = 'Oranges';
                } else if (data == 'fruit-pear') {
                    li.textContent = 'Pears';
                } else {
                    li.textContent = 'Unknown Fruit';
                }
                event.target.appendChild(li);
            };
            function dragover(ev) {
                ev.preventDefault();
            };
        </script>
    </body>
    </html>
    View Code

       HTML5的拖拽提供了 setDragImage ,  effectAllowed , setData.... 等很多便捷的方法给开发者,  通过FileReader读取File, 然后就可以用ajax与后台进行交互, 和前端DOM操作:

    <!DOCTYPE HTML>
    <html>
    <head>
        <meta charset="utf-8"/>
        <style type="text/css">
        </style>
    </head>
    <body>
        <div id="div0" ondragover="dragover(event)" ondrop="drop(event)">
            drop拖放文件进来
        </div>
        <script>
            function dragover(ev) {
                ev.preventDefault();
            };
            function drop(ev) {
                var reader = new FileReader();
                reader.onload = function ( ev ) {
                    var oDiv = document.createElement("div");
                    oDiv.innerHTML = ev.target.result;
                    document.body.appendChild( oDiv );
                };
                reader.readAsText( ev.dataTransfer.files[0] );
                ev.preventDefault();
            }
        </script>
    </body>
    </html>

      插件效果图:

      最后完成的插件代码:

    <!--
    //设置内容;
    window.onWebMessage( '{"type":"setItems","data":{"items":[{"name":1111,"type":"doc"},{"name":2222,"type":"doc"}]}}' ) ;
    
    window.onWebMessage( '{"type":"setItems","data":{"items":[{"name":"文档类型","type":"doc"},{"name":"音频类型","type":"audio","active":true},{"name":"视频类型","type":"video"},{"name":"单元测试","type":"test"},{"name":"图片类型","type":"pic"}]}}' ) ;
    
    //设置内容, 对应的item对象如果active为true为激活态;
    window.onWebMessage( '{"type":"setItems","data":{"items":[{"name":1111,"type":"doc"},{"name":2222,"type":"doc","active":true}]}}' ) ;
    
    //设置某个第n个位置的item;
    window.onWebMessage('{"type":"setItem","data":[2,{ "name" : "add-item", "type":"doc"}]}');
    
    //激活第三个锚链接为选中态;
    window.onWebMessage( '{"type":"active","data":2}' )
    
    //获取目前的数据:
    window.onWebMessage( '{"type":"getItem"}' )
    -->
    
    <html>
        <head>
            <meta charset="utf-8" />
            <script src="http://cdn.bootcss.com/jquery/2.1.4/jquery.js"></script>
        </head>
        <style>
            /*初始的reset样式*/
            *{
                margin:0;
                padding:0;
            }
            .time-line-wrap{
                position: relative;
                 400px;
                margin:0 auto;
            }
            ul{
                list-style: none;
            }
            body,html{
                height: 100%;
            }
            body{
                background:#303030;
                -webkit-user-select: none;
                -moz-user-select: none;
                -ms-user-select: none;
                user-select: none;
            }
    
    
            /*样式开始*/
            .scroll-time-line{
                height:100%;
                overflow: hidden;
            }
            .time-line-wrap{
                position: relative;
            }
            .time-line-wrap::before{
                display: block;
                content: "";
                position: absolute;
                border: 2px solid #616161;
                 7px;
                background: #303030;
                height: 7px;
                z-index: 2;
                border-radius: 100%;
                left: 12px;
                top: 0;
            }
            .time-line-wrap::after{
                display: block;
                content: "";
                position: absolute;
                border: 2px solid #616161;
                 7px;
                background: #303030;
                height: 7px;
                z-index: 2;
                border-radius: 100%;
                left: 12px;
                bottom:0;
            }
            .time-line-ul{
                position: relative;
            }
            /**
            时间轴的轴用伪类实现;
            */
            .time-line-ul::before{
                display: block;
                position:absolute;
                content:"";
                height:100%;
                1px;
                left:17px;
                top:0;
                background: #616161;
            }
    
            .time-line-ul li{
                padding: 14px;
                position: relative;
                color: #FFF;
                height: 26px;
            }
            .time-line-ul li>* {
                vertical-align: middle;
                display: inline-block;
            }
    
            /**
            为了更好的维护hover的样式, 背景图片通过js进行管理
            hover start;
            */
            .time-line-ul li b{
                 32px;
                height: 32px;
            }
            .time-line-ul li b.active{
                display: none;
            }
            .time-line-ul li:hover b{
                display: none;
            }
            .time-line-ul li:hover  .active{
                display: inline-block;
            }
            /**
                当li被点击的时候添加的类,优先级
            */
            .time-line-ul li b.show{
                display: none;
            }
            .time-line-ul li b.active.show{
                display: inline-block;
            }
            /**
            hover end
            */
    
            .time-line-ul li span{
                display: inline-block;
                white-space: nowrap;
                word-wrap: normal;
                 100px;
                text-overflow: ellipsis;
                overflow: hidden;
            }
            /**
            当拖拽LI到某个LI上面,这个LI变透明
            */
            .over{
                opacity: 0.4;
            }
            /**
            占位DIV;
            */
            .blank{
                display: block;
                height:50px;
                line-height: 50px;
            }
    
            /**
            默认时间轴锚链接的样式
            */
            .time-line-icon{
                 7px;
                height: 7px;
                display: inline-block;
                background: #616161;
                border-radius: 100%;
            }
            /**
            鼠标移动上来,或者锚链接有active时候的背景图样式
            */
            .time-line-icon.active,.time-line-icon:hover{
                background: #fff;
            }
        </style>
    
        <!--模板,勿删!-->
        <script type="text/tempate" id="li-tpl">
            <% for(var i=0; i<items.length; i++ ) {%>
                <li class="li-<%=i%>" draggable="true">
                    <a href="###" class="time-line-icon <% if(items[i].active){ %> <%="active"%> <%}%> "></a>
                    <b class="">
                        <img src="imgs/<%=items[i].type%>.png" />
                    </b>
                    <b class="active">
                        <img src="imgs/<%=items[i].type%>1.png" />
                    </b>
                    <span>
                        <%=items[i].name%>
                    </span>
                </li>
            <% } %>
        </script>
    
        <body>
            <!--
            滚动出现在这个div里面
            -->
            <div class="scroll-time-line">
    
                <!---
                时间轴相关的html结构
                -->
                <div class="time-line-wrap">
                    <ul class="time-line-ul">
    
                        <!----假数据--->
                        <li class="li-0" draggable="true">
                            <a href="###" class="time-line-icon  "></a>
                            <b class="">
                                <img src="imgs/doc.png">
                            </b>
                            <b class="active">
                                <img src="imgs/doc1.png">
                            </b>
                            <span>
                                文档类型
                            </span>
                        </li>
    
                        <li class="li-2" draggable="true">
                            <a href="###" class="time-line-icon  "></a>
                            <b class="">
                                <img src="imgs/video.png">
                            </b>
                            <b class="active">
                                <img src="imgs/video1.png">
                            </b>
                            <span>
                                视频类型
                            </span>
                        </li>
    
    
    
                        <li class="li-3" draggable="true">
                            <a href="###" class="time-line-icon  "></a>
                            <b class="">
                                <img src="imgs/test.png">
                            </b>
                            <b class="active">
                                <img src="imgs/test1.png">
                            </b>
                            <span>
                                单元测试
                            </span>
                        </li><li class="li-1" draggable="true">
                        <a href="###" class="time-line-icon  active  "></a>
                        <b class="">
                            <img src="imgs/audio.png">
                        </b>
                        <b class="active">
                            <img src="imgs/audio1.png">
                        </b>
                        <span>
                            音频类型
                        </span>
                    </li>
    
                        <li class="li-4" draggable="true">
                            <a href="###" class="time-line-icon  "></a>
                            <b class="">
                                <img src="imgs/pic.png">
                            </b>
                            <b class="active">
                                <img src="imgs/pic1.png">
                            </b>
                        <span>
                            图片类型
                        </span>
                        </li>
    
                        <li class="li-0" draggable="true">
                            <a href="###" class="time-line-icon  "></a>
                            <b class="">
                                <img src="imgs/doc.png">
                            </b>
                            <b class="active">
                                <img src="imgs/doc1.png">
                            </b>
                            <span>
                                文档类型
                            </span>
                        </li>
    
                        <li class="li-2" draggable="true">
                            <a href="###" class="time-line-icon  "></a>
                            <b class="">
                                <img src="imgs/video.png">
                            </b>
                            <b class="active">
                                <img src="imgs/video1.png">
                            </b>
                            <span>
                                视频类型
                            </span>
                        </li>
    
    
    
                        <li class="li-3" draggable="true">
                            <a href="###" class="time-line-icon  "></a>
                            <b class="">
                                <img src="imgs/test.png">
                            </b>
                            <b class="active">
                                <img src="imgs/test1.png">
                            </b>
                            <span>
                                单元测试
                            </span>
                        </li><li class="li-1" draggable="true">
                        <a href="###" class="time-line-icon  active  "></a>
                        <b class="">
                            <img src="imgs/audio.png">
                        </b>
                        <b class="active">
                            <img src="imgs/audio1.png">
                        </b>
                        <span>
                            音频类型
                        </span>
                    </li>
    
                        <li class="li-4" draggable="true">
                            <a href="###" class="time-line-icon  "></a>
                            <b class="">
                                <img src="imgs/pic.png">
                            </b>
                            <b class="active">
                                <img src="imgs/pic1.png">
                            </b>
                            <span>
                                图片类型
                            </span>
                        </li>
    
                        <li class="li-0" draggable="true">
                            <a href="###" class="time-line-icon  "></a>
                            <b class="">
                                <img src="imgs/doc.png">
                            </b>
                            <b class="active">
                                <img src="imgs/doc1.png">
                            </b>
                            <span>
                                文档类型
                            </span>
                        </li>
    
                        <li class="li-2" draggable="true">
                            <a href="###" class="time-line-icon  "></a>
                            <b class="">
                                <img src="imgs/video.png">
                            </b>
                            <b class="active">
                                <img src="imgs/video1.png">
                            </b>
                            <span>
                                视频类型
                            </span>
                        </li>
    
    
    
                        <li class="li-3" draggable="true">
                            <a href="###" class="time-line-icon  "></a>
                            <b class="">
                                <img src="imgs/test.png">
                            </b>
                            <b class="active">
                                <img src="imgs/test1.png">
                            </b>
                            <span>
                                单元测试
                            </span>
                        </li><li class="li-1" draggable="true">
                        <a href="###" class="time-line-icon  active  "></a>
                        <b class="">
                            <img src="imgs/audio.png">
                        </b>
                        <b class="active">
                            <img src="imgs/audio1.png">
                        </b>
                        <span>
                            音频类型
                        </span>
                    </li>
    
                        <li class="li-4" draggable="true">
                            <a href="###" class="time-line-icon  "></a>
                            <b class="">
                                <img src="imgs/pic.png">
                            </b>
                            <b class="active">
                                <img src="imgs/pic1.png">
                            </b>
                            <span>
                                图片类型
                            </span>
                        </li>
    
                        <li class="li-0" draggable="true">
                            <a href="###" class="time-line-icon  "></a>
                            <b class="">
                                <img src="imgs/doc.png">
                            </b>
                            <b class="active">
                                <img src="imgs/doc1.png">
                            </b>
                            <span>
                                文档类型
                            </span>
                        </li>
    
                        <li class="li-2" draggable="true">
                            <a href="###" class="time-line-icon  "></a>
                            <b class="">
                                <img src="imgs/video.png">
                            </b>
                            <b class="active">
                                <img src="imgs/video1.png">
                            </b>
                            <span>
                                视频类型
                            </span>
                        </li>
    
    
    
                        <li class="li-3" draggable="true">
                            <a href="###" class="time-line-icon  "></a>
                            <b class="">
                                <img src="imgs/test.png">
                            </b>
                            <b class="active">
                                <img src="imgs/test1.png">
                            </b>
                            <span>
                                单元测试
                            </span>
                        </li><li class="li-1" draggable="true">
                            <a href="###" class="time-line-icon  active  "></a>
                            <b class="">
                                <img src="imgs/audio.png">
                            </b>
                            <b class="active">
                                <img src="imgs/audio1.png">
                            </b>
                            <span>
                                音频类型
                            </span>
                        </li>
    
                        <li class="li-4" draggable="true">
                            <a href="###" class="time-line-icon  "></a>
                            <b class="">
                                <img src="imgs/pic.png">
                            </b>
                            <b class="active">
                                <img src="imgs/pic1.png">
                            </b>
                            <span>
                                图片类型
                            </span>
                        </li>
    
                        <li class="li-0" draggable="true">
                            <a href="###" class="time-line-icon  "></a>
                            <b class="">
                                <img src="imgs/doc.png">
                            </b>
                            <b class="active">
                                <img src="imgs/doc1.png">
                            </b>
                            <span>
                                文档类型
                            </span>
                        </li>
    
                        <li class="li-2" draggable="true">
                            <a href="###" class="time-line-icon  "></a>
                            <b class="">
                                <img src="imgs/video.png">
                            </b>
                            <b class="active">
                                <img src="imgs/video1.png">
                            </b>
                            <span>
                                视频类型
                            </span>
                        </li>
    
    
    
                        <!---假数据end--->
    
                    </ul>
                </div>
                <!---
                时间轴相关的html结构结束
                -->
            </div>
            <script>
                //模板引擎的代码
                (function () {
                    //underscore抄的模板引擎;
                    var escaper = /\|'|
    |
    |	|u2028|u2029/g;
    
                    var escapes = {
                        "'":      "'",
                        '\':     '\',
                        '
    ':     'r',
                        '
    ':     'n',
                        '	':     't',
                        'u2028': 'u2028',
                        'u2029': 'u2029'
                    };
    
                    $.templateSettings = {
                        evaluate    : /<%([sS]+?)%>/g,
                        interpolate : /<%=([sS]+?)%>/g,
                        escape      : /<%-([sS]+?)%>/g
                    }
                    $.template = function(text, data, settings) {
                        var render;
                        settings = $.extend({}, settings, $.templateSettings);
    
                        // Combine delimiters into one regular expression via alternation.
                        var matcher = new RegExp([
                            (settings.escape || noMatch).source,
                            (settings.interpolate || noMatch).source,
                            (settings.evaluate || noMatch).source
                        ].join('|') + '|$', 'g');
    
                        // Compile the template source, escaping string literals appropriately.
                        var index = 0;
                        var source = "__p+='";
                        text.replace(matcher, function(match, escape, interpolate, evaluate, offset) {
                            source += text.slice(index, offset)
                                    .replace(escaper, function(match) { return '\' + escapes[match]; });
    
                            if (escape) {
                                source += "'+
    ((__t=(" + escape + "))==null?'':_.escape(__t))+
    '";
                            }
                            if (interpolate) {
                                source += "'+
    ((__t=(" + interpolate + "))==null?'':__t)+
    '";
                            }
                            if (evaluate) {
                                source += "';
    " + evaluate + "
    __p+='";
                            }
                            index = offset + match.length;
                            return match;
                        });
                        source += "';
    ";
    
                        // If a variable is not specified, place data values in local scope.
                        if (!settings.variable) source = 'with(obj||{}){
    ' + source + '}
    ';
    
                        source = "var __t,__p='',__j=Array.prototype.join," +
                                "print=function(){__p+=__j.call(arguments,'');};
    " +
                                source + "return __p;
    ";
    
                        try {
                            render = new Function(settings.variable || 'obj', '_', source);
                        } catch (e) {
                            e.source = source;
                            throw e;
                        }
    
                        if (data) return render(data, _);
                        var template = function(data) {
                            return render.call(this, data);
                        };
    
                        // Provide the compiled function source as a convenience for precompilation.
                        template.source = 'function(' + (settings.variable || 'obj') + '){
    ' + source + '}';
    
                        return template;
                    };
                })();
    
                (function( fn ) {
    
                    $( fn.call( $ ,$) );
    
                })(function ($) {
    
                    $.timeLineSetting = {
                        offsetTop : 100
                    };
    
                    $.extend($.fn, {
                        timeLine : function() {
                            $.each(this, function() {
    
                                var _this = this,
                                        eleDrag;
                                $(this).delegate(".time-line-ul>li", "click", function( ev ) {
                                    $(".time-line-icon.active").removeClass("active");
                                    $(this).find(".time-line-icon").addClass("active");
                                    $("b").removeClass("show");
                                    $(this).find("b").addClass("show");
                                    $(_this).animate({scrollTop: this.offsetTop - $.timeLineSetting.offsetTop},300);
                                    ev.preventDefault();
                                }).delegate(".time-line-ul>li","dragstart" , function(ev) {
                                    //不允许img和a的拖拽;
                                    if( ev.target&&ev.target.tagName.toLocaleLowerCase() === "img" || ev.target.tagName.toLocaleLowerCase() === "a") {
                                        return false;
                                    };
                                    /*拖拽开始*/
                                    //拖拽效果
                                    ev.originalEvent.dataTransfer.effectAllowed = "move";
                                    eleDrag = ev.originalEvent.target;
                                    return true;
                                }).delegate(".time-line-ul>li","dragenter" , function(ev) {
                                    return true;
                                }).delegate(".time-line-ul>li", "dragover" , function(ev) {
                                    $(".time-line-ul>li.over").removeClass("over");
                                    $(this).addClass("over");
                                    $(".blank").remove();
                                    var $blank = $("<li class='blank'  draggable='true'></li>");
                                    $(this).after( $blank );
                                    /*拖拽元素在目标元素头上移动的时候*/
                                    ev.preventDefault();
                                    return true;
                                });
                                $(".time-line-ul").bind("drop" , function(ev) {
                                    if(ev.target.tagName.toLocaleLowerCase() === "li") {
                                        $(ev.target).after( eleDrag );
                                    };
                                    $(".blank").remove();
                                    $(".time-line-ul>li.over").removeClass("over");
                                    return false;
                                });
                            });
                        }
                    });
                });
    
                $(function() {
                    var compile= $.template( $("#li-tpl").html() || "");
    
                    //与客户端的交互事件;
                    var orginalData = {};
                    window.onWebMessage = function( msg ) {
                        msg = JSON.parse(msg);
                        switch( msg.type ) {
                            case "setItems" :
                                $(".time-line-ul").html( compile(msg.data) );
                                //结构化复制;
                                orginalData = JSON.parse(JSON.stringify(msg.data));
                                break;
    
                            case "setItem" :
                                orginalData.items&&orginalData.items.splice(msg.data[0],0,msg.data[1]);
                                $(".time-line-ul").html( compile(orginalData) );
                                break;
    
                            case "getItem" :
                                    var result = [];
                                    var lis = $(".time-line-ul li");
                                    for(var i=0; i<lis.length; i++) {
                                        result.push( {
                                           index : i,
                                           src : $(lis[i]).find("img").attr("src"),
                                           name : $(lis[i]).find("span").text()
                                        });
                                    };
                                    alert(JSON.stringify( result ));
                                break;
    
                            case "active" :
                                $(".time-line-icon.active").removeClass("active");
                                $(".time-line-ul>li").eq( msg.data).find(".time-line-icon").addClass("active")
                                break;
    
                        };
    
                    };
    
                    //启用插件;
                    $(".scroll-time-line").timeLine();
                })
            </script>
        </body>
    </html>
    View Code

      FileReader的API

      FILE的API

      HTML拖拽API

    作者: NONO
    出处:http://www.cnblogs.com/diligenceday/
    QQ:287101329 

  • 相关阅读:
    答题技巧总结(高项)
    系统集成 中英文对照 第一季
    系统集成管理项目工程师总结(别人发的 )
    系统集成管理项目工程师总结(别人发的 我觉得很有意思)
    熵、信息增益以及其他
    位运算
    二分查找排序
    在链表中漫游
    Levenshtein距离
    动态规划(dynamic programming)
  • 原文地址:https://www.cnblogs.com/diligenceday/p/4642776.html
Copyright © 2011-2022 走看看