RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 640370
Accepted
cronfy
cronfy
Asked:2020-03-16 22:51:57 +0000 UTC2020-03-16 22:51:57 +0000 UTC 2020-03-16 22:51:57 +0000 UTC

Javascript:在黑色背景上的页面上查找黑色文本

  • 772

如何使用 Javascript 查找页面上所有黑底黑字的元素?同时,黑色背景/颜色可以不分配给元素本身,而是分配给远方的父元素,但在所有继承之后,结果是黑色的黑色。

我们设定的任务是:在网站上为视障人士制作一个版本。其中一个要点是颜色反转,即我们在黑色背景上显示白色文本。我写了 black backgroundy body,更正了其他容器的 css,一切都很好,除了一个但是。在所见即所得编辑器的某些页面的管理区域中,明确定义了文本的黑色(在属性中style)。因此,此文本在页面上不可见。

我想找到一种无需更改页面代码即可解决问题的解决方案。

例如,让 javascript 自动找到这样的文本并将其颜色更改为白色。问题是如何找到这样的元素。

到目前为止,我只看到递归遍历所有 DOM 元素、记住background父元素并检查元素本身的颜色的选项。

但也许有更简单的方法,一些在 jquery 中几行的解决方案?

换句话说,您需要确保在第二个示例div > p中文本是可见的:

.orig {
  background-color: #fff;
}

.invert {
  background-color: #000;
}
<h2>Оригинал</h2>
<div class="orig"><p style="color: black">Текст</p></div>

<h2>Инверсия</h2>
<div class="invert"><p style="color: black">Текст</p></div>

javascript
  • 5 5 个回答
  • 10 Views

5 个回答

  • Voted
  1. Best Answer
    Sasha Omelchenko
    2020-03-17T18:34:30Z2020-03-17T18:34:30Z

    我突然想到,编辑器中设置的样式不一定会将文本设置为黑色——它可以是深灰色或某种棕色。这种颜色的文字在倒置的背景上,对于视障人士来说仍然难以阅读,所以你需要确定文字和背景的对比度。

    代码部分复制粘贴自Leah Veru的对比度计。

    这段代码中发生了什么:函数getLuminance()返回相对亮度;该函数getContrastRatio()返回输入的背景和文本颜色数据的对比度。我们遍历块内的每个段落.invert,确定对比度,如果小于 7(这是 WCAG 要求),我们将文本设为白色,如果大于 7,则保持原样.

    UPD:我重写了代码以确定背景颜色不是为父元素,而是为元素本身,为此你需要在 CSS 中编写一个段落background-color: inherit并将bg你自己的背景颜色的值分配给变量:bg = $(item).css('background-color')。

    UPD:最终版本,它允许您对对比度不足且不使用的元素执行任何操作background-color: inherit。

    资料来源:

    Lea Verou,对比度。

    相对亮度计算公式:https ://www.w3.org/TR/2008/REC-WCAG20-20081211/#relativeluminancedef 。

    对比度计算公式:https ://www.w3.org/TR/2008/REC-WCAG20-20081211/#contrast-ratiodef 。

    $(function() {
      var color, bg, textLuminance, parentLuminance, cr;
    
      $('.invert p').each(function(index, item) {
        color = $(item).css('color'),
        bg = $(item).css('background-color');
    
        textLuminance = getLuminance(color);
        parentLuminance = getLuminance(bg);
        
        cr = getContrastRatio(textLuminance, parentLuminance);
        
        if(cr <= 7) $(item).css('color', '#fff');
      });
    
      function getContrastRatio(l1, l2) {
        l1 += .05,
        l2 += .05;
        
        var ratio = l1 / l2;
    
        if (l2 > l1) {
          ratio = 1 / ratio;
        }
    
        return ratio = Math.round(ratio, 1);
      }
    
      function getLuminance(color) {
        var rgb = color.slice(4, -1).split(',').map(Number);
    
        for (var i = 0; i < 3; i++) {
          var rgbI = rgb[i];
    
          rgbI /= 255;
    
          rgbI = rgbI < .03928 ? rgbI / 12.92 : Math.pow((rgbI + .055) / 1.055, 2.4);
    
          rgb[i] = rgbI;
        }
    
        return .2126 * rgb[0] + .7152 * rgb[1] + 0.0722 * rgb[2];
      }
    });
    .orig {
      background-color: #fff;
    }
    
    .invert {
      background-color: #000;
    }
    
    .invert p {
      padding: 5px;
      background-color: inherit;
    }
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    
    <h2>Оригинал</h2>
    <div class="orig">
      <p style="color: black">Текст</p>
    </div>
    
    <h2>Инверсия</h2>
    <div class="invert">
      <p>Обычный текст без инлайновых стилей</p>
    </div>
    
    <div class="invert">
      <div style="background-color: #fff">
      <div style="background-color: #ff0">
      <div>
      <p style="color: black">Черный Текст</p>
      </div>
      </div>
      </div>
    </div>
    
    <div class="invert">
      <p style="color: brown; background: darkgrey">Коричневый Текст</p>
    </div>
    
    <div class="invert">
      <p style="color: blue">Синий Текст</p>
    </div>
    
    <div class="invert">
      <p style="color: yellow">Желтый Текст</p>
    </div>
    
    <div class="invert">
      <p style="color: orange">Оранжевый Текст</p>
    </div>

    • 9
  2. HamSter
    2020-03-17T03:34:45Z2020-03-17T03:34:45Z

    可能是这样:

    $('p').each(function(){
      var
        $this = $(this),
        wrap = $this.parent('div'),
        color = $(this).css('color'),
        bg = wrap.css('backgroundColor');
      
      console.log(color + ' ' + bg);
      
      if(color === bg) {
        $this.css({'color':'#ffffff'});
      }
    });
    .orig {
      background-color: #fff;
    }
    
    .invert {
      background-color: #000;
    }
    <script src="https://code.jquery.com/jquery-2.1.4.js"></script>
      
    <h2>Оригинал</h2>
    <div class="orig"><p style="color: black">Текст</p></div>
    
    <h2>Инверсия</h2>
    <div class="invert"><p style="color: black">Текст</p></div>

    要么像这样:

    $('p').each(function(){
      var
        $this = $(this),
        wrap = $this.closest('.invert'),
        color = $(this).css('color'),
        bg = wrap.css('backgroundColor');
      
      console.log(color + ' ' + bg);
      
      if(color === bg) {
        $this.css({'color':'#ffffff'});
      }
    });
    .orig {
      background-color: #fff;
    }
    
    .invert {
      background-color: #000;
    }
    <script src="https://code.jquery.com/jquery-2.1.4.js"></script>
      
    <h2>Оригинал</h2>
    <div class="orig"><p style="color: black">Текст</p></div>
    
    <h2>Инверсия</h2>
    <div class="invert">
      <div>
        <div>
          <div><p style="color: black">Текст</p></div>
        </div>
      </div>
    </div>

    • 7
  3. Sasha Omelchenko
    2020-03-17T01:14:07Z2020-03-17T01:14:07Z

    也许有过滤器invert?

    .orig {
      background-color: #fff;
    }
    
    .invert {
      background-color: #000;
    }
    
    .invert p {
      filter: invert(100%);
    }
    <h2>Оригинал</h2>
    <div class="orig"><p style="color: black">Текст</p></div>
    
    <h2>Инверсия</h2>
    <div class="invert"><p style="color: black">Текст</p></div>

    • 4
  4. user207618
    2020-03-16T23:27:20Z2020-03-16T23:27:20Z

    好奇的。
    当您更改文本节点 ( MutationObserver) 时,您可以检查其颜色,将其与黑色进行比较,如果太暗,则将其调亮。
    保存时绕树(TreeWalker),强制设置文字颜色。

    • 3
  5. MobiDevices
    2020-03-17T00:13:31Z2020-03-17T00:13:31Z

    如果您想快速轻松地完成它,请使用属性在本机 CSS 中完成mix-blend-mode:

    p {
      color: #fff !important;;
      mix-blend-mode: difference;
    }
    <h2>Оригинал</h2>
    <div style="background-color: #fff;"><p>Текст</p></div>
    
    <h2>Инверсия</h2>
    <div style="background-color: #000;"><p style="color: black">Текст</p></div>
    
    <h2>mix-blend-mode</h2>
    <div style="background-color: #000;"><p>Текст</p></div>

    • 1

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    Python 3.6 - 安装 MySQL (Windows)

    • 1 个回答
  • Marko Smith

    C++ 编写程序“计算单个岛屿”。填充一个二维数组 12x12 0 和 1

    • 2 个回答
  • Marko Smith

    返回指针的函数

    • 1 个回答
  • Marko Smith

    我使用 django 管理面板添加图像,但它没有显示

    • 1 个回答
  • Marko Smith

    这些条目是什么意思,它们的完整等效项是什么样的

    • 2 个回答
  • Marko Smith

    浏览器仍然缓存文件数据

    • 1 个回答
  • Marko Smith

    在 Excel VBA 中激活工作表的问题

    • 3 个回答
  • Marko Smith

    为什么内置类型中包含复数而小数不包含?

    • 2 个回答
  • Marko Smith

    获得唯一途径

    • 3 个回答
  • Marko Smith

    告诉我一个像幻灯片一样创建滚动的库

    • 1 个回答
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Алексей Шиманский 如何以及通过什么方式来查找 Javascript 代码中的错误? 2020-08-03 00:21:37 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    user207618 Codegolf——组合选择算法的实现 2020-10-23 18:46:29 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5