2015-05-15 41 views
1

我正在将图像放在对象的确切中间,使其看起来像background-size: cover;。为此,我已将宽度或高度(其中较小者)设置为100%,另一个设置为auto。然后我将顶部和右侧设置为50%。最后,我尝试将边距(右侧和顶部)设置为高度和宽度的一半。jQuery的宽度和高度返回旧的值

这里是我的代码:

$.fn.extend({ 
    middleify: function(){ 
     var i = $(this); 
     var f = i.parent(); 
     var wh = i.height() == i.width() ? f.width() < f.height() : i.width() > i.height(); 
     var hw = i.height() == i.width() ? f.height() < f.width() : i.height() > i.width(); 
     return i.css({position: "relative", "z-index": 2, width: hw ? "100%" : "auto", height: wh ? "100%" : "auto", top: "50%", right: "50%", "margin-right": 0 - (i.width())/2, "margin-top": 0 - (i.width()/2)}); 
    } 
}); 

http://jsfiddle.net/beb8o2g6/2/

谢谢!

+0

我无法理解你的最终目标位置是。 – Jack

+0

@Jack我想要图像在矩形中间,就像'background-size:cover;' – GINCHER

+0

@Jack我已经添加了目标:http://jsfiddle.net/beb8o2g6/2/ – GINCHER

回答

1

有你错过检查的东西太多了。

首先

$(this);包含元素的数组,因为你的选择是img

$("img").middleify(); 

但是你存储的值是这样的:

var i = $(this); 
    var f = i.parent(); 

var wh = i.height() == i.width() ? f.width() < f.height() : i.width() > i.height(); 
var hw = i.height() == i.width() ? f.height() < f.width() : i.height() > i.width(); 

你不需要有这样的条件,它真的让我困惑。只需设置width:100%然后height: auto,因为您的容器比其高度大width

return i.css({position: "relative", "z-index": 2, width: hw ? "100%" : "auto", height: wh ? "100%" : "auto", top: "50%", right: "50%", "margin-right": 0 - (i.width())/2, "margin-top": 0 - (i.width()/2)}); 

您计算width,哪些是你没有设置这些值尚未元素的height。它更有可能获得默认值。

为了解决这个问题,你必须设定widthheight第一分开来计算

"margin-right": 0 - (i.width())/2, "margin-top": 0 - (i.width()/2)});

把它们放在一起

$.fn.extend({ 
    middleify: function(){ 
    var i = $(this); 
    $.each(i, function(index, value) { 
     var elm = $(value); 
     var f = elm.parent(); 
     elm.css({position: "relative", "z-index": 2, width: "100%", height:"auto", top: "50%", left: "50%"}); 

     elm.css({"margin-left": 0 - (elm.width())/2, "margin-top": 0 - (elm.height()/2)}); 
    }); 
    } 
}); 
$("img").middleify(); 

Fiddle

更新

由于设置更宽的图像width100%会造成一个问题,让我们利用这个逻辑上background:cover

$.fn.extend({ 
    middleify: function(){ 
    var i = $(this); 
    $.each(i, function(index, value) { 
     var elm = $(value); 
     var f = elm.parent(); 

     var imgWidth = elm.width(); 
     var imgHeight = elm.height(); 

     var containerWidth = f.width(); 
     var containerHeight = f.height(); 

     var imgRatio = (imgHeight/imgWidth); 
     var containerRatio = (containerHeight/containerWidth); 

     if (containerRatio > imgRatio) { 
      var finalHeight = containerHeight; 
      var finalWidth = (containerHeight/imgRatio); 
     } 
     else { 
      var finalWidth = containerWidth; 
      var finalHeight = (containerWidth * imgRatio); 
     } 

     elm.css({position: "relative", "z-index": 2, width: finalWidth, height: finalHeight, top: "50%", left: "50%"}); 

     elm.css({"margin-left": 0 - (elm.width())/2, "margin-top": 0 - (elm.height()/2)}); 
    }); 
    } 
}); 
$("img").middleify(); 

Fiddle

+0

将宽度设置为100%时出现问题。我正在使用的一些图像看起来像这样:https://scontent-fra.xx.fbcdn.net/hphotos-xfp1/t31.0-8/1502690_477245699047085_1960157551_o.jpg – GINCHER

+0

@GINCHER更新后的代码。有一个好看。 –

1

你可以只用CSS这样做...

figure { 
 
    position: relative; 
 
    overflow: hidden; 
 
    height: 100px; 
 
    width: 200px; 
 
    border: 1px solid black; 
 
} 
 

 
figure img { 
 
    position: absolute; 
 
    left: 50%; 
 
    top: 50%; 
 
    transform: translate(-50%,-50%); 
 
    width: 100%; 
 
}
<div class="left"> 
 
    <h1>The attempt</h1> 
 
    <figure> 
 
     <img src="https://fbcdn-sphotos-b-a.akamaihd.net/hphotos-ak-xpf1/t31.0-8/1601993_484655221639466_890925492_o.jpg" /> 
 
    </figure> 
 
    
 
    <figure> 
 
     <img src="https://scontent-fra.xx.fbcdn.net/hphotos-ash2/v/t1.0-9/580303_450139941757661_1330443402_n.jpg?oh=9ae59fa1b0e51a356b2ca50b0c160354&oe=55DDE28F" /> 
 
    </figure> 
 
    
 
    <figure> 
 
     <img src="https://fbcdn-sphotos-g-a.akamaihd.net/hphotos-ak-xap1/v/t1.0-9/1618538_487714631333525_1011288966_n.jpg?oh=2e48acfd68c08d2ea27fa3e7ba8e9462&oe=55B2A1C5&__gda__=1441110764_e04ce223b16035ae8c496e00f8845212" /> 
 
    </figure> 
 
</div>

+0

我无法将宽度设置为100%,因为如果高度较小,那么宽度将不会填充整个“图形”。另外,纠正我,如果我错了,但并非所有的浏览器都支持'translate'。 – GINCHER

+0

'transform/translate'与'figure'具有相同的浏览器支持,所以如果你想使用'figure',你应该没问题。 http://caniuse.com/#search=transform – sbeliv01

+0

如果是这样,那么太棒了!谢谢! – GINCHER