2015-11-15 3 views
2

Я создал простое веб-приложение, использующее тэг HTML5 и тэг canvas, который позволяет рисовать вдоль линии мыши, перемещается при нажатии. Это отлично работает, когда я не использую форматирование CSS. Однако, когда я использую форматирование CSS, это не работает должным образом: линия рисуется далеко от того места, где расположена мышь. Тэг Canvas не работает, если используется форматирование CSS

context = document.getElementById('drawing').getContext("2d"); 
 
//below code to ensure compatibility with older browser by check if addEventListener is available or not 
 
var EventUtil = { 
 
addHandler: function(element, type, handler){ if (element.addEventListener){ 
 
      element.addEventListener(type, handler, false); 
 
      } else if (element.attachEvent){ 
 
      element.attachEvent('on' + type, handler); 
 
      } else { 
 
      element['on' + type] = handler; } 
 
      }, 
 

 
removeHandler: function(element, type, handler){ if (element.removeEventListener){ 
 
      element.removeEventListener(type, handler, false); 
 
      } else if (element.detachEvent){ 
 
      element.detachEvent('on' + type, handler); 
 
      } else { 
 
      element['on' + type] = null; } 
 
      } 
 
} ; 
 

 
//Drawing canvas related functions 
 
var clickX = new Array(); 
 
var clickY = new Array(); 
 
var clickDrag = new Array(); 
 
var paint; 
 

 
function addClick(x, y, dragging) 
 
{ 
 
    clickX.push(x); 
 
    clickY.push(y); 
 
    clickDrag.push(dragging); 
 
} 
 
function whenMousedown() { 
 
     var mouseX = event.pageX - this.offsetLeft; 
 
     var mouseY = event.pageY - this.offsetTop; 
 
     paint = true; 
 
     addClick(event.pageX - this.offsetLeft, event.pageY - this.offsetTop); 
 
     redraw(); 
 
}; 
 
function whenMousemove(){ 
 
     if(paint){ 
 
      addClick(event.pageX - this.offsetLeft, event.pageY - this.offsetTop, true); 
 
      redraw(); 
 
     } 
 
}; 
 

 
function whenMouseup(){ 
 
    paint = false; 
 
}; 
 
function whenMouseleave(){ 
 
    paint = false; 
 
}; 
 

 
function redraw(){ 
 
      context.clearRect(0, 0, context.canvas.width, context.canvas.height); // Clears the canvas 
 

 
      context.strokeStyle = "#df4b26"; 
 
      context.lineJoin = "round"; 
 
      context.lineWidth = 5; 
 

 
      for(var i=0; i < clickX.length; i++) { 
 
      context.beginPath(); 
 
      if(clickDrag[i] && i){ 
 
       context.moveTo(clickX[i-1], clickY[i-1]); 
 
      }else{ 
 
       context.moveTo(clickX[i]-1, clickY[i]); 
 
      } 
 
      context.lineTo(clickX[i], clickY[i]); 
 
      context.closePath(); 
 
      context.stroke(); 
 
    } 
 
} 
 
// this clears the canvas and sets the arrays to null 
 
function clearCanvas() { 
 
    context.clearRect(0, 0, context.canvas.width, context.canvas.height) // Clears the canvas 
 
    clickX = []; 
 
    clickY = []; 
 
    clickDrag = []; 
 
}; 
 

 
EventUtil.addHandler (document.getElementById('drawing'), 'mousedown', whenMousedown); 
 
EventUtil.addHandler (document.getElementById('drawing'), 'mousemove', whenMousemove); 
 
EventUtil.addHandler (document.getElementById('drawing'), 'mouseup', whenMouseup); 
 
EventUtil.addHandler (document.getElementById('drawing'), 'mouseleave', whenMouseleave); 
 
EventUtil.addHandler(document.getElementById('clearBtn'), 'click', clearCanvas) ;
#container{ 
 
\t \t margin: auto; 
 
\t \t width: 800px; 
 
\t \t height: 605px; 
 
\t \t border: 1px solid; 
 
\t } 
 
#body { 
 
\t \t margin: 10px; 
 
\t } 
 
.heading { 
 
\t \t margin: auto; 
 
\t \t width: 455px; 
 
    color: blue; 
 
    padding-bottom: 10px; 
 
} 
 
#drawing { 
 
\t \t width: 780px; 
 
\t \t height: 500px; 
 
\t \t border: 1px solid; 
 
\t \t margin: auto; 
 
\t } 
 
#clearBtnDiv{ 
 
    margin: auto; 
 
    width:80px; 
 
} 
 
#clearBtn{ 
 
    color: purple; 
 
    font-size: large; 
 
    background-color: aqua; 
 
    width: 80px; 
 
}
<!DOCTYPE html> 
 
<html> 
 
<head> 
 
\t <title> Drawing Canvas</title> 
 
<link rel='stylesheet' type="text/css" href = 'drawingMain.css'> 
 

 
</head> 
 
<body> 
 
<div id = 'container'> 
 
<div id='body'> 
 
\t <h1 class = 'heading'> Welcome to a Drawing Canvas!!</h1> 
 
<canvas id ='drawing' > 
 
\t A sample drawing <! this will be shown if canvas doesnt work in the browser !> 
 
</canvas> 
 
</div> 
 
<div id ='clearBtnDiv'> 
 
\t <input type="submit" value="Clear" id ='clearBtn' > </div> 
 
</div> 
 
<script type="text/javascript" src= 'drawing.js'> </script> 
 
</body> 
 
</html>

+0

Код - @ github, поэтому поделитесь им здесь, пожалуйста. –

+0

@ mr-alien - Done – kutuhal

+1

Я обнаружил, что это не форматирование CSS, в основном, вызывающее эту проблему, но эта проблема была специфична для установки ** высоты ** и ** ширины ** свойства canvas. Эти свойства холста должны быть установлены ниже: canvasObject.setAttribute ('width', '475'). Кроме того, это было хорошо объяснено в другом вопросе: [Холст растянут при использовании CSS] (http://stackoverflow.com/questions/2588181/canvas-is-stretched-when-using-css-but-normal-with- width-height-properties) – kutuhal

ответ

0

Это происходит потому, что вы не имеете все элементы offsetParent offsetTop и offsetLeft вычисленных. Смещение offsetLeft/Top возвращает пиксель смещения левой границы к его первому родительскому элементу, но ваш холст #drawing имеет #body и #container и элемент в качестве родителей, когда вы устанавливаете маржу, чтобы центрировать их, вам также необходимо добавить эти поля и border к событию мыши, потому что вы используете page.x в качестве базы.

+0

Я попытался удалить поля и отступы, это не решило. Однако, когда я удалил свойство below из #drawing, оно не выровнено правильно, но работает как ожидалось. \t \t ширина: 780px; \t \t высота: 500px; – kutuhal

Смежные вопросы