Dynamically change colours with CSS so background and text colour aren’t clashing

I’m facing the problem that users can change background colours for HTML components which sometimes conflict with text colours they can’t change (or more generally, background and text colour are visually too similar). As a result, the text may become invisible (or difficult to see) if those colours are visually close enough.

See below where’s there’s a triangle (=text)…

…which only becomes more visible on hover.

(the user could also have also opted for a grey background which would have made this even worse)

I’ve tried to tinker with filters (e.g. filter: brightness(50%) contrast(150%); or filter: saturate(0) grayscale(1) brightness(.7) contrast(1000%) invert(1) as suggested here), but that’s sensitive to the selected colours (i.e. may not work in all cases of background and text colour combinations). Is there a way (in CSS, without JS as shown here) that would change the text colour slightly (ideally, the “type of colour” itself is somewhat maintained), so that text on conflicting (too close) background and text colours becomes visible?

I realise that this question is asking for 2 things (1. detecting the conflict and 2. resolving the conflict by applying some sort of filter (or others)). If some suggestions are made for how to resolve the conflicting colours (2.), I’d already be happy.

Trying mix-blend-mode: difference

Without mix-blend-mode: difference;

With mix-blend-mode: difference;

3

This article demonstrates a CSS method for switching the (text) color between black and white based on the (perceived) luminance of the background color. So it’s not exactly what you’re asking for, but it’s close.

A simpler alternative you could consider is using a contrasting text-shadow to improve readability when the text and background colours are similar.

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<code>:root {
--clr-white-80: rgb(255 255 255 / 0.8);
}
body {
background: lightsalmon;
font-size: 2.5em;
}
p {
color: peru;
margin: 0;
}
.p2 {
text-shadow: 0 0 5px var(--clr-white-80);
}
.p3 {
text-shadow: 0 0 20px var(--clr-white-80);
}
.p4 {
text-shadow: 2px 2px 0 var(--clr-white-80);
}</code>
<code>:root { --clr-white-80: rgb(255 255 255 / 0.8); } body { background: lightsalmon; font-size: 2.5em; } p { color: peru; margin: 0; } .p2 { text-shadow: 0 0 5px var(--clr-white-80); } .p3 { text-shadow: 0 0 20px var(--clr-white-80); } .p4 { text-shadow: 2px 2px 0 var(--clr-white-80); }</code>
:root {
  --clr-white-80: rgb(255 255 255 / 0.8);
}

body {
  background: lightsalmon;
  font-size: 2.5em;
}

p {
  color: peru;
  margin: 0;
}

.p2 {
  text-shadow: 0 0 5px var(--clr-white-80);
}

.p3 {
  text-shadow: 0 0 20px var(--clr-white-80);
}

.p4 {
  text-shadow: 2px 2px 0 var(--clr-white-80);
}
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<code><p class="p1">Is this readable?</p>
<p class="p2">What about now?</p>
<p class="p3">Or with a larger spread</p>
<p class="p4">Or with an offset</p></code>
<code><p class="p1">Is this readable?</p> <p class="p2">What about now?</p> <p class="p3">Or with a larger spread</p> <p class="p4">Or with an offset</p></code>
<p class="p1">Is this readable?</p>
<p class="p2">What about now?</p>
<p class="p3">Or with a larger spread</p>
<p class="p4">Or with an offset</p>

3

The need for CSS to address this problem has been recognised, and a CSS function contrast-color() has been drafted to help. At this stage, experimental support for this function is available only in Safari TP.

Note that the spec says the function is to be called contrast-color(), but what Safari TP has currently implemented is color-contrast().

1

Trang chủ Giới thiệu Sinh nhật bé trai Sinh nhật bé gái Tổ chức sự kiện Biểu diễn giải trí Dịch vụ khác Trang trí tiệc cưới Tổ chức khai trương Tư vấn dịch vụ Thư viện ảnh Tin tức - sự kiện Liên hệ Chú hề sinh nhật Trang trí YEAR END PARTY công ty Trang trí tất niên cuối năm Trang trí tất niên xu hướng mới nhất Trang trí sinh nhật bé trai Hải Đăng Trang trí sinh nhật bé Khánh Vân Trang trí sinh nhật Bích Ngân Trang trí sinh nhật bé Thanh Trang Thuê ông già Noel phát quà Biểu diễn xiếc khỉ Xiếc quay đĩa Dịch vụ tổ chức sự kiện 5 sao Thông tin về chúng tôi Dịch vụ sinh nhật bé trai Dịch vụ sinh nhật bé gái Sự kiện trọn gói Các tiết mục giải trí Dịch vụ bổ trợ Tiệc cưới sang trọng Dịch vụ khai trương Tư vấn tổ chức sự kiện Hình ảnh sự kiện Cập nhật tin tức Liên hệ ngay Thuê chú hề chuyên nghiệp Tiệc tất niên cho công ty Trang trí tiệc cuối năm Tiệc tất niên độc đáo Sinh nhật bé Hải Đăng Sinh nhật đáng yêu bé Khánh Vân Sinh nhật sang trọng Bích Ngân Tiệc sinh nhật bé Thanh Trang Dịch vụ ông già Noel Xiếc thú vui nhộn Biểu diễn xiếc quay đĩa Dịch vụ tổ chức tiệc uy tín Khám phá dịch vụ của chúng tôi Tiệc sinh nhật cho bé trai Trang trí tiệc cho bé gái Gói sự kiện chuyên nghiệp Chương trình giải trí hấp dẫn Dịch vụ hỗ trợ sự kiện Trang trí tiệc cưới đẹp Khởi đầu thành công với khai trương Chuyên gia tư vấn sự kiện Xem ảnh các sự kiện đẹp Tin mới về sự kiện Kết nối với đội ngũ chuyên gia Chú hề vui nhộn cho tiệc sinh nhật Ý tưởng tiệc cuối năm Tất niên độc đáo Trang trí tiệc hiện đại Tổ chức sinh nhật cho Hải Đăng Sinh nhật độc quyền Khánh Vân Phong cách tiệc Bích Ngân Trang trí tiệc bé Thanh Trang Thuê dịch vụ ông già Noel chuyên nghiệp Xem xiếc khỉ đặc sắc Xiếc quay đĩa thú vị
Trang chủ Giới thiệu Sinh nhật bé trai Sinh nhật bé gái Tổ chức sự kiện Biểu diễn giải trí Dịch vụ khác Trang trí tiệc cưới Tổ chức khai trương Tư vấn dịch vụ Thư viện ảnh Tin tức - sự kiện Liên hệ Chú hề sinh nhật Trang trí YEAR END PARTY công ty Trang trí tất niên cuối năm Trang trí tất niên xu hướng mới nhất Trang trí sinh nhật bé trai Hải Đăng Trang trí sinh nhật bé Khánh Vân Trang trí sinh nhật Bích Ngân Trang trí sinh nhật bé Thanh Trang Thuê ông già Noel phát quà Biểu diễn xiếc khỉ Xiếc quay đĩa
Thiết kế website Thiết kế website Thiết kế website Cách kháng tài khoản quảng cáo Mua bán Fanpage Facebook Dịch vụ SEO Tổ chức sinh nhật