【问题标题】:CSS Vertically Center in dynamically sized parent.CSS 在动态大小的父级中垂直居中。
【发布时间】:2018-02-15 23:46:31
【问题描述】:

这是另一个关于在 div 中垂直居中的问题,但我尝试了许多其他答案中讨论的解决方案,但均无济于事。

Here's an example of the code to play with: https://codesandbox.io/s/z2qzxwk99x

箭头图标在视口中垂直居中,而不是查看器包装器 div。因此,如果您使页面非常窄,它会完全脱离图像,而不是保持垂直居中。

.viewer-wrapper {
    background-color: #1b8dbb;
    position: relative;
}

.arrow-wrap {
    position: absolute;
    max-height: 100%;
    line-height: 95vh;
    background-color: #4cae4c;
    margin: auto;
    opacity: .9;
    left: 0px
}

.arrow-icon {
    background-color: orangered;
}

.comic-page {
      object-fit: contain;
      max-height: 95vh;
      width: 100%;
}

<div className="viewer-wrapper"> 
    <div className="arrow-wrap">
      <LeftArrow className="arrow-icon" size={75} />
    </div>

    <img className="comic-page"
        src="http://assets-production.rovio.com/s3fs-public/hatchlings_0.jpg"
      about="This is an image"
    />
  </div>

【问题讨论】:

  • 问题似乎根源于箭头图标的 position:absolute 一直到视口来计算它的相对位置,而不是它最近的定位祖先。我可以通过将其拉到 .arrow-wrap div 之外来解决此问题,并将其直接父级设为 .viewer-wrapper。任何想法为什么它没有正确找到它的相对位置?

标签: css reactjs


【解决方案1】:

这里的魔力是Flexbox(还有 Grids,但 Flexbox 有更好的浏览器支持)。保持相同的 HTML 布局,你可以像这样使用 somerthig:

.viewer-wrapper {
    background-color: #1b8dbb;
    display: flex;
    align-items: flex-start;
}

.arrow-wrap {
    background-color: #4cae4c;
    margin: auto;
    opacity: .9;
}

.arrow-icon {
    background-color: orangered;
}

.comic-page {
      object-fit:contain;
      min-height: 100%;
      max-width: 100%;
}

【讨论】:

    【解决方案2】:

    根据您对 IE 的支持程度,有不同的方式来完成垂直对齐。

    如果你不需要支持IE,你可以使用flex显示属性:

    .viewer-wrapper{
        display: flex;
        align-items: center;
    }
    

    或者,继续您正在尝试做的事情。您缺少的是 top: 属性。由于您已经正确地创建了父元素 position: relative,设置 top: 50% 会将您的箭头设置为 beginviewer-wrapper 元素的中间位置。从这里你需要设置一个负边距来校正箭头的高度。由于看起来您指定了 75(px?) 的大小,因此您可以这样实现:

    .arrow-wrap {
        position: absolute;
        background-color: #4cae4c;
        margin-top: -37.5px;
        left: 0px;
    }
    

    您不应该设置任何其他边距。

    howtocenterincss.com 是一个很好的资源,我用来帮助回答你的问题。

    【讨论】:

    • 我刚刚尝试了这两种解决方案,它们都遇到了我遇到的相同问题。它们似乎在视口中垂直居中,而不是父 div。
    • 一旦我将 .arrow-icon 拉到 .arrow-wrap 之外并使其成为 .viewer-wrapper 的子级后,它就可以工作了。问题似乎源于箭头图标的 position:absolute 一直到视口来计算它的相对位置,而不是它最近的定位祖先。我可以通过将其拉到 .arrow-wrap div 之外来解决此问题,并将其直接父级设为 .viewer-wrapper。任何想法为什么它不能正确找到它的相对位置?
    • react 元素可能无法很好地与它的 div 容器配合使用。可能发生的情况是 .arrow-wrap div 实际上定位正确,但 react 元素在做自己的事情。将样式直接应用于元素可能会成功。
    • jvial,我认为可能是这样,所以我将 react 箭头图标换成了一个简单的 .jpg 图像,甚至将整个东西拉成纯 html 和 CSS,没有任何反应或 javascript。同样的问题。关于在 div 内嵌套,或使用 .comic-page 上的“object-fit: contains”来定义 .viewer-wrapper 的大小的事情正在破坏继承。
    猜你喜欢
    • 2016-05-02
    • 1970-01-01
    • 1970-01-01
    • 2013-07-31
    • 2014-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-29
    相关资源
    最近更新 更多