CSS下拉菜单导致后续内容无法撑满页面

问题描述

初学CSS,打算做一个下拉菜单。目标结果是:

clipboard.png

“下拉菜单”那个显示的就是一个下拉菜单。

但是如果在CSS中把下拉菜单周围的border去掉,内容部分就无法占满整行:

clipboard.png

问题出现的环境背景及自己尝试过哪些方法

怀疑和.topnav中设置的overflow: hidden;属性有关,但是把这个属性去掉,下拉菜单就被隐藏了

相关代码

<!DOCTYPE html>
<html>

<head>
    <title>layout.html</title>
    <style>
        * {
            box-sizing: border-box;
        }
        body {
            font-family: Arial, Helvetica, sans-serif;
            padding: 10px;
            background: #f1f1f1;
        }
        /* 头部标题 */
        .header {
            padding: 30px;
            text-align: center;
            background: white;
        }
        .header h1 {
            font-size: 50px;
        }
        /* 导航条 */
        .topnav {
            /* overflow: hidden; */
            background-color: #333;
        }
        .topnav a {
            float: left;
            display: block;
            color: #f2f2f2;
            text-align: center;
            padding: 14px 16px;
            text-decoration: none;
        }
        .topnav a:hover {
            background-color: #ddd;
            color: black;
        }
        /* - 下拉菜单 */
        .dropbtn {
            /* 同.topnav,a有一样的颜色 */
            background-color: #333;
            color: #f2f2f2;
            padding: 13px 16px;
            border: none;
            font-size: 16px;
        }
        .dropdown {
            position: relative;
            display: inline-block;
            border: 1px solid;  /*必须有这个,否则内容就不会分隔开,为什么?*/
        }
        .dropdown a {
            float: none;
        }
        .dropdown:hover .dropbtn {
            background-color: #ddd;
            color: black;
        }
        .dropdown-content {
            display: none;
            position: absolute;
            background-color: #333;
            min-width: 100px;
            box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2);
        }
        .dropdown:hover .dropdown-content {
            display: block;
        }

        /* 内容区域 */
        .leftcolumn {   
            float: left;
            width: 75%;
        }
        .rightcolumn {
            float: left;
            width: 25%;
            background-color: #f1f1f1;
            padding-left: 20px;
        }
        .fakeimg {
            background-color: #aaa;
            width: 100%;
            padding: 20px;
        }
        .card {
            background-color: white;
            padding: 20px;
            margin-top: 20px;
        }
        .row:after {
            content: "";
            display: table;
            clear: both;
        }
        /* 底部 */
        .footer {
            padding: 20px;
            text-align: center;
            background: #ddd;
            margin-top: 20px;
        }

        /* 响应式布局 - 屏幕尺寸小于 800px 时,两列布局改为上下布局 */
        /* @media screen and (max-width: 800px) {
            .leftcolumn, .rightcolumn {   
                width: 100%;
                padding: 0;
            }
        } */
        /* 响应式布局 -屏幕尺寸小于 400px 时,导航等布局改为上下布局 */
        /* @media screen and (max-width: 400px) {
            .topnav a {
                float: none;
                width: 100%;
            }
        } */
    </style>
</head>

<body>
    <div class="header">
        <h1>我的网页</h1>
        <p>重置浏览器大小查看效果。</p>
    </div>

    <div class="topnav">
        <a href="#">链接</a>
        <a href="#">链接</a>
        <a href="#">链接</a>
        <div class="dropdown">
            <button class="dropbtn">下拉菜单</button>
            <div class="dropdown-content">
                <a href="#">菜单1</a>
                <a href="#">菜单2</a>
                <a href="#">菜单3</a>
            </div>
        </div>
        <a href="#" style="float: right;">链接</a>
    </div>

    <div class="row">
        <div class="leftcolumn">
            <div class="card">
                <h2>文章标题</h2>
                <h5>2019 年 4 月 17日</h5>
                <div class="fakeimg" style="height:200px;">图片</div>
                <p>一些文本...</p>
                <p>菜鸟教程 - 学的不仅是技术,更是梦想!菜鸟教程 - 学的不仅是技术,更是梦想!菜鸟教程 - 学的不仅是技术,更是梦想!菜鸟教程 - 学的不仅是技术,更是梦想!</p>
            </div>
            <div class="card">
                <h2>文章标题</h2>
                <h5>2019 年 4 月 17日</h5>
                <div class="fakeimg" style="height:200px;">图片</div>
                <p>一些文本...</p>
                <p>菜鸟教程 - 学的不仅是技术,更是梦想!菜鸟教程 - 学的不仅是技术,更是梦想!菜鸟教程 - 学的不仅是技术,更是梦想!菜鸟教程 - 学的不仅是技术,更是梦想!</p>
            </div>
        </div>
        <div class="rightcolumn">
            <div class="card">
                <h2>关于我</h2>
                <div class="fakeimg" style="height:100px;">图片</div>
                <p>关于我的一些信息..</p>
            </div>
            <div class="card">
                <h3>热门文章</h3>
                <div class="fakeimg">
                    <p>图片</p>
                </div>
                <div class="fakeimg">
                    <p>图片</p>
                </div>
                <div class="fakeimg">
                    <p>图片</p>
                </div>
            </div>
            <div class="card">
                <h3>关注我</h3>
                <p>一些文本...</p>
            </div>
        </div>
    </div>

    <div class="footer">
        <h2>底部区域</h2>
    </div>

</body>

</html>

你期待的结果是什么?实际看到的错误信息又是什么?

希望能有一种方法可以去掉.dropdown中的border属性,同时让内容部分能够左右显示,不是上下显示。

阅读 2.9k
1 个回答

你有两个地方用到了浮动
-----topnav 这里

 .topnav a {
    float: left;
    display: block;
    color: #f2f2f2;
    text-align: center;
    padding: 14px 16px;
    text-decoration: none;
}

-----row 这里

.leftcolumn {   
    float: left;
    width: 75%;
}
.rightcolumn {
    float: left;
    width: 25%;
    background-color: #f1f1f1;
    padding-left: 20px;
}

你现在的代码只清除了row 的,topnav 没清除。所以有这个问题
然后推荐作法是单独声明一个清除浮动的类,然后那里需要往那里加,比如:

.clearfloat:after{
    content: "";
    display: table;
    clear: both;
}

最后推荐使用flex布局,现在兼容已经几乎没问题了更灵活

强烈推荐掌握BFC 理解布局的真谛

解决问题的代码:

<!DOCTYPE html>
<html>

<head>
    <title>layout.html</title>
    <style>
        .clearfloat:after{
            content: "";
            display: table;
            clear: both;
        }
        * {
            box-sizing: border-box;
        }
        body {
            font-family: Arial, Helvetica, sans-serif;
            padding: 10px;
            background: #f1f1f1;
        }
        /* 头部标题 */
        .header {
            padding: 30px;
            text-align: center;
            background: white;
        }
        .header h1 {
            font-size: 50px;
        }
        /* 导航条 */
        .topnav {
            position: relative;
            background-color: #333;
        }
        .topnav a {
            float: left;
            display: block;
            color: #f2f2f2;
            text-align: center;
            padding: 14px 16px;
            text-decoration: none;
        }
        .topnav a:hover {
            background-color: #ddd;
            color: black;
        }
        /* - 下拉菜单 */
        .dropbtn {
            /* 同.topnav,a有一样的颜色 */
            background-color: #333;
            color: #f2f2f2;
            padding: 13px 16px;
            border: none;
            font-size: 16px;
        }
        .dropdown {
            position: relative;
            display: inline-block;
            /* border: 1px solid;  /*必须有这个,否则内容就不会分隔开,为什么?*/ */
        }
        .dropdown:hover .dropbtn {
            background-color: #ddd;
            color: black;
        }
        .dropdown-content {
            display: none;
            position: absolute;
            background-color: #333;
            min-width: 100px;
            box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2);
        }
        .dropdown:hover .dropdown-content {
            display: block;
        }

        /* 内容区域 */
        .leftcolumn {   
            float: left;
            width: 75%;
        }
        .rightcolumn {
            float: left;
            width: 25%;
            background-color: #f1f1f1;
            padding-left: 20px;
        }
        .fakeimg {
            background-color: #aaa;
            width: 100%;
            padding: 20px;
        }
        .card {
            background-color: white;
            padding: 20px;
            margin-top: 20px;
        }
        /* 底部 */
        .footer {
            padding: 20px;
            text-align: center;
            background: #ddd;
            margin-top: 20px;
        }

        /* 响应式布局 - 屏幕尺寸小于 800px 时,两列布局改为上下布局 */
        /* @media screen and (max-width: 800px) {
            .leftcolumn, .rightcolumn {   
                width: 100%;
                padding: 0;
            }
        } */
        /* 响应式布局 -屏幕尺寸小于 400px 时,导航等布局改为上下布局 */
        /* @media screen and (max-width: 400px) {
            .topnav a {
                float: none;
                width: 100%;
            }
        } */
    </style>
</head>

<body>
    <div class="header">
        <h1>我的网页</h1>
        <p>重置浏览器大小查看效果。</p>
    </div>

    <div class="topnav clearfloat">
        <a href="#">链接</a>
        <a href="#">链接</a>
        <a href="#">链接</a>
        <div class="dropdown">
            <button class="dropbtn">下拉菜单</button>
            <div class="dropdown-content">
                <a href="#">菜单1</a>
                <a href="#">菜单2</a>
                <a href="#">菜单3</a>
            </div>
        </div>
        <a href="#" style="float: right;">链接</a>
    </div>

    <div class="row clearfloat">
        <div class="leftcolumn">
            <div class="card">
                <h2>文章标题</h2>
                <h5>2019 年 4 月 17日</h5>
                <div class="fakeimg" style="height:200px;">图片</div>
                <p>一些文本...</p>
                <p>菜鸟教程 - 学的不仅是技术,更是梦想!菜鸟教程 - 学的不仅是技术,更是梦想!菜鸟教程 - 学的不仅是技术,更是梦想!菜鸟教程 - 学的不仅是技术,更是梦想!</p>
            </div>
            <div class="card">
                <h2>文章标题</h2>
                <h5>2019 年 4 月 17日</h5>
                <div class="fakeimg" style="height:200px;">图片</div>
                <p>一些文本...</p>
                <p>菜鸟教程 - 学的不仅是技术,更是梦想!菜鸟教程 - 学的不仅是技术,更是梦想!菜鸟教程 - 学的不仅是技术,更是梦想!菜鸟教程 - 学的不仅是技术,更是梦想!</p>
            </div>
        </div>
        <div class="rightcolumn">
            <div class="card">
                <h2>关于我</h2>
                <div class="fakeimg" style="height:100px;">图片</div>
                <p>关于我的一些信息..</p>
            </div>
            <div class="card">
                <h3>热门文章</h3>
                <div class="fakeimg">
                    <p>图片</p>
                </div>
                <div class="fakeimg">
                    <p>图片</p>
                </div>
                <div class="fakeimg">
                    <p>图片</p>
                </div>
            </div>
            <div class="card">
                <h3>关注我</h3>
                <p>一些文本...</p>
            </div>
        </div>
    </div>

    <div class="footer">
        <h2>底部区域</h2>
    </div>

</body>

</html>
推荐问题