CSS Flexbox 居中对齐

Posted

技术标签:

【中文标题】CSS Flexbox 居中对齐【英文标题】:CSS Flexbox Align Center 【发布时间】:2020-07-27 10:10:13 【问题描述】:

我正在尝试将 flex 框中的内容对齐(垂直和水平)。在我的示例中,只要屏幕足够大,它就可以工作。

问题:

    当“.wrapper”类中的内容大于 100vh 时。内容将在顶部被剪切。 当我将“.wrapper”设置为“100vh”并添加“.header”div 时,该div 应该从“100vh”中排除,否则我将得到一个滚动条。

<!doctype html>
<html class="no-js" lang="en">
    <head>
        <meta charset="utf-8">
        <title>FlexBox</title>
        <meta name="infoription" content="">

        <style>
            * 
                margin: 0;
                padding: 0;
            

            body 
                background-color: #f8f9fa;
                font-family: Roboto,Helvetica,Arial,Lucida,sans-serif;
                color: #55595c;
            

            .wrapper 
                display: flex;
                justify-content: center;
                align-content: center;
                height: 100vh;
                flex-wrap: wrap;
            

            .content 
                background-color: #ffffff;
                max-height: 350px;
                max-width: 300px;
                min-height: 350px;
                min-width: 300px;
                margin: 10px;
                position: relative;
                border: 1px solid #dfdfdf;
                border-radius: 0.25rem;
                 

            .content:after     
                /* background: none repeat scroll 0 0 transparent; */
                bottom: 0;
                content: "";
                display: block;
                height: 10px;
                left: 50%;
                position: absolute;
                background: #55595c;
                transition: width 0.4s ease 0s, left 0.4s ease 0s;
                width: 0;
            

            .content:hover:after  
                width: 100%; 
                left: 0;
            

            .thumb 
                background-color: #55595c;
                height: 150px;
                border-top-left-radius: 0.25rem;
                border-top-right-radius: 0.25rem;
                color: #ffffff;
                display: flex;
                justify-content: center;
                align-items: center;
            

            .info 
                padding: 10px;
                text-align: justify;
            

            /* Responsive layout - screen is bigger than 1000px wide */
            @media (min-width: 1000px) 
                .bodysize 
                    width: 1000px;
                    margin: auto;
                
        </style>

    </head>
    <body>
        <div class="bodysize">
        <div class="header">
            <h1>Example Page</h1>
        </div>
        <div class="wrapper">
            <div class="content">
                <div class="thumb">
                    <h3>Thumbnail</h3>
                </div>
                <div class="info">
                    <h3>[1]</h3>
                    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean turpis felis, dapibus ac tellus at, imperdiet consectetur ante. Mauris vulputate arcu nibh, et convallis felis mattis id.</p>
                </div>
            </div>
            <div class="content">
                <div class="thumb">
                    <h3>Thumbnail</h3>
                </div>
                <div class="info">
                    <h3>[2]</h3>
                    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean turpis felis, dapibus ac tellus at, imperdiet consectetur ante. Mauris vulputate arcu nibh, et convallis felis mattis id.</p>
                </div>
            </div>
           
            <div class="content">
                <div class="thumb">
                    <h3>Thumbnail</h3>
                </div>
                <div class="info">
                    <h3>[3]</h3>
                    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean turpis felis, dapibus ac tellus at, imperdiet consectetur ante. Mauris vulputate arcu nibh, et convallis felis mattis id.</p>
                </div>
            </div>
            
            <div class="content">
                <div class="thumb">
                    <h3>Thumbnail</h3>
                </div>
                <div class="info">
                    <h3>[4]</h3>
                    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean turpis felis, dapibus ac tellus at, imperdiet consectetur ante. Mauris vulputate arcu nibh, et convallis felis mattis id.</p>
                </div>
            </div>
            
            <div class="content">
                <div class="thumb">
                    <h3>Thumbnail</h3>
                </div>
                <div class="info">
                    <h3>[5]</h3>
                    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean turpis felis, dapibus ac tellus at, imperdiet consectetur ante. Mauris vulputate arcu nibh, et convallis felis mattis id.</p>
                </div>
            </div>
            
            <div class="content">
                <div class="thumb">
                    <h3>Thumbnail</h3>
                </div>
                <div class="info">
                    <h3>[6]</h3>
                    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean turpis felis, dapibus ac tellus at, imperdiet consectetur ante. Mauris vulputate arcu nibh, et convallis felis mattis id.</p>
                </div>
            </div>
            
            <div class="content">
                <div class="thumb">
                    <h3>Thumbnail</h3>
                </div>
                <div class="info">
                    <h3>[7]</h3>
                    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean turpis felis, dapibus ac tellus at, imperdiet consectetur ante. Mauris vulputate arcu nibh, et convallis felis mattis id.</p>
                </div>
            </div>
            
            <div class="content">
                <div class="thumb">
                    <h3>Thumbnail</h3>
                </div>
                <div class="info">
                    <h3>[8]</h3>
                    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean turpis felis, dapibus ac tellus at, imperdiet consectetur ante. Mauris vulputate arcu nibh, et convallis felis mattis id.</p>
                </div>
            </div>
            
            <div class="content">
                <div class="thumb">
                    <h3>Thumbnail</h3>
                </div>
                <div class="info">
                    <h3>[9]</h3>
                    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean turpis felis, dapibus ac tellus at, imperdiet consectetur ante. Mauris vulputate arcu nibh, et convallis felis mattis id.</p>
                </div>
            </div>

        </div>
    </div>
    </body>
 </html>

示例图片:

Problem 1 - 滚动条因为“高度:100vh;”。

Problem 2 - 内容浮出浏览器顶部。也是因为“身高:100vh;”。

问题:

1) 如何设置动态高度,以便包装器始终填充剩余的可用空间? 2)如果内容小于包装高度,则应垂直居中,但如果内容较大,则不需要居中。

有什么办法可以解决这个问题吗?

>>> 解决方案

我添加了 .bodysize,从包装器中删除了高度,并在包装​​器中添加了“flex-grow: 1”。 .bodysize 显示:弹性;弹性流:列;高度:100vh;

【问题讨论】:

您应该考虑使用媒体查询。 w3schools.com/css/css_rwd_mediaqueries.asp height: 100vh; 应该移动到.bodysize,如果您希望所有内容在没有滚动条的情况下可见,您应该考虑调整字体大小以及您可能拥有的所有填充和边距 @ZohirSalak:当我将 100vh 移动到 .bodysize 时,内容不再垂直居中。就像我尝试“朱莉安娜·加西亚”的想法一样。 @ThetAung:这也是我的想法。我',我已经使用了一个媒体查询。是否有可能进行媒体查询,上面写着“如果身体大于 100vh...”。这可能吗? 是的,您需要使用 flex 或其他方法将它们居中 .bodysize height: 100vh;display: flex;justify-content: center;align-content: center;flex-direction:column; 【参考方案1】:

尝试设置高度:auto;最大高度:100vh;在你的包装上。

否则,即使内部元素很少,您的包装器也会始终保持 100% 的高度。当内容超过 100vh 时应该会出现滚动条。

.wrapper 
    display: flex;
    justify-content: center;
    align-content: center;
    height: auto;
    max-height: 100vh;
    flex-wrap: wrap;

【讨论】:

当内容大于屏幕高度(100vh)时,它可以工作并且内容不会浮出顶部屏幕(它不会被切断)。但是当内容小于屏幕高度时,它不会垂直居中(因为高度设置为“自动”。

以上是关于CSS Flexbox 居中对齐的主要内容,如果未能解决你的问题,请参考以下文章

Flexbox 列对齐项目的宽度相同但没有包装器居中(仅限 css)

当其他元素居中对齐时,使用 Flexbox 将页脚与页面底部对齐

将一个项目居中对齐,其他项目与 Flexbox 对齐 [重复]

CSS Flexbox - 相对于父元素居中所有具有全高的子元素[重复]

如何使用 Flexbox 使一个弹性项目居中对齐并右对齐另一个

如何居中对齐 flexbox 容器? [复制]