【问题标题】:How to dynamically change text colour based on dynamically changing background colour如何根据动态改变的背景颜色动态改变文本颜色
【发布时间】:2019-09-10 08:12:33
【问题描述】:

我正在建立一个新网站,需要我的文本根据不断变化的背景颜色来改变颜色,以保持对比度。我在网上搜索了不涉及 Sass 的答案,但没有一个有效...

我尝试了一些 JavaScript,但它们仅在背景是您手动更改的固定颜色时才有效。

我的当前文件: https://codepen.io/jonathanlee/pen/wZXvRY

var color = function getRandomColor() {
  var letters = '0123456789ABCDEF'.split('');
  var color = '#';
  for (var i = 0; i < 6; i++) {
    color += letters[Math.floor(Math.random() * 16)];
  }
  return color;
}
setInterval(function() {
  document.getElementById("test").style.backgroundColor = color(); //() to execute the function!
}, 3000);

var ww = function isDarkColor(rgb) {
  return Math.round((
    parseInt(rgb[0], 10) * 299 +
    parseInt(rgb[1], 10) * 587 +
    parseInt(rgb[2], 10) * 114) / 1000) <= 140
}

if (ww <= 140) {
  document.getElementById("test").style.color = '#fff';
} else {
  document.getElementById("test").style.color = '#000';
}

我尝试过但不起作用的其他解决方案之一:http://jsfiddle.net/QkSva/

function isDark(color) {
  var match = /rgb\((\d+).*?(\d+).*?(\d+)\)/.exec(color);
  return (match[1] & 255) +
    (match[2] & 255) +
    (match[3] & 255) <
    3 * 256 / 2;
}
$('div').each(function() {
  console.log($(this).css("background-color"))
  $(this).css("color", isDark($(this).css("background-color")) ? 'white' : 'black');
});

现实生活中的例子是我正在开发的网站上的另一个主页https://nepmelbourne.com/q。我的背景是动态的,但有些颜色与我的白色文本形成鲜明对比。

【问题讨论】:

  • 为什么不像在字幕上加一个小的文字阴影?
  • 谁在打电话isDarkColor

标签: javascript html css


【解决方案1】:

一种方法是将背景颜色的相反颜色设置为文本,如下所示,

function invertColor(hex, bw) {
    if (hex.indexOf('#') === 0) {
      hex = hex.slice(1);
    }
    // convert 3-digit hex to 6-digits.
    if (hex.length === 3) {
      hex = hex[0] + hex[0] + hex[1] + hex[1] + hex[2] + hex[2];
    }
    if (hex.length !== 6) {
      throw new Error('Invalid HEX color.');
    }
    var r = parseInt(hex.slice(0, 2), 16),
      g = parseInt(hex.slice(2, 4), 16),
      b = parseInt(hex.slice(4, 6), 16);
    if (bw) {
      // http://stackoverflow.com/a/3943023/112731
      return (r * 0.299 + g * 0.587 + b * 0.114) > 186 ?
        '#000000' :
        '#FFFFFF';
    }
    // invert color components
    r = (255 - r).toString(16);
    g = (255 - g).toString(16);
    b = (255 - b).toString(16);
    // pad each with zeros and return
    return "#" + padZero(r) + padZero(g) + padZero(b);
  }

  function padZero(str, len) {
    len = len || 2;
    var zeros = new Array(len).join('0');
    return (zeros + str).slice(-len);
  }

  var color = function getRandomColor() {
    var letters = '0123456789ABCDEF'.split('');
    var color = '#';
    for (var i = 0; i < 6; i++) {
      color += letters[Math.floor(Math.random() * 16)];
    }
    return color;
  }

  setInterval(function() {
    var bgColor = color();
    var textColor = invertColor(bgColor,true);
    document.getElementById("test").style.backgroundColor = bgColor; //() to execute the function!
    document.getElementById("test").style.color = textColor;
  }, 3000);
&lt;div id="test"&gt;This is some text&lt;/div&gt;

取自How can I generate the opposite color according to current color?的反色码

在 invertColor() 中添加了一个额外的参数 bw,如果 bw 设置为 true,则如果背景明亮,则文本颜色将为黑色,反之亦然。

【讨论】:

  • 感谢伟大的代码!但是,我想知道是否可以将文本保持为黑色或白色......
  • 太棒了!非常感谢!我试图解决的最后一件事是是否可以控制颜色变化的速度,即。每 3000 毫秒它会平滑地改变颜色...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-23
  • 2019-01-27
  • 2021-11-07
  • 2013-09-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多