JavaScript Text Color Based on Background

JavaScript Font Color
Project: Automatic text color check [JS]
Author: Emilio Dominguez
Edit Online: View on CodePen
License: MIT

This JavaScript code snippet helps to change text color based on the background color. It comes with a color switcher input and a resultant color output element. It also defines a function to convert hexadecimal color codes to RGB values, and another function to set the contrast color of an element based on a given color.

The setContrastColor function calculates the brightness of a color and sets the contrast color of the target element to either black or white based on the brightness value.

Overall, this code allows users to select a color and see its corresponding contrast color in real-time.

How to change Text Color Based on Background

Create the HTML structure as follows:

<div class="box">
    <h1>Press the button below to change the color</h1>
    <p>
        The text color will change automatically according to the background color brightness...
    </p>
</div>

<h4 id="resultant-color"></h4>

<button class="color-switcher" title="Change the color...">
    <input type="color" />
</button>

Style using the following CSS styles:

@import url("https://fonts.googleapis.com/css2?family=Quicksand:wght@300;400;500;600;700&display=swap");
:root {
  --primaryColor: #222;
  --primaryContrastColor: #fff;
}

*,
*::before,
*::after {
  margin: 0;
  padding: 0;
  box-sizing: border-box;
  font-family: "Quicksand", sans-serif;
}

body {
  min-height: 100vh;
  display: flex;
  flex-direction: column;
  justify-content: center;
  align-items: center;
}
@media (max-width: 540px) {
  body {
    padding: 25px;
  }
}

.box {
  max-width: 500px;
  padding: 15px;
  text-align: center;
  background-color: var(--primaryColor);
  box-shadow: 0 0 6px rgba(0, 0, 0, 0.1), 0 0 6px rgba(0, 0, 0, 0.15), 0 0 3px rgba(0, 0, 0, 0.15) inset;
  border-radius: 5px;
  color: var(--primaryContrastColor);
  transition: color ease 250ms;
}
.box h1 {
  font-size: 1.25rem;
  margin-bottom: 5px;
}
.cd__main{
display: block !important;
}

#resultant-color {
  margin: 15px auto;
  font-size: 15px;
  text-transform: uppercase;
}

.color-switcher {
  position: relative;
  width: 25px;
  height: 25px;
  border-radius: 5px;
  border: none;
  box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1), 0 2px 4px rgba(0, 0, 0, 0.15), 0 0 3px rgba(0, 0, 0, 0.15) inset;
  background-color: var(--primaryColor);
  animation: pulse ease-out infinite 1s;
}
.color-switcher:hover {
  animation: none;
}
.color-switcher input {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  opacity: 0;
  cursor: pointer;
}

@keyframes pulse {
  from, to {
    transform: scale(1);
  }
  50% {
    transform: scale(1.1);
  }
}

Finally, add the following JavaScript function:

const colorSwitcher = document.querySelector(".color-switcher input");
const resultantColor = document.querySelector("#resultant-color");

function hexToRgb(hex) {
  const shortHexRegExp = /^#?([a-f\d])([a-f\d])([a-f\d])$/i;
  hex = hex.replace(shortHexRegExp, (_, r, g, b) => r + r + g + g + b + b);
  const result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);

  if (!result) throw Error('A valid HEX must be provided');

    return {
        r: parseInt(result[1], 16),
        g: parseInt(result[2], 16),
        b: parseInt(result[3], 16)
    };
}

function setContrastColor(color, target = document.documentElement) {
    const { r, g, b } = hexToRgb(color);
    const yiq = (r * 299 + g * 587 + b * 114) / 1000;
    // https://en.wikipedia.org/wiki/YIQ

    let contrastColor;

    if (yiq >= 128) {
        contrastColor = "#000";
    } else {
        contrastColor = "#fff";
    }

    target.style.setProperty("--primaryColor", color);
    target.style.setProperty(
        "--primaryContrastColor",
        contrastColor
    );
}

colorSwitcher.addEventListener("input", ({ target }) => {
    setContrastColor(target.value);
    resultantColor.innerHTML = `<h1>${target.value}</h1>`;
});

That’s all! hopefully, you have successfully integrated this JavaScript code to changes text color based on background. If you have any questions or suggestions, feel free to comment below.

Leave a Comment

Comments

No comments yet. Why don’t you start the discussion?

Leave a Reply