📄 range.js
字号:
/*
300: ruler width
30: ruler height
15: ruler shadow height
15: indicator width => 8: indicator offset
14: indicator height
*/
Class("linb.UI.Range", ["linb.UI","linb.absValue"],{
Instance:{
_setCtrlValue:function(value){
return this.each(function(profile){
var p=profile.properties,
tpl=p.captionTpl,
fun=function(k){return profile.getSubNode(k)},
fun1=function(a,i){a.cssPos({left:profile[i], top: box._x2y(profile[i])}) },
fun2=function(o,v){o.get(0).style.width = v +'px'},
title = fun('CAPTION'),
a=fun('IND1'),
b=fun('IND2'),
r1 = fun('RULER1'),
r3 = fun('RULER3'),
box = profile.box,
arr = box._v2a(value);
profile._rate= 300/(p.max-p.min);
//use Math.round
profile._v1= Math.round((arr[0]-p.min) / (p.max-p.min) *300) ;
profile._v2= Math.round((1-(p.max - arr[1]) / (p.max-p.min)) *300);
//text value
title.html(box._buildTpl(p.singleValue,tpl, arr,p.unit),false);
//indicator position
fun1(a, '_v1');
fun1(b,'_v2');
//background div width
fun2(r1, profile._v1+8);
fun2(r3, 300 - profile._v2+8);
});
},
_setDirtyMark:function(){
return this.each(function(profile){
if(!profile.domNode)return;
var properties = profile.properties,
o=profile.getSubNode('BOX'),
flag=properties.value !== properties.$UIvalue,
cls=linb.UI.$css_tag_dirty;
if(profile.beforeDirtyMark && false===profile.boxing().beforeDirtyMark(profile,flag))
return;
if(flag)
o.addClass(cls);
else
o.removeClass(cls);
});
}
},
Static:{
Templates:{
style:'{_style}',
BOX:{
tagName:'div',
RULER:{
tagName:'div',
IND1:{
tagName:'a',
href:linb.$href,
tabindex:'{tabIndex}',
style:'{_single}'
},
IND2:{
tagName:'a',
href:linb.$href,
tabindex:'{tabIndex}'
},
RULER1:{
style:'{_single}'
},
RULER3:{}
},
TAIL:{
tagName:'div',
CAPTION:{
tagName:'div'
},
MIN:{
text:'{min}'
},
MAX:{
text:'{max}'
}
}
}
},
Appearances:{
'KEY, RULER, IND1, IND1':{
'font-size':0,
'line-height':0,
position:'relative'
},
BOX:{
position:'absolute',
left:0,
top:0,
width:'316px'
},
'CAPTION, IND1, TAIL, MIN':{
'font-size':'12px',
'line-height':'12px'
},
RULER:{
$order:1,
position:'relative',
height:'30px',
overflow:'visible',
'margin-bottom':'3px',
background: linb.UI.$bg('cmds.gif', ' no-repeat left -241px', true)
},
'RULER1, RULER3':{
position:'absolute',
top:0,
height:'30px',
width:'300px'
},
RULER1:{
left:0,
background: linb.UI.$bg('cmds.gif', ' no-repeat left -271px', true)
},
RULER3:{
right:0,
background: linb.UI.$bg('cmds.gif', ' no-repeat right -271px', true)
},
'IND1,IND2':{
display:linb.$inlineBlock,
zoom:linb.browser.ie6?1:null,
'z-index':'2',
width:'15px',
height:'14px',
position:'absolute'
},
IND1:{
background: linb.UI.$bg('cmds.gif', ' no-repeat left -225px', true),
left:'0px',
top:'11px'
},
IND2:{
background: linb.UI.$bg('cmds.gif', ' no-repeat -15px -225px', true),
left:'300px',
top:'1px'
},
TAIL:{
$order:2,
width:'300px',
position:'relative'
},
CAPTION:{
position:'relative',
'text-align':'center'
},
MIN:{
position:'absolute',
left:0,
top:0
},
MAX:{
position:'absolute',
right:0,
top:0
}
},
Behaviors:{
IND1:{
onKeydown:function(profile, e, src){
profile.box._keydown.apply(profile.box,[profile, e, src,0]);
},
onMousedown:function(profile, e, src){
var p=profile.properties,
box=profile.box,
arr = box._v2a(p.$UIvalue);
linb([src]).startDrag(e,{
widthIncrement:p.steps?p.width/p.steps:null,
dragType:'move',
targetReposition:true,
horizontalOnly:true,
maxLeftOffset: Math.floor(profile._v1),
maxRightOffset: Math.floor(profile._v2-profile._v1),
dragCursor:'default'
});
linb([src]).css('zIndex',10).focus();
profile.getSubNode('IND2').css('zIndex',5);
},
onDrag:function(profile, e, src){
var d=linb.DragDrop.getProfile();
profile.box._ondrag.apply(profile.box,[profile,d.curPos.left,src,0]);
},
onDragstop:function(profile, e, src){
var p=profile.properties,
box=profile.boxing(),
rate = profile._rate,
d=linb.DragDrop.getProfile(),
f,
arr = p.$UIvalue.split(':');
profile._v1=d.curPos.left;
arr[0]= Math.floor((profile._v1)/rate + p.min);
box.setUIValue(arr.join(':'));
if(profile._v1==profile._v2){
linb([src]).css('zIndex',10);
profile.getSubNode('IND2').css('zIndex',5);
}
}
},
IND2:{
onKeydown:function(profile, e, src){
profile.box._keydown.apply(profile.box,[profile, e, src,1]);
},
onMousedown:function(profile, e, src){
var p=profile.properties,
box=profile.box,
arr = box._v2a(p.$UIvalue);
linb([src]).startDrag(e,{
widthIncrement:p.steps?p.width/p.steps:null,
dragType:'move',
targetReposition:true,
horizontalOnly:true,
maxLeftOffset: Math.floor(profile._v2-profile._v1),
maxRightOffset: Math.floor(300 - profile._v2),
dragCursor:'default'
});
linb([src]).css('zIndex',10).focus();
profile.getSubNode('IND1').css('zIndex',5);
},
onDrag:function(profile, e, src){
var d=linb.DragDrop.getProfile();
profile.box._ondrag.apply(profile.box,[profile,d.curPos.left,src,1]);
},
onDragstop:function(profile, e, src){
var p=profile.properties,
box=profile.boxing(),
rate = profile._rate,
d=linb.DragDrop.getProfile(),
f,
arr = p.$UIvalue.split(':');
profile._v2=d.curPos.left;
arr[1]= Math.floor((profile._v2)/rate + p.min);
box.setUIValue(arr.join(':'));
}
}
},
DataModel:{
position:'absolute',
width:300,
height:46,
min:{
ini:0,
action:function(){
var self=this,t,pro=self.properties,b=self.boxing();
b.refresh();
if(pro.$UIvalue!=(t=this.box._ensureValue(self,pro.$UIvalue)))
b.setValue(t);
}
},
max:{
ini:100,
action:function(){
var self=this,t,pro=self.properties,b=self.boxing();
b.refresh();
if(pro.$UIvalue!=(t=this.box._ensureValue(self,pro.$UIvalue)))
b.setValue(t);
}
},
unit:{
ini:'',
action:function(){
this.boxing()._setCtrlValue(this.properties.$UIvalue);
}
},
steps:0,
captionTpl:{
ini:'{fromvalue}{unit} - {tovalue}{unit}',
action:function(){
this.boxing()._setCtrlValue(this.properties.$UIvalue);
}
},
value:'0:100',
singleValue:{
ini:false,
action:function(v){
this.boxing().refresh();
}
}
},
_prepareData:function(profile){
var d=arguments.callee.upper.call(this, profile);
var p=profile.properties,
arr=profile.box._v2a(p.value);
d._single = p.singleValue?'display:none':'';
p.min=parseFloat(p.min);
p.max=parseFloat(p.max);
d.min = d.min + p.unit;
d.max = d.max + p.unit;
return d;
},
_ensureValue:function(profile, value){
var p = profile.properties,
a = value.split(':'),
min=p.min,
max=p.max,
b=[],
f1=function(a){return parseFloat(a)},
f2=function(a){return Math.min(max, Math.max(min,a))};
b[0]= f1(a[0]);
b[1]= f1(a[1]);
b[0] = Math.min(b[0],b[1]);
if(!min)min=b[0];
if(!max)max=b[1];
b[0]= f2(b[0]);
b[1]= f2(b[1]);
return b.join(':');
},
_v2a:function(value){
return typeof value == 'string'? value.split(':') : value;
},
_buildTpl:function(single,tpl,arr,unit){
return single?
arr[1] + unit
: tpl.replace(/\{fromvalue\}/g,arr[0]).replace(/\{tovalue\}/g,arr[1]).replace(/\{unit\}/g,unit);
},
_x2y:function(x){
return Math.floor(15 + 1 - (x) * (15/300));
},
_keydown:function(profile, e, src,type){
var key=linb.Event.getKey(e);
if(key[0]=='left' || key[0]=='right'){
var s=src.style, left=parseInt(s.left), pro=profile.properties, steps=pro.steps, span=300/steps, v,f=function(key){
return parseInt(profile.getSubNode(key).get(0).style.left);
};
left += key[0]=='left'?-1:1;
if(steps){
left = left-left%span;
if(key[0]=='right')
left += span;
}
if(!pro.singleValue)
if(type===0){
v=f('IND2');
if(left>v)left=v;
}else{
v=f('IND1');
if(left<v)left=v;
}
if(left<0)left=0;
if(left>300)left=300;
s.left=left+'px';
profile.box._ondrag.apply(profile.box,[profile,left,src,1]);
var rate = profile._rate,
arr = pro.$UIvalue.split(':');
if(type===0){
profile._v1=left;
arr[0]= Math.floor((profile._v1)/rate + pro.min);
}else{
profile._v2=left;
arr[1]= Math.floor((profile._v2)/rate + pro.min);
}
profile.boxing().setUIValue(arr.join(':'));
}
},
_ondrag:function(profile, left, src, tag){
var p=profile.properties,
d=linb.DragDrop.getProfile(),
box=profile.box,
fun=function(k){return profile.getSubNode(k)},
fun2=function(o,v){o.get(0).style.width = v +'px'},
cap = fun('CAPTION'),
r1 = fun('RULER1'),
r3 = fun('RULER3'),
t,f,
arr=this._v2a(p.$UIvalue);
//adjust top
src.style.top = this._x2y(left) + 'px';
t = Math.floor((left)/profile._rate + p.min);
if(tag){
arr[1] = t;
fun2(r3, 300 - left + 8);
}else{
arr[0] = t;
fun2(r1, left + 8);
}
cap.html(box._buildTpl(p.singleValue, p.captionTpl, arr,p.unit),false);
}
}
});
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -