forked from InkTimeRecord/TTime
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathscreenshot.html
175 lines (160 loc) · 4.69 KB
/
screenshot.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
<!DOCTYPE html>
<html>
<head>
<meta charset='UTF-8'>
<title>截屏</title>
</head>
<style>
html, body, div {
margin: 0;
padding: 0;
box-sizing: border-box;
overflow: hidden
}
.bg {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
/*opacity: 0;*/
}
.rect {
position: absolute;
z-index: 1;
}
.size-info {
position: absolute;
color: #ffffff;
font-size: 12px;
background: rgba(40, 40, 40, 0.8);
padding: 5px 10px;
border-radius: 2px;
font-family: Arial Consolas sans-serif;
display: none;
z-index: 2;
}
#magnifierDiv {
position: absolute;
border: 2px solid grey;
overflow: hidden;
cursor: none;
}
#magnifierDiv:before {
content: "";
background-color: grey;
position: absolute;
top: 50%;
left: 0;
width: 100%;
height: 1px;
z-index: 1;
}
#magnifierDiv:after {
content: "";
background-color: grey;
position: absolute;
top: 0;
left: 50%;
width: 1px;
height: 100%;
z-index: 1;
}
</style>
<body>
<input type='hidden' id='screenId'>
<div id='bgBlock'>
<img class='bg' />
</div>
<canvas class='rect'></canvas>
<div class='size-info'></div>
<script>
window.addEventListener('error', function (event) {
window.api.logErrorEvent('[截图窗口异常]', event.error)
});
// 放大镜尺寸
const magnifierDivSize = 120
// 放大镜放大倍数
const magnifierZoom = 3
const bgBlock = document.getElementById('bgBlock')
// 复制背景块内所有元素
let copy = bgBlock.cloneNode(true)
// 获取背景块内的背景图作为放大镜图
let magnifierImg = copy.getElementsByTagName('img')[0]
copy.style.zoom = magnifierZoom
copy.style.width = (bgBlock.offsetWidth * magnifierZoom) + 'px'
copy.style.heigth = (bgBlock.offsetHeight * magnifierZoom) + 'px'
copy.style.position = 'absolute'
// 放大镜清空class 主要清除从背景图复制过来的样式
magnifierImg.removeAttribute('class')
// 设置放大镜ID
magnifierImg.setAttribute('id', 'magnifierImg')
// 构建放大镜外围Div
const magnifierDiv = document.createElement('div')
magnifierDiv.setAttribute('id', 'magnifierDiv')
magnifierDiv.style.width = magnifierDivSize + 'px'
magnifierDiv.style.height = magnifierDivSize + 'px'
// 默认放大器隐藏 否则刚开始加载 没有鼠标定位 默认会出现在最左上角
// 并且多屏下 会出现多个
magnifierDiv.style.visibility = 'hidden'
// 把复制的背景块元素存入放大镜外围Div
magnifierDiv.appendChild(copy)
// 放大镜外围Div存入背景块中
bgBlock.appendChild(magnifierDiv)
bgBlock.getBoundingClientRect()
// 显示器缩放比例 用于计算显示器如果设置了缩放时 放大镜同步计算
let screenScaleFactor = 1
// 获取显示器缩放比例事件
window.api.screenScaleFactorNoticeEvent(value => {
screenScaleFactor = value
})
// 是否截图完毕
let isScreenshotEnd = false
// 当截图完毕后触发
window.api.screenshotEndEvent(() => {
isScreenshotEnd = true
})
/**
* 鼠标进入截图窗口后触发一次
*
* 多屏的情况下,可能会出现设置的各显示器缩放比例不一样
* 所以这里每当移入窗口时重新获取一下缩放比例值
*/
document.addEventListener('mouseenter', (_ev) => {
// 获取当前鼠标所在的显示器缩放比例 调用后回调到 screenScaleFactorNoticeEvent 方法
window.api.screenScaleFactorEvent(document.getElementById('screenId').value)
})
/**
* 鼠标在截图窗口内移动时触发
*/
document.addEventListener('mousemove', (ev) => {
ev.preventDefault()
ev.stopPropagation()
const x = ev.pageX
const y = ev.pageY
// 放大镜距离鼠标的坐标信息
magnifierDiv.style.left = -(magnifierDivSize / 2) + x + 90 + 'px'
magnifierDiv.style.top = -(magnifierDivSize / 2) + y + 90 + 'px'
// 放大器内的图像坐标信息
copy.style.left = -(x * screenScaleFactor - bgBlock.offsetLeft) + (magnifierDivSize / magnifierZoom) * 0.5 + 'px'
copy.style.top = -(y * screenScaleFactor - bgBlock.offsetTop) + (magnifierDivSize / magnifierZoom) * 0.5 + 'px'
// 截图完毕后才能显示放大镜
// 因为有时加载过快 还没截图完成 放大镜就显示出来了
// 最后导致截图时把放大镜一起截进去了
if(isScreenshotEnd) {
// 显示放大镜
magnifierDiv.style.visibility = 'visible'
}
})
/**
* 鼠标在截图窗口移出后触发
*
* 多显示器时使用
*/
document.addEventListener('mouseleave', e => {
// 隐藏放大镜
magnifierDiv.style.visibility = 'hidden'
})
</script>
</body>
</html>