TransferToWindow
将指定窗口大小的数据转化输出到另一窗口,并可缩放平移操作新窗口
1. 安装
npm install transfer-to-window
2. 构造
new TransferToWindow(
param: {
inw: number,
inh: number,
outw: number,
outh: number,
minWH?: number,
minWH?: number,
limitInWindow?: boolean,
limitSize?: number,
},
slient?: boolean
) => TransferToWindow
3. API
translate(dx: number, dy: number) => void
zoom(cx: number, cy: number, ratio: number) => void
- 缩放;以InCoor:(cx,cy)为中心缩放到scale比例
zoomToByInCoor(cx: number, cy: number, scale: number) => void
resize() => void
- 将输入窗口的roi:[x,y,width,heigght]区域放置于输出窗口正中间
scrollToRect(x: number, y: number, width: number, height: number, margin?: number) => void
updateMatrix(scale: number, dx: number, dy: number) => void
inCoorIsIn(x: number, y: number) => boolean
outCoorIsIn(x: number, y: number) => boolean
transInToOut(coors: number[]) => number[]
transOutToIn(coors: number[]) => number[]
使用
以下为在浏览器视窗内显示并缩放平移一个HTMLElement的示例
html
<div id="transfer-to-window">
<div class="content" style="width: 16384px; height: 16384px;">
<svg width="16384" height="16384" viewBox="0 0 16384 16384" xmlns="http://www.w3.org/2000/svg">
<defs>
<pattern id="grid" patternUnits="userSpaceOnUse" width="512" height="512">
<g stroke-width="10" stroke="#000" stroke-opacity="1" fill="none">
<path d="M0,0L512,512 M0,512L512,0 M256,0L0,256 M512,256L256,512 M0,256L256,512 M256,0L512,256" />
</g>
</pattern>
</defs>
<rect x="0" y="0" width="16384" height="16384" fill="url(#grid)" />
</svg>
</div>
</div>
css
html,
body,
#transfer-to-window {
width: 100%;
height: 100%;
margin: 0;
overflow: hidden;
}
#transfer-to-window {
position: fixed;
inset: 0;
z-index: 10;
}
#transfer-to-window>.content {
transform-origin: 0 0 0;
}
javascript
import { TransferToWindow } from 'transfer-to-window';
window.onload = function () {
const ele = document.getElementById('transfer-to-window');
const transfer2window = new TransferToWindow({
inw: 16384,
inh: 16384,
outw: ele.clientWidth,
outh: ele.clientHeight,
limitInWindow: true,
})
setTransform();
function getPosition(e) {
let rect = ele.getBoundingClientRect();
return [e.pageX - rect.left, e.pageY - rect.top];
}
function setTransform() {
ele.firstElementChild.style.transform = `translate(${transfer2window.dx}px, ${transfer2window.dy}px) scale(${transfer2window.scale})`
}
document.addEventListener('keyup', function (e) {
transfer2window.resize();
setTransform();
})
ele.addEventListener('wheel', function (e) {
const coor = getPosition(e);
transfer2window.zoom(coor[0], coor[1], e.deltaY < 0 ? 1.1 : 0.9);
setTransform();
})
let pos;
ele.addEventListener('mousedown', function (e) {
pos = getPosition(e);
document.addEventListener('mousemove', mousemove)
document.addEventListener('mouseup', mouseup)
})
function mousemove(e) {
const cur = getPosition(e);
transfer2window.translate(cur[0] - pos[0], cur[1] - pos[1]);
pos = cur;
setTransform();
}
function mouseup() {
document.removeEventListener('mousemove', mousemove)
document.removeEventListener('mouseup', mouseup)
}
}