Điều tôi hiện có là nhiều phần tử html, cùng với jQuery và css để tạo một mẫu chấm có hiệu ứng dựa trên chuyển động của chuột. Thật khó để giải thích vì vậy tôi đã làm một ví dụ. http://jsfiddle.net/sebastianscholten/u6ebt390/Mẫu chấm với canvas html
var mX, mY, distance;
function theDistance(elem, mouseX, mouseY) {
return Math.floor(Math.sqrt(Math.pow(mouseX - (elem.offset().left+(elem.width()/2)), 2) + Math.pow(mouseY - (elem.offset().top+(elem.height()/2)), 2)));
}
$(document).mousemove(function(e) {
mX = e.pageX;
mY = e.pageY;
cutoff = 100;
$('.element').each(function(){
distance = theDistance($(this), mX, mY);
if (distance <= cutoff) {
$(this).css('transform', 'scale(' + (distance*(1/cutoff)-1) + ')');
} else {
$(this).css('transform', 'scale(0)');
}
});
});
Vấn đề là hiệu suất bị lỗi nên tôi đã nghĩ về việc tạo hiệu ứng tương tự với canvas html. Tôi không có ý tưởng nếu nó sẽ làm việc mặc dù.
Các bạn có biết cách nào khác để tôi có thể tạo hiệu ứng tương tự mà không cần nhiều yếu tố html hay không. Cảm ơn.
EDIT: Cảm ơn markE cho câu trả lời của bạn. Nó đã giúp tôi rất nhiều. Điều này tôi đã nghĩ ra.
var c = document.getElementById("canvas");
var ctx = c.getContext("2d");
var circleRadius = 1;
var circleMargin = 10;
var canvasW = c.width;
var canvasH = c.height;
var $canvas = $("#canvas");
var canvasOffset = $canvas.offset();
var offsetX = canvasOffset.left;
var offsetY = canvasOffset.top;
var circleAmountX = canvasW/(circleRadius + (2 * circleMargin));
var circleAmountY = canvasH/(circleRadius + (2 * circleMargin));
function draw(mouseX, mouseY) {
ctx.clearRect(0, 0, canvasW, canvasH);
for (i = 0; i < circleAmountX + 1; i++) {
for (k = 0; k < circleAmountY + 1; k++) {
var x = i * (circleRadius + circleMargin * 2);
var y = k * (circleRadius + circleMargin * 2);
var dx = mouseX - x;
var dy = mouseY - y;
var inflation = 1;
var inflationAmount = 6;
var cutoff = 150;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance <= cutoff && distance > 0) {
inflation = inflationAmount - (distance/((cutoff/inflationAmount) + 2));
} else if (distance = 0) {
inflation = inflationAmount;
}
ctx.beginPath();
ctx.arc(x, y, circleRadius * inflation, 0, 2 * Math.PI);
ctx.fill();
ctx.closePath();
}
}
}
draw(0, 0);
$("#canvas").mousemove(function (e) {
var mX = parseInt(e.clientX - offsetX);
var mY = parseInt(e.clientY - offsetY);
draw(mX, mY);
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.4/jquery.min.js"></script>
<canvas id="canvas" width=500 height=500></canvas>
+1 chỉ để làm tôi choáng váng với demo mà! :) –
Cảm ơn bạn rất nhiều vì đã chia sẻ kết quả. Thật sự thú vị. –