【问题标题】:Image behaving as if it was only a portion of original image图像表现得好像它只是原始图像的一部分
【发布时间】:2018-02-22 18:07:21
【问题描述】:

对不起,如果这有点令人困惑,但我会尽力解释。 总而言之,我希望图像仅根据图像的一小部分表现。

例如,想象一个太阳系的图像,它的宽度为 1000 像素,高度为 1000 像素。太阳是图像的一部分,位于距顶部 150 像素和距左侧 150 像素的位置,形状为 250 像素的正方形。

我希望图像的太阳部分占据一个完整的 div 类似的东西:

img { width: 100% }

如果我这样做,太阳系的完整图像将完全嵌入到 div 中。它不是以太阳为中心的。

为了实现我想要的,我必须这样做:

img {
position: absolute;
width: 400%;
top: some pixel value;
left: some pixel value;
}

但是当图像所在的原始DIV不固定时,这很令人头疼。

所以我想知道是否存在允许设置图像左上角值和右下角值的东西,并且让图像的其余部分溢出并以与设置边界的图像部分相同的方式进行调整。

【问题讨论】:

  • 带有图像的真实代码会有所帮助,或者至少是草图。我认为您不想使用 400% 宽度,因此必须为您想要实现的目标提供更好的解决方案。
  • hmm 澄清一下,您的示例中的图片是单独的 div,对吧?
  • 嗨,约翰,不,它实际上是一张具有透明背景的图片。但是输入这个问题让我意识到我很愚蠢。我实际上应该使图像的宽度变大(百分之百)以使图像的特定部分占据整个 div,但是我不能用像素定位它!我想我应该使用 % 或 vw, vmin, vmax ... 否则它不会工作.. 我会尝试玩这个,看看我是否能达到预期的效果......(我可能会取消不污染的问题太多了,以后再问我是否还有问题)

标签: html css image


【解决方案1】:

在 CSS 中使用 background-image 而不是 <img /> 标记将使这变得相当简单并且完全响应:

.sun {
  width: 25%;
  height: 0px;
  padding-top: 25%;
  background-image: url(https://i.imgur.com/3lHAYdT.png);
  background-size: 400%; /* 400% * 250px == 1000px */
  /* Edit: a little confused, but looks like you need 20% instead.  Trying to figure out why. */
  background-position: 20% 20%; /* 15% of 1000px = 150px */
}
<div class="sun"></div>

如果您更喜欢使用<img /> 标签,您可以与position: absolute;overflow: hidden; 一起使用

.sun {
  width: 25%;
  height: 0px;
  padding-top: 25%;
  position: relative;
  overflow: hidden;
}

.sun img {
  width: 400%;
  height: auto;
  position: absolute;
  top: -60%; /* 60% is 15% of 1000px * 400% */
  left: -60%;
}
<div class="sun"><img src="https://i.imgur.com/3lHAYdT.png" alt="universe" /></div>

【讨论】:

  • 谢谢乔纳森我确实意识到我在像素定位方面很愚蠢。 15% 15% 绝对是我应该使用的。使用背景可能也是一个好主意,而不是使用绝对定位和 z-index...
  • <img> 标签不需要或使用结束斜线。
  • @Rob 是的,如果您选择这样做。告知自己要使用的文档类型和语法
  • @G-Cyr 它没有,你也不能显示任何曾经创建的 HTML 规范,说你必须使用右斜杠,它是必需的,或者它可以做任何事情。
  • 你说,“@Rob 是的……”
【解决方案2】:

你也可以使用object-fit:

object-fit CSS 属性指定应如何调整替换元素(例如 <img><video>)的大小以适合其容器。

img {
  vertical-align: top;
  object-fit: none;
  padding: 5px;
  border: solid;
  margin: 5px;
  background: linear-gradient(60deg, tomato, gold, silver, purple, brown, turquoise, lightgray);
}

img:nth-child(2) {
  width: 130px;
  height: 125px;
  object-position: 0 0;
}

img:nth-child(3) {
  width: 140px;
  height: 45px;
  object-position: -130px 0;
}

img:nth-child(4) {
  width: 80px;
  height: 100px;
  object-position: -160px -50px;
}

img:nth-child(5) {
  width: 140px;
  height: 150px;
  object-position: -250px -30px;
}

img:nth-child(6) {
  width: 80px;
  height: 70px;
  object-position: 0 -230px;
}

img:nth-child(7) {
  width: 70px;
  height: 75px;
  object-position: -70px -125px;
}

img:nth-child(8) {
  width: 80px;
  height: 80px;
  object-position: -325px -260px;
}

img:nth-child(9) {
  width: 180px;
  height: 65px;
  object-position: -200px -370px;
}

img:nth-child(10) {
  width: 65px;
  height: 65px;
  object-position: -380px -370px;
}

img:nth-child(11) {
  width: 240px;
  height: 140px;
  object-position: 0 -295px;
}

i {
  font-size: 0.5em;
}
<h1>testing object-fit <i>(full image below)</i></h1>
<img src="https://teachingphysics.files.wordpress.com/2010/04/solar-system.jpg" />
<img src="https://teachingphysics.files.wordpress.com/2010/04/solar-system.jpg" />
<img src="https://teachingphysics.files.wordpress.com/2010/04/solar-system.jpg" />
<img src="https://teachingphysics.files.wordpress.com/2010/04/solar-system.jpg" />
<img src="https://teachingphysics.files.wordpress.com/2010/04/solar-system.jpg" />
<img src="https://teachingphysics.files.wordpress.com/2010/04/solar-system.jpg" />
<img src="https://teachingphysics.files.wordpress.com/2010/04/solar-system.jpg" />
<img src="https://teachingphysics.files.wordpress.com/2010/04/solar-system.jpg" />
<img src="https://teachingphysics.files.wordpress.com/2010/04/solar-system.jpg" />
<img src="https://teachingphysics.files.wordpress.com/2010/04/solar-system.jpg" />
<hr/>
<h2>original</h2>
<img src="https://teachingphysics.files.wordpress.com/2010/04/solar-system.jpg" />

object-position 与背景位置相同

【讨论】:

  • &lt;img&gt; 标签不需要或使用结束斜线。
  • @Rob 有,也没有。当您决定不使用非结束标签时,这意味着您使用 HTML-4 语法,这意味着您也不在 hr 或输入标签上使用它以保持连贯性。如果您选择使用结束标记,则意味着您使用的是 XHTML 语法。两者都在 HTML5 中被允许,但不能一起使用。几年前我放弃了 HTML4 语法,我将坚持使用 XHTML 语法。请自行了解要使用的文档类型和语法;)
  • 没有。 HTML4 中也不使用或不需要结束标记。事实上,在任何 HTML 规范中,从来没有需要 &lt;img&gt;&lt;br&gt; 上的右斜杠。而 XHTML,正确地用作 application xml/xhtml 是另一种动物(它是 XML)。
  • @Rob 你能再读一遍吗?我在哪里说过要在 HTML 4 中使用结束标记?在 W3C 网站上通知自己,那里有关于 html/xhtml/xml/svg/ 的所有官方标准 ...语言及其文档类型 .... 或者最好使用他们的验证器 validator.w3.org 你会发现它很有用:)跨度>
  • 您说,“这意味着您使用 HTML-4 语法”。这不是真的。我无法阅读不存在的内容,因此请向我展示指向网络历史中任何 HTML 规范的链接,该链接显示需要、需要或具有任何含义的右斜杠。请不要再引用 XHTML 和 XML。
【解决方案3】:

只需使用具有图像摘录的预期大小和overflow: hidden; 的容器。然后使用margin-topmargin-left 的负值根据预期摘录定位图像,如下所示。

示例(原图可在https://www.pics.edu.pk/Students/images/48/newcertificate_sample.jpg查看):

.container {
  width: 200px;
  height: 200px;
  overflow: hidden;
}

img {
  margin-top: -500px;
  margin-left: -392px;
}
<div class="container">
  <img src="https://www.pics.edu.pk/Students/images/48/newcertificate_sample.jpg">
</div>

附加:您可以将容器设置为您想要的任何大小,使用定义的宽度和高度调整(整个)图像的大小/缩放:自动并使用左边距和右边距的负值定义摘录。这需要一些试验和错误,但您可以使用我描述的方法以任何大小显示图像的任何部分。

顺便说一句:图像精灵也是这样工作的,如果你用谷歌搜索“图像精灵”,你会发现很多例子。

【讨论】:

  • 嗨 Johannes,这就是我所做的,但我希望图像仍能适应包含的 div。然后,我可能应该从这个线程中获得灵感,而不是使用 200x200:stackoverflow.com/questions/10062811/… 并且还使用 pourcentage 作为边距......
  • 我会尝试从这里的答案中获得灵感,看看我能不能有所作为
  • 您可以更改容器大小,对于图像本身,您仍然可以定义一个大小(即定义的widthheight: auto 以保持宽度/高度比例)来缩放它。
  • 嗯.. 如果容器宽度为 100%,高度为这一点,那就太好了。 (我的部分不完全是 200x200 也不是 250x250,而是像 585x542px 这样的高度是宽度的 92.64%。)然后我可以根据宽度比(1368/585 即 234%)放大图像,然后用百分比调整边距以制作正确的部分在 div 里面......好吧,我明天会玩这一切
  • 此外,我想看看溢出。我需要太阳,它是图像的非居中部分,在我的 div 中居中。当 div 被重新定义时,太阳会相应地伸展,并且它周围的行星也会改变大小。太阳仍然是 div 的中心。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-07
  • 2018-01-08
  • 1970-01-01
  • 2019-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多