【问题标题】:CSS multiple backgrounds work inconsistentlyCSS 多个背景工作不一致
【发布时间】:2013-04-08 18:51:11
【问题描述】:

我在尝试使用多个背景时遇到了一个奇怪的问题。我想要的基本效果是边缘的渐变背景和中间的透明背景。这是真正的基本代码:

background: transparent, linear-gradient(45deg, #f06, yellow);
background-size:50% 50%, 100% 100%;
background-position: 50% 50%, 0 0;
background-repeat: no-repeat;

我正在使用dabblet 来玩弄它。如果我使用该代码,我将一无所获(我将 transparent 替换为 green 确保我能够看到它):http://dabblet.com/gist/5339331

但是,如果我反转背景 (backgound: linear-gradient(45deg, #f06, yellow), green;),它会按预期完美运行,除了当然是在 reversehttp://dabblet.com/gist/5339291

这里发生了什么?为什么它会以一种方式工作而不是另一种?我还尝试用blue 替换渐变以使其简单,但它不起作用:http://dabblet.com/gist/5339396

仅供参考,我正在 Chrome 27 中进行测试,我收到黄色 ! 警告 Invalid property value.

编辑:这是我想要的效果的better (yet still broken) example。在这个例子中,有四块,每块都有自己的渐变背景。理想情况下,我会拥有一件,因为

  1. 它将允许看起来正确的渐变。

  2. 这看起来很糟糕,在移动设备上播放效果不佳。

  3. 如果可能,最好避免使用额外的固定/绝对 div

【问题讨论】:

  • 在你的小提琴中,渐变应该是半透明的吗?或者我应该问:您希望内容显示在渐变上方还是下方,如果在上方,您想让它们保持半透明还是不透明?我有一个解决方案,我打算在昨晚发布,但 dabblet 和 GitHub 太愚蠢了——我想我会在 dabblet 几乎无法使用的编辑器 UI 上忍受 jsFiddle 的持续停机时间。
  • 渐变应该是半透明的并且在文本上。想象一个彩色玻璃窗,中间部分被切掉,所以你可以清楚地看到中间的所有东西,而只能看到其余部分。我希望渐变部分都是一体的。这是a better example,因为这些部分不重叠,但我试图让一个渐变覆盖所有四个部分(或者真的有一个中间有一个洞的部分)。
  • 这听起来很棘手,但我想我有一个解决方案。我会发布一个带有一些解释的答案。
  • 听起来很酷。这是另一个sorta solution。渐变看起来正确,但文本位于渐变顶部而不是下方。
  • 我认为这是您想要的效果,因为您首先使用的是背景:) 无论如何,我刚刚发布了我的答案。叠加白色-白色渐变似乎是一种巧妙的技术,但我不知道为什么我之前没有想到它。

标签: google-chrome css background gradient


【解决方案1】:

您可能知道,transparent 是颜色值而不是图像值,就像blue。因为它是一个颜色值,它必须在background 简写中最后指定,并且在那里,因为only the base layer may have a background color。这就是 Chrome 的 Web Inspector 报告您拥有的无效属性值的原因。

不幸的是,没有办法使用多个背景来指定单个背景图像及其被切掉的区域(例如,显示中间部分的透明开口)。

不过,您在 jsFiddle 上所拥有的只是一个步骤。您可以通过将::before::after 伪元素添加到htmlbody 来轻松地完全取消额外的div 元素,因此您有四个伪元素可以使用。您还需要使用background-sizebackground-position 适当调整渐变背景,使其看起来无缝。

由于您希望渐变在保持无缝的同时保持半透明,因此您需要防止它们重叠。这可以通过相应地调整偏移量以及background-size 来轻松实现。

这是我使用的 CSS:

html::before, html::after, body::before, body::after {
    display: block;
    position: fixed;
    background: linear-gradient(45deg, rgba(255, 0, 0, 0.5), rgba(0, 255, 0, 0.5));
    content: '';
}

html::before, html::after {
    height: 25%;
    left: 25%;
    right: 25%;
    background-size: 200% 400%;
}

body::before, body::after {
    width: 25%;
    top: 0;
    bottom: 0;
    background-size: 400% 100%;
}

html::before { top:    0; background-position: top;    }
html::after  { bottom: 0; background-position: bottom; }
body::before { left:   0; background-position: left;   }
body::after  { right:  0; background-position: right;  }

jsFiddle preview (with borders to show how I've arranged the pseudo-elements)

你不能只用一个盒子来做到这一点,所以是的,它在移动设备上可能表现不佳。如果这不能很好地工作,那么您可以使用 SVG 背景来实现这一点,或者如果失败,您可能不得不回退到使用传统的预渲染背景图像。

【讨论】:

  • 我喜欢伪元素的想法。它似乎在移动设备上也能更好地工作(在调整大小或更改方向时,固定的 div 似乎可以在 Chrome for Android 上随心所欲地移动,但有了这些,它们似乎就粘在了边缘)。但是,背景看起来仍然有些奇怪。我发现background-attachment:fixed 完美解决了这个问题!我modified the fiddle 更多。不过,background-attachment:fixed 似乎不适用于 Android 的 Chrome。
  • @redbmk:嗯,我使用了我的小提琴上的设置,发现background-size: 400%(相当于background-size: 400% auto)在Firefox 和其他浏览器上的行为不同。将其更改为background-size: 400% 100% 似乎可以使其在所有浏览器中始终如一地工作,而无需background-attachment: fixed,因此它们处理auto 的方式有些不对劲。我用这些变化更新了我的答案。
  • 哦,我明白了!是的,它在 Chrome 和 Android 上完美地运行。赞!感谢您的帮助
  • @redbmk:没问题!或者,实际上,一个问题:我刚刚在 Opera 中对此进行了测试,虽然在页面加载和滚动时一切正常,但伪元素和背景不会响应调整大小事件,因此一旦调整窗口大小,它就会严重中断。 . 取决于您的兼容性要求(未来版本的 Opera 将使用 Blink),这可能会或可能不会是一个炫耀!
  • 好吧,我真的只是在胡闹——有点概念证明。实际上,IE9 及以下版本甚至不支持我所看到的渐变,因此那里也必须具有某种向后兼容性。不过,跨浏览器支持会很好——也许有一种方法可以使用真实(非伪)元素来创建相同的效果,而不会在移动浏览器中表现得时髦。当然,如果它只是在一个很快就会获得新引擎的浏览器中被破坏......
【解决方案2】:

CSS background 速记属性语法如下:

background: background-color background-image background-repeat background-attachment, background-position

请注意,没有逗号,所以最好不要使用它们,尤其是在分隔background-colorbackground-image 时。

使用所有这些并回到原始示例:http://dabblet.com/gist/5340042

【讨论】:

  • 那个 dabblet 看起来像我的第二个,它的边缘显示绿色背景,中间显示渐变。我试图得到完全相反的结果——边缘的渐变和中间的绿色。 background shorthand 的 CSS 规范说逗号分隔背景层
  • 以您的示例为基础,it looks like 您可以创建渐变(例如,它可以从绿色变为绿色),但使其透明显示到另一个背景,而不是使整个背景不可见。但是,我希望能够看到整个 div 下的内容,比如窗口
  • @redbmk background-size 只影响背景图像——在这种情况下是渐变。我会为此使用 CSS 伪选择器(请参阅更新的答案)
  • @AlfredXing,我没有看到更新的答案。另外,我已经更新了这个问题,以展示一个更好的例子来说明我正在努力实现的目标。它可以打磨得更好看,但这更容易,而且我认为更容易理解:jsfiddle.net/redEvo/FGcgY
  • @redbmk 抱歉。这就是我到目前为止所做的:jsfiddle.net/FaEK9 但我不知道如何到达你想要的地方......我认为只使用实际图像会更容易(它不会占用太多空间/bandwitdth)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-21
  • 2018-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-24
相关资源
最近更新 更多