如何自动裁剪和居中图像

时间:2012-07-19 00:34:47

标签: css

给定任意图像,我想从图像中心裁剪一个正方形并将其显示在给定的正方形内。

这个问题类似于:CSS Display an Image Resized and Cropped,但我不知道图像的大小,所以我不能使用设置边距。

7 个答案:

答案 0 :(得分:283)

一种解决方案是使用以尺寸与裁剪尺寸相对应的元素为中心的背景图像。


基本示例

.center-cropped {
  width: 100px;
  height: 100px;
  background-position: center center;
  background-repeat: no-repeat;
}
<div class="center-cropped" 
     style="background-image: url('http://placehold.it/200x200');">
</div>


img标记

的示例

此版本保留img标记,以便我们不会失去拖动或右键单击以保存图像的功能。感谢Parker Bennett的不透明技巧。

.center-cropped {
  width: 100px;
  height: 100px;
  background-position: center center;
  background-repeat: no-repeat;
  overflow: hidden;
}

/* Set the image to fill its parent and make transparent */
.center-cropped img {
  min-height: 100%;
  min-width: 100%;
  /* IE 8 */
  -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";
  /* IE 5-7 */
  filter: alpha(opacity=0);
  /* modern browsers */
  opacity: 0;
}
<div class="center-cropped" 
     style="background-image: url('http://placehold.it/200x200');">
  <img src="http://placehold.it/200x200" />
</div>


object-fit / -position

See supported browsers

CSS3 Images specification定义了object-fitobject-position属性,它们共同允许更好地控制img元素的图像内容的比例和位置。有了这些,就有可能达到预期的效果:

.center-cropped {
  object-fit: none; /* Do not scale the image */
  object-position: center; /* Center the image within the element */
  height: 100px;
  width: 100px;
}
<img class="center-cropped" src="http://placehold.it/200x200" />

答案 1 :(得分:69)

我一直在寻找使用img标签的纯CSS解决方案(不是背景图片方式)。

我找到了实现crop thumbnails with css目标的绝佳方式:

.thumbnail {
  position: relative;
  width: 200px;
  height: 200px;
  overflow: hidden;
}
.thumbnail img {
  position: absolute;
  left: 50%;
  top: 50%;
  height: 100%;
  width: auto;
  -webkit-transform: translate(-50%,-50%);
      -ms-transform: translate(-50%,-50%);
          transform: translate(-50%,-50%);
}
.thumbnail img.portrait {
  width: 100%;
  height: auto;
}

它类似于@Nathan Redblur的答案,但它也允许使用肖像图像。

对我来说就像一个魅力。关于图像,你唯一需要知道的是它是纵向还是横向,以便设置.portrait类,所以我不得不在这个部分使用一些Javascript。

答案 2 :(得分:30)

尝试此操作:设置图像裁剪尺寸并在CSS中使用此行:

object-fit: cover;

答案 3 :(得分:22)

img标记但没有background-image

的示例

此解决方案会保留img代码,这样我们就不会失去拖动或右键单击以保存图片的能力,但不会background-image只是居中并使用css裁剪。

除了非常高的图像外,保持纵横比很好。 (查看链接)

(view in action)

<强>标记

<div class="center-cropped">
    <img src="http://placehold.it/200x150" alt="" />
</div>

CSS

div.center-cropped {
  width: 100px;
  height: 100px;
  overflow:hidden;
}
div.center-cropped img {
  height: 100%;
  min-width: 100%;
  left: 50%;
  position: relative;
  transform: translateX(-50%);
}

答案 4 :(得分:7)

我使用@ Russ和@ Alex的答案创建了一个angularjs指令

2014年及以后可能会很有趣:P

HTML

<div ng-app="croppy">
  <cropped-image src="http://placehold.it/200x200" width="100" height="100"></cropped-image>
</div>

JS

angular.module('croppy', [])
  .directive('croppedImage', function () {
      return {
          restrict: "E",
          replace: true,
          template: "<div class='center-cropped'></div>",
          link: function(scope, element, attrs) {
              var width = attrs.width;
              var height = attrs.height;
              element.css('width', width + "px");
              element.css('height', height + "px");
              element.css('backgroundPosition', 'center center');
              element.css('backgroundRepeat', 'no-repeat');
              element.css('backgroundImage', "url('" + attrs.src + "')");
          }
      }
  });

fiddle link

答案 5 :(得分:2)

试试这个:

#yourElementId
{
    background: url(yourImageLocation.jpg) no-repeat center center;
    width: 100px;
    height: 100px;
}

请注意,widthheight仅在您的DOM元素具有布局(块显示元素,如divimg)时才有效。如果不是(例如,跨度),请将display: block;添加到CSS规则中。如果您无权访问CSS文件,请将元素内联放入元素中。

答案 6 :(得分:0)

还有另一种方法可以裁剪图像居中:

.thumbnail{position: relative; overflow: hidden; width: 320px; height: 640px;}
.thumbnail img{
    position: absolute; top: -999px; bottom: -999px; left: -999px; right: -999px;
    width: auto !important; height: 100% !important; margin: auto;
}
.thumbnail img.vertical{width: 100% !important; height: auto !important;}

您唯一需要的是添加课程&#34; vertical&#34;对于垂直图像,您可以使用以下代码执行此操作:

jQuery(function($) {
    $('img').one('load', function () {
        var $img = $(this);
        var tempImage1 = new Image();
        tempImage1.src = $img.attr('src');
        tempImage1.onload = function() {
            var ratio = tempImage1.width / tempImage1.height;
            if(!isNaN(ratio) && ratio < 1) $img.addClass('vertical');
        }
    }).each(function () {
        if (this.complete) $(this).load();
    });
});

注意:&#34;!important&#34;用于覆盖img标签上可能的width,height属性。