为何需设置div高度100%以在100vh背景图上实现Flexbox居中?
问题:为何Flexbox居中需设置子元素高度为100%?
我在学习的课程里有个固定定位的顶部导航栏,背景容器(.hero)设置了100vh高度,需要把带文本的.content div在背景上居中。用Flexbox时看起来近乎居中,但要让它真正处于背景中心,必须给这个div设置height:100%。我对Flexbox和视口高度有一定了解,但不清楚为什么设置div高度为100%是实现居中的必要条件。
复现代码
CSS代码
* { box-sizing: border-box; margin: 0; padding: 0; } body { font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif; background: #fff; color: #333; line-height: 1.5; } ul { list-style: none; } a { color: #333; text-decoration: none; } h1, h2 { font-weight: 300; line-height: 1.5; } p { margin: 10px 0; } img { width: 100%; } /* 导航栏 */ .navbar { display: flex; align-items: center; justify-content: space-between; background-color: #333; color: #fff; width: 100%; height: 70px; position: fixed; top: 0; padding: 0 30px; } .navbar a { color: #fff; padding: 10px 20px; margin: 0 5px; } .navbar a:hover { border-bottom: 1px solid #28a745; } .navbar ul { display: flex; } /* 头部容器 */ .hero { background: url("https://i.sstatic.net/Hmhpy.jpg") no-repeat center center/cover; height: 100vh; position: relative; color: #fff; } .hero .content { display: flex; flex-direction: column; align-items: center; justify-content: center; text-align: center; height: 100%; }
HTML代码
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Welcome to EdgeLedger</title> <link rel="stylesheet" href="/css/utilities.css"> <link rel="stylesheet" href="/css/style.css"> <script src="https://kit.fontawesome.com/6eab1538de.js" crossorigin="anonymous"></script> </head> <body id="home"> <header class="hero"> <div id="navbar" class="navbar"> <h1 class="logo"> <span class="text-primary"><i class="fas fa-book-open"></i>Edge</span>Ledger </h1> <nav> <ul> <li><a href="#home">Home</a></li> <li><a href="#about">About</a></li> <li><a href="#cases">Cases</a></li> <li><a href="#blog">Blog</a></li> <li><a href="#contact">Contact</a></li> </ul> </nav> </div> <div class="content"> <h1>The sky is the limit</h1> <p>We provide world class financial assistance</p> <a href="#about" class="btn">Read More</a> </div> </header> </body> </html>
原因解释
核心在于Flexbox的居中是相对于当前容器的可用空间:
- 父容器
.hero设置了height:100vh,意味着它的高度是整个视口的高度。 - 默认情况下,子元素
.content的高度是内容高度——也就是刚好包裹里面的标题、段落和按钮的高度,远小于.hero的高度。 - 这时候给
.content加display:flex和justify-content:center,只是把内容在.content自身的小高度范围内垂直居中,看起来就不是整个.hero容器的中心。 - 当给
.content设置height:100%后,它的高度会继承父容器.hero的100vh高度,此时Flexbox的垂直居中就会基于整个视口高度的空间来计算,自然就处于背景的真正中心。
另外注意:固定定位的导航栏不会影响这个逻辑,因为fixed定位会让元素脱离文档流,.hero的100vh高度依然是占满整个视口的,.content的100%高度也会对应这个完整的视口高度。
内容的提问来源于stack exchange,提问作者Freebird
相关产品推荐
相关产品推荐

