如何在HTML / CSS中仅显示图像的一部分?


140

假设我想要一种只显示HTML中250x250像素的图像的中心50x50像素的方法。我怎样才能做到这一点。另外,有没有办法对css:url()引用执行此操作?

我知道CSS中的clip,但这似乎仅在与绝对定位一起使用时才起作用。


在与HTML / CSS / JS有关的问题的任何人访问的站点列表中,应该有一个List Apart:这是一种制作sprite的方法这是另一种使用JS的方法
graham.reeds 08/09/11

1
使用精灵-请在此处查看w3schools.com/css/css_image_sprites.asp

Answers:


116

一种方法是在容器(td,div,span等)中将要显示的图像设置为背景,然后调整背景位置以获得所需的精灵。


1
为了澄清起见,您可以将容器的宽度和高度td,div,span或其他设置为50px,以使其工作。
Paul D. Waite,2009年

7
@Espo,这似乎是一个相当标准的方法,但是如果您有一个包含数个32x32大小的单个图像的sprite图像,并且想要在大于32x32的div,span等上显示其中一个图像,该怎么办。 。设置背景位置不再有效。
马修·莱顿

2
@ series0ne您可能可以与background-size
Stijn de Witt

163

正如问题中提到的那样,有一个clipcss属性,尽管它确实要求被裁剪的元素是position: absolute;(这很遗憾):

.container {
  position: relative;
}
#clip {
  position: absolute;
  clip: rect(0, 100px, 200px, 0);
  /* clip: shape(top, right, bottom, left); NB 'rect' is the only available option */
}
<div class="container">
  <img src="http://lorempixel.com/200/200/nightlife/3" />
</div>
<div class="container">
  <img id="clip" src="http://lorempixel.com/200/200/nightlife/3" />
</div>

JS Fiddle演示,用于实验。

为了补充最初的答案(有些晚了),我正在编辑以显示的用法clip-path,该用法已取代了现在不推荐使用的clip属性。

clip-path属性允许以下选项的范围(大于原始选项clip):

  • inset—矩形/长方体形状,定义为'distance-from'四个值(top right bottom left)
  • circlecircle(diameter at x-coordinate y-coordinate)
  • ellipseellipse(x-axis-length y-axis-length at x-coordinate y-coordinate)
  • polygon—由相对于元素左上角的原点的一系列x/ y坐标定义。当路径自动关闭时,多边形的实际最小点数应为3,再少(2)为一条线或(1)为一点:polygon(x-coordinate1 y-coordinate1, x-coordinate2 y-coordinate2, x-coordinate3 y-coordinate3, [etc...])
  • url —可以是本地URL(使用CSS id选择器)或外部文件的URL(使用文件路径)来标识SVG,尽管我还没有尝试过,但是我无法提供有关其收益或警告的见解。

div.container {
  display: inline-block;
}
#rectangular {
  -webkit-clip-path: inset(30px 10px 30px 10px);
  clip-path: inset(30px 10px 30px 10px);
}
#circle {
  -webkit-clip-path: circle(75px at 50% 50%);
  clip-path: circle(75px at 50% 50%)
}
#ellipse {
  -webkit-clip-path: ellipse(75px 50px at 50% 50%);
  clip-path: ellipse(75px 50px at 50% 50%);
}
#polygon {
  -webkit-clip-path: polygon(50% 0, 100% 38%, 81% 100%, 19% 100%, 0 38%);
  clip-path: polygon(50% 0, 100% 38%, 81% 100%, 19% 100%, 0 38%);
}
<div class="container">
  <img id="control" src="http://lorempixel.com/150/150/people/1" />
</div>
<div class="container">
  <img id="rectangular" src="http://lorempixel.com/150/150/people/1" />
</div>
<div class="container">
  <img id="circle" src="http://lorempixel.com/150/150/people/1" />
</div>
<div class="container">
  <img id="ellipse" src="http://lorempixel.com/150/150/people/1" />
</div>
<div class="container">
  <img id="polygon" src="http://lorempixel.com/150/150/people/1" />
</div>

JS Fiddle演示,用于实验。

参考文献:


14
令人惊奇的发现,非常感谢:)仅供参考,它并不像人们想象的那样有限。如果您在img标签周围有一个图像容器div(id =“ img_container”),只需将img_container位置设为相对,并将img设为绝对,则可以用这种方式裁剪图像
FurtiveFelon 2011年

“位置:绝对;(很可惜)”
Sanket Sahu 2014年

不是我知道的,不。
大卫说恢复莫妮卡2014年

6
clip弃用。较新的版本clip-path不需要定位
渴望

3
尽管不推荐使用clip,但许多现代浏览器尚不支持clip-path。developer.mozilla.org/en-US/docs/Web/CSS/clip-path
barrypicker

37

另一种选择是以下方法,尽管不是最干净的方法,因为它假定图像是容器中的唯一元素,例如在这种情况下:

<header class="siteHeader">
  <img src="img" class="siteLogo" />
</header>

然后,您可以将容器用作所需大小的蒙版,并以负边距包围图像以将其移动到正确的位置:

.siteHeader{
    width: 50px;
    height: 50px;
    overflow: hidden;
}

.siteHeader .siteLogo{
    margin: -100px;
}

演示可以在此JSFiddle中看到。

似乎只能在IE> 9和所有其他浏览器的所有重要版本中使用。


2
尽管它是一个bitc hacky,但它有一个好处是可以在所有浏览器中使用(不建议使用clip,并且在IE中不支持clip-path),并且在尝试打印网页时可以使用(默认情况下会跳过背景图片) )
劳妮·利勒梅斯

这是唯一真正跨浏览器的方法。所有其他方式都有问题。“剪辑”已贬值,并且并非在所有浏览器中都准确读取背景位置。
Kareem
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.