我正在研究Parallax / Scrolling Timeline项目,我遇到了CSS3背景大小封面属性的问题。
div具有以下属性:
background: url(../images/timeline/back-6.jpg) no-repeat top center black;
background-size: cover;
padding-top: 90px;
height: 1855px;
position: relative;
使用jQuery我将背景附件切换为固定。当我这样做时,背景图像会“跳入”(意味着现在可以看到超出屏幕边缘的图像部分)。这不是理想的结果。
在测试中,我可以将div切换为使用background-size:100%覆盖,但在滚动时会导致不同的垂直跳跃问题。
当我将背景切换到固定时,如何防止它跳入的任何想法? (当我将背景设置为滚动时,它也会反向发生。)
我遗憾地无法链接到此代码的演示,因为页面尚未准备好部署。
答案 0 :(得分:3)
将background-size
设置为cover
或contain
时,我遇到了同样的问题
设置固定高度,例如通过@media
为较小的屏幕设置,可防止背景图像跳跃。在我的测试之后,我得出结论,在将background-attachment
设置为fixed
后,跳跃是由于元素的方向
将其设置为fixed
,size
的计算方式是视口大小,而不是包含background-image
的元素。这是跳跃的来源以及为background-size
设置固定高度或宽度的原因解决了这个问题。
答案 1 :(得分:0)
我在创建单页面布局时遇到了同样的问题,我想使用scrollTo-Plugin等等.... 页面布局分为两部分: 左侧为背景图像,应该更改/滚动右侧的内容。 所以我曾经制作了一种jquery插件来结合“background-position:fixed”和“background-size:cover”。 你只需要按类/ id定义元素来对齐背景图像。
不要抱怨代码。我对javascript / jquery比较新。但它的工作;) 那是:
function fixedResize() {
var targetEl = $('element where bg-images are in');
var targetWidth = targetEl.width();
var targetHeight = targetEl.height();
var targetPosX = targetEl.offset().left;
var targetPosY = targetEl.offset().top;
var leftRatio = targetWidth / targetHeight;
//console.log('TargetWidth', targetWidth, 'TargetHeight', targetHeight, 'Offset', targetPosX, targetPosY, 'leftRatio', leftRatio);
targetEl.each(function(){
var imgTarget = $(this);
var url = $(this).css('background-image').replace('url(', '').replace(')', '').replace("'", '').replace('"', '');
var bgImg = $('<img />'); // make background-image as image tag for getting width and height of the image
imgTarget.css('background-attachment','fixed');
bgImg.hide();
bgImg.bind('load', function(){
var imgHeight = $(this).height();
var imgWidth = $(this).width();
var imgRatio = imgWidth / imgHeight;
$(this).remove(); // remove img Tags again
// Calculate resize dimensions
if (imgRatio > leftRatio) {
var currentWidth = imgRatio * targetHeight; // image width after resize
var currentHeight = (currentWidth/imgWidth)*imgHeight;
var setToLeft = ((currentWidth - targetWidth)/2);
var imgPosX = targetPosX - setToLeft;
var imgPosY = (currentHeight - targetPosY - currentHeight/2 - targetHeight/2)* -1;
var resizeImg = 'background-size: auto '+ targetHeight +'px;';
} else if (imgRatio < leftRatio){
var currentWidth = targetWidth;
var currentHeight = (currentWidth/imgWidth)*imgHeight;
var imgPosX = targetPosX;
var imgPosY = (currentHeight - targetPosY - currentHeight/2 - targetHeight/2)* -1;
var resizeImg = 'background-size: '+ targetWidth +'px auto;'; // resize background
}
imgTarget.attr('style','background-attachment: fixed; background-position: '+ imgPosX +'px '+ imgPosY +'px;' + resizeImg);
console.log('imgWidth', imgWidth, 'imgHeight', imgHeight, 'imgRatio', imgRatio, 'currentWidth', currentWidth, 'currentHeight', currentHeight, 'setToLeft', setToLeft);
console.log('imgPos', imgPosX, imgPosY, 'setToLeft', setToLeft, targetPosX);
});
$(this).append(bgImg);
bgImg.attr('src', url);
});
}
fixedResize(); // initiate function
$(window).resize(function() {
fixedResize(); // initiate function for window resize (Fluid behavior)
});
或 的 jsfiddle.net/rowphant/eXb6e/14 / 强>