Подтвердить что ты не робот

Overlay Divs без абсолютного положения

Далее следует длинное объяснение, но это единственный способ эффективно сообщить о проблеме, которую я пытаюсь решить...

Я (отчаянно и совершенно безуспешно) пытался наложить divs без использования абсолютного позиционирования. Потребность связана с корзиной PayPal, которую я размещаю на сайте с помощью Javascript. Естественное положение тележки затруднено с верхним краем веб-страницы (а не с ее содержимым div, которое #wpPayPal или оболочкой для этого div, #main).

Автор script настоятельно рекомендует не настраивать таблицу стилей корзины, но я нашел учебник, который он написал, что позволяет вставлять корзину в разделитель div, с инструкциями по позиционированию для контейнера, который работает - я смог расположить корзину ниже раздела верхнего баннера сайта. Однако...

Форма HTML корзины и элемент ul внутри каждого из них имеют требования к высоте в таблице стилей корзины, и это вызывает основной контент страницы, завернутый контейнером div #imageWrapper, слишком далеко вниз по странице, чтобы быть приемлемым.

Я попытался разместить #imageWrapper над #main несколькими идеями, собранными из сообщений на этом сайте, без успеха. Я пробовал абсолютное позиционирование на #imageWrapper, но это освобождает нижний колонтитул, чтобы плавать ниже. #imageWrapper height является переменной, поэтому я не хочу удерживать нижний колонтитул на месте с высотой, так как минимальная высота для предотвращения перекрытия приведет к тому, что нижний колонтитул слишком сильно удалит большую часть содержимого сайта.

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

Затем я прочитал статью об использовании позиции: relative и z-index для наложения div. Попробовал это, сначала, поставив z-index: -1 на #main (div, который обертывает корзину PayPal), но тележка исчезает. Не уверен, где это происходит, либо, так как навигация на сайте, также завернутая #main, осталась на месте.

Затем я устанавливаю z-index для main в 0 и применяемое положение: относительно #imageWrapper с z-index: 100. Корзина снова появилась, но все еще удерживает #imageWrapper.

Предложения приветствуются. Я не являюсь пользователем интерфейса каким-то образом воображения, просто парень, который знает, как использовать Google, поэтому заранее заблаговременно за четкое формулирование вашего разрешения:) Кроме того, FYI, в настоящее время у меня есть требование минимальной высоты для тележки форма установлена ​​в 0 и устанавливает элемент UL в пределах height: auto. При использовании только одного элемента в корзине это позволяет #imageWrapper перемещаться вверх по странице настолько, чтобы быть приемлемым, но это не жизнеспособное долгосрочное решение.

Здесь страница примера - чтобы увидеть корзину, добавьте элемент, используя раскрывающееся меню, которое отображается под основным изображением. В расширенном состоянии вы увидите, как #imageWrapper сидит против него.

Я включил части оскорбительного HTML/CSS ниже:

<div id="main">
    <div id="wpPayPal">
    </div><!--end wpPayPal-->
    <div id="breadcrumbs">
        <span class="B_crumbBox"><span class="B_firstCrumb"><a class="B_homeCrumb" href="/">home</a></span> &raquo;</span></span>
    </div> <!--end breadcrumbs -->
</div><!-- end Main -->

<div id="imageWrapper">
    <div id="imageInnerWrapper">
        <div id="featureImage">
            <div class="filename"><h1>~&nbsp;Bryce Canyon Sunrise | Bryce Canyon | Utah&nbsp;~</h1>
            </div><!--end filename-->

и т.д...

#main {
    display: inline;
    position: relative;
    z-index: 0;
}

#imageWrapper {
    clear: both;
    width: 840px;
    margin: 0 auto;
    padding: 0;
    position: relative;
    z-index: 100;
}

#imageInnerWrapper {
    width: 840px;
    margin: 0 auto;
    padding: 0;
    position: relative;
    z-index: 100;
}

#featureImage {
    width: 840px;
    margin: 0 auto;
    padding: 0;  
}

#wpPayPal {
    overflow: hidden;
    float: right;
    margin-right: 100px;
    min-width: 365px;
    min-height: 20px;
}

/* Override the default Mini Cart styles */

#wpBody #PPMiniCart form {
    position: relative;
    right: auto;
    width: auto;
    min-height: 0;
}

#wpBody #PPMiniCart form ul {
    height: auto;
}
4b9b3361

Ответ 1

Простая скрипка: просто CSS

Какой-то парень опубликовал другой, но у него была куча лишнего ненужного кода и немного JS В другом сообщении был ответ, но чего-то не хватало

.over {
  background: rgba(230, 6, 6, .5);
  float: right;
  height: 460px;
  margin-top: -500px;
  margin-right: 159px;
  overflow: visible;
  position: relative;
  width: 560px;
  color: #FFFFFF;
  /* Just for looks*/
  z-index: 1000;
  padding: 20px/* Just for looks*/
}

.over span {
  position: relative;
  /* Just for looks*/
  top: 15px;
  /* Just for looks*/
}

.this {
  width: 560px;
  height: 460px;
  color: #FFFFFF;
  /* Just for looks*/
  padding: 20px;
  /* Just for looks*/
  background-image: url("http://www.tshirtvortex.net/wp-content/uploads/dramaticchipmunk.jpg");
  /* Just for looks*/
}
<div class="this">To BE UNDER</div>
<div class="over"><span>..or not To BE UNDER</span></div>

Ответ 2

Фон Div для блока с динамической высотой может быть реализован с помощью flexbox без абсолютного позиционирования:

/* Every rule not marked by "required" is optional and used only to decorate the example */
.block {
    margin: 10px 50px;
    display: flex; /* required */
    flex-flow: row nowrap; /* required */
}
.block .background,
.block .foreground {
    box-sizing: border-box; /* required */
    width: 100%; /* required */
    flex: none; /* required */
}
.block .background {
    background: #9ff;
    color: #fff;
    padding: 15px;
    font-size: 30px;
}
.block .foreground {
    padding: 15px;
    border: solid 1px;
    margin-left: -100%; /* required */
}
.block .foreground .outside {
    position: absolute;
    top: 5px;
    left: 8px;
}
<div class="block">
    <div class="background">
        Background
    </div>
    <div class="foreground">
        <div>
            <div class="outside">Outside</div> <!-- The "outside" div is also optional -->
            <div>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Odio incidunt perspiciatis sapiente aspernatur repellat delectus atque quae optio nam? Pariatur explicabo laboriosam dolores temporibus molestiae error ipsa sunt molestias doloremque odio nemo iure similique quae exercitationem, adipisci, ullam dicta esse numquam beatae qui velit asperiores. Dolore, quo illum necessitatibus tempora earum nihil cumque corporis aut error eius voluptatibus quia, pariatur.</div>
        </div>
    </div>
</div>

Ответ 3

  
    

Получил!: D

    

Решение Pure Css очень просто. Поместите следующее.

#main {
float: right;
overflow: visible;
position: relative;
z-index: 1000;
height: 177px;
width: 100%;
}

Замените все, что у вас есть в css #main с, что я сделал выше.

Итак удалите следующее:

display: inline;
position: relative;
z-index: 0;

Объяснение: Основная идея здесь состоит в том, чтобы плавать основной элемент, сделать его определенной высотой, так что ни в коем случае он не отталкивает все. Но сделайте переполнение видимой. Переполнение содержимого не влияет на siblings основного элемента .

Ответ 4

Теперь вы можете сделать это и с сеткой.

.parent {
  display: grid;
  grid-template-columns: 1fr;
}

.parent div {
 padding: 50px;
 background-color: rgba(0,0,0,0.5);
 grid-row-start: 1;
 grid-column-start: 1;
}
<div class="parent">
  <div class="child1">
  1
  </div>
  <div class="child2">
  2
  </div>
</div>

Ответ 5

Ни один из предыдущих ответов не помогает с вашим требованием, что позволяет PPMiniCart расширяться и сокращаться без нажатия imageWrapper вниз.

Трюк здесь заключается в том, чтобы дать wpPayPal фиксированную высоту, достаточно большую, чтобы удерживать сокращенную версию PPMiniCart (40px будет делать - это даст магазину достаточно места, не нажимая imageWrapper слишком далеко вниз).

#wpPayPal {
    height:40px;
}

Затем дайте main (контейнер, который содержит wpPayPal) a z-index больше, чем imageWrapper, чтобы он переполнил его.

#main {
    z-index: 1;
}
#imageWrapper {
    z-index: 0;
}

Установив imageWrapper z-index на 100 видов перегрузок, я бы рекомендовал 0, как я сделал выше.

Вам также понадобится некоторый JavasScript для установки overflow: visible на wpPayPal после PPMiniCart, который будет расширяться и удалять его перед его списанием. К счастью Mini Cart JS предоставляет красивый управляемый событиями API, который позволяет настраивать обратные вызовы. Поскольку вы используете jQuery на своей веб-странице, воспользуйтесь этим:

PAYPAL.apps.MiniCart.render({
    parent: 'wpPayPal',
    events: {
        afterShow: function () {
            $("#wpPayPal").css("overflow", "visible");
        },
        onHide: function () {
            $("#wpPayPal").css("overflow", "");
        }
    }
});

Обратите внимание на тщательный выбор обратных вызовов afterShow и onHide, если вы попытаетесь сделать это по-другому (установка overflow: visible до PPMiniCart расширяет или удаляет его перед контрактами PPMiniCart) PPMiniCart будет "плавать" во время перехода.


Наконец, рабочая скрипка стоит тысячи слов.

Ответ 6

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

body {
  font-family: -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', Helvetica, Arial, sans-serif;
}

.container {
  max-width: 500px;
  /*border: 1px solid lime;*/
}

.card {
  display: flex;
  /*border: 1px solid red;*/
  overflow: hidden;
}

.box {
  position: relative;
  min-width: 100%;
  width: 100%;
  flex-basis: 100%;
  flex-grow: 1;
}

.box--image {
  z-index: 1;
  overflow: hidden;
}

.box--image.box--heightrestricted {
  max-height: 300px;
}

.box--text {
  z-index: 2;
  margin-left: -100%;
  display: flex;
  flex-direction: column;
  justify-content: flex-end;
  color: red;
}

.box--text h3 {
  margin: 0;
  padding: 1rem;
}
<div class="container">

  <button onclick="document.getElementById('imagebox').classList.toggle('box--heightrestricted')">toggle image max-height</button>
  <br>
  <br>

  <div class="card">

    <div id="imagebox" class="box box--image box--heightrestricted">
      <img src="https://placeimg.com/640/640/4" alt="" />
    </div>

    <div class="box box--text">
      <h3>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris in urna porta, maximus velit vitae, suscipit eros. Praesent eleifend est at nisi laoreet auctor. Nunc molestie fringilla magna et dictum. Nam ac massa nec erat consequat lacinia in in leo. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Maecenas sollicitudin nibh nisl, sed molestie lorem lobortis in. Nulla eget purus a risus scelerisque cursus. Praesent nisl dolor, varius eget faucibus sit amet, rutrum non lorem. Ut elementum sapien sed facilisis tempus. Morbi nec ipsum sed lacus vulputate sodales quis ut velit. Quisque id ante quis leo pharetra efficitur nec at mauris. Praesent dignissim hendrerit posuere. Vestibulum venenatis urna faucibus facilisis sodales. Suspendisse potenti. Proin a magna elit. Aenean vitae aliquam est, quis fringilla lectus.</h3>
    </div>

  </div>

</div>

Ответ 7

Также можно использовать flexbox для создания контейнера вкладок без абсолютной позиции:

/* Flex Overflow */
section {
  display: flex;
  width: 100%;
  overflow: hidden;
}

section article {
  flex: 100% 0 0;
  order: 0;
}

section article:target {
  order: -1;
}

/* UI */
section { background-color: #ecf0f1; }
section article { 
  display: flex;
  align-items: center;
  justify-content: center;
  color: #ecf0f1;
  font-size: 20px;
  min-height: 8em;
  visibility: hidden;
  opacity: 0;
  transition: visibility .5s ease, opacity .5s ease;
}
section article:first-child,
section article:target {
  visibility: visible;
  opacity: 1;
}
section article#zoneA { background-color: #2980b9; }
section article#zoneB { background-color: #16a085; }
section article#zoneC { background-color: #f39c12; }
section article#zoneD { background-color: #8e44ad; }
<ul>
  <li><a href="#zoneA">Zone A</a></li>
  <li><a href="#zoneB">Zone B</a></li>
  <li><a href="#zoneC">Zone C</a></li>
  <li><a href="#zoneD">Zone D</a></li>
</ul>

<section>
  <article id="zoneA">A</article>
  <article id="zoneB">B</article>
  <article id="zoneC">C</article>
  <article id="zoneD">D</article>
</section>