为什么 jQuery 将 hsl() 替换为 rgb()?

Why jQuery replaces hsl() with rgb()?

我想通过将 hsl 背景颜色应用于样式属性动态添加一些跨度,如下所示:

<span style="background-color: hsl(190, 75%, 43%)"></span>

这是我的 jQuery 这样做的:

var hues = [ 172, 178, 184, 190, 196, 202, 208 ];

$.each(hues, function(index, backgroundHue) {
    var newSpan = $('<span></span>');
    newSpan.css('background-color', 'hsl('+backgroundHue+', 75%, 43%)');
    someBlock.append(newSpan);
});

但结果我得到了 rgb() 背景颜色的跨度(从 hsl() 自动转换):

<span style="background-color: rgb(27, 165, 192);"></span>

这是一个fiddle:https://jsfiddle.net/pbjcvwdh/5/

谁能解释这是为什么,有什么办法可以避免这种自动转换?如果我在 html 中静态应用背景颜色,它不会更改为 rgb()。

jQuery 与此行为无关 - 这只是因为浏览器以 RGB 格式呈现值。不幸的是你不能改变它。如果你想获得 HSL 格式的值,你需要将它从 RGB 转换回来。如果需要,This question 可以帮助您。

为了证明上述内容,这里有一个表现出相同行为的原生 JS 实现:

[172, 178, 184, 190, 196, 202, 208].forEach(function(backgroundHue) {
  var span = document.createElement('span');
  span.style.backgroundColor = 'hsl(' + backgroundHue + ', 75%, 43%)';
  document.querySelector('.add-em-here').appendChild(span);
});
.add-em-here span {
  display: inline-block;
  height: 40px;
  width: 40px;
  border: 2px solid white;
  margin-left: 6px;
}
<div class="add-em-here">
  <!-- Added statically - stays with hsl() -->
  <span style="background-color: hsl(60, 75%, 43%)"></span>

  <!-- Added dynamically - auto-replaced with rgb() -->
</div>

jQuery 不处理服务器接收到的源 HTML。它操纵文档树的内存表示。因此,根本没有 HTML(或本例中的 CSS)要显示。

发生的情况是,无论您使用什么工具来调试代码,都必须实现这些内存中值的表示。 HTML 和 CSS 是常见的一个明显的选择,但它们都需要为您重新创建,这里是不同的实现可能不同的地方。例如,Firebug 的 Style 窗格使其可配置:

(我的 Firefox 已本地化,但希望您能理解。)

如果您希望它保留在 HSL 中,请使用 .attr() 而不是 .css():

newSpan.attr('style', 'background-color:hsl('+backgroundHue+', 75%, 43%)');

这样做时,页面将使用 HSL 而不是 RGB 呈现。