在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;
但这只会产生较大的图像效果,因为它会将较小的图像拉伸到与浏览器高度或宽度相匹配的位置,相反,我希望图像小于浏览器的图像只是居中并保持其最大高度/宽度。
答案 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会丢失放大镜光标:)