console
(function(){
const dcs = document.getElementById('drawingCanvas'), d2d = dcs.getContext('2d');
const sdw = document.getElementById('start_draw'),edw = document.getElementById('end_draw');
const ic = document.getElementById('id_color');
let painting = false;
const snc = document.getElementById('screenCanvas'), s2d = snc.getContext('2d');
const sdr = document.getElementById('start_screen'),edr = document.getElementById('end_screen');
const sc = document.getElementById('screen_range');
let ot={x:0,y:0,w:1,h:1,t:0,l:0,ox:0,oy:0}, screening = false;
function startPosition(e) { painting = true; draw(e); }
function finishedPosition() { painting = false; d2d.beginPath(); }
function draw(e) {
if (!painting) return;
d2d.lineWidth = 5;
d2d.lineCap = 'round';
d2d.strokeStyle = ic.value;
d2d.lineTo(e.clientX - dcs.offsetLeft, e.clientY - dcs.offsetTop);
d2d.stroke();
d2d.beginPath();
d2d.moveTo(e.clientX - dcs.offsetLeft, e.clientY - dcs.offsetTop);
}
function startDraw(){
endScreen();
dcs.addEventListener('mousedown', startPosition);
dcs.addEventListener('mousemove', draw);
dcs.addEventListener('mouseup', finishedPosition);
dcs.addEventListener('mouseout', finishedPosition);
sdw.disabled = true;
edw.disabled = false;
}
function endDraw(){
dcs.removeEventListener('mousedown', startPosition);
dcs.removeEventListener('mousemove', draw);
dcs.removeEventListener('mouseup', finishedPosition);
dcs.removeEventListener('mouseout', finishedPosition);
edw.disabled = true;
sdw.disabled = false;
}
sdw.addEventListener('click',startDraw);
edw.addEventListener('click',endDraw);
startDraw();
function upd(){
sc.style.width = ot.w + 'px';
sc.style.height = ot.h + 'px';
sc.style.left = ot.l + 'px';
sc.style.top = ot.t + 'px';
}
function openScreen(e){
screening = true;
ot.x = e.clientX; ot.y = e.clientY; ot.ox = e.offsetX; ot.oy = e.offsetY;
screen(e);
sc.style.display = 'block';
}
function closeScreen(){ screening = false; }
function screen(e){
if(!screening){ return; }
let cx = e.clientX, cy = e.clientY;
if( cx >= ot.x ){ ot.w = cx - ot.x ; ot.l = ot.x; }else{ ot.w = ot.x - cx ; ot.l = cx; }
if( cy >= ot.y ){ ot.h = cy - ot.y ; ot.t = ot.y; }else{ ot.h = ot.y - cy ; ot.t = cy; }
upd();
let x = cx >= ot.x?ot.ox:e.offsetX, y = cy >= ot.oy?ot.oy:e.offsetY;
s2d.clearRect(0, 0, snc.width, snc.height);
s2d.drawImage(dcs, x, y, ot.w, ot.h, 0, 0, ot.w, ot.h);
}
function startScreen(){
endDraw();
dcs.addEventListener('mousedown', openScreen);
dcs.addEventListener('mousemove', screen);
dcs.addEventListener('mouseup', closeScreen);
dcs.addEventListener('mouseout', closeScreen);
sdr.disabled = true;
edr.disabled = false;
}
function endScreen(){
dcs.removeEventListener('mousedown', openScreen);
dcs.removeEventListener('mousemove', screen);
dcs.removeEventListener('mouseup', closeScreen);
dcs.removeEventListener('mouseout', closeScreen);
edr.disabled = true;
sdr.disabled = false;
sc.style.display = 'none';
}
sdr.addEventListener('click',startScreen);
edr.addEventListener('click',endScreen);
})()
<div>
<button type="button" id="start_draw">开始绘制</button>
<input type="color" id="id_color" value="#000">
<button type="button" id="end_draw">结束绘制</button>
<span>--</span>
<button type="button" id="start_screen">开始截图</button>
<button type="button" id="end_screen">结束截图</button>
</div>
<div>
<div id="screen_range" class="screen"></div>
<canvas id="drawingCanvas" width="600" height="400" style="border:1px solid #000000;"></canvas>
<canvas id="screenCanvas" width="200" height="200" style="border:1px solid #000000;"></canvas>
</div>
.screen{
position: absolute;
width: 10px;
height: 10px;
background-color: transparent;
pointer-events: none;
z-index: 1000;
border: 1px dashed red;
}