Как наложить один div на другой div - PullRequest
833 голосов
/ 31 мая 2010

Мне нужна помощь с наложением одного человека div на другого человека div.

Мой код выглядит так:

<div class="navi"></div>
<div id="infoi">
    <img src="info_icon2.png" height="20" width="32"/>
</div>

К сожалению, я не могу вложить div#infoi или img внутри первого div.navi.

Это должны быть два отдельных div с, как показано, но мне нужно знать, как я мог бы разместить div#infoi над div.navi и с самой правой стороны и центрировать поверх div.navi.

Ответы [ 8 ]

1115 голосов
/ 31 мая 2010

#container {
  width: 100px;
  height: 100px;
  position: relative;
}
#navi,
#infoi {
  width: 100%;
  height: 100%;
  position: absolute;
  top: 0;
  left: 0;
}
#infoi {
  z-index: 10;
}
<div id="container">
  <div id="navi">a</div>
  <div id="infoi">
    <img src="https://appharbor.com/assets/images/stackoverflow-logo.png" height="20" width="32" />b
  </div>
</div>

Я бы предложил узнать о position: relative и дочерних элементах с position: absolute.

247 голосов
/ 20 сентября 2017

Принятое решение прекрасно работает, но IMO не хватает объяснения, почему оно работает. Пример ниже сводится к основам и отделяет важный CSS от несоответствующего CSS стиля. В качестве бонуса я также включил подробное объяснение того, как работает позиционирование CSS.

TLDR; , если вам нужен только код, прокрутите вниз до Результат .

Проблема

Существует 2 отдельных элемента, родственных элемента, и цель состоит в том, чтобы расположить 2-й элемент (с id из infoi), чтобы он отображался в предыдущем элементе (элемент с class из navi ). Структура HTML не может быть изменена.

Предлагаемое решение

Чтобы достичь желаемого результата, мы собираемся переместить или расположить 2-й элемент, который мы назовем #infoi, чтобы он появился в 1-м элементе, который мы назовем .navi. В частности, мы хотим, чтобы #infoi был расположен в верхнем правом углу .navi.

Требуемая позиция CSS Знание

CSS имеет несколько свойств для позиционирования элементов. По умолчанию все элементы position: static. Это означает, что элемент будет располагаться в соответствии с его порядком в структуре HTML, за некоторыми исключениями.

Другие значения position: relative, absolute и fixed. Установив для элемента position одно из этих 3 значений, теперь можно использовать комбинацию следующих 4 свойств для позиционирования элемента:

  • top
  • right
  • bottom
  • left

Другими словами, установив position: absolute, мы можем добавить top: 100px, чтобы расположить элемент на 100 пикселей сверху страницы. И наоборот, если мы установим bottom: 100px, элемент будет расположен в 100 пикселях от нижней части страницы.

Вот где теряются многие новички CSS - position: absolute имеет систему координат. В приведенном выше примере системой отсчета является элемент body. position: absolute с top: 100px означает, что элемент расположен 100px сверху элемента body.

Положение системы отсчета или контекст положения можно изменить, установив position родительского элемента на любое значение, отличное от position: static. То есть мы можем создать новый контекст позиции, задав родительский элемент:

  • position: absolute;
  • position: relative;
  • position: fixed;

Например, если элемент <div class="parent"> задан position: relative, любые дочерние элементы используют <div class="parent"> в качестве контекста позиции. Если бы дочернему элементу были заданы position: absolute и top: 100px, элемент был бы позиционирован на 100px от вершины элемента <div class="parent">, потому что <div class="parent"> теперь является контекстом позиции.

Другой фактор, о котором нужно знать , это порядок стеков - или как элементы располагаются в направлении z. Здесь необходимо знать, что порядок стеков элементов по умолчанию определяется в порядке, обратном их порядку в структуре HTML. Рассмотрим следующий пример:

<body>
  <div>Bottom</div>
  <div>Top</div>
</body> 

В этом примере, если два элемента <div> были бы расположены в одном и том же месте на странице, элемент <div>Top</div> будет охватывать элемент <div>Bottom</div>. Поскольку <div>Top</div> идет после <div>Bottom</div> в структуре HTML, у него более высокий порядок наложения.

div {
  position: absolute;
  width: 50%;
  height: 50%;
}

#bottom {
  top: 0;
  left: 0;
  background-color: blue;
}

#top {
  top: 25%;
  left: 25%;
  background-color: red;
}
<div id="bottom">Bottom</div>
<div id="top">Top</div>

Порядок размещения можно изменить с помощью CSS, используя свойства z-index или order.

Мы можем игнорировать порядок размещения в этом выпуске, поскольку естественная HTML-структура элементов означает, что элемент, который мы хотим отобразить на top, идет после другого элемента.

Итак, вернемся к проблеме - мы будем использовать контекст позиции для решения этой проблемы.

Решение

Как указано выше, наша цель - расположить элемент #infoi так, чтобы он находился внутри элемента .navi. Для этого мы обернем элементы .navi и #infoi в новый элемент <div class="wrapper">, чтобы мы могли создать новый контекст позиции.

<div class="wrapper">
  <div class="navi"></div>
  <div id="infoi"></div>
</div>

Затем создайте новый контекст позиции, задав .wrapper a position: relative.

.wrapper {
  position: relative;
}

С этим новым контекстом позиции мы можем позиционировать #infoi в .wrapper. Сначала дайте #infoi a position: absolute, что позволит нам позиционировать #infoi абсолютно в .wrapper.

Затем добавьте top: 0 и right: 0, чтобы поместить элемент #infoi в верхнем правом углу. Помните, поскольку элемент #infoi использует .wrapper в качестве контекста позиции, он будет находиться в верхнем правом углу элемента .wrapper.

#infoi {
  position: absolute;
  top: 0;
  right: 0;
}

Поскольку .wrapper является просто контейнером для .navi, расположение #infoi в верхнем правом углу .wrapper дает эффект расположения в верхнем правом углу .navi.

И у нас это есть, #infoi теперь, кажется, находится в верхнем правом углу .navi.

Результат

Пример ниже сводится к основам и содержит некоторые минимальные стили.

/*
*  position: relative gives a new position context
*/
.wrapper {
  position: relative;
}

/* 
*  The .navi properties are for styling only
*  These properties can be changed or removed
*/
.navi {
  background-color: #eaeaea;
  height: 40px;
}


/*
*  Position the #infoi element in the top-right
*  of the .wrapper element
*/
#infoi {
  position: absolute;
  top: 0;
  right: 0;
  
  /*
  *  Styling only, the below can be changed or removed
  *  depending on your use case
  */
  height: 20px;
  padding: 10px 10px;
}
<div class="wrapper">
  <div class="navi"></div>
  <div id="infoi">
    <img src="http://via.placeholder.com/32x20/000000/ffffff?text=?" height="20" width="32"/>
  </div>
</div>

Альтернативное решение (без оболочки)

В случае, если мы не можем редактировать HTML, то есть мы не можем добавить элемент-обертку, мы все равно можем добиться желаемого эффекта

Вместо использования position: absolute для элемента #infoi мы будем использовать position: relative. Это позволяет нам переместить элемент #infoi из положения по умолчанию ниже элемента .navi. С position: relative мы можем использовать отрицательное значение top, чтобы переместить его из положения по умолчанию, и значение left 100% минус несколько пикселей, используя left: calc(100% - 52px), чтобы расположить его рядом с правой стороной. ,

/* 
*  The .navi properties are for styling only
*  These properties can be changed or removed
*/
.navi {
  background-color: #eaeaea;
  height: 40px;
  width: 100%;
}


/*
*  Position the #infoi element in the top-right
*  of the .wrapper element
*/
#infoi {
  position: relative;
  display: inline-block;
  top: -40px;
  left: calc(100% - 52px);
  
  /*
  *  Styling only, the below can be changed or removed
  *  depending on your use case
  */
  height: 20px;
  padding: 10px 10px;
}
<div class="navi"></div>
<div id="infoi">
  <img src="http://via.placeholder.com/32x20/000000/ffffff?text=?" height="20" width="32"/>
</div>
107 голосов
/ 23 мая 2012

Используя div в стиле z-index:1; и position: absolute;, вы можете наложить div на любой другой div.

z-index определяет порядок, в котором делятся стеки. Div с более высоким z-index появится перед div с более низким z-index. Обратите внимание, что это свойство работает только с позиционированными элементами .

19 голосов
/ 09 января 2017

Здесь следует простое решение на 100% на основе CSS. «Секрет» заключается в использовании display: inline-block в элементе оболочки. vertical-align: bottom на изображении - это хак для преодоления отступов в 4px, которые некоторые браузеры добавляют после элемента.

Совет : если элемент перед упаковщиком встроен, он может оказаться вложенным. В этом случае вы можете «обернуть обертку» внутри контейнера с помощью display: block - обычно это старый и старый div.

.wrapper {
    display: inline-block;
    position: relative;
}

.hover {
    position: absolute;
    top: 0;
    left: 0;
    right: 0;
    bottom: 0;
    background-color: rgba(0, 188, 212, 0);
    transition: background-color 0.5s;
}

.hover:hover {
    background-color: rgba(0, 188, 212, 0.8);
    // You can tweak with other background properties too (ie: background-image)...
}

img {
    vertical-align: bottom;
}
<div class="wrapper">
    <div class="hover"></div>
    <img src="http://placehold.it/450x250" />
</div>
19 голосов
/ 30 января 2013

Это то, что вам нужно:

function showFrontLayer() {
  document.getElementById('bg_mask').style.visibility='visible';
  document.getElementById('frontlayer').style.visibility='visible';
}
function hideFrontLayer() {
  document.getElementById('bg_mask').style.visibility='hidden';
  document.getElementById('frontlayer').style.visibility='hidden';
}
#bg_mask {
  position: absolute;
  top: 0;
  right: 0;  bottom: 0;
  left: 0;
  margin: auto;
  margin-top: 0px;
  width: 981px;
  height: 610px;
  background : url("img_dot_white.jpg") center;
  z-index: 0;
  visibility: hidden;
} 

#frontlayer {
  position: absolute;
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
  margin: 70px 140px 175px 140px;
  padding : 30px;
  width: 700px;
  height: 400px;
  background-color: orange;
  visibility: hidden;
  border: 1px solid black;
  z-index: 1;
} 


</style>
<html>
  <head>
    <META HTTP-EQUIV="EXPIRES" CONTENT="-1" />

  </head>
  <body>
    <form action="test.html">
      <div id="baselayer">

        <input type="text" value="testing text"/>
        <input type="button" value="Show front layer" onclick="showFrontLayer();"/> Click 'Show front layer' button<br/><br/><br/>

        Testing text Testing text Testing text Testing text Testing text Testing text Testing text Testing text Testing text Testing text Testing text Testing text Testing text Testing text Testing text Testing text Testing text Testing text Testing text Testing text
        Testing text Testing text Testing text Testing text Testing text Testing text Testing text Testing text Testing text Testing text Testing text Testing text Testing text Testing text Testing text Testing text Testing text Testing text Testing text Testing text
        Testing text Testing text Testing text Testing text Testing text Testing text Testing text Testing text Testing text Testing text Testing text Testing text Testing text Testing text Testing text Testing text Testing text Testing text Testing text Testing textsting text Testing text Testing text Testing text Testing text Testing text Testing text Testing text Testing text Testing text Testing text Testing text Testing text Testing text Testing text Testing text Testing text Testing text
        <div id="bg_mask">
          <div id="frontlayer"><br/><br/>
            Now try to click on "Show front layer" button or the text box. It is not active.<br/><br/><br/>
            Use position: absolute to get the one div on top of another div.<br/><br/><br/>
            The bg_mask div is between baselayer and front layer.<br/><br/><br/>
            In bg_mask, img_dot_white.jpg(1 pixel in width and height) is used as background image to avoid IE browser transparency issue;<br/><br/><br/>
            <input type="button" value="Hide front layer" onclick="hideFrontLayer();"/>
          </div>
        </div>
      </div>
    </form>
  </body>
</html>
9 голосов
/ 29 августа 2010

Я не большой программист и не эксперт в CSS, но я все еще использую вашу идею в своих веб-проектах Я тоже пробовал разные разрешения:

#wrapper {
  margin: 0 auto;
  width: 901px;
  height: 100%;
  background-color: #f7f7f7;
  background-image: url(images/wrapperback.gif);
  color: #000;
}
#header {
  float: left;
  width: 100.00%;
  height: 122px;
  background-color: #00314e;
  background-image: url(images/header.jpg);
  color: #fff;
}
#menu {
  float: left;
  padding-top: 20px;
  margin-left: 495px;
  width: 390px;
  color: #f1f1f1;
}
<div id="wrapper">
  <div id="header">
    <div id="menu">
      menu will go here
    </div>
  </div>
</div>

Конечно, вокруг них будет обертка. Вы можете управлять расположением меню div, которое будет отображаться внутри заголовка div с левыми полями и верхними позициями. Вы также можете настроить меню div, если хотите. Надеюсь, это поможет.

3 голосов
/ 02 апреля 2019

Новая Grid CSS спецификация обеспечивает гораздо более элегантное решение. Использование position: absolute может привести к проблемам наложения или масштабирования, в то время как Grid избавит вас от грязных хаков CSS.

Пример минимального наложения сетки:

HTML

<div class="container">
  <div class="content">This is the content</div>
  <div class="overlay">Overlay - must be placed under content in the HTML</div>
</div>

CSS

.container {
  display: grid;
 }

.content, .overlay {
  grid-area: 1 / 1;
}

Вот и все. Если вы не строите для IE, ваш код, скорее всего, будет работать.

0 голосов
/ 28 августа 2018

Вот простой пример для наложения эффекта наложения с иконкой загрузки поверх другого div.

<style>
#overlay {
    position: absolute;
    width: 100%;
    height: 100%;
    background: black url('icons/loading.gif') center center no-repeat; /* Make sure the path and a fine named 'loading.gif' is there*/
    background-size: 50px;
    z-index: 1;
    opacity: .6;
}
.wraper{
    position: relative;
    width:400px;  /* Just for testing, remove width and height if you have content inside this div*/
    height:500px; /*Remove this if you have content inside*/
}
</style>
<h2>The overlay tester</h2>
<div class="wraper">
    <div id="overlay"></div>
    <h3>Apply the overlay over this div</h3>
</div>

Попробуй здесь http://jsbin.com/fotozolucu/edit?html,css,output

...