211

我知道实际上用 CSS 修改图像是不可能的,这就是为什么我将裁剪放在引号中。

我想做的是拍摄矩形图像并使用 CSS 使它们看起来是方形的,而不会扭曲图像。

我基本上想把这个:

在此处输入图像描述

进入这个:

在此处输入图像描述

4

11 回答 11

517

div没有包装器或其他无用代码的纯 CSS 解决方案:

img {
  object-fit: cover;
  width:230px;
  height:230px;
}
于 2016-08-12T21:45:28.033 回答
87

假设它们不必在 IMG 标签中......

HTML:

<div class="thumb1">
</div>

CSS:

.thumb1 { 
  background: url(blah.jpg) 50% 50% no-repeat; /* 50% 50% centers image in div */
  width: 250px;
  height: 250px;
}

.thumb1:hover { YOUR HOVER STYLES HERE }

编辑:如果 div 需要链接到某个地方,只需调整 HTML 和样式,如下所示:

HTML:

<div class="thumb1">
<a href="#">Link</a>
</div>

CSS:

.thumb1 { 
  background: url(blah.jpg) 50% 50% no-repeat; /* 50% 50% centers image in div */
  width: 250px;
  height: 250px;
}

.thumb1 a {
  display: block;
  width: 250px;
  height: 250px;
}

.thumb1 a:hover { YOUR HOVER STYLES HERE }

请注意,这也可以修改为响应式,例如百分比宽度和高度等。

于 2013-03-01T22:04:21.237 回答
59
  1. 将您的图像放在一个 div 中。
  2. 给你的 div 明确的正方形尺寸。
  3. 将 div 上的 CSS 溢出属性设置为隐藏 ( overflow:hidden)。
  4. 把你的想象放在 div 里面。
  5. 利润。

例如:

<div style="width:200px;height:200px;overflow:hidden">
    <img src="foo.png" />
</div>
于 2013-03-01T22:02:19.097 回答
55

如果图像位于具有响应宽度的容器中:

.rect-img-container {
  position: relative;
}

.rect-img-container::after {
  content: "";
  display: block;
  padding-bottom: 100%;
}

.rect-img {
  position: absolute;
  width: 100%;
  height: 100%;
  object-fit: cover;
}
<div class="rect-img-container">
  <img class="rect-img" src="https://picsum.photos/id/0/367/267" alt="">
</div>

(编辑:从 sass 更新为纯 css)(编辑:添加虚拟图像以供参考)

于 2019-05-03T08:49:28.833 回答
32

使用背景尺寸:封面 - http://codepen.io/anon/pen/RNyKzB

CSS:

.image-container {
  background-image: url('http://i.stack.imgur.com/GA6bB.png');
  background-size:cover;
  background-repeat:no-repeat;
  width:250px;
  height:250px;
}  

标记:

<div class="image-container"></div>
于 2015-02-23T11:48:30.577 回答
14

实际上,我最近遇到了同样的问题,并最终采用了稍微不同的方法(我无法使用背景图像)。虽然它确实需要一点点 jQuery 来确定图像的方向(我相信你可以使用纯 JS 代替)。

如果您对更多解释感兴趣,我写了一篇关于它的博客文章,但代码非常简单:

HTML:

<ul class="cropped-images">
  <li><img src="http://fredparke.com/sites/default/files/cat-portrait.jpg" /></li>
  <li><img src="http://fredparke.com/sites/default/files/cat-landscape.jpg" /></li>
</ul>

CSS:

li {
  width: 150px; // Or whatever you want.
  height: 150px; // Or whatever you want.
  overflow: hidden;
  margin: 10px;
  display: inline-block;
  vertical-align: top;
}
li img {
  max-width: 100%;
  height: auto;
  width: auto;
}
li img.landscape {
  max-width: none;
  max-height: 100%;
}

jQuery:

$( document ).ready(function() {

    $('.cropped-images img').each(function() {
      if ($(this).width() > $(this).height()) {
        $(this).addClass('landscape');        
      }
    });

});
于 2014-02-25T19:50:40.583 回答
5

object-fit: cover会做你需要的。

但它可能不适用于 IE/Edge。按照如下所示仅使用 CSS修复它以在所有浏览器上工作。

我采用的方法是使用绝对值将图像定位在容器内 ,然后使用以下组合将其放置在中心:

position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);

一旦它在中心,我给图像,

// For vertical blocks (i.e., where height is greater than width)
height: 100%;
width: auto;

// For Horizontal blocks (i.e., where width is greater than height)
height: auto;
width: 100%;

这使得图像得到了 Object-fit:cover 的效果。


这是上述逻辑的演示。

https://jsfiddle.net/furqan_694/s3xLe1gp/

此逻辑适用于所有浏览器。


原始图像
原始图像

垂直裁剪
垂直裁剪的图像

水平裁剪
水平裁剪的图像


于 2020-03-06T05:00:10.087 回答
3

我遇到了类似的问题,无法“妥协”背景图片。我想出了这个。

<div class="container">
    <img src="http://lorempixel.com/800x600/nature">
</div>

.container {
    position: relative;
    width: 25%; /* whatever width you want. I was implementing this in a 4 tile grid pattern. I used javascript to set height equal to width */
    border: 2px solid #fff; /* just to separate the images */
    overflow: hidden; /* "crop" the image */
    background: #000; /* incase the image is wider than tall/taller than wide */
}

.container img {
    position: absolute;
    display: block;
    height: 100%; /* all images at least fill the height */
    top: 50%; /* top, left, transform trick to vertically and horizontally center image */
    left: 50%;
    transform: translate3d(-50%,-50%,0);
}

//assuming you're using jQuery
var h = $('.container').outerWidth();
$('.container').css({height: h + 'px'});

希望这可以帮助!

示例: https ://jsfiddle.net/cfbuwxmr/1/

于 2016-04-06T21:21:43.527 回答
3

看看 CSSaspect-ratio

https://developer.mozilla.org/en-US/docs/Web/CSS/aspect-ratio

.square-image{
  width: 50%;
  background-image: url('https://picsum.photos/id/0/367/267');
  background-size: cover;
  background-position: center;
  aspect-ratio: 1/1;
}
<div class="square-image"></div>

于 2021-04-13T09:25:54.270 回答
2

使用 CSS:溢出:

.thumb {
   width:230px;
   height:230px;
   overflow:hidden
}
于 2013-03-01T22:02:32.987 回答
0

使用带有 .testimg 类的内部图像的方形尺寸 div:

.test {
width: 307px;
height: 307px;
overflow:hidden
}

.testimg {
    margin-left: -76px

}

或带有图像背景的方形 div。

.test2 {
width: 307px;
height: 307px;
    background: url(http://i.stack.imgur.com/GA6bB.png) 50% 50%
}

这里有一些例子:http: //jsfiddle.net/QqCLC/1/

更新了图像中心

.test {
  width: 307px;
  height: 307px;
  overflow: hidden
}

.testimg {
  margin-left: -76px
}

.test2 {
  width: 307px;
  height: 307px;
  background: url(http://i.stack.imgur.com/GA6bB.png) 50% 50%
}
<div class="test"><img src="http://i.stack.imgur.com/GA6bB.png" width="460" height="307" class="testimg" /></div>

<div class="test2"></div>

于 2013-03-01T22:13:48.980 回答