CSS中的栅格布局

CSS中的栅格布局

在写前端项目的时候,我之前一直习惯使用flex布局,flex布局写起来比较随心,几乎可以实现任意形式的页面布局。不过自从B占看到某位大佬的grid布局后,发现布局居然还可以这么玩,正好自己在写一个vue3的项目,需要写几个大屏展示方案,用栅格布局实现了一下,发现真香

看一下最后的实现效果,真实效果比这个好很多,因为有数据和地图,但这里主要记录怎么使用栅格布局,所以我只将精髓

image-20231027171054551

页面分上中下三部分,整体使用flex布局,排列方向是column。上面是标题,中间是数据看板,下面是展示的核心内容

上面也是用的flex布局,中间和下面都是grid布局

先看下完整代码

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>网格布局</title>
  <style>
    .main-screen {
      display: flex;
      flex-direction: column;
      align-items: center;
      justify-content: center;
    }
    .header {
      width: 100%;
      height: 80px;
      background-color: #030829;
      display: flex;
      align-items: center;
      justify-content: space-between;
    }
    .time {
      color: #fff;
      margin-left: 20px;
    }

    .tip {
      color: #fff;
      margin-right: 20px;
      display: flex;
      justify-content: center;
      align-items: center;
    }
    .header-title {
      width: 30%;
      text-align: center;
      color: #FFFFff;
      background-size: 100% 100%;
      height: 80px;
      font-family: "微软雅黑" !important;
    }
    h2 {
      margin-top: 16px !important;
      font-size: 28px !important;
    }
    .content {
      width: 100%;
      background-color: #081832;
      padding-top: 10px;
      padding-bottom: 5px;
      height: 950px;
      display: flex;
      flex-direction: column;
    }
    .numeric {
      padding: 10px;
      display: grid;
      grid-template-columns: 1fr 1fr 1fr;
      gap: 30px;
      // background-color: #034c6a;
      height: 15%;
      width: 100%;
    }
    .chart {
      height: 85%;
      width: 100%;
      // border: 1px solid #fff;
      display: grid;
      grid-template-columns: repeat(10, 1fr);
      gap: 10px;
      padding: 10px;
    }
    .box {
      box-shadow: -10px 0px 15px #034c6a inset,
      0px -10px 15px #034c6a inset,
      10px 0px 15px #034c6a inset,
      0px 10px 15px #034c6a inset;
      border: 1px solid #034c6a;
      box-sizing: border-box;
      margin-top: 10px;
      position: relative;
      display: flex;
      justify-content: center;
      align-items: center;
      flex-direction: column;
    }
    .title {
      background-color: #034c6a;
      border-radius: 18px;
      position: absolute;
      height: 35px;
      width: 60%;
      top: -15px;
      color: #ffffff;
      font-weight: bold;
      font-size: 16px;
      left: 20%;
      line-height: 35px;
      text-align: center;
    }
    .top-left {
      grid-row: 1/4;
      grid-column: 1/3;
    }

    .bottom-left {
      grid-row: 4/7;
      grid-column: 1/3;
    }

    .middle-map-left {
      grid-row: 1/5;
      grid-column: 3/6;
    }

    .middle-map-right {
      grid-row: 1/5;
      grid-column: 6/9;
    }

    .middle-bottom-left {
      grid-row: 5/7;
      grid-column: 3/5;
    }

    .middle-bottom-bottom {
      grid-row: 5/7;
      grid-column: 5/7;
    }

    .middle-bottom-right {
      grid-row: 5/7;
      grid-column: 7/9;
    }

    .right-top {
      grid-row: 1/4;
      grid-column: 9/11;
    }

    .right-bottom {
      grid-row: 4/7;
      grid-column: 9/11;
    }

    .numeric-box {
      background-color: #034c6a;
      border-radius: 8px;
      height: 100%;
      display: flex;
      justify-content: space-around;
      align-items: center;
    }

  </style>
</head>
<body style="margin: 0; padding: 0;">
  <div class="main-screen">
    <div class="header">
      <div class="time">2023-10-27 16:59:59</div>
      <div class="header-title">
        <h2><strong>无锡市今日数据看板</strong></h2>
      </div>
      <div class="tip">
        <span>提示:数据每小时更新</span>
      </div>
    </div>
    <div class="content">
      <div class="numeric">
        <div class="numeric-box"></div>
        <div class="numeric-box"></div>
        <div class="numeric-box"></div>
      </div>

      <div class="chart">
        <div class="box top-left">
          <div class="title">江阴市</div>

        </div>
        <div class="box bottom-left">
          <div class="title">宜兴市</div>

        </div>
        <div class="box middle-map-left">
          <div class="title">今日地图</div>

        </div>
        <div class="box middle-map-right">
          <div class="title">当前地图</div>

        </div>
        <div class="box middle-bottom-left">
          <div class="title">滨湖区</div>

        </div>
        <div class="box middle-bottom-bottom">
          <div class="title">新吴区</div>

        </div>
        <div class="box middle-bottom-right">
          <div class="title">梁溪区</div>

        </div>
        <div class="box right-top">
          <div class="title">锡山区</div>

        </div>
        <div class="box right-bottom">
          <div class="title">惠山区</div>

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

先看中间的三个数据展示面板的网格布局,样式代码如下

    .numeric {
      padding: 10px;
      display: grid;
      grid-template-columns: 1fr 1fr 1fr;
      gap: 30px;
      // background-color: #034c6a;
      height: 15%;
      width: 100%;
    }
    .numeric-box {
      background-color: #034c6a;
      border-radius: 8px;
      height: 100%;
      display: flex;
      justify-content: space-around;
      align-items: center;
    }

主要看上面的numeric,这是一个很基础的网格布局,核心就是设置grid-template-columns,因为有3列,所以写三个1fr就行了,然后就是样式的美化,gap是样式之间的间隔

下面来看比较复杂的grid布局

下面那部分内容,我要展示7个小的方块,2个大一点的方块,大的方块要放在中间,为了布局好看点,我进行了如下的设计:

image-20231030081645560

每个方块,都有一个box属性,就是设置背景颜色和阴影的。其他的属性直接在图上标注了。

那现在的重点就是如何用栅格布局来设计这种响应式的大屏页面了,根据代码:

首先看容器的样式

    .chart {
      height: 85%;
      width: 100%;
      // border: 1px solid #fff;
      display: grid;
      grid-template-columns: repeat(10, 1fr);
      gap: 10px;
      padding: 10px;
    }

关键的代码就是设置了grid-template-columns: repeat(10, 1fr);意思是横向上重复10列,也就是有10个网格,这个10如何而来,自然是根据上面的设计,从B到K正好10格。

接下来看每个方块是怎么设置的

 	.top-left {
      grid-row: 1/4;
      grid-column: 1/3;
    }

    .bottom-left {
      grid-row: 4/7;
      grid-column: 1/3;
    }

    .middle-map-left {
      grid-row: 1/5;
      grid-column: 3/6;
    }

    .middle-map-right {
      grid-row: 1/5;
      grid-column: 6/9;
    }

    .middle-bottom-left {
      grid-row: 5/7;
      grid-column: 3/5;
    }

    .middle-bottom-bottom {
      grid-row: 5/7;
      grid-column: 5/7;
    }

    .middle-bottom-right {
      grid-row: 5/7;
      grid-column: 7/9;
    }

    .right-top {
      grid-row: 1/4;
      grid-column: 9/11;
    }

    .right-bottom {
      grid-row: 4/7;
      grid-column: 9/11;
    }

其实都是设置了2个属性

  • grid-row,这个属性表示的意思是,元素的行占位,比如1/4,其中1表达的意思是从第1行开始,4表达的意思是占3行,1+3=4,再比如5/7,5表示从第5行开始,占2行,5+2=7
  • grid-column和grid-row一样

所以关键就是设计好上面那个页面,然后根据这两个参数,就能完成一个响应式的grid部局了,比自己手写flex布局效果要好得多

还有一些细节,就是网格之间还会有间距,可以用gap来设置

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/110567.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

github搜索技巧探索

毕设涉及到推荐系统&#xff0c;那么就用搜索推荐系统相关资料来探索一下GitHub的搜搜技巧 文章目录 1. 基础搜索2. 限定在特定仓库搜索3. 按照语言搜索4. 按照star数量搜索5. 搜索特定用户/组织的仓库6. 查找特定文件或路径7. 按时间搜索8. 搜索不包含某个词的仓库9. 搜索特定…

pytorch 入门 (五)案例三:乳腺癌识别-VGG16实现

本文为&#x1f517;小白入门Pytorch内部限免文章 &#x1f368; 本文为&#x1f517;小白入门Pytorch中的学习记录博客&#x1f366; 参考文章&#xff1a;【小白入门Pytorch】乳腺癌识别&#x1f356; 原作者&#xff1a;K同学啊 在本案例中&#xff0c;我将带大家探索一下深…

用大白话聊聊SpringBoot的自动配置原理(面试题详解)

首先&#xff0c;SpringBoot的自动配置不等于自动装配&#xff01; 自动配置是Auto-Configuration&#xff0c;针对的是SpringBoot中的配置类&#xff0c; 而自动装配是Autowire&#xff0c;针对的是Spring中的依赖注入。 进入主题&#xff1a; 自动配置简单来说就是自动去把…

Cesium 问题:在 cesium 中加载 geojson 文件,绘制带边框的多边形并设置贴地后,边框不展示,该怎么配置呢?

文章目录 问题分析问题 在 cesium 中加载 geojson 文件,绘制带边框的多边形并设置贴地后,边框不展示,该怎么配置呢? 代码如下: var promise = Cesium.GeoJsonDataSource.load(data/obstacle/ExOceanData/result.geojson

自动化测试的一些问题合集

问题1、 ipykernel_launcher.py: error: unrecognized arguments: usage: ipykernel_launcher.py [-h] [--id ID] [--test TEST] [--env ENV] ipykernel_launcher.py: error: unrecognized arguments: --ip127.0.0.1 --stdin9003 --control9001 --hb9000 --Session.signature_…

SAML- 安全断言标记语言

一、概念 安全断言标记语言&#xff08;SAML&#xff09;是一种开放标准&#xff0c;用于在各方之间&#xff08;特别是身份提供商和服务提供商之间&#xff09;交换身份验证和授权数据。SAML 是一种基于XML的安全断言标记语言&#xff08;服务提供商用来做出访问控制决策的语句…

python使用ffmpeg来制作音频格式转换工具(优化版)

简介:一个使用python加上ffmpeg模块来进行音频格式转换的工具。 日志: 20231030:第一版,设置了简单的UI布局和配色,实现音频转为Mp3、AAC、wav、flac四种格式。可解析音频并显示信息,可设置转换后的保存路径 UI界面: 编程平台:visual studio code 编程语言:python 3…

基于 Center 的 3D 目标检测和跟踪

论文地址&#xff1a;https://arxiv.org/abs/2006.11275 论文代码&#xff1a;https://github.com/tianweiy/CenterPoint 3D 目标通常表示为点云中的 3D Boxes。 CenterPoint 在第一阶段&#xff0c;使用关键点检测器检测对象的中心&#xff0c;然后回归到其他属性&#xff0…

AcWing 第127场周赛 构造矩阵

构造题目&#xff0c;考虑去除掉最后一行最后一列先进行考虑&#xff0c;假设除了最后一行和最后一列都已经排好了&#xff08;你可以随便排&#xff09;&#xff0c;那么分析知最后一个数字由限制以外其他都已经确定了&#xff0c;无解的情况是k为-1 并且n&#xff0c;m的奇偶…

C++进阶语法——STL 标准模板库(上)(Standard Template Library)【学习笔记(六)】

文章目录 STL 标准模板库1、 STL简介2、STL容器的类别3、STL迭代器的类别4、STL算法的类别5、泛型编程&#xff08;generic programming&#xff09;6、C模板&#xff08;template&#xff09;6.1 函数模板&#xff08;function template&#xff09;6.2 类模板&#xff08;cla…

MAMP Pro 6.8.1

MAMP Pro是一款MacPHP/MySQL开发环境软件&#xff0c;可以将电脑变成一个完整的Web开发环境。无论个人开发者、网站管理员还是团队协作&#xff0c;MAMP Pro都提供了强大的工具和便捷的管理方式&#xff0c;能够更加高效地构建和测试网站。 MAMP Pro的基本功能包括集成AMP环境&…

【网络协议】聊聊套接字socket

网络编程我们知道是通过socket进行编程的&#xff0c;其实socket也是基于TCP和UDP协议进行编程的。但是在socket层面是感知不到下层的&#xff0c;所以在设置参数的时候&#xff0c;其实是端到端协议智商的网络层和传输层。TCP是数据流所以设置为SOCK_STREAM&#xff0c;而UDP是…

实现基于 Azure DevOps 的数据库 CI/CD 最佳实践

数据库变更一直是整个应用发布过程中效率最低、流程最复杂、风险最高的环节&#xff0c;也是 DevOps 流程中最难以攻克的阵地。那我们是否能在具体的 CI/CD 流程中&#xff0c;像处理代码那样处理数据库变更呢&#xff1f; DORA 调研报告 DORA&#xff08;DevOps Research &am…

​学习一下,什么是预包装食品?​

预包装食品&#xff0c;指预先定量包装或者制作在包装材料和容器中的食品&#xff1b;包括预先定量包装以及预先定量制作在包装材质和容器中并且在一定量限范围内具有统一的质量或体积标识的食品。简单说&#xff0c; 就是指在包装完成后即具有确定的量值&#xff0c;这一确定的…

Ajax学习笔记第4天

做决定之前仔细考虑&#xff0c;一旦作了决定就要勇往直前、坚持到底&#xff01; 【1 模仿百度招聘】 整个流程展示&#xff1a; 1.文件目录 2.页面效果展示及代码 data中的page1数据展示 2.1 主页 index.html:index里面代码部分解释 underscore.js :模板页面的相关代码 &…

2023最新版本 FreeRTOS教程 -1-标准库移植FreeRTOS

源码下载 官网下载驱动 点击直达 源码剪裁 剪裁之后的图片,找我免费获取 添加进MDK 配置滴答定时器 全部工程获取 查看下方头像

微服务框架SpringcloudAlibaba+Nacos集成RabbiMQ

目前公司使用jeepluscloud版本&#xff0c;这个版本没有集成消息队列&#xff0c;这里记录一下&#xff0c;集成的过程&#xff1b;这个框架跟ruoyi的那个微服务版本结构一模一样&#xff0c;所以也可以快速上手。 1.项目结构图&#xff1a; 配置类的东西做成一个公共的模块 …

省市区三级联动查询redis(通过python脚本导入数据)

最近工作有一个工作需求是实现省市区联动&#xff0c;点击省下拉框&#xff0c;选中一个省&#xff0c;然后再选市&#xff0c;最后选区&#xff0c;当然最重要的首先自然是数据了&#xff0c;没数据怎么测试接口&#xff0c;我数据是在 https://hxkj.vip/demo/echartsMap/ 这里…

小程序request请求封装

以上为本人的项目目录 1.首先在utils中创建request.js文件封装request请求&#xff0c;此封装带上了token&#xff0c;每次请求都会自带token&#xff0c;需要你从后端获取后利用wx.setStorageSync(token,返回的token),不使用的话就是空。 直接复制即可&#xff0c;需要改一下…

关于 MapboxGL 在 Vue 中的简单使用

前言问题 关于我为什么使用了 在线的 js引入方法&#xff0c;而不是使用 npm 直接下载依赖问题&#xff0c;之前有一篇文章讲过原因&#xff1a;关于 Vue-iClient-MapboxGL 的使用注意事项 网上提供的 vue-iclient-mapboxgl 比较多&#xff0c;但是我这里使用的是 iclient-su…