8项目通关前端/美团网布局项目03:完成页头

1,250 阅读4分钟

@效果预览

image.png

感觉身体里有一股真气在逐渐升腾,糟了!可能是心动的感觉?

image.png

@布局思路

宏观拆分

  • 给整个页头以197的高度 + 白色背景 + 怪异盒模型(即197包含内容高+上下内边距);
  • 用一个div1盛放logo + 搜索框,宽度1190居中,高度108,顶部预留30内边距,怪异盒模型;
  • 用一个div2盛放水平主菜单,宽度1190居中,高度51,怪异盒模型;
  • 以上完成大格局的铺排,接下来我们往上述两个div中填充具体内容;

image.png

搜索框布局

  • 用一个div11盛放input框 + 搜索按钮,宽度553,令其在div1中水平居中;
  • 在div11内部使用左浮动放置input + button,令其水平排列;

logo图片布局

  • 使用绝对定位使其位于div1最左侧;

image.png

水平菜单布局

  • 将一个宽740的ul放置在div2的正中央,高度随后让li将其自然撑开;
  • 此处我们刻意使用绝对定位+偏移实现ul在div2中的宽高居中;
  • 使用浮动实现ul中li的横排;

image.png


@HTML部分

根据上面的思路,我们设置页头的HTML如下

    <!-- 页头 -->
    <div class="header">

        <!-- 顶栏内容 -->
        <div class="topbar">...</div>

        <!-- 盛放logo + 搜索框 -->
        <div class="search-box">
            <!-- logo -->
            <img src="./imgs/logo.png" alt="logo">

            <!-- 搜索框 -->
            <div class="box">
                <input class="left" type="text" placeholder="搜索商家或地点">
                <button class="left">
                    <i class="iconfont icon-fangdajing"></i>
                </button>
            </div>
        </div>

        <!-- 盛放水平菜单 -->
        <div class="menu-box">
            <!-- 水平菜单 -->
            <ul>
                <li class="left">美团外卖</li>
                <li class="left">猫眼电影</li>
                <li class="left">美团酒店</li>
                <li class="left">民宿/公寓</li>
                <li class="left">商家入驻</li>
                <li class="left">美团公益</li>
                <li class="clearfix"></li>
            </ul>
        </div>
        
    </div>

@样式部分

宏观拆分

  • 准备盛放logo+搜索框的盒子(即上面布局思路中的div1
.search-box {

    /* 设计图中测量出盒子的宽高 */
    width: 1190px;
    height: 108px;

    // 顶部内边距
    padding-top: 30px;

    // 怪异盒模型(即1190*108实际包含了内容+内边距)
    box-sizing: border-box;

    // 在父盒子中的外边距 上下为0 左右居中
    margin: 0 auto;

    // 稍后logo图片子元素要相对于当前盒子做绝对定位
    position: relative;
}
  • 盛放水平菜单的盒子(即上面布局思路中的div2
/* 准备盛放水平菜单 */
.menu-box {

    /* 在设计图中测量出的盒子宽高 */
    width: 1190px;
    height: 51px;

    // 在父盒子中水平居中
    margin: 0 auto;

    // 所有子元素的字号大小
    font-size: 16px;

    // ul子元素稍后要相对当前盒子做绝对定位
    position: relative;
}

搜索框布局

  • 用一个div盛放input框 + 搜索按钮,宽度553,令其在父盒子中水平居中;
  • 在div内部使用左浮动放置input + button,令其水平排列;
/* 定义左右浮动类 */
.left {
    float: left;
}


/* 准备盛放logo + 搜索框 */
.search-box {
    ...

    /* 搜索框盒子 */
    .box {

        /* 效果图宽高 */
        width: 553px;
        height: 40px;

        // 在父元素中水平居中
        margin: 0 auto;

        /* 输入框 */
        input {
        
            /* 当前元素还有一个left类在控制其左浮动 */

            /* 效果图中测量宽高 */
            width: 473px;
            height: 100%;

            // 宽高中包含了内边距
            box-sizing: border-box;

            /* 设置边框 左上左下角有圆角 */
            border: 1px solid #f1f1f1;
            border-radius: 5px 0 0 5px;

            // 文本缩进
            text-indent: 15px;

            // 去掉聚焦时的默认高亮黑框
            outline: none;
        }

        /* 搜索按钮 */
        button {
            /* 当前元素还有一个left类在控制其左浮动 */

            /* 效果图中测量出宽高 */
            width: 80px;
            height: 100%;

            // 背景色
            background-color: #ffc300;

            // 取消默认边框
            border: none;

            // 右上 右下 5px圆角
            border-radius: 0 5px 5px 0;

            /* iconfont图标字体 */
            i {
                // 加粗
                font-weight: bold;

                // 图标字体的字号大小
                font-size: 18px;
            }
        }

    }
}

logo图片布局

  • 使用绝对定位使其脱离文档流并位于父盒子最左侧;
/* 准备盛放logo + 搜索框 */
.search-box {

    /* logo图片 */
    img {
        // 效果图宽度(高度会根据比例自适应)
        width: 126px;

        // 相对于父盒子做绝对定位(脱离了文档流,其它兄弟元素无视它的存在)
        position: absolute;

        // 距离父盒子左侧为0
        left: 0;
    }

}

水平菜单布局

  • 将一个宽740的ul放置在父盒子的正中央,高度随后让li将其自然撑开;
  • 此处我们刻意使用绝对定位+偏移实现ul在父盒子中的宽高居中;
  • 使用浮动实现ul中li的横排;
/* 准备盛放水平菜单 */
.menu-box {
    ...

    /* 水平菜单 */
    ul {

        /* 宽度测量而来 高度自然撑开 */
        width: 740px;

        // 在父盒子中水平居中
        margin: 0 auto;

        // 清除子元素浮动对后来元素的影响,使当前盒子成为一个BFC
        overflow: hidden;

        /* 使用绝对定位+偏移校正使当前盒子在父盒子中宽高居中 */
        // 绝对定位
        position: absolute;

        // 左上角对其父盒子的中心点
        top: 50%;
        left: 50%;

        // 向左+向上校正当前盒子宽高的一半
        transform: translate(-50%, -50%);

        /* 注意这些li都有一个left类在控制它们左浮动 */
        li {
            // 左右有margin
            margin: 0 20px;

            // 字体加粗
            font-weight: bold;
        }

        /* 被鼠标覆盖时鼠标变手型 + 文字变色 */
        li:hover {
            color: red;
            cursor: pointer;
        }

    }
}

源码在此 收刀下课!

7ba8e1d1b10fa3cdd3dbcbdbf05b58ba4ba35ddb7da9b2-oufjXM_fw658.gif

@知识链接