css.css" type="text/css" rel="stylesheet" />
.graphical-sort{ position: relative; width: 100%; height: 100%; padding-top: 40px; }
.graphical-sort .bars-container{ height: 100%; background: #222; white-space: nowrap; overflow: hidden; }
.graphical-sort .bars-container span{ display: inline-block; position: relative; height: 100%; background: #35bddb; border-left: 1px solid #222;
-webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; }
.graphical-sort .bars-container span.highlight{ background: #aee496; }
.graphical-sort .controller{ position: absolute; font-size: 10px; white-space: nowrap; overflow: visible; top: 0px; } .graphical-sort .controller .widget{ margin-right: 5px; }
.graphical-sort .controller .speed-amount{ display: inline-block; }
.graphical-sort .controller .speed-slider{ display: inline-block; }
// ----------------------------------------- // utils // ----------------------------------------- jquery.fn.swap = function(b){ b = jquery(b)[0]; var a = this[0]; var temp = a.parentnode.insertbefore(document.createtextnode(''), a); b.parentnode.insertbefore(a, b); temp.parentnode.insertbefore(b, temp); temp.parentnode.removechild(temp); return this; }
array.prototype.insert = function(value, index){ var array = this for(var i = array.length - 1; index array[i + 1] = array[i] } array[index] = value }
array.prototype.insertbefore = function(from, to){ this.insert(this[from], to) if(to from += 1 } this.splice(from, 1) } array.prototype.swap = function(a, b){ var temp = this[a] this[a] = this[b] this[b] = temp }
function range(min, max){ var array = [] while(min array.push(min) min++ } return array }
function randrange(min, max){ return math.floor(math.random() * (max - min)) + min }
function shuffle(array){ var length = array.length for(var i = 0; i var j = randrange(0, length) var temp = array[i] array[i] = array[j] array[j] = temp } return array }
window.profile = { nowprofiling: false, start: function(name){ if(profile === false) return if(this.nowprofiling){ console.profileend() } this.nowprofiling = true console.profile(name) }, end: function(){ if(profile === false) return this.nowprofiling = false console.profileend() } }
// ----------------------------------------- // queue class // ----------------------------------------- var queue = class.$extend({ __init__: function(){ this.length = 0 this.i = 0 this.queue = [] }, get: function(){ if(this.length === 0) return undefined this.length-- return this.queue[this.i++] }, put: function(value){ this.queue.push(value) this.length++ } })
// ----------------------------------------- // controller class // ----------------------------------------- controller = class.$extend({ widget: $(""), reset: $.noop, onspeedchange: $.noop, onlengthchange: $.noop, __init__: function(defaults){ this.element = $("
_createrestartbutton: function(){ var self = this var button = $("重新演示").button().click(function(){ self.restart() }) return this.widget.clone().append(button) }, _createspeedslider: function(defaultspeed){ var self = this var amount = $("").text(defaultspeed) var slider = $("") slider.slider({ min: 1, max: 300, value: defaultspeed, slide: function(event, ui){ amount.text(ui.value) self.onspeedchange(ui.value) } })
var sliderwrapper = $("").append(amount).append(slider) return this.widget.clone().text("演示速度: ").append(sliderwrapper) }, _createlengthbuttonset: function(defaultlength){ var self = this var buttonset = this.widget.clone().addclass("length-button") var radioname = "graphical-sort-radio" var _label = $("") var _radio = $("").attr("name", radioname) $.each([5, 10, 30, 50, 100, 200], function(i, length){ var label = _label.clone().text(length + "个排序").attr("for", radioname + length) var radio = _radio.clone().attr("id", radioname + length).val(length) buttonset.append(label).append(radio) }) buttonset.find("input[value=" + defaultlength + "]").attr("checked", "checked") buttonset.buttonset() buttonset.click(function(event, ui){ self.onlengthchange(parseint(event.target.value)) }) return buttonset } }) // ----------------------------------------- // bar class // ----------------------------------------- var bar = class.$extend({ __init__: function(value){ this.value = value }, createelement: function(){ var bar = $("") return bar } })
// ----------------------------------------- // bars class // ----------------------------------------- var bars = class.$extend({ __init__: function(length, container){ this.length = length this.container = container this.bars = [] var values = this.values = shuffle(range(1, length+1)) for(var i = 0; i this.bars[i] = bar(values[i]) } this.elements = this._createelements() },
swap: function(a, b, command){ var classname = "highlight" var elements = this.container.find("span") elements.removeclass(classname) var bara = elements.eq(a) var barb = elements.eq(b) bara[0].classname = barb[0].classname = classname if(command === c.swap){ barb.swap(bara) } }, insert: function(from, to){ var elements = this.container.find("span").removeclass("highlight") this.container[0].insertbefore(elements.eq(from).addclass("highlight")[0], elements[to]) }, _createelements: function(){ var elements = $() var length = this.length $.each(this.bars, function(){ var bar = this var element = bar.createelement() element.css("width", 100 / length + "%") element.css("height", bar.value / length * 100 + "%") elements = elements.add(element) }) return elements } })
var command = class.$extend({ __classvars__: { highlight: "highlight", swap: "swap", insert: "insert", set: "set" } }) var c = command
// ----------------------------------------- // graphicalsort class // ----------------------------------------- graphicalsort = class.$extend({ length: 30, // default list length speed: 100, // default speed currenttaskid: -1, __init__: function(){}, // graphical api compare: function(a, b){ var command = c.highlight if(this.values[a] > this.values[b]){ this.values.swap(a, b) command = c.swap } this.task.put([a, b, command]) }, // graphical api highlight: function(a, b){ this.task.put([a, b, c.highlight]) }, // graphical api swap: function(a, b){ this.values.swap( a, b) this.task.put([a, b, c.swap]) }, // graphical api insertbefore: function(from, to){ this.values.insertbefore(from, to) this.task.put([from, to, c.insert]) }, show: function(viewelement){ if(this.sortfunc === undefined){ throw error("sort function is undefined") } this.$sort = $("
_inittask: function(){ this.task = queue() this.sortfunc() }, _next: function(){ var order = this.task.get() if(order === undefined){ this.complete() return } var command = order[2] if(command === c.insert){ this.bars.insert(order[0], order[1]) }else{ this.bars.swap(order[0], order[1], command) }
this._settimeout() }, _settimeout: function(){ var self = this var interval = 2000 / this.speed this.currenttaskid = settimeout(function(){ self._next() }, interval) } })
})()
永远的蔚蓝星球遗迹券获取途径
伊瑟西尔比技能加点及搭配推荐
王者荣耀10周年限时点券商城皮肤换哪个好-十周年限时点券商城皮肤兑换推荐
新月同行周年福利兑换码分享
古今2风起蓬莱毒流玩法攻略分享
三国群英传鸿鹄霸业每周礼包码分享
功夫熊猫3最新版
疯狂的麦咭游戏
奥特曼传说之战游戏
企鹅侦探
修复大师
修复大师是一款非常好玩的经营类手游,你需要接手一个被龙卷风袭
美味餐厅模拟经营模拟器
美味餐厅模拟经营模拟器带来深度沉浸的餐饮管理体验,您将化身餐
高校模拟器2025汉化版
高校模拟器2025是一款很好玩的模拟手游,游戏是以女子高中的
一亿小目标手游
如果让你的人生从来,你可以像王健林一样霸气的表示一亿小目标吗
一亿小目标手机版2019
一亿小目标手机版2019趣味休闲模拟游戏,玩家在游戏中将会通