这个时间轴是工作上用到的,自己写了一个, 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 ,  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;
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>

  FileReader的API

  FILE的API

  HTML拖拽API

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

QQ:287101329

jQ插件--时间线插件和拖拽API的更多相关文章

  1. 基于html5拖拽api实现列表的拖拽排序

    基于html5拖拽api实现列表的拖拽排序 html代码: <ul ondrop="drop_handler(event);" ondragover="dragov ...

  2. div/dom元素拖拽缩放插件,纯js实现拖拽缩放,不依赖jQuery~

    产品需求,需要用到对div(dom)进行拖拽缩放操作,看到有好多插件,要么依赖jQuery,要么文件太大. 封装了一个插件,不压缩状态下5KB. html <!DOCTYPE html> ...

  3. DragVideo,一种在播放视频时,可以任意拖拽的方案

    转载请把头部出处链接和尾部二维码一起转载,本文出自逆流的鱼yuiop:http://blog.csdn.net/hejjunlin/article/details/53638896 前言 项目已开源到 ...

  4. Html5 拖拽api

    拖拽要有两个元素,一个是要拖动的元素,一个是要放置到的元素. 1, 在默认情况下, 只有图片和文字是可以拖拽的,其它元素都不可以.因此要想使一个元素可拖动,必须设置它的draggable 属性为tru ...

  5. 强大的jQuery幻灯片播放插件 支持全拼、拖拽和下载等功能

    在线演示 本地下载

  6. 不断优化,重构我的代码-----拖拽jquery插件

    最近学东西学的有点太散了,歇一阵子,重新完善之前的JQ插件,今天先上拖拽吧 // JavaScript Document (function($){ var defaults = { actionEl ...

  7. JQuery之拖拽插件

    一直以来,都对JS获取元素的位置感到非常的困惑:一会client.一会offset.一会scroll. 再加上各大浏览器之间的不兼容,唉,搞得哥晕晕乎乎的. 而很多页面效果都要用到这些位置.不得已,得 ...

  8. 一步一步实现JS拖拽插件

    js拖拽是常见的网页效果,本文将从零开始实现一个简单的js插件. 一.js拖拽插件的原理 常见的拖拽操作是什么样的呢?整过过程大概有下面几个步骤: 1.用鼠标点击被拖拽的元素 2.按住鼠标不放,移动鼠 ...

  9. div拖拽缩放jquery插件编写——带8个控制点

    项目中需要对div进行拖拽缩放,需要有控制面板8个控制点的那种,原以为这么常见的效果应该能搜索到很多相关插件,然而可以完成拖拽的实繁,却找不到我想要的,还是自己动手丰衣足食吧 效果预览(只支持pc端) ...

随机推荐

  1. U-BOOT-Linux启动指令bootm分析

    首先说一下uImage和zImage的区别 uImage是在zImage之前加上信息头.包含系统类型.是否压缩及压缩方式等 bootm命令只能启动uImage 幻数:说得再好听的名字也只不过是个0~0 ...

  2. javascript里面foreach遍历函数介绍,以及跟jquery里面each的区别

    foreach是把数组从头到尾遍历一遍,有三个参数分别是:数组元素,数组索引,数组本身.如果是一个参数,就是数组元素. var data=[1,2,3,4,5,6]; var sum=0; data. ...

  3. python-day02数据类型-字符串和列表的操作

    while循环: while True: 条件语句....... 关于break和continue,break:跳出当前的循环                               contnu ...

  4. PHP-数组函数

    今天在写一个给第三方同步数据的接口时遇到一个这种情况,我有一大坨数据,但是第三方只需要其中的几个而已,不及思索的就开始foreach $ret = array(); foreach ($needPar ...

  5. codevs 1907 方格取数 3

    Description 在一个有m*n 个方格的棋盘中,每个方格中有一个正整数.现要从方格中取数,使任意2 个数所在方格没有公共边,且取出的数的总和最大.试设计一个满足要求的取数算法. Input 第 ...

  6. [转]使用URLDecoder和URLEncoder对中文进行处理

    一 URLEncoder HTML 格式编码的实用工具类.该类包含了将 String 转换为 application/x-www-form-urlencoded MIME 格式的静态方法.有关 HTM ...

  7. Linux Linux程序练习十五(进程间的通信共享内存版)

    /* * 题目: * 编写程序,要去实现如下功能: 父进程创建子进程1和子进程2.子进程1向子进程2发送可靠信号,并传送额外数据为子进程1的pid*2; 子进程2接受可靠信号的值,并发送给父进程,父进 ...

  8. 基于ASP.NET MVC的热插拔模块式开发框架(OrchardNoCMS)--BootStrap

    按照几个月之前的计划,也应该写一个使用Bootstrap作为OrchardNoCMS的UI库.之前这段时间都是在学习IOS开发,没顾得上写,也没顾得上维护OrchardNoCMS代码.看看我的活动轨迹 ...

  9. 极简Word排版示例(以Word2013为例)

    文档标题 第一行写下文档的名字,居中,微软雅黑字体,三号 章节标题 每一章的标题单独一行,光标选中这行,设置为标题1 每一节的标题单独一行,光标选中这行,设置为标题2 全部章节标题设置完毕后,下一步 ...

  10. Use Dapper ORM With ASP.NET Core

    Dapper.NET is not just another ORM tool, it's considered as the king of ORM. Because it's fast, easy ...