297

我是 Rails 编程的初学者,试图在页面上显示许多图像。有些图像要放在其他图像之上。为了简单起见,假设我想要一个蓝色方块,蓝色方块的右上角有一个红色方块(但角落不紧)。由于性能问题,我试图避免合成(使用 ImageMagick 等)。

我只想相对于彼此定位重叠的图像。

作为一个更困难的例子,想象一个里程表放置在一个更大的图像中。对于六位数字,我需要合成一百万个不同的图像,或者在运行中完成所有操作,所需要的只是将六个图像放在另一个图像之上。

4

12 回答 12

501

好的,一段时间后,这就是我登陆的内容:

.parent {
  position: relative;
  top: 0;
  left: 0;
}
.image1 {
  position: relative;
  top: 0;
  left: 0;
  border: 1px red solid;
}
.image2 {
  position: absolute;
  top: 30px;
  left: 30px;
  border: 1px green solid;
}
<div class="parent">
  <img class="image1" src="https://via.placeholder.com/50" />
  <img class="image2" src="https://via.placeholder.com/100" />
</div>

作为最简单的解决方案。那是:

创建一个放置在页面流中的相对div;首先将基本图像放置为相对,以便 div 知道它应该有多大;将叠加层放置为相对于第一张图像的左上角的绝对值。诀窍是让亲戚和绝对正确。

于 2010-01-04T03:40:16.717 回答
84

这是一个准系统看看我所做的将一个图像浮动到另一个图像上。

img {
  position: absolute;
  top: 25px;
  left: 25px;
}
.imgA1 {
  z-index: 1;
}
.imgB1 {
  z-index: 3;
}
<img class="imgA1" src="https://via.placeholder.com/200/333333">
<img class="imgB1" src="https://via.placeholder.com/100">

来源

于 2008-09-07T14:42:30.070 回答
42

这里的代码可能会给你一些想法:

<style>
.containerdiv { float: left; position: relative; } 
.cornerimage { position: absolute; top: 0; right: 0; } 
</style>

<div class="containerdiv">
    <img border="0" src="https://www.google.com/images/branding/googlelogo/2x/googlelogo_color_272x92dp.png" alt=""">
    <img class="cornerimage" border="0" src="http://www.gravatar.com/avatar/" alt="">
<div>

JSFiddle

我怀疑Espo 的解决方案可能不方便,因为它要求您绝对定位两个图像。您可能希望第一个将自己定位在流程中。

通常,有一种自然的方式可以做到这一点,那就是 CSS。您将 position: relative 放在容器元素上,然后将子元素绝对定位在其中。不幸的是,您不能将一张图片放入另一张图片中。这就是我需要容器 div 的原因。请注意,我将其设为浮点数以使其自动适应其内容。使其显示:inline-block 理论上应该也可以工作,但是那里的浏览器支持很差。

编辑:我从图像中删除了尺寸属性以更好地说明我的观点。如果您希望容器图像具有其默认大小并且事先不知道大小,则不能使用背景技巧。如果你这样做,这是一个更好的方法。

于 2008-09-07T15:37:03.870 回答
12

我注意到可能导致错误的一个问题是,在 rrichter 的回答中,代码如下:

<img src="b.jpg" style="position: absolute; top: 30; left: 70;"/>

应该在样式中包含 px 单位,例如。

<img src="b.jpg" style="position: absolute; top: 30px; left: 70px;"/>

除此之外,答案效果很好。谢谢。

于 2011-11-29T06:07:46.157 回答
8

您可以绝对pseudo elements相对于它们的父元素定位。

这为每个元素提供了两个额外的层 - 因此将一个图像放置在另一个图像之上变得很容易 - 具有最少的语义标记(没有空 div 等)。

标记:

<div class="overlap"></div>

CSS:

.overlap
{
    width: 100px;
    height: 100px;
    position: relative;
    background-color: blue;
}
.overlap:after
{
    content: '';
    position: absolute;
    width: 20px;
    height: 20px;
    top: 5px;
    left: 5px;
    background-color: red;
}

这是一个现场演示

于 2013-01-21T08:07:35.150 回答
7

可能有点晚了,但为此你可以这样做:

在此处输入图像描述

HTML

<!-- html -->
<div class="images-wrapper">
  <img src="images/1" alt="image 1" />
  <img src="images/2" alt="image 2" />
  <img src="images/3" alt="image 3" />
  <img src="images/4" alt="image 4" />
</div>

SASS

// In _extra.scss
$maxImagesNumber: 5;

.images-wrapper {
  img {
    position: absolute;
    padding: 5px;
    border: solid black 1px;
  }

  @for $i from $maxImagesNumber through 1 {
    :nth-child(#{ $i }) {
      z-index: #{ $maxImagesNumber - ($i - 1) };
      left: #{ ($i - 1) * 30 }px;
    }
  }
}
于 2018-08-01T17:37:50.750 回答
6

内联样式只是为了清楚起见。使用真正的 CSS 样式表。

<!-- First, your background image is a DIV with a background 
     image style applied, not a IMG tag. -->
<div style="background-image:url(YourBackgroundImage);">
    <!-- Second, create a placeholder div to assist in positioning 
         the other images. This is relative to the background div. -->
    <div style="position: relative; left: 0; top: 0;">
        <!-- Now you can place your IMG tags, and position them relative 
             to the container we just made -->   
        <img src="YourForegroundImage" style="position: relative; top: 0; left: 0;"/>
    </div>
</div>
于 2008-09-07T15:42:33.700 回答
5

最简单的方法是使用 background-image 然后在该元素中放置一个 <img> 。

另一种方法是使用 css 层。有大量资源可以帮助您解决这个问题,只需搜索css layers

于 2008-09-07T14:40:21.307 回答
1

设置背景大小的封面。然后用另一个 div 包裹你的 div 现在在父 div 上设置 max-width。

<div style="max-width:100px">
  <div style="background-image:url('/image.png'); background-size: cover; height:100px; width:100px; "></div>
</div>
于 2021-04-29T19:18:24.767 回答
1

您可以使用CSS-Grid,如果您想堆叠、重叠内容,这是一个非常方便的解决方案。首先你需要定义你的网格。在该网格内,您“告诉”您的 img-tags 在该网格内的位置。如果您将它们定义为位于网格的同一起点,它们将重叠。在以下示例中,两张图像重叠,一张在它们下方。

<div style="display: grid; grid-template-columns: [first-col] 100%; grid-template-rows: [first-row] 300px">
  <img src="https://fakeimg.pl/300/" style="grid-column-start: first-col; grid-row-start: first-row">
  <img src="https://fakeimg.pl/300/" style="grid-column-start: first-col; grid-row-start: first-row">
  <img src="https://fakeimg.pl/300/">
</div>

你可以在这里找到一个很好的 CSS-Grid解释

于 2021-08-31T07:04:17.480 回答
0

@buti-oxa:不要迂腐,但您的代码无效。HTMLwidthheight属性不允许使用单位;您可能会想到 CSSwidth:height:属性。您还应该提供text/css带有标签的内容类型( ; 参见 Espo 的代码)<style>

<style type="text/css"> 
.containerdiv { float: left; position: relative; } 
.cornerimage { position: absolute; top: 0; right: 0; } 
</style>

<div class="containerdiv">
    <img border="0" src="http://www.gravatar.com/avatar/" alt="" width="100" height="100">
    <img class="cornerimage" border="0" src="http://www.gravatar.com/avatar/" alt="" width="40" height="40">
<div>

保留and属性可能会px;导致渲染引擎停止。widthheight

于 2008-09-07T15:50:41.420 回答
0

创建一个放置在页面流中的相对div;首先将基本图像放置为相对,以便 div 知道它应该有多大;将叠加层放置为相对于第一张图像的左上角的绝对值。诀窍是让亲戚和绝对正确。

于 2020-02-03T05:25:48.413 回答