【问题标题】:Make color in JS change on refresh of browser刷新浏览器时使JS中的颜色发生变化
【发布时间】:2018-04-05 06:49:52
【问题描述】:

我正在编写一段代码,我希望可擦除画布的颜色在刷新时改变。

在css中触发颜色会更容易,尽管现在这是在这些触发器的编码本身中;

var container = document.getElementById('canvas'); 
init(container, 5000, 3000, '#f8fa58');

我怎样才能使它可以选择多种(比如说2)可变颜色。那么在刷新网站的时候,具体的颜色会是随机的吗?

(function() {

  // a little verbose but...
  function handleMousemove(event) {
    var x = event.clientX;
    var y = event.clientY;
    draw(x, y);
  }

  function handleTouchmove(event) {
    event.preventDefault(); // we don't want to scroll
    var touch = event.touches[0];
    var x = touch.clientX;
    var y = touch.clientY;
    draw(x, y);
  }
  // this one can be shared by both touch and move events
  function activateDrawing(event) {
    event.preventDefault();
    canvas.isDrawing = true;
  }

  function draw(eventX, eventY) {
    var x = eventX - canvas.node.offsetLeft;
    var y = eventY - canvas.node.offsetTop;
    if (!canvas.isDrawing) {
      return;
    }
    var radius = 100; // or whatever
    var fillColor = '#ff0000';
    ctx.globalCompositeOperation = 'destination-out';
    ctx.fillCircle(x, y, radius, fillColor);
  }

  function createCanvas(parent, width, height) {
    var canvas = {};
    canvas.node = document.createElement('canvas');
    canvas.context = canvas.node.getContext('2d');
    canvas.node.width = width || 100;
    canvas.node.height = height || 100;
    parent.appendChild(canvas.node);
    return canvas;
  }

  var canvas, ctx; // got it out to avoid nesting too deeply my handlers;

  function init(container, width, height, fillColor) {
    canvas = createCanvas(container, width, height);
    ctx = canvas.context;
    // define a custom fillCircle method
    ctx.fillCircle = function(x, y, radius, fillColor) {
      var radgrad = ctx.createRadialGradient(x, y, 0, x, y, radius);
      radgrad.addColorStop(0, 'rgba(255,0,0,1)');
      radgrad.addColorStop(0.8, 'rgba(255,0,0,.9)');
      radgrad.addColorStop(1, 'rgba(255,0,0,0)');

      // draw shape
      ctx.fillStyle = radgrad;
      ctx.fillRect(x - radius, y - radius, x + radius, y + radius);
    };
    ctx.clearTo = function(fillColor) {
      ctx.fillStyle = fillColor;
      ctx.fillRect(0, 1, width, height);
    };
    ctx.clearTo(fillColor || "#ddd");

    // bind mouse events
    canvas.node.onmousemove = throttle(handleMousemove);
    canvas.node.ontouchmove = throttle(handleTouchmove);
    canvas.node.onmouseenter =
      canvas.node.ontouchstart = throttle(activateDrawing);

  }

  var container = document.getElementById('canvas');
  init(container, 5000, 3000, '#f8fa58');

  /* Bonus : throttle these events so they don't fire too often */
  function throttle(callback) {
    var active = false; // a simple flag
    var evt; // to keep track of the last event
    var handler = function() { // fired only when screen has refreshed
      active = false; // release our flag 
      callback(evt);
    }
    return function handleEvent(e) { // the actual event handler
      evt = e; // save our event at each call
      if (!active) { // only if we weren't already doing it
        active = true; // raise the flag
        requestAnimationFrame(handler); // wait for next screen refresh
      };
    }
  }

})();

document.body.addEventListener('touchstart', function(e) {
  e.preventDefault();
});
body {
  overflow: hidden !important;
  margin-left: -10vw;
  margin-top: -30vh;
}

#back {
  z-index: -10;
  pointer-events: none;
  position: absolute;
  margin: 0;
  display: block;
  background: url(https://odlp-staging1.s3.amazonaws.com/uploads/2012/04/original_01_-belladonna-viviane-sassen-jpg.jpg) no-repeat center center fixed;
  -webkit-background-size: cover;
  -moz-background-size: cover;
  -o-background-size: cover;
  background-size: cover;
  width: 110vw;
  height: 130vh;
}

#canvas {
  z-index: -1;
  top: 2vh;
  left: -10vw;
  width: 110vw;
  height: 130vh;
  overflow: hidden;
}
<div id="back"></div>
<div id="canvas"></div>

【问题讨论】:

  • 刷新后你的代码会重新执行,你不会记得之前的颜色是什么。除非您将其存储在 localStorage 中。查一下。 developer.mozilla.org/en-US/docs/Web/API/Window/localStorage
  • @RogerC 虽然,它可以“随机”工作,对吧?所以它有时是颜色 1 或颜色 2……这实际上是我所提到的。
  • 听起来像是 XY 问题。实际上,您要做的就是从数组中检索一个随机值。
  • 是的,如果你想要随机性,你不需要 localStorage

标签: javascript jquery css html5-canvas


【解决方案1】:

使用url位置哈希存储重载次数的简单解决方案:

<body>
<script>


const numberOfReloads = window.location.hash.substr(1) | 0;
window.location.hash = numberOfReloads + 1;


if (numberOfReloads % 2) {
    document.body.style.background = "red";
} else {
    document.body.style.background = "blue";
}

</script>
</body>

【讨论】:

  • 我说的是document.body.style.background,你可以调用init(container, 5000, 3000, '#f8fa58');而是选择两种颜色,我只想要一个简单的孤立示例
【解决方案2】:

对于随机颜色,您可以将各种颜色存储在数组中,然后使用随机方法。

var randomColors = ['#f8fa58','red','black'];
var bg = randomColors[Math.floor(Math.random()*randomColors.length)];
init(container, 5000, 3000, bg);

【讨论】:

  • 随机的一个问题是有时颜色会重复
  • @Ritz 我试图在代码中实现它,但这并不能使它在这段特定的编码中工作......
【解决方案3】:

编写一个函数生成随机颜色,然后调用该函数获取随机颜色:

function GetRandomColor() {
  var set = ["1","2","3","4","5","6","7","8","9","a","b","c","d","e","f"];

  var c1 = set[Math.floor(Math.random()*set.length)];
  var c2 = set[Math.floor(Math.random()*set.length)];
  var c3 = set[Math.floor(Math.random()*set.length)];
  var c4 = set[Math.floor(Math.random()*set.length)];
  var c5 = set[Math.floor(Math.random()*set.length)];
  var c6 = set[Math.floor(Math.random()*set.length)];
  var color = "#" + c1 + c2 + c3 + c4 + c5 + c6 ;

  return color ;
}

$(document).ready(function() {
  $("a").on("click", function() {
    var c = GetRandomColor() ;
    
    $("#color").css("background-color", c) ;
  });
});
#color{
  display: block;
  width: 50px;
  height: 50px;
  border: 1px solid #000;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<a href="javascript:;">Generate a random color</a>

<div id="color"></div>

【讨论】:

    猜你喜欢
    • 2021-05-10
    • 1970-01-01
    • 1970-01-01
    • 2013-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-18
    • 1970-01-01
    相关资源
    最近更新 更多