CSS 基于背景的图表
CSS background based graph
试图用 CSS 背景 属性 制作一个简单的图表,但我 运行 遇到了一个我无法解决的问题。
使用一个 x 宽和 y 高的容器,我在其中绘制每个父级宽度的 10% 的条(基于数据的可变高度)从背景位置 0% 开始到位置 90% 结束我应该有 10 根大小相同的钢筋完全适合容器吗?不幸的是,这不是我在页面上看到的结果,而是我最终得到了一个容器,它可以容纳 11 个柱,而不是 10 个。
截图:https://dl.dropboxusercontent.com/u/67967664/Bars.jpg
CSS如下:
background: linear-gradient(hsl(160,50%,20%), hsl(20,50%,20%)) 0% bottom no-repeat,
linear-gradient(hsl(160,50%,20%), hsl(20,50%,20%)) 10% bottom no-repeat,
linear-gradient(hsl(160,50%,20%), hsl(20,50%,20%)) 20% bottom no-repeat,
linear-gradient(hsl(160,50%,20%), hsl(20,50%,20%)) 30% bottom no-repeat,
linear-gradient(hsl(160,50%,20%), hsl(20,50%,20%)) 40% bottom no-repeat,
linear-gradient(hsl(160,50%,20%), hsl(20,50%,20%)) 50% bottom no-repeat,
linear-gradient(hsl(160,50%,20%), hsl(20,50%,20%)) 60% bottom no-repeat,
linear-gradient(hsl(160,50%,20%), hsl(20,50%,20%)) 70% bottom no-repeat,
linear-gradient(hsl(160,50%,20%), hsl(20,50%,20%)) 80% bottom no-repeat,
linear-gradient(hsl(160,50%,20%), hsl(20,50%,20%)) 90% bottom no-repeat hsl(0, 0%, 12%);
background-size: 10% 5%,
10% 10%,
10% 15%,
10% 20%,
10% 25%,
10% 30%,
10% 35%,
10% 40%,
10% 45%,
10% 50%;
background-size
仅用于测试目的,将在最终代码中通过 JavaScript 变为 set/updated。
所以问题是,我做错了什么,或者不了解我正在使用的方法?根据我的逻辑,在 10% 宽度的 0% 位置有一个条形意味着它填充 space 0% 到 10% 下一个从 10% 到 20% .. 从 90% 到 100%
使用:带有 Stylish 1.4.3 的 Firefox 38.0.5
您看到的问题是因为 background-position
在 CSS 中以百分比形式给出时的工作方式。以下是 spec 关于基于百分比 background-position
的说法:
A percentage for the horizontal offset is relative to (width of background positioning area - width of background image). A percentage for the vertical offset is relative to (height of background positioning area - height of background image), where the size of the image is the size given by ‘background-size’.
For example, with a value pair of ‘0% 0%’, the upper left corner of the image is aligned with the upper left corner of, usually, the box's padding edge. A value pair of ‘100% 100%’ places the lower right corner of the image in the lower right corner of the area. With a value pair of ‘75% 50%’, the point 75% across and 50% down the image is to be placed at the point 75% across and 50% down the area.
(重点是我的)
如此处所述,如果我们将位置指定为 10% bottom
(相当于 10% 100%
),则背景图像的实际放置方式是 10% 跨度的点图像放置在包含框上 10% 的点上。
现在举个例子,假设这个盒子是 100px x 100px。因此,容器框上的 10% 为 10px,图像上的 10% 为图像上的 1px 标记(因为背景大小设置为容器大小的 10%)。因此,图像实际上位于容器内 9px 处,因此容器上的 10px 和图像上的 1px 是同一点。这使得第二张图片与第一张图片重叠 1px。同样,第三张图片将与第二张图片重叠 2px,依此类推。
使用多个背景图片相同大小(X轴)时计算位置的规则是:
background-position
of nth-element = 100% * (n-1) / (图像总数 - 1)
对于 Y 轴,没有问题,因为它们都位于 100%,因此图像的底部将与容器的底部匹配。
div {
background: linear-gradient(hsl(160, 50%, 20%), hsl(20, 50%, 20%)) 0% bottom no-repeat, linear-gradient(hsl(160, 50%, 20%), hsl(20, 50%, 20%)) 11.11% bottom no-repeat, linear-gradient(hsl(160, 50%, 20%), hsl(20, 50%, 20%)) 22.22% bottom no-repeat, linear-gradient(hsl(160, 50%, 20%), hsl(20, 50%, 20%)) 33.33% bottom no-repeat, linear-gradient(hsl(160, 50%, 20%), hsl(20, 50%, 20%)) 44.44% bottom no-repeat, linear-gradient(hsl(160, 50%, 20%), hsl(20, 50%, 20%)) 55.55% bottom no-repeat, linear-gradient(hsl(160, 50%, 20%), hsl(20, 50%, 20%)) 66.66% bottom no-repeat, linear-gradient(hsl(160, 50%, 20%), hsl(20, 50%, 20%)) 77.77% bottom no-repeat, linear-gradient(hsl(160, 50%, 20%), hsl(20, 50%, 20%)) 88.88% bottom no-repeat, linear-gradient(hsl(160, 50%, 20%), hsl(20, 50%, 20%)) 99.99% bottom no-repeat hsl(0, 0%, 12%);
background-size: 10% 5%, 10% 10%, 10% 15%, 10% 20%, 10% 25%, 10% 30%, 10% 35%, 10% 40%, 10% 45%, 10% 50%;
min-height: 200px;
width: 600px;
}
<div></div>
试图用 CSS 背景 属性 制作一个简单的图表,但我 运行 遇到了一个我无法解决的问题。
使用一个 x 宽和 y 高的容器,我在其中绘制每个父级宽度的 10% 的条(基于数据的可变高度)从背景位置 0% 开始到位置 90% 结束我应该有 10 根大小相同的钢筋完全适合容器吗?不幸的是,这不是我在页面上看到的结果,而是我最终得到了一个容器,它可以容纳 11 个柱,而不是 10 个。
截图:https://dl.dropboxusercontent.com/u/67967664/Bars.jpg
CSS如下:
background: linear-gradient(hsl(160,50%,20%), hsl(20,50%,20%)) 0% bottom no-repeat,
linear-gradient(hsl(160,50%,20%), hsl(20,50%,20%)) 10% bottom no-repeat,
linear-gradient(hsl(160,50%,20%), hsl(20,50%,20%)) 20% bottom no-repeat,
linear-gradient(hsl(160,50%,20%), hsl(20,50%,20%)) 30% bottom no-repeat,
linear-gradient(hsl(160,50%,20%), hsl(20,50%,20%)) 40% bottom no-repeat,
linear-gradient(hsl(160,50%,20%), hsl(20,50%,20%)) 50% bottom no-repeat,
linear-gradient(hsl(160,50%,20%), hsl(20,50%,20%)) 60% bottom no-repeat,
linear-gradient(hsl(160,50%,20%), hsl(20,50%,20%)) 70% bottom no-repeat,
linear-gradient(hsl(160,50%,20%), hsl(20,50%,20%)) 80% bottom no-repeat,
linear-gradient(hsl(160,50%,20%), hsl(20,50%,20%)) 90% bottom no-repeat hsl(0, 0%, 12%);
background-size: 10% 5%,
10% 10%,
10% 15%,
10% 20%,
10% 25%,
10% 30%,
10% 35%,
10% 40%,
10% 45%,
10% 50%;
background-size
仅用于测试目的,将在最终代码中通过 JavaScript 变为 set/updated。
所以问题是,我做错了什么,或者不了解我正在使用的方法?根据我的逻辑,在 10% 宽度的 0% 位置有一个条形意味着它填充 space 0% 到 10% 下一个从 10% 到 20% .. 从 90% 到 100%
使用:带有 Stylish 1.4.3 的 Firefox 38.0.5
您看到的问题是因为 background-position
在 CSS 中以百分比形式给出时的工作方式。以下是 spec 关于基于百分比 background-position
的说法:
A percentage for the horizontal offset is relative to (width of background positioning area - width of background image). A percentage for the vertical offset is relative to (height of background positioning area - height of background image), where the size of the image is the size given by ‘background-size’.
For example, with a value pair of ‘0% 0%’, the upper left corner of the image is aligned with the upper left corner of, usually, the box's padding edge. A value pair of ‘100% 100%’ places the lower right corner of the image in the lower right corner of the area. With a value pair of ‘75% 50%’, the point 75% across and 50% down the image is to be placed at the point 75% across and 50% down the area.
(重点是我的)
如此处所述,如果我们将位置指定为 10% bottom
(相当于 10% 100%
),则背景图像的实际放置方式是 10% 跨度的点图像放置在包含框上 10% 的点上。
现在举个例子,假设这个盒子是 100px x 100px。因此,容器框上的 10% 为 10px,图像上的 10% 为图像上的 1px 标记(因为背景大小设置为容器大小的 10%)。因此,图像实际上位于容器内 9px 处,因此容器上的 10px 和图像上的 1px 是同一点。这使得第二张图片与第一张图片重叠 1px。同样,第三张图片将与第二张图片重叠 2px,依此类推。
使用多个背景图片相同大小(X轴)时计算位置的规则是:
background-position
of nth-element = 100% * (n-1) / (图像总数 - 1)
对于 Y 轴,没有问题,因为它们都位于 100%,因此图像的底部将与容器的底部匹配。
div {
background: linear-gradient(hsl(160, 50%, 20%), hsl(20, 50%, 20%)) 0% bottom no-repeat, linear-gradient(hsl(160, 50%, 20%), hsl(20, 50%, 20%)) 11.11% bottom no-repeat, linear-gradient(hsl(160, 50%, 20%), hsl(20, 50%, 20%)) 22.22% bottom no-repeat, linear-gradient(hsl(160, 50%, 20%), hsl(20, 50%, 20%)) 33.33% bottom no-repeat, linear-gradient(hsl(160, 50%, 20%), hsl(20, 50%, 20%)) 44.44% bottom no-repeat, linear-gradient(hsl(160, 50%, 20%), hsl(20, 50%, 20%)) 55.55% bottom no-repeat, linear-gradient(hsl(160, 50%, 20%), hsl(20, 50%, 20%)) 66.66% bottom no-repeat, linear-gradient(hsl(160, 50%, 20%), hsl(20, 50%, 20%)) 77.77% bottom no-repeat, linear-gradient(hsl(160, 50%, 20%), hsl(20, 50%, 20%)) 88.88% bottom no-repeat, linear-gradient(hsl(160, 50%, 20%), hsl(20, 50%, 20%)) 99.99% bottom no-repeat hsl(0, 0%, 12%);
background-size: 10% 5%, 10% 10%, 10% 15%, 10% 20%, 10% 25%, 10% 30%, 10% 35%, 10% 40%, 10% 45%, 10% 50%;
min-height: 200px;
width: 600px;
}
<div></div>