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;
- width: 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%;
- width: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;
- width: 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;
- width: 0px;
- height: 0px;
- border: 10px solid rgba(0, 0, 0, 0);
- border-right: 10px solid #fff;
- }
- /**
- 默认时间轴锚链接的样式
- */
- .time-line-icon{
- width: 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 = /\\|'|\r|\n|\t|\u2028|\u2029/g;
- var escapes = {
- "'": "'",
- '\\': '\\',
- '\r': 'r',
- '\n': 'n',
- '\t': 't',
- '\u2028': 'u2028',
- '\u2029': 'u2029'
- };
- $.templateSettings = {
- evaluate : /<%([\s\S]+?)%>/g,
- interpolate : /<%=([\s\S]+?)%>/g,
- escape : /<%-([\s\S]+?)%>/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 += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'";
- }
- if (interpolate) {
- source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'";
- }
- if (evaluate) {
- source += "';\n" + evaluate + "\n__p+='";
- }
- index = offset + match.length;
- return match;
- });
- source += "';\n";
- // If a variable is not specified, place data values in local scope.
- if (!settings.variable) source = 'with(obj||{}){\n' + source + '}\n';
- source = "var __t,__p='',__j=Array.prototype.join," +
- "print=function(){__p+=__j.call(arguments,'');};\n" +
- source + "return __p;\n";
- 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') + '){\n' + 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>
模板用了underscore,tempate方法挂到了$下, 作为$的工具方法(依赖于jQuery),模板的js代码直接放这里方便一些小项目直接用:
- //模板引擎的代码
- (function () {
- //underscore抄的模板引擎;
- var escaper = /\\|'|\r|\n|\t|\u2028|\u2029/g;
- var escapes = {
- "'": "'",
- '\\': '\\',
- '\r': 'r',
- '\n': 'n',
- '\t': 't',
- '\u2028': 'u2028',
- '\u2029': 'u2029'
- };
- $.templateSettings = {
- evaluate : /<%([\s\S]+?)%>/g,
- interpolate : /<%=([\s\S]+?)%>/g,
- escape : /<%-([\s\S]+?)%>/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 += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'";
- }
- if (interpolate) {
- source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'";
- }
- if (evaluate) {
- source += "';\n" + evaluate + "\n__p+='";
- }
- index = offset + match.length;
- return match;
- });
- source += "';\n";
- // If a variable is not specified, place data values in local scope.
- if (!settings.variable) source = 'with(obj||{}){\n' + source + '}\n';
- source = "var __t,__p='',__j=Array.prototype.join," +
- "print=function(){__p+=__j.call(arguments,'');};\n" +
- source + "return __p;\n";
- 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') + '){\n' + source + '}';
- return template;
- };
- })();
模板的使用的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 = /\\|'|\r|\n|\t|\u2028|\u2029/g;
- var escapes = {
- "'": "'",
- '\\': '\\',
- '\r': 'r',
- '\n': 'n',
- '\t': 't',
- '\u2028': 'u2028',
- '\u2029': 'u2029'
- };
- $.templateSettings = {
- evaluate : /<%([\s\S]+?)%>/g,
- interpolate : /<%=([\s\S]+?)%>/g,
- escape : /<%-([\s\S]+?)%>/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 += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'";
- }
- if (interpolate) {
- source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'";
- }
- if (evaluate) {
- source += "';\n" + evaluate + "\n__p+='";
- }
- index = offset + match.length;
- return match;
- });
- source += "';\n";
- // If a variable is not specified, place data values in local scope.
- if (!settings.variable) source = 'with(obj||{}){\n' + source + '}\n';
- source = "var __t,__p='',__j=Array.prototype.join," +
- "print=function(){__p+=__j.call(arguments,'');};\n" +
- source + "return __p;\n";
- 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') + '){\n' + 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 {width: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>
另外一个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>
HTML5的拖拽提供了 setDragImage ,
等很多便捷的方法给开发者, 通过FileReader读取File, 然后就可以用ajax与后台进行交互, 和前端DOM操作:effectAllowed , setData....
- <!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;
- width: 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;
- width: 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;
- width: 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%;
- width: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{
- width: 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;
- width: 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{
- width: 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 = /\\|'|\r|\n|\t|\u2028|\u2029/g;
- var escapes = {
- "'": "'",
- '\\': '\\',
- '\r': 'r',
- '\n': 'n',
- '\t': 't',
- '\u2028': 'u2028',
- '\u2029': 'u2029'
- };
- $.templateSettings = {
- evaluate : /<%([\s\S]+?)%>/g,
- interpolate : /<%=([\s\S]+?)%>/g,
- escape : /<%-([\s\S]+?)%>/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 += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'";
- }
- if (interpolate) {
- source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'";
- }
- if (evaluate) {
- source += "';\n" + evaluate + "\n__p+='";
- }
- index = offset + match.length;
- return match;
- });
- source += "';\n";
- // If a variable is not specified, place data values in local scope.
- if (!settings.variable) source = 'with(obj||{}){\n' + source + '}\n';
- source = "var __t,__p='',__j=Array.prototype.join," +
- "print=function(){__p+=__j.call(arguments,'');};\n" +
- source + "return __p;\n";
- 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') + '){\n' + 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>
作者: NONO
出处:http://www.cnblogs.com/diligenceday/
QQ:287101329
jQ插件--时间线插件和拖拽API的更多相关文章
- 基于html5拖拽api实现列表的拖拽排序
基于html5拖拽api实现列表的拖拽排序 html代码: <ul ondrop="drop_handler(event);" ondragover="dragov ...
- div/dom元素拖拽缩放插件,纯js实现拖拽缩放,不依赖jQuery~
产品需求,需要用到对div(dom)进行拖拽缩放操作,看到有好多插件,要么依赖jQuery,要么文件太大. 封装了一个插件,不压缩状态下5KB. html <!DOCTYPE html> ...
- DragVideo,一种在播放视频时,可以任意拖拽的方案
转载请把头部出处链接和尾部二维码一起转载,本文出自逆流的鱼yuiop:http://blog.csdn.net/hejjunlin/article/details/53638896 前言 项目已开源到 ...
- Html5 拖拽api
拖拽要有两个元素,一个是要拖动的元素,一个是要放置到的元素. 1, 在默认情况下, 只有图片和文字是可以拖拽的,其它元素都不可以.因此要想使一个元素可拖动,必须设置它的draggable 属性为tru ...
- 强大的jQuery幻灯片播放插件 支持全拼、拖拽和下载等功能
在线演示 本地下载
- 不断优化,重构我的代码-----拖拽jquery插件
最近学东西学的有点太散了,歇一阵子,重新完善之前的JQ插件,今天先上拖拽吧 // JavaScript Document (function($){ var defaults = { actionEl ...
- JQuery之拖拽插件
一直以来,都对JS获取元素的位置感到非常的困惑:一会client.一会offset.一会scroll. 再加上各大浏览器之间的不兼容,唉,搞得哥晕晕乎乎的. 而很多页面效果都要用到这些位置.不得已,得 ...
- 一步一步实现JS拖拽插件
js拖拽是常见的网页效果,本文将从零开始实现一个简单的js插件. 一.js拖拽插件的原理 常见的拖拽操作是什么样的呢?整过过程大概有下面几个步骤: 1.用鼠标点击被拖拽的元素 2.按住鼠标不放,移动鼠 ...
- div拖拽缩放jquery插件编写——带8个控制点
项目中需要对div进行拖拽缩放,需要有控制面板8个控制点的那种,原以为这么常见的效果应该能搜索到很多相关插件,然而可以完成拖拽的实繁,却找不到我想要的,还是自己动手丰衣足食吧 效果预览(只支持pc端) ...
随机推荐
- 分享一例测试环境下nginx+tomcat的视频业务部署记录
需求说明:在测试环境下(192.168.1.28)部署一套公司某业务环境,其中:该业务前台访问地址: http://testhehe.wangshibo.com该业务后台访问地址: http://te ...
- 2055 [ZJOI2009]假期的宿舍
P2055 [ZJOI2009]假期的宿舍 题目描述 学校放假了 · · · · · · 有些同学回家了,而有些同学则有以前的好朋友来探访,那么住宿就是一个问题.比如 A 和 B 都是学校的学生,A ...
- Java集合系列:-----------05LinkedList的底层实现
前面,我们已经学习了ArrayList,并了解了fail-fast机制.这一章我们接着学习List的实现类--LinkedList.和学习ArrayList一样,接下来呢,我们先对LinkedList ...
- 表单验证——JavaScript和Jquery版
1.轻量级的JavaScript表单验证 在应用中引用 validator.min.js 文件 <script type="text/javascript" src=&quo ...
- 启动PPT的时候一直配置vs2013的问题解决
前几天装了VS2013,结果发现每次启动powerpoint都要配置vs2013,虽然时间花的不多,可我看的就是碍眼,我都想把VS2013卸载来解决了.后来抱着试下的态度竟然在google上找到了解决 ...
- There is no ‘Animation’ attached to the “Player” game object
There is no ‘Animation’ attached to the “Player” game object 在照着龚老师的Unity3D投篮游戏视频教程练习时,遇到这个错误提示. 我知道 ...
- 在linux下运行java工程
在linux 服务器上运行JAVA工程需注意.1: 在linux 上: /etc/profile 设置classpath 配置正确的jar 路径.2: 把本地JAVA工程做成一个jar包.如:1. ...
- 让 HTML5 来为你定位
Geolocation HTML5 的 geolocation 是一个令人兴奋的 API,通过这套 API,Javascript 代码就能够访问到用户的当前位置.当然,访问之前必须得到用户的明确认可, ...
- [转]Linux系统中‘dmesg’命令处理故障和收集系统信息的7种用法
'dmesg'命令显示linux内核的环形缓冲区信息,我们可以从中获得诸如系统架构.cpu.挂载的硬件,RAM等多个运行级别的大量的系统信息.当计算机启动时,系统内核(操作系统的核心部分)将会被加载到 ...
- AngularJS中实现无限级联动菜单(使用demo)
昨天没来得及贴几个使用demo,今天补上,供有兴趣的同学参考 :) 1. 同步加载子选项demo2. 异步加载子选项demo3. 初始值回填demo4. 倒金字塔依赖demo directive的源代 ...