【问题标题】:Repeating background with an increment以增量重复背景
【发布时间】:2018-05-22 11:57:36
【问题描述】:

我在使用一些 CSS 时遇到了困难,我想要一个黑条来显示每 X 个像素,但我希望它每次显示时增加大约 10 像素。

例如,第一个条出现在 100px,第二个出现在 110,第三个出现在 120。

到目前为止,我已经使用以下背景样式来实现第一部分(每 X 像素显示一个条形),但它也不完美:

  background: repeating-linear-gradient(white, white 1405px, black 210px,black 37.4cm)

那里有任何知道修复的 CSS 战士吗?

编辑

所以经过一些试验和错误,我成功地使用以下代码每 1405 像素放置一条线:

background: repeating-linear-gradient(white, white 1405px, black 1405px, black 1415px)

但问题仍然存在,元素在它们所属的位置,该行需要出现在每个元素之后(因此 + 10px 请求)。

这就是现在的样子:https://imgur.com/a/pokGCTk 但它并不总是 1 个元素,可能还有更多这样的元素:https://imgur.com/a/veaVK44

线仍然必须以设定的间隔(1405 像素)放置在元素后面,但每次都必须增加 10。 (所以是 1405 像素,然后是 1415 像素,然后是 1425 像素等)

【问题讨论】:

  • 和黑色之间,白色应该是相同的长度还是需要增加?也许你可以分享结果的屏幕?
  • @TemaniAfif 我附上了 2 张展示问题的图片

标签: css sass background linear-gradients


【解决方案1】:

很明显,使用简单的linear-gradient 我们不能有非常规模式。这是一个想法,使用一些变换和透视来模拟您的图案,其中黑线之间的距离会增长:

  body {
  margin: 0;
  perspective: 30px;
  perspective-origin: top;
  overflow: hidden;
}

.grad {
  height: 100vh;
  transform: rotateX(10deg);
  transform-origin: bottom;
}

.grad:before {
  content: "";
  position: absolute;
  top: 0;
  bottom: 0;
  left: -1000%;
  right: -1000%;
  background: repeating-linear-gradient(to bottom, #000 0, #000 10px, #fff 10px, #fff 50px);
  ]
<div class="grad">

</div>

或者您需要使用多个渐变并调整background-position。如果您想要多行,您可以使用 SASS 轻松生成:

body {
  margin: 0;
  perspective: 30px;
  perspective-origin: top;
  overflow: hidden;
}

.grad {
  height: 100vh;
  background-image: 
    linear-gradient(#000,#000),
    linear-gradient(#000,#000),
    linear-gradient(#000,#000),
    linear-gradient(#000,#000);
  background-size:100% 10px ;
  background-repeat:no-repeat;
  background-position:
    0 0,
    0 50px,
    0 150px,
    0 300px;
}
<div class="grad">

</div>

这里是@Krypt1 提供的使用 SASS 生成上述内容的脚本:

https://www.sassmeister.com/gist/15bd039fdd0803ed79d12762ad6da28f

【讨论】:

  • 我想了解你做了什么,我想我明白了。但是,如果初始值为 1405,这对于 10 像素的增加不起作用,对吗?
  • @RickvanLieshout 很好,这是一个想法,但不是真正的解决方案:) 也许你可以调整不同的值以获得你想要的......如果你愿意,我添加了另一个解决方案;)
  • 我在 SCSS 中实现了一个简单的 mixin,可以根据您的回答自动生成它,看看:sassmeister.com/gist/15bd039fdd0803ed79d12762ad6da28f
  • @Krypt1 是的好一个;)如果你愿意,你可以将它添加为答案,或者我可以将它添加到我的?
  • 您可以将其添加到您的,因为它基于您的回答;)
【解决方案2】:

要使每个条带精确地工作 10 像素,您需要更改 repeating-linear-gradient 以从头到尾每 10 像素生成一次。然后你可以使用另一个渐变来隐藏第一个 100px 的白色,然后变为透明以显示条纹。 这是sn-p:

div {
  width: 100%;
  height: 200px;
  background: linear-gradient(white, white 100px, transparent 100px, transparent),
              repeating-linear-gradient(white, white 10px, black 10px, black 20px)
}
&lt;div&gt;&lt;/div&gt;

【讨论】:

  • 这看起来已经比我的解决方案更干净了,但我无法将条形分开 29.7 厘米(a4 尺寸)。此外,它不会增加,因此最终条形会不同步。我很难想象它,但如果你能把它们分开 29.7 厘米,我可以拍一张照片!
  • 是的,对不起,我首先误解了这个问题。我认为在单个元素的渐变中不可能有增量大小。您有完整的 HTML 示例吗?也许只更改 HTML 会更容易
  • 很遗憾,无法更改 html,它是由库生成的 :)
  • 你最好的办法是使用 SCSS 生成 CSS。看看@TemaniAfif 的答案,我在该答案的 cmets 中的 SCSS 中添加了一个 sn-p。
【解决方案3】:

一种允许您从后面的元素显示背景样式的解决方案是使用位于 div 后面的伪元素,并在您的 repeating-lenear-gradient 中使用 rgba 来获得透明颜色。

body {
  background-color: #e0e0e0;
}

div {
  position: relative;
  height: 500px;
}

div::after {
  content: '';
  display: block;
  position: absolute;
  top: 100px;
  right: 0;
  bottom: 0;
  left: 0;
  background-image: repeating-linear-gradient(rgba(0, 0, 0, 0), rgba(0, 0, 0, 0) 10px, #000000 10px, #000000 20px);
  z-index: -1;
  pointer-events: none;
}
&lt;div&gt;&lt;/div&gt;

【讨论】:

  • 抱歉,您能解释一下在背景方面需要伪元素吗?
  • @TemaniAfif 当然-它的基本原因是取消该问题的另一个答案的限制因素之一。另一个答案迫使整个 div 具有纯色背景色,因为它使用一个背景来隐藏另一个背景。我的解决方案允许它具有透明度。对于该约束,我能想到的将背景从 div 向下 100px 开始的唯一方法(根据 OP 的要求)是实际使用第二个元素。
  • 对不起,我还是不同意 :) 你可以控制背景的大小和位置,这是你用伪元素所做的:jsfiddle.net/mnyh1vfe
  • @TemaniAfif 但是,现在假设您事先知道 div 的最终大小...再说一次,您可能可以使用calc(100% - 100px) 来解决这个限制...是的,谢谢分享那个,我会记住这个主意的。
  • 不,我没有假设任何东西,也不需要任何大小的 div ;) 我只是喜欢你......从底部开始的渐变,高度为 200px,不需要知道任何div 大小
猜你喜欢
  • 1970-01-01
  • 2014-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-20
  • 1970-01-01
相关资源
最近更新 更多