diff --git a/packages/effects/common-ui/src/components/captcha/index.ts b/packages/effects/common-ui/src/components/captcha/index.ts index 6ad68c49..13634cd4 100644 --- a/packages/effects/common-ui/src/components/captcha/index.ts +++ b/packages/effects/common-ui/src/components/captcha/index.ts @@ -3,4 +3,5 @@ export { default as PointSelectionCaptchaCard } from './point-selection-captcha/ export { default as SliderCaptcha } from './slider-captcha/index.vue'; export { default as SliderRotateCaptcha } from './slider-rotate-captcha/index.vue'; +export { default as SliderTranslateCaptcha } from './slider-translate-captcha/index.vue'; export type * from './types'; diff --git a/packages/effects/common-ui/src/components/captcha/slider-translate-captcha/index.vue b/packages/effects/common-ui/src/components/captcha/slider-translate-captcha/index.vue index d340c201..ece15205 100644 --- a/packages/effects/common-ui/src/components/captcha/slider-translate-captcha/index.vue +++ b/packages/effects/common-ui/src/components/captcha/slider-translate-captcha/index.vue @@ -127,7 +127,12 @@ function resetCanvas() { if (!puzzleCanvas || !pieceCanvas) return; pieceCanvas.width = canvasWidth; const puzzleCanvasCtx = puzzleCanvas.getContext('2d'); - const pieceCanvasCtx = pieceCanvas.getContext('2d'); + // Canvas2D: Multiple readback operations using getImageData + // are faster with the willReadFrequently attribute set to true. + // See: https://html.spec.whatwg.org/multipage/canvas.html#concept-canvas-will-read-frequently (anonymous) + const pieceCanvasCtx = pieceCanvas.getContext('2d', { + willReadFrequently: true, + }); if (!puzzleCanvasCtx || !pieceCanvasCtx) return; puzzleCanvasCtx.clearRect(0, 0, canvasWidth, canvasHeight); pieceCanvasCtx.clearRect(0, 0, canvasWidth, canvasHeight); @@ -139,9 +144,16 @@ function initCanvas() { const pieceCanvas = unref(pieceCanvasRef); if (!puzzleCanvas || !pieceCanvas) return; const puzzleCanvasCtx = puzzleCanvas.getContext('2d'); - const pieceCanvasCtx = pieceCanvas.getContext('2d'); + // Canvas2D: Multiple readback operations using getImageData + // are faster with the willReadFrequently attribute set to true. + // See: https://html.spec.whatwg.org/multipage/canvas.html#concept-canvas-will-read-frequently (anonymous) + const pieceCanvasCtx = pieceCanvas.getContext('2d', { + willReadFrequently: true, + }); if (!puzzleCanvasCtx || !pieceCanvasCtx) return; const img = new Image(); + // 解决跨域 + img.crossOrigin = 'Anonymous'; img.src = src; img.addEventListener('load', () => { draw(puzzleCanvasCtx, pieceCanvasCtx); @@ -158,6 +170,7 @@ function initCanvas() { ); pieceCanvas.width = pieceLength; pieceCanvasCtx.putImageData(imageData, 0, sy); + setLeft('0'); }); } @@ -265,7 +278,7 @@ onMounted(() => { @click="resume" >