diff --git a/demos/zoom-wheel.html b/demos/zoom-wheel.html index 06eb90e7..1c35cd3e 100644 --- a/demos/zoom-wheel.html +++ b/demos/zoom-wheel.html @@ -46,45 +46,168 @@ let over = u.over; let rect = over.getBoundingClientRect(); - // wheel drag pan - over.addEventListener("mousedown", e => { - if (e.button == 1) { - // plot.style.cursor = "move"; - e.preventDefault(); + // all axes add event + for(let key in u.axes){ + let axis = u.axes[key]._el; + + let a_rect = axis.getBoundingClientRect(); + + axis._params = [key, a_rect]; + + axis.addEventListener("mousedown", e => { + // wheel drag pan + if (e.button == 1) { + e.preventDefault(); + + let key = e.target._params[0]; + // sacle ID + let scale_key = u.axes[key].scale; + + let scale = u.scales[scale_key] + let umin = scale.min; + let umax = scale.max; + + let scale_scale = u.posToVal(0, scale_key) - u.posToVal(1, scale_key); + + let left0 = e.clientX; + let top0 = e.clientY; - let left0 = e.clientX; - // let top0 = e.clientY; + function onmove(e) { + e.preventDefault(); - let scXMin0 = u.scales.x.min; - let scXMax0 = u.scales.x.max; + let left1 = e.clientX; + let top1 = e.clientY; + let dt = 0; + if(scale.ori === 0){ // x sacle + let dx = (left1 - left0); + dt = dx; + }else if(scale.ori === 1){ + let dy = top1 - top0; + dt = dy; + }else{return;} - let xUnitsPerPx = u.posToVal(1, 'x') - u.posToVal(0, 'x'); + let urange = [] + for(let key in u.scales){ + urange[key] = [u.scales[key].min, u.scales[key].max]; + } - function onmove(e) { - e.preventDefault(); + u.setScale(scale_key, { + min: umin + dt*scale_scale, + max: umax + dt*scale_scale, + }); + // restore other scale + for(let key in urange){ + if(key !== scale_key){ + u.setScale(key, { + min: urange[key][0], + max: urange[key][1], + }); + } + } + + } + + function onup(e) { + document.removeEventListener("mousemove", onmove); + document.removeEventListener("mouseup", onup); + } + document.addEventListener("mousemove", onmove); + document.addEventListener("mouseup", onup); + } + }); - let left1 = e.clientX; - // let top1 = e.clientY; + // wheel scroll zoom + axis.addEventListener("wheel", e=>{ + e.preventDefault(); + + let key = e.target._params[0]; + let scale_key = u.axes[key].scale; + + let range = u.scales[scale_key].max - u.scales[scale_key].min; + let val = (u.scales[scale_key].max + u.scales[scale_key].min)/2; + + range = e.deltaY < 0 ? range *factor: range / factor; - let dx = xUnitsPerPx * (left1 - left0); + let nMin = val -range/2; + let nMax = val +range/2; + + let urange = [] + for(let key in u.scales){ + urange[key] = [u.scales[key].min, u.scales[key].max]; + } - u.setScale('x', { - min: scXMin0 - dx, - max: scXMax0 - dx, + u.batch(() => { + u.setScale(scale_key, { + min: nMin, + max: nMax, }); + }); + + for(let key in urange){ + if(key !== scale_key){ + u.setScale(key, { + min: urange[key][0], + max: urange[key][1], + }); + } + } + }); + + } + + + // wheel drag pan on scale axes + over.addEventListener("mousedown", e => { + if (e.button == 1) { + e.preventDefault(); + // 记录起始位置 + let left0 = e.clientX; + let top0 = e.clientY; + let scY = new Array() + for(var key in u.scales){ + scY[key] = [u.scales[key].min, u.scales[key].max, u.posToVal(1, key) - u.posToVal(0, key), u.scales[key].ori]; } + function onmove(e) { + e.preventDefault(); + + let left1 = e.clientX; + let top1 = e.clientY; + + let dx = (left1 - left0); + let dy = top1 - top0; + for(var key in u.scales){ + if(scY[key] !== null){ + let dt = 0; + if(scY[key][3] === 0){ + // x轴 + dt = dx; + } + else if(scY[key][3] === 1){ + // y 轴 + dt = dy; + }else{ + continue; + } + u.setScale(key, { + min: scY[key][0] - dt*scY[key][2], + max: scY[key][1] - dt*scY[key][2], + }); + } + + } + } + function onup(e) { document.removeEventListener("mousemove", onmove); document.removeEventListener("mouseup", onup); } - document.addEventListener("mousemove", onmove); document.addEventListener("mouseup", onup); } }); - // wheel scroll zoom + //wheel scroll zoom over.addEventListener("wheel", e => { e.preventDefault(); @@ -92,31 +215,31 @@ let leftPct = left/rect.width; let btmPct = 1 - top/rect.height; - let xVal = u.posToVal(left, "x"); - let yVal = u.posToVal(top, "y"); - let oxRange = u.scales.x.max - u.scales.x.min; - let oyRange = u.scales.y.max - u.scales.y.min; - let nxRange = e.deltaY < 0 ? oxRange * factor : oxRange / factor; - let nxMin = xVal - leftPct * nxRange; - let nxMax = nxMin + nxRange; - [nxMin, nxMax] = clamp(nxRange, nxMin, nxMax, xRange, xMin, xMax); + let oRange = new Array(); + for(var key in u.scales){ + let Val = 0; + // ?? + if(u.scales[key].ori == 0){ + Val = u.posToVal(left,key); + }else if(u.scales[key].ori == 1){ + Val = u.posToVal(top, key) + }else{ continue;} - let nyRange = e.deltaY < 0 ? oyRange * factor : oyRange / factor; - let nyMin = yVal - btmPct * nyRange; - let nyMax = nyMin + nyRange; - [nyMin, nyMax] = clamp(nyRange, nyMin, nyMax, yRange, yMin, yMax); + let range = u.scales[key].max - u.scales[key].min; + let nRange = e.deltaY < 0 ? range * factor : range / factor; + let nMin = Val - leftPct * nRange; + let nMax = nMin + nRange; + oRange[key] = [nMin, nMax]; + } u.batch(() => { - u.setScale("x", { - min: nxMin, - max: nxMax, - }); - - u.setScale("y", { - min: nyMin, - max: nyMax, - }); + for(var key in oRange){ + u.setScale(key, { + min: oRange[key][0], + max: oRange[key][1], + }); + } }); }); } @@ -169,4 +292,4 @@ makeChart(); - \ No newline at end of file +