import { useState } from 'react'; import html2canvas from 'html2canvas'; function $(id) { return document.getElementById(id); } function useXiguan(props) { // xiguan 点击按钮 // content 截屏内容载体 // root 移动根容器 // sucker 移动的圈 const { xiguan, content, root, sucker } = props; const btn = $(xiguan); const con = $(content); const rt = $(root); const sur = $(sucker); const [px, setPx] = useState([]); const [centerpx, setCenterpx] = useState([]); // 截屏功能 async function handlecanvas() { window.pageYOffset = 0; document.documentElement.scrollTop = 0 document.body.scrollTop = 0 return await html2canvas(rt, { rt.offsetWidth, height: rt.offsetHeight, scale: 1, removeContainer: true, useCORS: true, // 开启跨域 scrollY: 0, scrollX: 0, logging: false, ignoreElements: (el) => { if (el.id === `${xiguan}`) { return true; } return false; } }) } const onClick = () => { // 截屏并保存图像到canvas; clearMove(); handlecanvas().then((canvas) => { const img = new Image(); img.src = canvas.toDataURL('image/png'); img.width = rt.offsetWidth; img.height = rt.offsetHeight; img.onload = function () { const ctx2 = con.getContext("2d"); con.width = rt.offsetWidth; con.height = rt.offsetHeight; ctx2.drawImage(img, 0, 0); } img.onerror = function () { btn.click(); } const rw = rt.offsetWidth; const rh = rt.offsetHeight; const rlt = rt.offsetLeft; const rtp = rt.offsetTop; const sw = 55; rt.onmousemove = function (e) { console.log('move'); if (this.time && (Date.now() - this.time) < 16) return; this.time = Date.now(); let [x, y] = [e.clientX - rlt, e.clientY - rtp]; const ctx = con.getContext('2d'); const pxData = ctx.getImageData(x - 11, y - 11, 11, 11)?.data || []; const px1 = []; const px2 = []; for (let i = 0; i < 121; i++) { let r = pxData[4 * i + 0]; let g = pxData[4 * i + 1]; let b = pxData[4 * i + 2]; let a = pxData[4 * i + 3] if (i === 60) { // center data px2.push({ r, g, b, a }) } // round data px1.push({ r, g, b, a }) } //定义鼠标在glass的中心 ,最大宽度减去元素本身一半。 x = x - sw; y = y - sw; if (x < - sw / 2) { x = - sw / 2;//用来判断在原点位置时x轴是否会溢出,这里是左边 } if (y < - sw / 2) { y = - sw / 2;//用来判断在原点位置时y轴是否会溢出,这里是右边 } let maxX = rw + sw; //定义glass在X轴可运动的最大范围 if (x > maxX) { x = maxX; //如果大于,就让它等于 } let maxY = rh + sw; //定义glass在Y轴可运动的最大范围 if (y > maxY) { y = maxY; //如果大于,就让它等于 } [sur.style.left, sur.style.top] = [x + "px", y + "px"]; setPx(px1); setCenterpx(px2); } }) } function clearMove() { rt.onmousemove = null; } return [onClick, px, centerpx, clearMove] } export default useXiguan;
import { useState } from 'react'; import html2canvas from 'html2canvas'; function $(id) { return document.getElementById(id); } function useXiguan(props) { // xiguan 点击按钮 // content 截屏内容载体 // root 移动根容器 // sucker 移动的圈 const { xiguan, content, root, sucker } = props; const btn = $(xiguan); const con = $(content); const rt = $(root); const sur = $(sucker); const [px, setPx] = useState([]); const [centerpx, setCenterpx] = useState([]); // 截屏功能 async function handlecanvas() { window.pageYOffset = 0; document.documentElement.scrollTop = 0 document.body.scrollTop = 0 return await html2canvas(rt, { rt.offsetWidth, height: rt.offsetHeight, scale: 1, removeContainer: true, useCORS: true, // 开启跨域 scrollY: 0, scrollX: 0, logging: false, ignoreElements: (el) => { if (el.id === `${xiguan}`) { return true; } return false; } }) } const onClick = () => { // 截屏并保存图像到canvas; clearMove(); handlecanvas().then((canvas) => { const img = new Image(); img.src = canvas.toDataURL('image/png'); img.width = rt.offsetWidth; img.height = rt.offsetHeight; img.onload = function () { const ctx2 = con.getContext("2d"); con.width = rt.offsetWidth; con.height = rt.offsetHeight; ctx2.drawImage(img, 0, 0); } img.onerror = function () { btn.click(); } rt.onmousemove = function (e) { window.requestAnimationFrame(move.bind(null,e)); } }) } function move(e) { const rw = rt.offsetWidth; const rh = rt.offsetHeight; const rlt = rt.offsetLeft; const rtp = rt.offsetTop; const sw = 55; let [x, y] = [e.clientX - rlt, e.clientY - rtp]; const ctx = con.getContext('2d'); const pxData = ctx.getImageData(x - 11, y - 11, 11, 11)?.data || []; const px1 = []; const px2 = []; for (let i = 0; i < 121; i++) { let r = pxData[4 * i + 0]; let g = pxData[4 * i + 1]; let b = pxData[4 * i + 2]; let a = pxData[4 * i + 3] if (i === 60) { // center data px2.push({ r, g, b, a }) } // round data px1.push({ r, g, b, a }) } //定义鼠标在glass的中心 ,最大宽度减去元素本身一半。 x = x - sw; y = y - sw; if (x < - sw / 2) { x = - sw / 2;//用来判断在原点位置时x轴是否会溢出,这里是左边 } if (y < - sw / 2) { y = - sw / 2;//用来判断在原点位置时y轴是否会溢出,这里是右边 } let maxX = rw + sw; //定义glass在X轴可运动的最大范围 if (x > maxX) { x = maxX; //如果大于,就让它等于 } let maxY = rh + sw; //定义glass在Y轴可运动的最大范围 if (y > maxY) { y = maxY; //如果大于,就让它等于 } [sur.style.left, sur.style.top] = [x + "px", y + "px"]; setPx(px1); setCenterpx(px2); } function clearMove() { rt.onmousemove = null; } return [onClick, px, centerpx, clearMove] } export default useXiguan;