С оператором if
вам не нужно ничего делать, если вы не хотите двигаться.Кроме того, не забывайте о радиусе окружности и не забывайте проверять, чтобы значение было маленьким, а не просто слишком большим:
// If the new position is
if (this.ox + dx <= width - radius && // not too far right
this.oy + dy <= height - radius && // and not too far down
this.ox + dx >= 0 + radius && // and not too far left
this.oy + dy >= 0 + radius) // and not too far up
{ // ... then move
this.attr({cx: this.ox + dx, cy: this.oy + dy});
} // else nothing
Но мне нравится использовать min
и max
больше:
var nowX, nowY, w = ..., h=..., r=...,
move = function (dx, dy) {
// move will be called with dx and dy
// restrict movement of circle to within boundaries
// You can combine the following 4 lines into 2 or even 1,
// but I left it as 4 for readability.
nowX = Math.max(0 + r, this.ox + dx);
nowY = Math.max(0 + r, this.oy + dy);
nowX = Math.min(w - r, nowX);
nowY = Math.min(h - r, nowY);
this.attr({cx: nowX, cy: nowY});
}
window.onload = function() {
var nowX, nowY, w = 300, h=300, r=30, R = Raphael("canvas", w, h),
c = R.circle(100, 100, r).attr({
fill: "hsb(.8, 1, 1)",
stroke: "none",
opacity: .5,
cursor: "move"
});
var start = function () {
// storing original coordinates
this.ox = this.attr("cx");
this.oy = this.attr("cy");
this.attr({opacity: 1});
},
move = function (dx, dy) {
// move will be called with dx and dy
// restrict movement of circle to within boundaries
nowX = Math.max(0 + r, this.ox + dx);
nowY = Math.max(0 + r, this.oy + dy);
nowX = Math.min(w - r, nowX);
nowY = Math.min(h - r, nowY);
this.attr({cx: nowX, cy: nowY});
},
up = function () {
// restoring state
this.attr({opacity: .5});
};
c.drag(move, start, up);
};