Der Code, den ich unten habe, funktioniert gut, aber ich bin sicher, dass es mehr stromlinienförmig sein könnte.each() -Funktion. Kann jemand mir raten, wie man diesen Code kürzt
Das Skript ändert die Größe eines Bildes und positioniert es horizontal in der Mitte des enthaltenen div, unabhängig von der Bildschirmgröße.
Die beiden Funktionen innerhalb der Funktion "resizeBg" sind identisch, abgesehen davon, dass sie auf verschiedene divs (".block1" und ".block2") zeigen, die ein Bild mit einer anderen Klasse (".bg1" und ". bg2 ").
Ich brauche die Funktion resizeBG, die separat auf jedes div angewendet wird. Ein Bild könnte ein Porträt sein, während das andere eine Landschaft darstellen könnte, so dass das Ergebnis abhängig von den Bildproportionen unterschiedlich ist. Dies ist der einzige Weg, wie ich das jetzt zur Arbeit bringen kann, aber mir ist klar, dass es viel einfacher/ordentlicher sein könnte.
HTML
<div class="block block1">
IMAGE
</div>
<div class="block block2">
IMAGE
</div>
CSS
.block1 {background: #000000;}
.block2 {background: ffffff;}
.block {
float: left;
width: 50%;
height: 100%;
overflow: hidden;
}
.bgwidth {
width: 100%;
}
.bgheight {
height: 100%;
}
jQuery
jQuery(window).load(function() {
// FULLSCREEN BACKGROUND IMAGE
var theWindow = $(window);
var block1 = $('.block1');
bg1 = block1.children(".bg1");
var block2 = $('.block2');
bg2 = block2.children(".bg2");
aspectRatio1 = bg1.width()/bg1.height();
aspectRatio2 = bg2.width()/bg2.height();
function resizeBg() {
$('.block1').each(function() {
if ((block1.width()/block1.height()) < aspectRatio1) {
bg1.removeClass('bgwidth').addClass('bgheight');
if(bg1.width() > block1.width()) {
bg1.each(function(){
//get width (unitless) and divide by 2
var hWide = ($(this).width() - block1.width())/2;
// attach negative and pixel for CSS rule
hWide = '-' + hWide + 'px';
$(this).addClass("js-fix").css({
"margin-left" : hWide
});
});
}
else {
bg1.each(function(){
$(this).removeClass("js-fix").css({
"margin-left" : 0 + 'px'
});
});
};
} else {
bg1.removeClass('bgheight').addClass('bgwidth');
bg1.each(function(){
$(this).removeClass("js-fix").css({
"margin-left" : 0 + 'px'
});
});
}
});
$('.block2').each(function() {
if ((block2.width()/block2.height()) < aspectRatio2) {
bg2.removeClass('bgwidth').addClass('bgheight');
if(bg2.width() > block2.width()) {
bg2.each(function(){
//get width (unitless) and divide by 2
var hWide = ($(this).width() - block2.width())/2;
// attach negative and pixel for CSS rule
hWide = '-' + hWide + 'px';
$(this).addClass("js-fix").css({
"margin-left" : hWide
});
});
}
else {
bg2.each(function(){
$(this).removeClass("js-fix").css({
"margin-left" : 0 + 'px'
});
});
};
} else {
bg2.removeClass('bgheight').addClass('bgwidth');
bg2.each(function(){
$(this).removeClass("js-fix").css({
"margin-left" : 0 + 'px'
});
});
}
});
}
theWindow.resize(function() {
resizeBg();
}).trigger("resize");
});
gut Sie CSS verwenden können, das Zentrierteil zu tun, was dann bedeutet, dass Sie nur jQuery benötigen die Größe des Bildes. Haben Sie eine Live-Demo, von der wir sehen und arbeiten können? –
Anstatt 'bg1' und' bg2' vorher zu definieren, können Sie '$ (this) .children()' einfach im Callback aufrufen. Dann können Sie den gleichen Code für beide Elementtypen verwenden. –
Schauen Sie sich auch an, wie Sie die Loops umstellen können, wo Sie $ (this) .removeClass ("js-fix") haben. Css ({"margin-left": 0 + 'px' – frenchie