有你错过检查的东西太多了。
首先
你$(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
。它更有可能获得默认值。
为了解决这个问题,你必须设定width
和height
第一分开来计算
"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
更新
由于设置更宽的图像width
100%
会造成一个问题,让我们利用这个逻辑上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
我无法理解你的最终目标位置是。 – Jack
@Jack我想要图像在矩形中间,就像'background-size:cover;' – GINCHER
@Jack我已经添加了目标:http://jsfiddle.net/beb8o2g6/2/ – GINCHER