我正在寻找一个简单的div在两种颜色之间无休止地渐变,即蓝色到红色,红色到蓝色,蓝色到红色等。

理想情况下,我将具有这样的函数,它仅需要两种颜色以及在两种颜色之间淡出所花费的时间。

toggle_color = function(color1, color2, time) { ... }

我已经尝试过使用setInterval和setTimeout在它们之间进行翻转,但是这样做并不顺利(即Fade)或处于循环状态。不知道该怎么做。同样不确定使用延迟是正确的选择。似乎仅凭单个时间值始终处于淡入状态可能会更简单,但同样,不确定如何进行。
function toggle_color(color1, color2, cycle_time, wait_time) {

setInterval(function first_color() {
    document.body.style.backgroundColor = color1;
    setTimeout(change_color, wait_time);
}, cycle_time);

function change_color() {
    document.body.style.backgroundColor = color2;
}

最佳答案

我不知道如何不使用CSS过渡就可以做到这一点,但是我相信您仍然可以得到想要的东西。您可以使用JS动态修改背景色动画的过渡时间。

// CSS
body {
   -webkit-transition:background-color 1s ease;
   -moz-transition:background-color 1s ease;
   -o-transition:background-color 1s ease;
   transition:background-color .1s ease;
}

// JS

var id = toggle_color('red', 'blue', 5000);

function toggle_color(color1, color2, time) {
  var $selector = document.querySelector('body');

  setTransitionDurations($selector, time)
  $selector.style.backgroundColor = $selector.style.backgroundColor === color1 ? color2 : color1;
  var intervalId = setInterval(function() {
    $selector.style.backgroundColor = $selector.style.backgroundColor === color1 ? color2 : color1;
  }, time);
  return intervalId;
}

function getStringFromMs(ms) {
  // convert ms to string
  // i.e. 1000 => '1ms'
  return ms + 'ms';
}

function setTransitionDurations($selector, ms) {
  var transitionSeconds = getStringFromMs(ms);
  // you need to set the transition for
  // each browser for max compatibility
  var prefixes = ['-webkit', '-o', '-moz'];
  prefixes.forEach(function(prefix) {
    $selector.style.setProperty(prefix + '-transition-duration', transitionSeconds);
  })
  $selector.style.transitionDuration = transitionSeconds;
}

看看这个jsfiddle来解决:https://jsfiddle.net/dwLL9yy4/8/。注意几件事。如果要动态更改转换,则需要确保为每个浏览器更新转换。请注意,仅IE10及更高版本支持转换。同样,转换期望的时间格式为“1s”或“1000ms”。有关过渡的更多详细信息,请查看https://developer.mozilla.org/en-US/docs/Web/CSS/transition

09-13 12:19