2014-12-12 2 views
0

어떻게 코드합니까? 마우스가 캔버스의 미리 정의 된 영역에 들어가면 미리 정의 된 영역을 벗어날 때 이미지가 나타나고 이미 미리 정렬 된 영역을 벗어날 때 다시 사라집니다.jQuery- 마우스를 영역 안으로 이동하고 종료하는 캔버스

이것은 모두 jQuery를 사용합니다.

미리 감사드립니다.

+0

JQuery와 캔버스 요소 호버/흐림을 추적하지만 캔버스 내부에 개별 도면 것이다. html 캔버스에 그려지는 이미지는 DOM 요소가 아닙니다. 대신 그들은 캔버스에 그린 픽셀을 잊어 버린 것과 같습니다. ** 다음은 캔버스 이미지에 호버 효과를 적용하는 단계입니다. ** (1) 자바 스크립트 객체에서 이미지의 정의 (x, y, 너비, 높이)를 추적합니다. (2) mousemove를 청취합니다. 캔버스 위의 이벤트, (3) 마우스가 이미지 안에 있는지 테스트, (4) 마우스가 원을 넣거나 나갈 때 이미지를 다시 그리거나 지 웁니다. 코딩에 문제가있는 경우 코딩을 시도하고 다시 시도하십시오. – markE

+0

그래, 이미 시도했는데 문제는 내가 공간으로 이동할 때, 미리 정의 된 모양이 나옵니다. 그러나 다음 픽셀로 이동할 때까지 분할 된 부분에 대해서만 나타납니다. 따라서 화려한 이미지를 만들거나 이미지가없는 경우 마우스가 움직이지 않는다. 솔루션에 대한 아이디어가 있습니까? – Danny12345

+0

예, 이전 mousemove가 이미지 내부 또는 외부에 있었는지 여부를 나타내는 lastStatus 플래그를 만드십시오. 그렇게하면 lastStatus가 변경 될 때만 표시하거나 지워야합니다. 이렇게하면 이미지 내부의 모든 마우스를 사용하여 이미지를 다시 그려서 깜박임 현상을 제거 할 수 있습니다. 건배! – markE

답변

1

jQuery는 캔버스 요소에서 호버/흐림을 추적하지만 캔버스 내부의 개별 그림에서는 추적하지 않습니다. HTML 캔버스에 그려진 이미지는 DOM 요소가 아닙니다. 대신 그들은 캔버스에 그린 픽셀을 잊어 버린 것과 같습니다.

는 캔버스 안에 이미지 무승부에 호버 효과를 적용 할 수있는 단계는 다음과 같습니다

  1. ,

    자바 스크립트 객체 이미지의 정의 (x, y, 폭, 높이)를 추적
  2. 캔버스에서 mousemove 이벤트를 수신

  3. , 마우스가 이미지 안에있는 경우

  4. 테스트,

  5. 마우스가 원을 넣거나 나갈 때 이미지를 다시 그리거나 지 웁니다.

호버/흐림을보다 효율적으로 유지하려면 이전 이미지 상태 (표시 여부/비공개)를 추적하고 상태가 변경되지 않은 경우 아무 것도하지 않습니다.

여기서 예 코드 및 데모 같습니다

var canvas=document.getElementById("canvas"); 
 
var ctx=canvas.getContext("2d"); 
 
var cw=canvas.width; 
 
var ch=canvas.height; 
 
var $canvas=$("#canvas"); 
 
var canvasOffset=$canvas.offset(); 
 
var offsetX=canvasOffset.left; 
 
var offsetY=canvasOffset.top; 
 
var scrollX=$canvas.scrollLeft(); 
 
var scrollY=$canvas.scrollTop(); 
 

 
var lastMouseWasIn; 
 
var currentMouseIsIn=false; 
 
var imgDef={x:30,y:30}; 
 

 
var img=new Image(); 
 
img.onload=start; 
 
img.src="https://dl.dropboxusercontent.com/u/139992952/stackoverflow/KoolSmall.png"; 
 
function start(){ 
 

 
    imgDef.width=img.width; 
 
    imgDef.height=img.height; 
 

 
    draw(); 
 

 
    $("#canvas").mousemove(function(e){handleMouseMove(e);}); 
 

 
} 
 

 
function draw(){ 
 
    if(lastMouseWasIn===currentMouseIsIn){return;} 
 
    ctx.clearRect(0,0,cw,ch); 
 
    if(currentMouseIsIn){ 
 
    ctx.drawImage(img,imgDef.x,imgDef.y); 
 
    } 
 
    ctx.strokeRect(imgDef.x,imgDef.y,imgDef.width,imgDef.height);  
 
} 
 

 
function handleMouseMove(e){ 
 
    e.preventDefault(); 
 
    e.stopPropagation(); 
 

 
    x=parseInt(e.clientX-offsetX); 
 
    y=parseInt(e.clientY-offsetY); 
 

 
    currentMouseIsIn = x>imgDef.x 
 
    && x<imgDef.x+imgDef.width 
 
    && y>imgDef.y 
 
    && y<imgDef.y+imgDef.height; 
 

 
    draw(); 
 

 
    lastMouseWasIn=currentMouseIsIn; 
 

 
}
body{ background-color: ivory; } 
 
#canvas{border:1px solid red;}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script> 
 
<h4>Move mouse in and out of rectangle to show/hide image.</h4> 
 
<canvas id="canvas" width=300 height=300></canvas>

+1

정말 고마워요. 정말 고마워요. – Danny12345

관련 문제