这个时间轴是工作上用到的,自己写了一个, qq空间有时间轴的控件, 百度文库也有时间轴的控件;
百度的时间轴大概是这样的:
用户点击对应的锚链接, 那个三角会滚动, 然后左侧的界面也会滚动;
实际的效果如下图,用户点击左侧的按钮或者右侧的input,滚动条都会主动滚动, 这里有个小技巧就是用after和before伪类生成三角形, 用户点击按钮的滚动效果直接用jq的animate方法:
<!--
//设置内容;
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>
以上所述就是本文的全部内容了,希望大家能够喜欢。
本文地址:https://www.stayed.cn/item/25134
转载请注明出处。
本站部分内容来源于网络,如侵犯到您的权益,请 联系我