53

接下来是一个很长的解释,但这是有效传达我正在尝试解决的问题的唯一方法......

我(有点绝望,完全不成功)试图在不使用绝对定位的情况下覆盖 div。需求源于我通过 Javascript 在网站上放置的贝宝购物车。购物车的自然位置很难靠在网页的上边缘(不是它包含的 div,即#wpPayPal或此 div 的包装器,#main)。

该脚本的作者强烈建议不要自定义购物车的样式表,但我发现他编写的教程可以将购物车插入占位符 div,并提供有效容器的定位说明 - 我能够将购物车定位在网站顶部横幅下方部分。然而...

购物车的 HTML 表单和其中的 ul 元素在购物车的样式表中都有高度要求,这会将由容器 div #imageWrapper包装的页面的主要内容推到页面下方太远而无法接受。

我试图将#imageWrapper 置于#main 之上,并从该站点上的帖子中收集了几个想法,但没有成功。我已经尝试在#imageWrapper 上进行绝对定位,但这可以让页脚在下方浮动。#imageWrapper 的高度是可变的,因此我不想将页脚与高度保持在适当的位置,因为防止重叠的最小高度会将页脚向下推得太远,以适应网站的大部分内容。

我还尝试从购物车表单的 CSS 中拉出 position:relative,但购物车会立即浮回到网页顶部。边距、上边距等,不要对此进行补救。

然后我阅读了一篇关于使用 position:relative 和 z-index 覆盖 div 的文章。也试过这个,首先将 z-index: -1 放在#main(包装贝宝购物车的 div)上,但购物车消失了。也不确定它的去向,因为该站点的面包屑导航(也由#main 包裹)保持不变。

然后我将 main 的 z-index 设置为 0 并应用 position:relative to #imageWrapper with z-index:100。购物车重新出现,但仍将 #imageWrapper 按住。

非常欢迎提出建议。无论如何,我都不是一个界面人,只是一个知道如何使用谷歌的人,所以提前感谢你清楚地表达你的决议:)另外,仅供参考,目前我对购物车有最小高度要求form 设置为 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-->

ETC...

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

7 回答 7

45

您现在也可以使用网格来执行此操作。

.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>

于 2018-04-29T12:19:01.597 回答
31

Div background for a block with a dynamic height can be implemented using flexbox without an absolute positioning:

/* 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>

The solution is supported by about 99% of browsers.

于 2018-02-20T02:49:14.927 回答
18

简单的小提琴:只是 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>

http://jsfiddle.net/3WDf7/

于 2014-04-01T20:38:47.090 回答
8

知道了!!!:D

纯 CSS 解决方案非常简单。以下。

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

#main 用我上面所做的替换你在 css 中的任何内容。

所以删除以下内容:

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

说明: 这里的主要思想是浮动主要元素,使其具有一定的高度,因此它不会将所有东西推下。但是让它溢出可见。内容溢出不会影响main元素的兄弟姐妹

于 2013-08-04T02:21:45.773 回答
2

以前的答案都没有真正帮助您满足您的要求,即允许PPMiniCart在不向下推的情况下进行扩展和收缩imageWrapper

这里的技巧是给wpPayPal一个足够大的固定高度来容纳收缩版本的PPMiniCart(40px 就可以了——这会给购物车足够的空间,而不会imageWrapper 向下推太远)。

#wpPayPal {
    height:40px;
}

然后给main(容纳 的容器wpPayPal)一个z-index大于 的imageWrapper,使其溢出。

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

imageWrapperz-index 设置为 100 有点过头了,我会像上面那样推荐 0。

您还需要一些 JavaScript 在展开后设置overflow: visiblewpPayPalPPMiniCart它收缩之前将其删除。幸运的是Mini Cart JS公开了一个很好的事件驱动 API,它允许自定义回调。由于您在网页中使用 jQuery,让我们利用它:

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

请注意仔细选择afterShowonHide回调,如果你尝试做任何不同的事情(在扩展之前设置overflow: visible或在合同之前PPMiniCart删除它)将在过渡期间“浮动”。PPMiniCartPPMiniCart


最后,一个工作小提琴值一千字。

于 2013-08-03T23:26:24.943 回答
2

为您的问题找到了一个优雅的解决方案,无需绝对定位或使用 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>

于 2017-12-11T13:03:57.420 回答
1

也可以使用 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>

于 2018-01-30T20:37:21.393 回答