正在进入ing...

CSS使用栅格布局实现页面大小自适应

发布时间:2020-09-08 浏览量: 2957 文章分类: 前端相关

最近在学习css的页面自适应,也就是不同大小的页面下,页面的样式会随之改变,这块在之前其实主要是用了bootstrap的栅格布局。通过自己的学习,现在对这块的认知就更加清楚了。首先自己实现了一个给予flex的自适应布局的功能。然后基于这个功能在完善一下网页的头部导航。相信下面这种样式,很多人都看见过。在不同的尺寸下可以实现不同的展示。

网页自适应展示

下面我就记录一下自己的实现过程(这里就不记录关于grid的实现了) 关于响应式的尺寸问题,借鉴了网上的一些说明,我的尺寸样式如下

宽度大小单位 判断逻辑
宽度小于576px 超小屏(xs)
宽度大于等于576px 小屏(sm)
宽度大于等于768px 中屏(md)
宽度大于等于992px 大屏(lg)
宽度大于等于1200px 超大屏(xl)

基于上面的尺寸 首先定义的是网页的header区域,我预设的高度是120px

    <header class="header-container">
        <div class="container">
            <div class="row">
                ....
            </div>
        </div>
    </header>

在头部区域我需要定义3个区域,一个展示logo,一个展示文字菜单、一个展示最小化的三条竖线菜单。

这块比较简单,主要就是a标签嵌套h1即可代码如下

<div class="header-logo-container col-9 col-md-12 col-lg-3">
    <a href="./index.html" class="header-logo">
        <h1>佩恩的博客</h1>
    </a>
</div>

注意在class里面的几个参数

  • header-logo-container 是我自己定义的,方便我增加修改样式
  • col-9 是在最小的屏幕尺寸(xs)下 占据九个栅格。
  • col-md-12 是在中屏尺寸(md)下占据12个栅格。
  • col-lg-3 是在大屏及以上占据3个栅格

按钮菜单

按钮菜单我的预期是只有在页面缩小到小屏寸才会出现,也就是在中屏及以上尺寸都是隐藏状态的

<div class="nav-btn-container col-3 d-md-none">
    <button type="button" class="nav-btn" id="nav-btn">
        <span class="nav-btn-bar"></span>
        <span class="nav-btn-bar"></span>
        <span class="nav-btn-bar"></span>
    </button>
</div>
  • nav-btn-container 是我自己定义的,方便我增加修改样式
  • col-3 是页面在小屏尺寸下占据3个栅格(上面的logo是在小屏尺寸占据9个)
  • col-md-none 这个区域在中屏及以上尺寸隐藏,也就是只有小屏和超小屏才显示

文字菜单

这块区域是只有在中屏及以上才进行展示

<div class="header-nav-container col-md-12 col-lg-9 d-none d-md-block">
    <ul class="nav-item">
        <li class="nav-class"><a href="./index.html">首页</a></li>
        <li class="nav-class"><a href="#">我的博客</a></li>
        <li class="nav-class"><a href="#">文章</a></li>
        <li class="nav-class"><a href="#">推荐</a></li>
        <li class="nav-class"><a href="#">关于我</a></li>
        <li class="nav-class"><a href="#">留言</a></li>
    </ul>
</div>
  • header-nav-container 是我自己定义的,方便我增加修改样式
  • col-md-12 的意思是中屏占据一整行(一行最多12个栅格)
  • col-lg-9 大屏及以上占据最多9个栅格(上面的logo是占据3个)
  • d-none 小屏&超小屏下隐藏这个区域
  • d-md-block 在中屏及以上显示

如果上面的都看明白了,那其实已经完成。 下面上完整的代码

    <header class="header-container">
        <div class="container">
            <div class="row">
                <div class="header-logo-container col-9 col-md-12 col-lg-3">
                    <a href="./index.html" class="header-logo"><h1>佩恩的博客</h1></a>
                </div>

                <div class="nav-btn-container col-3 d-md-none">
                    <button type="button" class="btn-toggle" id="btn-toggle">
                        <span class="btn-toggle-bar"></span>
                        <span class="btn-toggle-bar"></span>
                        <span class="btn-toggle-bar"></span>
                    </button>
                </div>

                <div class="header-nav-container col-md-12 col-lg-9 d-none d-md-block">
                    <ul class="nav-item">
                        <li class="nav-class"><a href="./index.html">首页</a></li>
                        <li class="nav-class"><a href="#">我的博客</a></li>
                        <li class="nav-class"><a href="#">文章</a></li>
                        <li class="nav-class"><a href="#">推荐</a></li>
                        <li class="nav-class"><a href="#">关于我</a></li>
                        <li class="nav-class"><a href="#">留言</a></li>
                    </ul>
                </div>
            </div>
        </div>
    </header>

CSS 样式如下

.header-container {
  height: 120px;
  background-color: #fff;
  width: 100%;
  display: flex;
  align-items: center;
  justify-content: center;
}
.header-logo-container,
.nav-btn-container,
.header-nav-container
{
  display: flex;
  align-items: center;
  justify-content: center;
}
.header-logo-container a{
  padding: 0 20px;
}
.header-logo-container h1{
  font-size: 1.5rem;
  font-weight: bold;
  color: #ca0100;
}
.header-nav-container , .nav-item{
  display: flex;
  align-items: center;
  justify-content: center;
}
.nav-class{
  margin-left: 10px;
}
.nav-class:first-child{
  margin-left: 0;
}
.nav-class a{
  padding: 0 20px;
  color: #000;
  font-size: 1rem;
}

关于小屏下面的三个btn-toggle-bar的实现,我是用的CSS3的动画来实现的,毕竟能用CSS实现的,就尽量少用图片实现。实现也比较简单。代码如下

.btn-toggle{
  padding: 10px;
  background-color: transparent;
  border: none;
  border-radius: 4px;
  cursor: pointer;
}
.btn-toggle:hover{
  background-color: #f9f9f9;
}
.btn-toggle-bar{
  display: block;
  width: 24px;
  height: 4px;
  background-color: #363636;
  border-radius: 2px;
}
.btn-toggle-bar + .btn-toggle-bar{
  margin-top: 4px;
}
.btn-toggle:hover .btn-toggle-bar{
  background-color: #1428a0;
}

以上代码就实现了整体的网页导航条自适应。