javascript - jQuery 宽度和高度返回旧值

标签 javascript jquery

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

这是我的代码:

$.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/

谢谢!

最佳答案

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

首先

您的 $(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)});

您正在计算尚未设置这些值的元素的宽度高度。它更有可能获得默认值。

要解决这个问题,您必须首先分别设置宽度高度以进行计算

"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

关于javascript - jQuery 宽度和高度返回旧值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30269002/

相关文章:

javascript - 我的 PHP 准备语句不起作用(在 bool 值上调用成员函数 bind_param())

javascript - 删除容器外的所有元素?

javascript - 我怎样才能用 $ ("li").text() 这样的东西创建一个数组

javascript - 为什么我的 Bootstrap 弹出窗口不显示?

javascript - HTML5 样板页面特定的 Javascript 放置

javascript - 将 $(this) 传递到设置的超时函数中?

javascript - 显示类似标签的内容

javascript - 为什么 jQuery 构造函数映射到 jQuery.fn.init?

javascript - 如何使用 document.getElementsByClassName ("Class_Name"直接更改 JS 中的样式属性)

javascript - 检测 Javascript 何时表现不佳