像Firefox一样预览和缩放图像

时间:2015-06-09 08:19:58

标签: javascript jquery css image

在Firefox中打开图像时,它具有以下特征:

  • 在浏览器中居中显示。
  • 将包含高度/宽度(不超过浏览器尺寸)。
  • 不会调整大小超过其最大尺寸。
  • 如果小于浏览器窗口,则根本不调整大小。
  • 保留纵横比。
  • 具有缩放工具,可将图像调整为最大尺寸,并允许其超出浏览器尺寸。

我如何使用CSS / JS复制这个?我已经尝试了几种使用CSS的方法,但我认为它需要JS而且我找不到任何例子。

我使用的最佳结果包含:

height: 100%;
width: 100%;
background-url: {location of image}
background-position: center center;
background-repeat: no-repeat;
background-size: contain;

但这只会产生较大的图像效果,因为它会将较小的图像拉伸到与浏览器高度或宽度相匹配的位置,相反,我希望图像小于浏览器的图像只是居中并保持其最大高度/宽度。

2 个答案:

答案 0 :(得分:1)

注意:我重新写了我的答案,因为我以前的解决方案在Firefox中不起作用(哦,具有讽刺意味)。它还在其他浏览器中引起了奇怪的行为。原因是flexbox将图像垂直和水平居中。

让我们一步一步来做。

在设置最大尺寸的同时保持图像的纵横比可以通过以下方式实现:

.img {
  display: block; // could also be inline-block or other block-like types
  max-height: 100%;
  max-width: 100%;
  height: auto;
  width: auto;
}

现在,垂直和水平对齐元素在技术上是使用flexbox的3行代码。如上所述,在某些浏览器中缩放图像时,这会导致奇怪的行为。相反,我们使用text-align: center使图像沿x轴居中,使用一种称为“Ghost Element”的方法使图像沿y轴居中。您可以在this article from CSS Tricks了解有关它的更多信息。总之,我们将这个元素集中在一起:

.parent {
  text-align: center;
  white-space: nowrap;
}

.parent:before {
  content: '';
  display: inline-block;
  height: 100%;
  vertical-align: middle;
  margin-right: -0.25em;
}

.centered-child {
  display: inline-block;
  vertical-align: middle;
}

最后,我们将缩放和居中结合起来。我假设HTML只存在于正文中的单个<img class="img" ...>

html {
  width: 100%;
  height: 100%;
}

body {
  margin: 0;
  width: 100%;
  height: 100%;
  background-color: #333;
  text-align: center;
}

body:before {
  content: '';
  width: 0;
  height: 100%;
  display: inline-block;
  vertical-align: middle;
  white-space: nowrap;
  margin-left: -0.25em;
}

.img {
  display: inline-block;
  vertical-align: middle;
  max-height: 100%;
  max-width: 100%;
  width: auto;
  height: auto;
}

现在我们实施缩放

为了缩放图像,我们需要JavaScript。我们来使用jQuery。

在JavaScript中更改css属性并不好,所以我们准备了两个额外的类。

.img.is-zoomable {
  cursor: zoom-in;
}

.img.is-zoomed {
  cursor: zoom-out;
  max-height: none;
  max-width: none;
}

单击JavaScript将切换类is-zoomed,并在mouseenter上决定是否可以缩放图像。如果可以缩放,我们会添加课程is-zoomable

$('.img').on('click', function() {
    $(this).toggleClass('is-zoomed');
});
$('.img').on('mouseenter', function() {
    var origWidth = this.naturalWidth;
    var origHeight = this.naturalHeight;
    var currWidth = $(this).width();
    var currHeight = $(this).height();
    if (origWidth !== currWidth || origHeight !== currHeight) {
        $(this).addClass('is-zoomable');
    }
});

Etvoilà,我们已经完成了。有关工作示例,请参阅my codepen

答案 1 :(得分:1)

<强> jsBin demo

(免责声明:仅限现代浏览器:(IE9 +))

你需要的只是:

<div id="parent">
  <img src="image.jpg">
</div>

CSS:

html,
body{
  margin:0;
  height:100%;
  background:url(http://i.imgur.com/aSqDLP0.png);
}

body{ /* or use a wrapper element instead */
  display: table;
  width: 100%;
  text-align: center;
}
#parent{
  display: table-cell;
  vertical-align: middle;
}
#parent img{
  vertical-align: middle;
  max-height: 100vh;
  max-width: 100vw;
  box-shadow: 0 4px 15px #111;
}

以上内容足以让对中和调整大小。
如果你想要像Firefox那样做:

    悬停时
  • 放大光标 - 如果浏览器调整图片大小(小)
  • 将窗口滚动到点击的坐标 - 如果图片很小
  • 缩小光标 - 如果图像被缩放(点击) - 显示-

比一点jQuery可能派上用场:

var $parent = $("#parent"),
    isParentSmaller = false,
    zoom = false,
    parW, parH,
    imgW, imgH;

$parent.find("img").on("mouseenter click", function( e ){

  imgW = this.naturalWidth;
  imgH = this.naturalHeight;
  parW = $parent.width();
  parH = $parent.height();
  isParentSmaller = parW-1 < imgW || parH-1 < imgH;

  $(this).css({
    cursor: isParentSmaller ? (zoom?"zoom-out":"zoom-in") : "auto"
  });

  if(e.type=="click" && isParentSmaller){
    zoom = !zoom;       // Toggle zoom boolean  
    $(this).css({       // Apply cursor styles
      maxWidth  : zoom ? "none" : "100vw",
      maxHeight : zoom ? "none" : "100vh",
      cursor    : zoom ? "zoom-out":"zoom-in"
    });
    // Scroll window where we want to zoom:
    window.scrollTo(((imgW/parW)-1)*e.clientX, ((imgH/parH)-1)*e.clientY);
  }

});

谦虚时间,上面的表现甚至比Firefox更好,因为如果你调整窗口大小,Firefox会丢失放大镜光标:)