是否有相当于背景大小的img(javascript):封面?

Posted

技术标签:

【中文标题】是否有相当于背景大小的img(javascript):封面?【英文标题】:Is there an img (javascript) equivalent to background-size:cover? 【发布时间】:2012-11-25 17:37:07 【问题描述】:

我正在开发一种以网格形式展示照片的响应式设计。照片本身可以是所有纵横比和尺寸。此外,放置它们的网格单元也不是固定宽度,它们会随着您调整浏览器的大小而缩放。此外,每个网格单元虽然在宽度和高度上是动态的,但大小相同,与其中的图像无关。

为了在这种高度动态的情况下正确显示照片,我找到了一个有效的方法:每张照片基本上都是一个 div,并将图像设置为背景图像。为了在动态大小的网格内正确缩放图像的未知宽度/高度,我使用了 CSS3 的 background-size:cover 功能。

最终结果非常棒,它在 UI 和显示方面完全符合我的要求。尽管如此,我对这个解决方案的可访问性降低并不满意:它不是 SEO 友好的,也不是插件友好的(想想社交插件)。因此,我试图重现我的工作情况,但这次使用的是旧的 img 标签而不是 CSS 背景。

我知道有 IE8 及以下用于 background-size:cover 的 polyfill,但我不是在寻找那个,我正在寻找基于 img 标签的解决方案。我还发现了使用绝对定位技术以及 CSS 的 clip 属性的文章,但请记住,我的设计没有任何内容是绝对大小的。

我想我正在寻找的是一个 javascript 例程,它具有 background-size:cover 动态大小的逻辑,在源(图像尺寸)和目标(显示框)的大小都是动态的情况下.

是否有这样一个相当于 background-size:cover 的 JavaScript 可以在 img 标签上工作?

【问题讨论】:

你应该可以使用 width:100% 或 height:100% 来获得 background-size:cover 的大部分效果。但是,当您混合使用非常不同的纵横比时,它可能不起作用。 @LieRyan 谢谢,我在回答中添加了一个额外的要求:每个网格单元的大小相同,是基于窗口宽度的动态大小。将一维设置为 100% 可以部分完成这项工作,但它不会像“封面”那样使图像居中。 会简单地设置“img max-width: 100%; ” 可能不是你想要的吗? @BillyMoat 解决了一部分问题,但不是 background-size:cover 实现的居中部分。 您可以创建一个 jsfiddle 来显示您的问题或指向您网站的链接吗? 【参考方案1】:

这是旧的,但我最近发现了一个新的解决方案。

不要让img显示一个div的背景图像,而是创建一个图像:

<div>
    <img src="mypic.jpg"/>
</div>
<style>
    div 
        width:200px;
        height:200px;
    
    img 
        box-sizing:border-box;
        width:100%;
        height:100%;
        background: url(mypic.jpg) no-repeat center center;
        background-size:cover;
        padding:50%;
    
</style>

将包含的 div 设置为您想要的图像的宽度/高度。然后将图像以 100% 的宽度/高度放入其中,并将 src 设置为您想要的 img。还要设置你想要的img作为img的背景图片。设置背景大小为覆盖,内边距为 50%。

诀窍在于 50% 的填充。 img 宽度/高度是固定的,因此当您增加填充时,图像会变得越来越小。 50% 正是隐藏它需要多少,现在您只是看到图像的背景图像显示为您想要的方式,但它仍然可以访问!

http://jsfiddle.net/t72xgbw0/

【讨论】:

如果我们得到了attr 的支持,那就容易多了。请投票 - bugzilla.mozilla.org/show_bug.cgi?id=435426 此解决方案不完全满足所要求的标准。 img标签的背景图片会被img标签的src图片遮挡,显示的输出是一张被拉伸的图片。 它确实有效,并且图像标签的 src 图像不可见,正如答案中使用填充所解释的那样。您的默认值可能具有不同的框大小。我已经更新了答案并包含了一个 jsfiddle。【参考方案2】:

考虑到可访问性和 SEO,我使用 jQuery 创建了一个非常相似的问题的解决方案,它没有重现背景封面的逻辑,而是利用了它。

图像实际上成为具有背景的容器的角色,并且以编程方式添加背景封面。

$imagesContainer.find('img').each(function(i, elem)
  $(elem).css(
    backgroundSize : 'cover',
    backgroundImage : 'url("' + $(elem).attr('src') + '")',
    backgroundPosition : 'center',
    display : 'block',
    height : '100%', // Or any size needed.
    width : '100%'
  );
  $(elem).removeAttr('src');
);

【讨论】:

我其实很喜欢这个解决方案的整体概念。对于可访问性或搜索代理情况,它会优雅地降级。【参考方案3】:

我找到了一种使用 css 和 javascript 用图像覆盖容器的好方法:

html

<div class="container">
  <img src="image.jpg"/>
</div>

CSS:

img 
  position: absolute;
  min-width: 100%;   // To cover container
  min-height: 100%;  // To cover container
  top: 50%;          // To move image corner to center of container
  left: 50%;         // To move image corner to center of container

Javascript:

$('img').css(
  'margin-top': -$('img').height()/2,   // To move to center of image
  'margin-left': -$('img').width()/2    // To move to center of image
);

确保在图像加载后运行 javascript。

【讨论】:

注意到这仅在图像小于其容器时才有效:(【参考方案4】:

我相信你想做两件事:

    让图像填满窗口 确保图像垂直和水平居中。

问题是(如果您想保持图像的纵横比)您必须根据图像和浏览器大小将其垂直和水平居中。

您可以结合使用 display:tablemargin:0 auto 以及智能高度/宽度设置来制作纯 CSS 解决方案。

见小提琴:http://jsfiddle.net/5yVYM/3/

.wrapper 
    display:table;
    text-align: center;
    margin:0 auto;
    width:100%;
    height:100%;


.wrapper div 
    display:table-cell;
    vertical-align:middle;
    max-width:100%;
    max-height:100%;


img 
    width:100%;
    height:auto;

【讨论】:

这根本不是backgound-size:cover 的行为方式。

以上是关于是否有相当于背景大小的img(javascript):封面?的主要内容,如果未能解决你的问题,请参考以下文章

是否可以将背景位置添加到 img /asp:image 标签

openCV 相当于 PIL 调整大小 ANTIALIAS?

如何使用 DOM 通过单选按钮更改背景大小(JAVASCRIPT)

03-02

使用 JavaScript 获取 CSS 背景图像的大小?

相当于elm(或javascript)中的std :: nextafter(下一个可表示的浮点数)