我目前正在做一个视差网站主题。背景图像需要固定为某些'div'和'section'附加,以避免jquery沉迷于所有内容。问题是任何动画项目下方的标签的背景图像在转换完成时都会消失,仅在 Google Chrome 上。补救?
17 回答
这是一个非常普遍的未解之谜。最近我遇到了同样的问题,并且“-webkit-backface-visibility: hidden”被证明是没用的(在我的“固定”附加背景上),因为背景在设置时就消失了。(附加信息:原因是当背景设置为固定时,几乎类似于在背景中放置一个固定的'div'并将原始div背景设置为透明。隐藏的背面很明显)。
要解决当前的问题,请尝试将元素的“位置”属性设置为“静态”,或者如果您给它设置了其他值,即“相对”、“固定”或“绝对”,只需将其删除即可。
如果您不记得设置位置属性,并且问题仍然存在,我的建议是您使用 chrome 或 firefox 上的调试工具,以
确保除了“静态”之外没有手动设置“位置”属性的值。
只花了半个小时搜索......认为这可以让你更容易......问候。:)
这里同样的问题。我在 PC Chrome 34 中有一个使用闪烁的粘性标题position:fixed;
。我尝试了这个线程中的解决方案,position:static;
在父级中破坏了其他部分。但我知道添加-webkit-transform: translate3d(0,0,0);
基本上会使 Chrome 将该 html 变成一个层,这样它就不会被重新绘制。这对我有用。
element {
position:fixed;
top:0;
left:50%;
width:960px;
height:50px;
margin-left:-480px;
-webkit-transform: translate3d(0,0,0);
/* ...all other CSS... */
}
UPDATE
未来友好的答案是使用该will-change
属性创建一个图层!
W3 规范
CanIUse
MDN 定义
element {
position:fixed;
top:0;
left:50%;
width:960px;
height:50px;
margin-left:-480px;
will-change:top;
/* ...all other CSS... */
}
老实说,这似乎是一个奇怪的解决闪烁的解决方案,但本质上它使元素成为一个层,与 translate3d() 相同。
回答可能有点晚了,但似乎该错误来自背景附件:chrome 中的固定属性。我找到了一个将其值更改为“滚动”的解决方案。它会在 firefox 上造成 jitterin 效果,但您可以使用 CSS 中的媒体浏览器查询来避免它,如下所示:
.yourstellarlayer{
background-attachment: fixed;
}
/*only for webkit browsers*/
@media screen and (-webkit-min-device-pixel-ratio:0) {
.yourstellarlayer{
background-attachment: scroll;
}
}
希望能帮助到你!
我在 Chrome 上遇到了同样的问题,这似乎是当页面内部发生太多事情时发生的错误,我能够通过将以下转换代码添加到固定位置元素来修复它,(transform: translateZ(0);-webkit-transform: translateZ(0);
)强制浏览器使用硬件加速来访问设备的图形处理单元 (GPU) 以使像素飞行。另一方面,Web 应用程序在浏览器的上下文中运行,这使软件可以完成大部分(如果不是全部)渲染,从而减少了转换的动力。但是 Web 一直在迎头赶上,现在大多数浏览器供应商都通过特定的 CSS 规则提供图形硬件加速。
使用-webkit-transform: translate3d(0,0,0); 将为 CSS 过渡启动 GPU,使它们更平滑(更高的 FPS)。
注意: translate3d(0,0,0) 对您看到的内容没有任何作用。它在 x、y 和 z 轴上将对象移动 0px。这只是一种强制硬件加速的技术。
#element {
position: fixed;
/* MAGIC HAPPENS HERE */
transform: translateZ(0);
-moz-transform: translatez(0);
-ms-transform: translatez(0);
-o-transform: translatez(0);
-webkit-transform: translateZ(0);
-webkit-font-smoothing: antialiased; /* seems to do the same in Safari Family of Browsers*/
}
这真的让我很烦,几乎毁了我的夜晚。我的解决方法是设置
background-attachment: scroll;
它适用于我的项目。
在此之前,我已将其固定。希望这可以帮助。
对我来说,问题是附加到具有固定背景的 div 的父元素的样式,我将其放在-webkit-backface-visibility: inherit;
固定 div 的两个主要父元素上。
就我而言,我使用的是画布外的基础,所以它是这样的
.off-canvas-wrap{
-webkit-backface-visibility:inherit;
}
.inner-wrap{
-webkit-backface-visibility:inherit;
}
position: fixed;
我们在元素上遇到了类似的问题。该元素包含一个相对定位的容器,其中包含一个绝对定位的图像。在 CSS 过渡时,图像消失了,过渡完成后重新出现。
我们尝试通过在包括 body 元素在内的几个元素上设置-webkit-backface-visibility
to 来解决问题hidden
,但这并没有帮助。在这个线程的帮助下,我们使用 Chrome 的 web 检查器来处理 elments 的position
属性,幸运的是能够解决问题,而无需对网站进行太多改动。(我们所要做的就是将固定元素的父元素的位置更改为static
)
未来将近 5 年的更新......这似乎仍然是 chrome 的问题。我已经尝试了提到的大多数解决方案,包括添加:
transform: translate3d(0,0,0);
-webkit-transform: translate3d(0,0,0);
它并没有解决口吃问题。添加background-attachment: scroll
消除了对网站用户体验至关重要的视差效果。上面提到添加父元素的解决方案对我来说没有任何改变。最近有这个问题的人有什么其他想法吗?我在前端使用 Gatsby(React)。
这是一个适用于 Firefox 30.0、chrome 35.0、opera 22.0 即 11.0 的解决方案(2014.7.11):
第 1 步:在 .htaccess 中添加这些行:
# cache for images
<FilesMatch "\.(png)$">
Header set Cache-Control "max-age=10000, public"
</FilesMatch>
- 此问题的详细描述以及如何解决它: https ://code.google.com/p/chromium/issues/detail?id=102706
STEP 2:添加图片预加载,例如:
var pics = []; // CREATE PICS ARRAY
$(document).ready(function(){
...
preload(
'/public/images/stars.red.1.star.png',
'/public/images/stars.red.2.star.png',
'/public/images/stars.red.3.star.png',
'/public/images/stars.red.4.star.png',
'/public/images/stars.red.5.star.png',
'/public/images/stars.empty.png'
);
...
$('.rating').on('mousemove', function(event){
var x = event.pageX - this.offsetLeft;
var id = getIdByCoord(x); //
if ($(this).data('current-image') != id) {
$(this).css('background-image', 'url(' + pics[id].src + ')');
$(this).data('current-image', id);
}
})
...
})
...
// PRELOAD FUNCTION TO SET UP PICS ARRAY IN MEMORY USING IMAGE OBJECT
function preload() {
for (i = 0; i < arguments.length; i++) {
pics[i] = new Image();
pics[i].src = arguments[i];
// alert("preload " + arguments[i]);
}
}
PS感谢肖恩奥特曼
我的任务是创建一个具有视差效果的页面。在尝试通过 CSS 解决此问题后,我想出了以下解决方案。
JavaScript:
var isChrome = navigator.userAgent.toLowerCase().indexOf('chrome') > -1;
if (isChrome)
{
var itemArr = $('.slider-title');
$(window).scroll(function()
{
var pos = $(window).scrollTop();
var wh = window.innerHeight;
$(itemArr).each(function(i, item){
var p = $(item).position();
var h = $(item).height();
if (p.top + h > pos && p.top < pos+wh)
{
// items ir redzams
var prc = (p.top - pos +h)/wh ;
//console.log(prc);
$(item).css({'background-position':'center '+prc+'%'});
}
});
});
}
CSS:
/*only for webkit browsers*/
@media screen and (-webkit-min-device-pixel-ratio:0) {
.slider-title{
background-size:auto;
background-position: center 0%;
}
}
.slider-title 将是固定背景附件的项目。
所以我在 Chrome 版本 40 上仍然看到这个问题。目前对我有用的解决方法是在该 div 上创建一个相对于该 div 的内部 div 设置位置,并使其适合其父级的高度,并在父级 div 上设置背景,背景附件为固定:
<section style="background-attachment: fixed;">
<div style="position: relative;">
// Code goes here including absolute posiioned elements
</div>
</section>
在我的情况下,当您将相对位置和背景附件固定在同一元素上时,似乎会出现问题。
希望这可以帮助。
我在 chrome 中也有同样的问题
非常简单,无需添加任何 webkit 和媒体标签,只需按照以下步骤操作
1. 而不是 background:url('path-to-image') 像下面这样设置图像并将位置设置为固定
2.它可以在chrome和IE浏览器中运行
这个聚会迟到了,但是一个惊人的发现,因为我可以看到大多数 css 框架用户,Bootstrap,Foundation (others),有问题,我相信你们中的许多人也有滚动到顶部的 js 功能,显示滚动到顶部按钮当用户开始向下滚动时,
如果你有这样的东西(Bootstrap 内置了它)
.fade {
opacity: 0;
-webkit-transition: opacity .35s linear;
-o-transition: opacity .35s linear;
transition: opacity .35s linear;
}
.fade.in {
opacity: 1;
}
或者您正在通过 显示一些元素,
-webkit-transition: opacity .35s linear;
-o-transition: opacity .35s linear;
transition: opacity .35s linear;
或者您正在通过 js(animation.css、waypoints.js、velocity.js)添加任何带有 transition 的元素或元素类(
如果可能的话)从该元素中删除过渡/类,或者重新检查该元素何时按顺序出现修复不稳定的 Chrome 问题。
将transform
属性添加到具有固定背景图像的元素中。你可以有任何固定的位置。
#thediv {
width: 100%;
height: 600px;
position: relative;
display: block;
background-image: url(https://cdn.shopify.com/s/files/1/1231/8576/files/hockeyjacket1.jpg);
background-size: cover;
background-position: center;
background-repeat: no-repeat;
background-attachment: fixed;
border: 10px solid black;
transform: translate3d(0,0,0);
-webkit-transform: translate3d(0,0,0);
}
我在弹出窗口下方的覆盖 div 上遇到了这个问题(在歌剧 20 中随机消失) - 既是动画的,也是由脚本激活的。
<div class="popupwrapper">
<div id="popupdownload" class="popup">
<h1>Test</h1>
</div>
<div class="popupoverlay"></div>
</div>
.popupwrapper {
display: none;
z-index: 9100;
}
.popupwrapper.active {
display: block;
}
.popupwrapper > div {
-webkit-transition: opacity 150ms ease-in-out, -webkit-transform 150ms ease-in-out;
-moz-transition: opacity 150ms ease-in-out, -moz-transform 150ms ease-in-out;
-ie-transition: opacity 150ms ease-in-out, -ie-transform 150ms ease-in-out;
transition: opacity 150ms ease-in-out, transform 150ms ease-in-out;
}
.popupoverlay {
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
width: 100%;
height: 100%;
background: rgba(26,26,26,.9);
opacity: 0;
}
.popup {
position: fixed;
top: 30%;
left: 40%;
padding: 48px;
background: #e6e6e6;
z-index: 9101;
-webkit-transform: scale(1.6);
transform: scale(1.6);
opacity: 0;
}
.popupoverlay.active {
opacity: 1;
}
.popup.active {
-webkit-transform: scale(1);
transform: scale(1);
opacity: 1;
}
覆盖是绝对定位的(.popupoverlay),但是在没有以任何方式定位的容器中。我已将叠加层的绝对定位复制到父级(.popup),它工作正常。
.popupwrapper {
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
width: 100%;
height: 100%;
display: none;
z-index: 9100;
}
我认为只有在父元素的定位不明显时才会出现问题。
很高兴帮助任何人。问候
当您在元素上添加任何标记时,似乎在 Chrome 中出现错误。尝试从这样的元素中删除背景并给它一个位置:相对的。在元素内部添加一个具有您需要的尺寸的新 div 并添加背景,只是不要在其中添加任何标记。
例子:
当前的:
<div class="container" style="background-image:url(example.jpg);background-position:center;background-attachment:fixed;background-size:cover;">
<div class="example"></div>
</div>
更正:
<div class="container" style="position:relative;">
<div class="added-background" style="position:absolute;width:100%;height:100%;background-image:url(example.jpg);background-position:center;background-attachment:fixed;background-size:cover;">
<div class="example"></div>
</div>
希望能帮助到你!
如果你必须有 position: fixed/relative/absolute 的另一种解决方法可能是因为你在里面有一个绝对定位的元素(就像我的情况一样)是在闪烁的 div 内创建一个包装 div 并将位置和背景属性移动到那个。
例如
你有过 -
<div class="background-flickers' style="background:url('path-to-image'); position:relative">
<absolutely positioned element>
</div>
可能的解决方法
<div class="no-more-flicker!">
<div class="wrapper" style="style="background:url('path-to-image'); position:relative">
<absolutely positioned element>
</div>
</div>
我不再有闪烁,显然闪烁错误不会下降到子容器。