缩放和居中图像而不切割边框

时间:2011-10-11 17:36:33

标签: jquery css image centering

我尝试过很多不同的东西,但没有一个在起作用。

我有一张照片(假设未知的高度和宽度),我希望它居中(垂直和水平)。高度和宽度由窗口大小决定,但不得超过原始高度和/或宽度。

作为示例,当您双击图片时,可以查看 Windows Live照片库。这正是我需要的,在css / jquery中。我不知道如何在页面中调整图像以适应我想要的效果。

感谢您的帮助。

我不知道具体用语,因为英语不是我的母语。

1 个答案:

答案 0 :(得分:3)

如果您事先知道图像的大小(在服务器端),最简单的方法是在渲染HTML时执行此操作;使用width标记的height<img>属性来设置其大小,并使用margin-leftmargin-top将其置于容器中。这将使最终用户更好,因为在加载图像后重新调整大小的javascript端时他不会看到屏幕闪烁。这是迄今为止最好的方法。

编辑:如评论中所述,如果您使用服务器端解决方案,您可能仍希望在$(window).resize()上使用javascript解决方案,以便图像保持居中如果用户更改窗口的尺寸,则尺寸合适。

-

但是,由于你的问题是javascript,你需要分两步完成;首先减小图像的高度和宽度,以便在保持比率的同时不大于窗口,然后在第二次应用一些边距使其水平和垂直居中。

以下是一个如何实现您想要的示例,请注意,此代码显然未经过优化,可能不应该按原样使用,我将其留在“详细”中让它更容易理解的方法。

HTML:

<body>
  <div id="main" style="margin: 0; padding: 0">
    <img id="yourpic" src="http://domain.com/image.png" />
  </div>
</body>

JS:

// we use the onLoad event so that your browser know the image dimension
$('#yourpic').load(function() {
    // cache your objects
    var $window = $(window);
    var $this = $(this);

    var tmp;

    // if the image has too much width reduce it, keeping its ratio
    if ($window.width() < this.width) {
        tmp = [this.width, this.height];
        $this.width($window.width());
        $this.height(tmp[1] / (tmp[0] / this.width));
    }

    // same for its height
    if ($window.height() < this.height) {
        tmp = [this.height, this.width];
        $this.height($window.height());
        $this.width(tmp[1] / (tmp[0] / this.height));
    }

    // now center it horizontally
    if ($window.width() > this.width) {
        $this.css('margin-left', ($window.width() - this.width) / 2);
    }

    // and vertically
    if ($window.height() > this.height) {
        $this.css('margin-top', ($window.height() - this.height) / 2);
    }
});

您可以在此处查看示例:http://jsfiddle.net/RPCjE/2/(chome img.onload事件为quite buggy,因此如果您使用此浏览器,则可能需要刷新而不使用缓存。)