【问题标题】:How to center and crop an image to always appear in square shape with CSS?如何使用 CSS 居中和裁剪图像以始终以方形显示?
【发布时间】:2013-09-11 12:08:18
【问题描述】:

我需要始终仅使用 CSS 将随机大小的图像裁剪为 160x160 的正方形。 裁剪后图像应保持居中。

我的标记应该是:

<a href="#" class="cropper">
   <img src="image" alt="description" />
</a>

在 StackOverflow 上搜索我找到了一些答案(例如 CSS - How to crop an image to a square, if it's already square then resize it),但它们不适用于图像可以水平(宽)较大垂直(高)的情况.

具体来说,我需要能够同时呈现这样的宽幅图像:

还有一个像这样的高大图像:

正方形,事先不知道哪个是水平矩形或垂直矩形。它还应该支持已经平方的图像。

【问题讨论】:

标签: html css


【解决方案1】:

jsFiddle Demo

div {
    width: 250px;
    height: 250px;
    overflow: hidden;
    margin: 10px;
    position: relative;
}
img {
    position: absolute;
    left: -1000%;
    right: -1000%;
    top: -1000%;
    bottom: -1000%;
    margin: auto;
    min-height: 100%;
    min-width: 100%;
}
<div>
    <img src="https://i.postimg.cc/TwFrQXrP/plus-2.jpg" />
</div>

关于尺寸的说明

正如 cmets 中提到的Salman A,我们需要将 img 的位置坐标(上、左、下、右)设置为高于图像实际尺寸的百分比。我在上面的例子中使用了1000%,当然你可以根据自己的需要进行调整。

* 进一步说明:当我们设置imgleftright(或者:topbottom) 坐标为 -100%(包含 div),整体允许的宽度(或: imgheight),最多可以是包含 divwidth 的 300% (或:height),因为它是div的宽度(或:height)和的总和>leftright(或:topbottom)坐标。

【讨论】:

  • 我需要让它们适合“缩略图”空间
  • 如果图片大于div,最好width: 100% 用于纵向图片或height: 100% 用于img 标签。
  • 图片大于 300% 的 div 大小是否有效? I don't think so. FIDDLE
  • @SalmanA 你是对的。但它在其他方面工作得很好。我想它可以改进。
  • @Itay 只是使用大(但合理)的数字而不是 100%。
【解决方案2】:

注意它在 IE 和一些较旧的移动浏览器中不起作用,简单的object-fit: cover; 通常是最佳选择。

.cropper {
  position: relative;
  width: 100px;
  height: 100px;
  overflow: hidden;
}
.cropper img {
  position: absolute;
  width: 100%;
  height: 100%;
  object-fit: cover;
}

如果没有object-fit: cover 支持,图像将被奇怪地拉伸以适应盒子,因此,如果需要对 IE 的支持,我建议使用 -100% 上、左、右的其他答案方法之一和底部值作为后备。

http://caniuse.com/#feat=object-fit

【讨论】:

    【解决方案3】:

    object-fit 属性具有魔力。在JsFiddle

    CSS

    .image {
      width: 160px;
      height: 160px;
    }
    
    .object-fit_fill {
      object-fit: fill
    }
    
    .object-fit_contain {
      object-fit: contain
    }
    
    .object-fit_cover {
      object-fit: cover
    }
    
    .object-fit_none {
      object-fit: none
    }
    
    .object-fit_scale-down {
      object-fit: scale-down
    }
    

    HTML

    <div class="original-image">
      <p>original image</p>
      <img src="http://lorempixel.com/500/200">
    </div>
    
    <div class="image">
      <p>object-fit: fill</p>
      <img class="object-fit_fill" src="http://lorempixel.com/500/200">
    </div>
    
    <div class="image">
      <p>object-fit: contain</p>
      <img class="object-fit_contain" src="http://lorempixel.com/500/200">
    </div>
    
    <div class="image">
      <p>object-fit: cover</p>
      <img class="object-fit_cover" src="http://lorempixel.com/500/200">
    </div>
    
    <div class="image">
      <p>object-fit: none</p>
      <img class="object-fit_none" src="http://lorempixel.com/500/200">
    </div>
    
    <div class="image">
      <p>object-fit: scale-down</p>
      <img class="object-fit_scale-down" src="http://lorempixel.com/500/200">
    </div>
    

    结果

    【讨论】:

    • 除非您真的需要 IE 支持,否则这绝对是正确的选择。即便如此,最好只通知您的用户他们需要切换到现代浏览器...
    • 很高兴知道它的存在!让我们希望尽快实现全面的跨浏览器兼容性。
    【解决方案4】:

    我在以下链接中找到了更好的解决方案。只使用 "object-fit" https://medium.com/@chrisnager/center-and-crop-images-with-a-single-line-of-css-ad140d5b4a87

    【讨论】:

    【解决方案5】:

    HTML:

    <div class="thumbnail">
    </div>
    

    CSS:

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

    【讨论】:

      【解决方案6】:
      <div>
          <img class="crop" src="http://lorempixel.com/500/200"/>
      </div>
      
      <img src="http://lorempixel.com/500/200"/>
      
      
      
      
      div {
          width: 200px;
          height: 200px;
          overflow: hidden;
          margin: 10px;
          position: relative;
      }
      .crop {
          position: absolute;
          left: -100%;
          right: -100%;
          top: -100%;
          bottom: -100%;
          margin: auto; 
          height: auto;
          width: auto;
      }
      

      http://jsfiddle.net/J7a5R/56/

      【讨论】:

      • 完美,我认为这将是正确答案
      • 此解决方案在使用超出比例的图像时不起作用500x200/250x100
      【解决方案7】:

      clip 属性和position 可以帮助你

      a{
      position:absolute;
      clip:rect(0px,200px,200px,0px);
      }
      
      a img{
      position:relative;
      left:-50%;
      top:-50%;
       }
      

      WORKING FIDDLE

      【讨论】:

        【解决方案8】:
        <div style="specify your dimension:overflow:hidden">
            <div style="margin-top:-50px">
               <img ...  />
            </div>
        </div>
        

        以上内容将从图像顶部裁剪 50 像素。您可能希望根据图像的尺寸计算出符合您要求的上边距。

        要从底部裁剪,只需指定外部 div 的高度并删除内部 div。将相同的原则应用于从侧面进行裁剪。

        【讨论】:

        • 这样我需要知道图像是矩形的还是水平的,我还需要知道移动图像需要多少像素。根本不是解决方案。
        【解决方案9】:

        尝试将图像放入容器中,如下所示:

        HTML:

        <div>
            <img src="http://www.testimoniesofheavenandhell.com/Animal-Pictures/wp-content/uploads/2013/04/Dog-Animal-Picture-Siberian-Husky-Puppy-HD-Wallpaper.jpg" />
        </div>
        

        CSS:

        div
        {
            width: 200px;
            height: 200px;
            overflow: hidden;
        }
        
        div > img
        {
            width: 300px;
        }
        

        这是fiddle

        【讨论】:

        • @PurpleFoxy 最好使用更方形的图像,猜你需要稍微调整一下尺寸。
        猜你喜欢
        • 2021-06-05
        • 2018-04-13
        • 1970-01-01
        • 1970-01-01
        • 2021-11-24
        • 2012-03-24
        • 1970-01-01
        • 2013-02-16
        相关资源
        最近更新 更多