CSS设置背景颜色只是表格行宽度的百分比

Posted

技术标签:

【中文标题】CSS设置背景颜色只是表格行宽度的百分比【英文标题】:CSS to set the background color for just a percentage of the width of a table row 【发布时间】:2012-08-14 19:31:36 【问题描述】:

我有一个包含两列的基本表:名称和值。我想根据值的大小为表格中的每一行加上适当的宽度百分比(本质上是创建一个横向直方图!)。我可以编写代码来计算要设置的适当百分比,但我无法计算出 CSS 以适当地对每一行进行实际着色。似乎整行都可以着色,但不是百分比。这是真的吗?

对于它的价值,我正在使用 Twitter Bootstrap,如果需要,我也可以使用 jQuery。这仅在 Chrome 上运行,因此仅 CSS3 和 Webkit 就可以了!这是 html

<table class="table">
  <tbody class="lead">              
    <tr> 
      <td>
        Joe
      </td>
      <td>
        10
      </td>
    </tr>              
    <tr> 
      <td>
        Jane
      </td>
      <td>
        20 
      </td>
    </tr>              
    <tr> 
      <td>
        Jim
      </td>
      <td>
        2
      </td>
    </tr>
  </tbody>
</table>

关于如何做到这一点的任何提示?希望这个问题有意义。

【问题讨论】:

如果解决方案是 CSS3 特定的,它会起作用吗? 你应该看看渐变,我不确定具体是怎么做的,但我知道在渐变中你可以这样做,然后使用 jquery 修改 .attr() 【参考方案1】:

无需使用渐变。首先,创建一个简单的图像文件,使用您想要为行着色的颜色。在我的例子中,我创建了一个全黑色的.png(在下面的示例中为black.png)。现在,只需使用 background-imagebackground-size 属性为行的适当部分着色。

示例,HTML:

<table cellspacing = "0px">
    <tr class = "row"><td>Hello Hello</td><td>Bye Bye</td></tr>
</table>

CSS:

.row 
    background-color: white; /*fallback color*/
    background-image: url(black.png);
    background-size: 75% 100%; /*your percentage is the first one (width), second one (100%) is for height*/
    background-repeat: no-repeat;
    color: rgb(0, 140, 200);
    font-weight: bold;

结果:

下面是一个简单的 sn-p,说明如何为您的示例自动执行此操作:

var tbl = document.getElementsByClassName("table")[0];
var rws = tbl.rows;
for(var i = 0; i < rws.length; i ++) 
    var percentage = parseInt(rws[i].getElementsByTagName("td")[1].innerHTML, 10);
    rws[i].style.backgroundImage = "black.png";
    rws[i].style.backgroundSize = percentage + "%" + " 100%";
    rws[i].style.backgroundRepeat = "no-repeat";
    rws[i].style.color = "rgb(0, 140, 200)";

小演示:percentage width bg color (non-gradient based).

希望对你有所帮助!

【讨论】:

这真的很酷。但由于某种原因,每个单元格都被 75% 的阴影覆盖(在两列中)。与您的屏幕截图不同,它没有跨越整个宽度。我会继续四处寻找,因为你的例子似乎有效! @tonic 这是 Chrome 的错误,我在最后一次编辑我的答案时修复了它。 @tonic 您需要将position: relative; display: block; 添加到行中才能与 Chrome 一起使用。这是使用background-image 时的一个已知问题。请参阅我的演示,它也适用于 Chrome。 @tonic 还注意到我的 javascript 代码中有错字。现在检查一个有效的演示和更正的代码。 对于 jsfiddle,这是一个有效的黑色像素:delhisweetcentre.co.uk/pics/black-pixel.jpg【参考方案2】:

你可以使用线性渐变。

如果百分比是 40%:

table
    background: -webkit-gradient(linear, left top, right top, color-stop(40%,#F00), color-stop(40%,#00F));
    background: -moz-linear-gradient(left center, #F00 40%, #00F 40%);
    background: -o-linear-gradient(left, #F00 40%, #00F 40%);
    background: linear-gradient(to right, #F00 40%, #00F 40%);

Demo

所以,在 JavaScript 中,

var percentage=40,
    col1="#F00",
    col2="#00F";
var t=document.getElementById('table');
t.style.background = "-webkit-gradient(linear, left top,right top, color-stop("+percentage+"%,"+col1+"), color-stop("+percentage+"%,"+col2+"))";
t.style.background = "-moz-linear-gradient(left center,"+col1+" "+percentage+"%, "+col2+" "+percentage+"%)";
t.style.background = "-o-linear-gradient(left,"+col1+" "+percentage+"%, "+col2+" "+percentage+"%)";
t.style.background = "linear-gradient(to right,"+col1+" "+percentage+"%, "+col2+" "+percentage+"%)";

Demo


如果您想以不同的方式将其应用于每一行:

var col1="#F00",
    col2="#00F";
var els=document.getElementById('table').getElementsByTagName('tr');
for (var i=0; i<els.length; i++) 
    var percentage = Number(els[i].getElementsByTagName('td')[1].firstChild.nodeValue);
    els[i].style.background = "-webkit-gradient(linear, left top,right top, color-stop("+percentage+"%,"+col1+"), color-stop("+percentage+"%,"+col2+"))";
    els[i].style.background = "-moz-linear-gradient(left center,"+col1+" "+percentage+"%, "+col2+" "+percentage+"%)" ;
    els[i].style.background = "-o-linear-gradient(left,"+col1+" "+percentage+"%, "+col2+" "+percentage+"%)";
    els[i].style.background = "linear-gradient(to right,"+col1+" "+percentage+"%, "+col2+" "+percentage+"%)" ;

问题在于将背景设置为tr 在 Firefox 和 Opera 上效果很好,但在 Chrome 上,渐变会应用于每个单元格。

添加此代码可以解决此问题(请参阅https://***.com/a/10515894):

#table td display: inline-block;

Demo

【讨论】:

谢谢!但是,这会使整个表格变暗。每一行都需要不同的阴影百分比。我该如何调整这段代码来做到这一点? @tonic,只需选择 tr 而不是整个表格。 感谢@oriol 的编辑!在您添加的编辑中,我注意到整个行在 jsfiddle 中没有阴影,而只是名称单元格。是否可以将整行遮蔽一定百分比? @tonic 检查我的答案是否有非梯度解决方案。 我将其应用于现有表,但是当我到达以 els[i].style.background 部分开头的四行时,IE 一直说这是一个“无效参数”。 Firefox 和 Chrome 似乎没有问题(正如预期的那样)。有人有建议吗?

以上是关于CSS设置背景颜色只是表格行宽度的百分比的主要内容,如果未能解决你的问题,请参考以下文章

CSS 如何实现一行表格的横向颜色渐变

用JS文件如何设置奇数表格行背景和偶数表格行背景

在Css中如何设置span的背景颜色和背景图片

Html表格背景颜色透明度怎么调,只用HTML和css

css静态网页背景颜色或者背景图片宽度都不能占满整个网页,右边有很大一块白色的,代码如下图,求解决。

HTML的表格怎么设置颜色啊!~