首页 > 其他分享 >CSS 如何根据背景色自动切换黑白文字?

CSS 如何根据背景色自动切换黑白文字?

时间:2023-06-16 15:33:56浏览次数:48  
标签:颜色 -- 黑白 背景色 滤镜 contrast var CSS

在项目中,经常会碰到背景色不确定的场景,为了让内容文字足够清晰可见,文字和背景之间需要有足够的对比度。换句话说,当背景是深色时,文字为白色,当背景是浅色时,文字为黑色,就像这样:

一、CSS 滤镜实现

使用滤镜对文字单独处理,所以需要额外一层标签。然后容器和文字用同一种颜色表示,目的是让文字颜色和背景相关联,可以通过currentColor实现。

用到对比度滤镜(contrast),在前面的基础上再叠加一层,再用到反转滤镜(invert),颠倒黑白。

<div class="box">
  <span class="text">前端侦探</span>
</div>

<style>
.box {
  width: 300px;
  height: 300px;
  color: #ffeb3b;
  background-color: currentColor;
  .text {
    font-size: 30px;
    filter: grayscale(1) contrast(999) invert(1);
  }
}
</style>

效果如下:

下面用一张图来表示转换过程:

 

二、CSS 其他思路

除了上面这种方式,还可以通过 CSS 变量来实现,要复杂一些。

这里简单介绍一下实现思路

  1. 将颜色RGB值拆分成 3 个独立的 CSS变量
  2. 通过灰度算法,用 CSS 计算函数算出灰度
  3. 用得到的灰度和阈值做差值,通过hsl模式转换成纯黑和纯白
:root {
  /* 定义RGB变量 */
  --red: 44;
  --green: 135;
  --blue: 255;
  /* 文字颜色变色的临界值,建议0.5~0.6 */
  --threshold: 0.5;
}

.btn {
  /* 按钮背景色就是基本背景色 */
  background: rgb(var(--red), var(--green), var(--blue));

  /** 
   * 使用sRGB Luma方法计算灰度(可以看成亮度)
   * 算法为:
   * lightness = (red * 0.2126 + green * 0.7152 + blue * 0.0722) / 255
  */
  --r: calc(var(--red) * 0.2126);
  --g: calc(var(--green) * 0.7152);
  --b: calc(var(--blue) * 0.0722);
  --sum: calc(var(--r) + var(--g) + var(--b));
  --lightness: calc(var(--sum) / 255);

  /* 设置颜色 */
  color: hsl(0, 0%, calc((var(--lightness) - var(--threshold)) * -999999%));
}

相比前面的实现而言,实现更加灵活,可以少一层标签。

 

另外,CSS 正在起草一个颜色对比函数color-contrast,可以从几个颜色中自动选择对比度最高的那个,实现是这样的

.text-contrast-primary {
  color: color-contrast(var(--theme-primary) vs white, black);
}

不过,现在还没有任何浏览器支持。

 

三、优缺点总结

总的来说,在color-contrast函数支持之前,我更推荐 CSS 滤镜方式,有以下几点好处

  1. 代码简洁,就一行代码,3 个滤镜
  2. 对颜色格式无任何要求,无需转换成 RGB模式
  3. 无需了解颜色算法,对设计更为友好

当然,也是存在一些缺点

  1. 需要单独一层标签,使用场景可能有限制
  2. 对颜色敏感度较高,不然无从下手
  3. 颜色转换有限制,最终只能是黑白,其他颜色就无能为力了

下面来回顾一下用到的3个滤镜,总结一下

  1. 灰度滤镜(grayscale),可以将彩色的文字转换成灰色
  2. 对比度滤镜(contrast),可以极大的增强对比度,黑的更黑,白的更白,如果是浅灰,那就变成白色,如果是深灰,那就变成黑色
  3. 反转滤镜(invert),可以翻转颜色,颠倒黑白

标签:颜色,--,黑白,背景色,滤镜,contrast,var,CSS
From: https://www.cnblogs.com/moranjl/p/17485684.html

相关文章

  • 浅析CSS实现超过3行折叠并显示...查看详情
    要实现效果如下:尾部带查看详情,前面有三个点省略号。之前单独看这个布局,即使借助JavaScript也不是一件容易的事啊(需要计算文字宽度动态截取文本,然后append上三个点和查看详情。vue-clamp就是这么做的,包括很多博客也是这么讲的,但是讲真,如果是个列表,这种不断的判断,肯定不是......
  • tailwindcss基本使用
    目录一、tailwindcss基本使用1、设置tailwind和postcss一、tailwindcss基本使用1、设置tailwind和postcss命令*npminit-y*npmitailwindcsspostcss-cliautoprefixer*npxtailwindinit编辑tailwind.config.jsmodule.exports={content:["./public/**/*.......
  • 2023-06-15 css伪类before、after制作文字两边横线
    <divclass="box">测试</div>···.box{color:#ccc;text-align:center;position:relative;&::after{position:absolute;left:24rpx;top:52%;content:'';width:calc(50%......
  • CSS(语义化标签、多媒体标签、新表单元素、属性选择器、结构伪类选择器、伪元素选择器
    一、HTML5新特性概述HTML5的新增特性主要是针对于以前的不足,增加了一些新的标签、新的表单和新的表单属性等。这些新特性都有兼容性问题,基本是IE9+以上版本的浏览器才支持,如果不考虑兼容性问题,可以大量使用这些新特性。1语义化标签(★★)以前布局,我们基本用div来做。di......
  • CSS的基本使用
    1.初始css1.1引入方式当读到一个样式表时,浏览器会根据它来格式化HTML文档。有三种:行内样式表(在HTML元素内部)<pstyle="color:white;">学习HTML好简单</p>内部样式表(位于<head>标签内部)<styletype="text/css"></style>外部样式表<linkhref="css/in......
  • vue+css: 引用的组件快速改变滚动条样式
    在a组件页面内有b组件,b组件产生的滚动条太丑不好看但是又不想改变b组件(b组件公共用的地方很多)又不想专门复制份在此基础上改。只要在使用的组件上增加css代码即可同时让组件内滚动条生效,原理是因为此滚动条相当于未定义类的当前组件全局。所以可以直接使用并生效comp.vue<styl......
  • css边框斜角
    为实现下面图形形状<style>.box{width:200px;height:100px;}</style><divclass="box"></div>1、利用linear-gradient.box{background:linear-gradient(135deg,transparent15px,#3b30)topleft,   linear-gradient(-135deg,......
  • vue3 css ts 双重弹跳加载动画
    /双重弹跳加载动画*/效果如同页面https://codepen.io/yjx123/pen/zYMvbML<ahref="javascript:void(0)"@click="startLoading"><inline-svg:src="getAssetPath(iconPath)"></inline-svg><div:style="{......
  • CSS动画和过渡的区别
    CSS动画和过渡都是用来实现网页元素的动态效果,但它们在实现方式和应用场景上有一些区别。CSS过渡(CSSTransitions)是在元素状态改变时实现平滑过渡效果的一种机制。过渡通过指定元素的属性变化,使元素从一个状态平滑地过渡到另一个状态。过渡通常用于响应用户操作、交互效果或状态......
  • CSS选择器的优先级和权重。
    定义:CSS选择器的优先级和权重是用来确定当多个选择器应用于同一个元素时,哪个选择器的规则将会生效。以下是CSS选择器优先级和权重的解释:CSS选择器的优先级:1.内联样式:应用于HTML元素内部的style属性,具有最高的优先级。如2.ID选择器:通过元素的id属性选择元素,如#example,具有较高的......