Javascript 用鼠标移动随机放置的盒子

Javascript 用鼠标移动随机放置的盒子,javascript,Javascript,我已经创建了一个程序,用随机放置的带有随机颜色的框填充画布。这一部分很简单,我遇到的问题是我想用鼠标移动这些彩色框中的任何一个。此外,指针必须与左上角保持一个共有距离。我的代码如下,任何帮助都将不胜感激 window.onload = init; function init() { var x= Math.floor(Math.random()*400); var y= Math.floor(Math.random()*400); var body = document.getElem

我已经创建了一个程序,用随机放置的带有随机颜色的框填充画布。这一部分很简单,我遇到的问题是我想用鼠标移动这些彩色框中的任何一个。此外,指针必须与左上角保持一个共有距离。我的代码如下,任何帮助都将不胜感激

window.onload = init;


function init() {

var x= Math.floor(Math.random()*400);
var y= Math.floor(Math.random()*400);


var body = document.getElementsByTagName("body")[0];
var canvas = document.createElement("canvas");

canvas.height = window.innerHeight;
canvas.width = window.innerWidth;
var context = canvas.getContext("2d");



//  Repeat to draw a rectangle 100 times
    for(var i=0;i<100;i++){
    var color = '#'+ Math.round(0xffffff * Math.random()).toString(16);
    context.fillStyle = color;

    //Each rectangle is at (0 ~ width of window, 0 ~ height of window)
    //Each rectangle's size is 50x50)    
        context.fillRect(Math.random()*window.innerWidth, 
    Math.random()*window.innerHeight, 50, 50);
  }

  document.body.appendChild(canvas);

  }

var mousePiece = null;

function init2() {
//we are grabbing the div elm by uts id
// var divEl = document.getElementById("ace");
var cx = document.querySelector("canvas").getContext("2d");
//divEl.style.top = getStyle(divEl,"top");
//divEl.style.left = getStyle(divEl,"left");

addEvent(cx, "mousedown", mouseGrab, false);
}

function mouseGrab(e) {
var evt = e || window.event;
mousePiece = evt.target || evt.srcElement;

addEvent(document, "mousemove", mouseMove, false);
addEvent(document, "mouseup", mouseDrop, false);
}

function mouseMove(e) {
var evt = e || window.event;
var mouseX = evt.clientX;
var mouseY = evt.clientY;

mousePiece.style.left = mouseX + "px";
mousePiece.style.top = mouseY + "px";
}

function mouseDrop(e) {
mousePiece = null;
removeEvent(document, "mousemove", mouseMove, false);
removeEvent(document, "mouseup", mouseDrop, false);
}

function addEvent(object, evName, fnName, cap) {
if (object.attachEvent)
    object.attachEvent("on" + evName, fnName);
else if (object.addEventListener)
    object.addEventListener(evName, fnName, cap);
}

function removeEvent(object, evName, fnName, cap) {
if (object.detachEvent)
    object.detachEvent("on" + evName, fnName);
else if (object.removeEventListener)
    object.removeEventListener(evName, fnName, cap);
}

function getStyle(object, styleName) {
if (window.getComputedStyle) {
    return document.defaultView.getComputedStyle(object,  
null).getPropertyValue(styleName);
} else if (object.currentStyle) {
    return object.currentStyle[styleName]
}
}
window.onload=init;
函数init(){
var x=数学地板(数学随机()*400);
变量y=数学地板(数学随机()*400);
var body=document.getElementsByTagName(“body”)[0];
var canvas=document.createElement(“canvas”);
canvas.height=window.innerHeight;
canvas.width=window.innerWidth;
var context=canvas.getContext(“2d”);
//重复100次以绘制矩形

对于(var i=0;i来说,坏消息是画布元素是一个像素映射:当您在画布上绘制一些东西时,您会像更新图像一样修改像素值。在画布上绘制不会创建可以使用
事件分配id、抓取或移动的HTML元素。target
(在您的情况下,目标将是画布元素)

好消息是,有一些画布库可以在画布顶部为单独放置的项目创建一个对象模型,然后允许您移动它们。例如,请查看它支持的操作的演示。请随意对您的选项进行更多研究


还要注意随机颜色字符串的两个问题:

  • 使用Math.floor而不是Math.round以避免以值2^24结束(ALFmachine的回复中也已更正)
  • 使用十六进制数字字符串定义CSS颜色需要3或6个以“#”开头的十六进制数字。为避免CSS解析器在您的情况下丢弃颜色值,请根据需要使用“0”填充十六进制数字以组成6个数字

  • 您可以构建一个cssrbg()使用范围为0到255的三个随机整数作为备选值的颜色字符串。

    坏消息是画布元素是一个像素映射:当您在画布上绘制某些东西时,您会修改像素值,就像您正在更新图像一样。在画布上绘制不会创建可以使用
    e分配id、抓取或移动的HTML元素target
    (在您的示例中,目标将是canvas元素)

    好消息是,有一些画布库可以在画布顶部为单独放置的项目创建一个对象模型,然后允许您移动它们。例如,请查看它支持的操作的演示。请随意对您的选项进行更多研究


    还要注意随机颜色字符串的两个问题:

  • 使用Math.floor而不是Math.round以避免以值2^24结束(ALFmachine的回复中也已更正)
  • 使用十六进制数字字符串定义CSS颜色需要3或6个以“#”开头的十六进制数字。为避免CSS解析器在您的情况下丢弃颜色值,请根据需要使用“0”填充十六进制数字以组成6个数字
  • 你可以使用0到255范围内的三个随机整数来构造CSS RBG~()颜色字符串。< /P> < P>我会考虑拖动。我用随机颜色和一个颜色给你做了一个。你可以用jQuery UI做很多事情,所以检查文档以找到你需要的东西。

    $( document ).ready( function () {
    for ( var i = 0; i < 50; i++ ) {
        var randomColor = Math.floor(Math.random()*16777215).toString(16);
        var ranNum = Math.round( Math.random() * 65 )
        $( ".boxHolder" ).append( '<div class="pos' + i + ' draggable ui-widget-content"></div>' )
        $( ".pos" + i ).css({
            "background" : "#" + randomColor,
            "top"        : 10 * i + "px", 
            "left"       : ranNum * 6 + "px"
        })
    }
    })
    
    $( function() {
       $( ".draggable" ).draggable()
    })
    
    $(文档).ready(函数(){
    对于(变量i=0;i<50;i++){
    var randomColor=Math.floor(Math.random()*16777215).toString(16);
    var ranNum=Math.round(Math.random()*65)
    $(“.boxHolder”).append(“”)
    $(“.pos”+i).css({
    “背景”:“#”+随机颜色,
    “顶部”:10*i+“px”,
    “左”:ranNum*6+“px”
    })
    }
    })
    $(函数(){
    $(“.draggable”).draggable()
    })
     

    我会考虑拖动。我用随机的颜色给你做了一个。所有的事情你可以用jQuery UI来做,所以检查文档来找到你需要的东西。

    $( document ).ready( function () {
    for ( var i = 0; i < 50; i++ ) {
        var randomColor = Math.floor(Math.random()*16777215).toString(16);
        var ranNum = Math.round( Math.random() * 65 )
        $( ".boxHolder" ).append( '<div class="pos' + i + ' draggable ui-widget-content"></div>' )
        $( ".pos" + i ).css({
            "background" : "#" + randomColor,
            "top"        : 10 * i + "px", 
            "left"       : ranNum * 6 + "px"
        })
    }
    })
    
    $( function() {
       $( ".draggable" ).draggable()
    })
    
    $(文档).ready(函数(){
    对于(变量i=0;i<50;i++){
    var randomColor=Math.floor(Math.random()*16777215).toString(16);
    var ranNum=Math.round(Math.random()*65)
    $(“.boxHolder”).append(“”)
    $(“.pos”+i).css({
    “背景”:“#”+随机颜色,
    “顶部”:10*i+“px”,
    “左”:ranNum*6+“px”
    })
    }
    })
    $(函数(){
    $(“.draggable”).draggable()
    })
    
    显然,如果不需要探索元素的使用,可以创建HTML元素并拖动它们。这个问题是家庭作业吗?不,我只是觉得如果我可以拖动框会很酷。这是拖动框的方式,但不是在画布中。这是一个很好的答案,有人发布在拖动画布图像上。希望这有帮助。显然,如果你不需要探索元素的使用,你可以创建HTML元素并拖动它们。这个问题是家庭作业吗?不,我只是觉得如果我可以拖动框会很酷。这是拖动它们的方式,但不是在画布中。这是一个很好的答案,有人在拖动画布图像上发布了。希望这能有所帮助。