How can I generate the opposite color according to current color?
UPDATE: Production-ready code on GitHub.
This is how I'd do it:
- Convert HEX to RGB
- Invert the R,G and B components
- Convert each component back to HEX
- Pad each component with zeros and output.
function invertColor(hex) {
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.');
}
// invert color components
var r = (255 - parseInt(hex.slice(0, 2), 16)).toString(16),
g = (255 - parseInt(hex.slice(2, 4), 16)).toString(16),
b = (255 - parseInt(hex.slice(4, 6), 16)).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);
}
Example Output:
Advanced Version:
This has a bw
option that will decide whether to invert to black or white; so you'll get more contrast which is generally better for the human eye.
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) {
// https://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);
}
Example Output:
How to easily invert text color based on the background color
Add this to the class .navbar-fixed-top in styles.css on line (1)
background-color: #0000004d;
The entire class should look like this:
.navbar-fixed-top {
position: fixed;
right: 0;
left: 0;
z-index: 1030;
top: 0;
background-color: #0000004d;
}
Hope I helped!
Calculating contrasting colours in javascript
In terms of sheer readability, you want to use black and white text on whatever background it is. So convert RGB to HSV, and just check whether V is < 0.5. If so, white, if not, black.
Try that first and see if you find it attractive.
If you don't, then you probably want the white and black not to be so stark when your background is too bright or too dark. To tone this down, keep the same hue and saturation, and use these values for brightness:
background V foreground V
0.0-0.25 0.75
0.25-0.5 1.0
0.5-0.75 0.0
0.75-1.0 0.25
On a medium color, you'll still see black or white text which will be nicely readable. On a dark color or light color, you'll see the same color text but at least 3/4 away in terms of brightness and therefore still readable. I hope it looks nice :)
How to get a color opposite to primary color?
you can use the colors "label" and "systembackground", they are usually opposite.
So use UIColor.systemBackground and UIColor.systemLabel for the opposite
or UIColor.secondarySystemBackground and UIColor.secondarySystemLabel etc...
Is it possible to make a Javascript program that changes the color of the text to the contrast of the background automatically?
Interesting resources for this:
- W3C - Ensure that foreground and background color combinations provide sufficient contrast
- Calculating the Perceived Brightness of a Color
Here's the W3C algorithm (with JSFiddle demo too):
const rgb = [255, 0, 0];
// Randomly change to showcase updates
setInterval(setContrast, 1000);
function setContrast() {
// Randomly update colours
rgb[0] = Math.round(Math.random() * 255);
rgb[1] = Math.round(Math.random() * 255);
rgb[2] = Math.round(Math.random() * 255);
// http://www.w3.org/TR/AERT#color-contrast
const brightness = Math.round(((parseInt(rgb[0]) * 299) +
(parseInt(rgb[1]) * 587) +
(parseInt(rgb[2]) * 114)) / 1000);
const textColour = (brightness > 125) ? 'black' : 'white';
const backgroundColour = 'rgb(' + rgb[0] + ',' + rgb[1] + ',' + rgb[2] + ')';
$('#bg').css('color', textColour);
$('#bg').css('background-color', backgroundColour);
}
#bg {
width: 200px;
height: 50px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="bg">Text Example</div>
How to invert text color according to what's behind it? (not only background)
I thought mix-blend-mode: difference;
would do just that. ✌️
#bg {
background-image:url(https://thumbs.dreamstime.com/b/beautiful-multicolored-bokeh-lights-holiday-glitter-background-christmas-new-year-birthday-celebration-high-resolution-image-133585052.jpg);
}
#test {
font-size:20vw;
color:#FFF;
mix-blend-mode: difference;
}
<div id="bg">
<div id="test">testing</div>
</div>
Invert colored text related background
You can avoid clip-path by using linear-gradient as background and the mix-blend-mode
will work perfectly:
#text { width: 150px; height: 150px; z-index: 1;}
#text { text-align: center; background: linear-gradient(to top right, black 50%, orange 51%);}
#text h1 { margin: 0; line-height: 150px; mix-blend-mode: difference; color: #fff;}
<div id="text"> <h1>TEXT</h1></div>
Related Topics
How to Use Window.Postmessage Across Domains
How to Detect Whether an Iframe Is Loaded
Making a Chrome Extension Download a File
Javascript: Extract Video Frames Reliably
Setting Href Attribute at Runtime
How to Determine Which Submit Button Was Pressed, Form Onsubmit Event, Without Jquery
Scope of Sessionstorage and Localstorage
How to Open a New Window and Insert HTML into It Using Jquery
How to Sort Elements by Numerical Value of Data Attribute
Why Element.Style Always Return Empty in Js
JavaScript Onclick Event Over Flash Object
Keycode on Android Is Always 229
Open Ie Browser in Firefox/Chrome Page
Make Anchor Link Go Some Pixels Above Where It's Linked To
Unexpected Token Colon JSON After Jquery.Ajax#Get
Html5 - Cross Browser Iframe Postmessage - Child to Parent