Как мне разместить одно изображение поверх другого в HTML?

Я новичок в программировании рельсов, пытаюсь показать много изображений на странице. Одни изображения накладываются поверх других. Чтобы упростить задачу, скажем, мне нужен синий квадрат с красным квадратом в верхнем правом углу синего квадрата (но не плотно в углу). Я пытаюсь избежать компоновки (с ImageMagick и т.п.) из-за проблем с производительностью.

Я просто хочу расположить перекрывающиеся изображения относительно друг друга.

В качестве более сложного примера представьте одометр, помещенный внутри большего изображения. Для шести цифр мне нужно было бы составить миллион разных изображений или сделать все это на лету, когда все, что нужно, - это разместить шесть изображений поверх другого.

вы можете сделать одометр с одним изображением, используя спрайты

Jason 05.01.2010 05:57
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Travel Booking Angular Template один из лучших Travel & Tour booking template in the world. 30+ валидированных HTML5 страниц, которые помогут...
272
1
806 515
10
Перейти к ответу Данный вопрос помечен как решенный

Ответы 10

Самый простой способ сделать это - использовать фоновое изображение, а затем просто поместить в этот элемент <img>.

Другой способ сделать это - использовать слои css. Есть масса ресурсов, которые помогут вам в этом, просто поищите css слои.

Это простой взгляд на то, что я сделал, чтобы наложить одно изображение на другое.

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

Источник

Вот код, который может дать вам идеи:

<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

Я подозреваю, что Решение Эспо может быть неудобным, потому что он требует от вас абсолютно позиционировать оба изображения. Вы можете захотеть, чтобы первая позиционировалась в потоке.

Обычно есть естественный способ сделать это - CSS. Вы помещаете position: relative в элемент контейнера, а затем полностью размещаете дочерние элементы внутри него. К сожалению, вы не можете поместить одно изображение внутрь другого. Вот почему мне понадобился контейнерный div. Обратите внимание, что я сделал его плавающим, чтобы он автоматически соответствовал своему содержимому. Заставить его отображать: inline-block теоретически тоже должно работать, но поддержка браузеров там оставляет желать лучшего.

Обновлено: Я удалил атрибуты размера из изображений, чтобы лучше проиллюстрировать свою точку зрения. Если вы хотите, чтобы у образа контейнера были размеры по умолчанию, и вы не знаете размер заранее, вы не можете использовать фоновый трюк. Если вы это сделаете, это лучший способ пойти.

Это лучшее решение для меня, потому что нет необходимости указывать ширину и высоту ваших изображений, и это приведет к гораздо большему повторному использованию.

Iman Mohamadi 24.03.2014 11:17

Встроенный стиль здесь только для ясности. Используйте настоящую таблицу стилей 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>

@ buti-oxa: Не буду педантичным, но ваш код недействителен. Атрибуты HTML width и height не допускают единиц измерения; вы, вероятно, думаете о свойствах CSS width: и 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>

Если оставить px; в атрибутах width и height, то механизм рендеринга может перестать работать.

Ответ принят как подходящий

Хорошо, через некоторое время вот на что я остановился:

.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://placehold.it/50" />
  <img class = "image2" src = "https://placehold.it/100" />
</div>

Как самое простое решение. То есть:

Создайте относительный div, который помещается в поток страницы; поместите базовое изображение первым как относительное, чтобы div знал, насколько он должен быть большим; разместите наложения как абсолютные относительно левого верхнего угла первого изображения. Уловка состоит в том, чтобы правильно определить родственников и абсолютов.

Это элегантное решение. Если «a» имеет идентификатор a, а «b» имеет идентификатор b, может ли этот код JavaScript (установка x и y некоторым расчетом) работать для изменения положения b?

DDPWNAGE 13.08.2015 04:42

Слева: 0 очень важно! Забыл, и в Safari не работает. Мне потребовалось время, чтобы понять это.

maracuja-juice 10.10.2017 21:57

При запуске фрагмента кода одно изображение не отображается поверх другого.

kojow7 31.03.2019 07:51

@ kojow7 Только что обновил фрагмент кода, чтобы показать их поверх других. :-)

Craigo 25.12.2019 07:47

Привет, @Craigo Спасибо за ответ. У меня есть одна проблема, но если я хочу выровнять оба изображения по центру, как я могу это сделать? Еще раз спасибо.

Me_developer 17.01.2020 11:39

@Me_developer Ты бы так не поступил. Вы бы использовали автоматические поля. w3schools.com/howto/howto_css_image_center.asp

Craigo 23.01.2020 11:47

@Craigo Спасибо. Я попробую это.

Me_developer 24.01.2020 11:59

Мне пришлось изменить порядок абсолютного и относительного, потому что мои изображения были внутри flex-reverse

Hank W 21.09.2020 09:34

Одна проблема, которую я заметил, которая может вызвать ошибки, заключается в том, что в ответе rrichter код ниже:

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

должен включать единицы пикселей в стиле, например.

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

В остальном ответ работал нормально. Спасибо.

Вы можете абсолютно позиционировать 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;
}

Вот такой ЖИВАЯ ДЕМО

Может быть, немного поздно, но для этого вы можете:

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;
    }
  }
}

Создайте относительный div, который помещается в поток страницы; поместите базовое изображение первым как относительное, чтобы div знал, насколько он должен быть большим; разместите наложения как абсолютные относительно левого верхнего угла первого изображения. Уловка состоит в том, чтобы правильно определить родственников и абсолютов.

Я думаю, что возможный пример кода может помочь будущим читателям этого ответа.

entpnerd 03.02.2020 08:52

Другие вопросы по теме