HTML布局之Grid模拟房间方位布局,显示摄像头等设备图标

1 篇文章 0 订阅


前言

最近项目中需要显示房间中某些设备的位置信息,并用图标表示出来。调查了一番后决定使用Grid布局来实现。
效果如下图所示:
在这里插入图片描述

一、设计

1.1 布局设计

多次尝试后,发现将房间分为4行4列显示效果较为合适。

1.1.1 初始设计

给每一个位置分配一个ID(如 1:上左角 2:上左边 3:上边 4:上右边 5:上右角 6:左上边 7:左边 8:左下边 9:右上边 10:右边 11:右下边 12:下左角 13:下左边 14:下边 15:下右边 16:下右角)

// 房间布局设计
 -----------------------------------
 上左角---上左边---上边---上右边---上右角
 -----                         -----
 左上边                         右上边
 -----                         -----
 左 边           房间名          右 边
 -----                         -----
 左下边                         右下边
 -----                         -----
 下左角---下左边---下边---下右边---下右角
 -----------------------------------

二、转变为布局

效果:
在这里插入图片描述
代码:
roomId为自己定义的字符(‘room-1001-’)

<div class="box">
      <span class="title">房间名称</span>
      <div class="top">
        <div class="item">
          <div :id="roomId + `1`">上左角</div>
        </div>
        <div class="item">
          <div :id="roomId + `2`">上左边</div>
        </div>
        <div class="item">
          <div :id="roomId + `3`">上边</div>
        </div>
        <div class="item">
          <div :id="roomId + `4`">上右边</div>
        </div>
        <div class="item">
          <div :id="roomId + `5`">上右角</div>
        </div>
      </div>
      <div class="left">
        <div class="item">
          <div :id="roomId + `6`">左上边</div>
        </div>
        <div class="item">
          <div :id="roomId + `7`">左边</div>
        </div>
        <div class="item">
          <div :id="roomId + `8`">左下边</div>
        </div>
      </div>
      <div class="right">
        <div class="item">
          <div :id="roomId + `9`">右上边</div>
        </div>
        <div class="item">
          <div :id="roomId + `10`">右边</div>
        </div>
        <div class="item">
          <div :id="roomId + `11`">右下边</div>
        </div>
      </div>
      <div class="bottom">
        <div class="item">
          <div :id="roomId + `12`">下左角</div>
        </div>
        <div class="item">
          <div :id="roomId + `13`">下左边</div>
        </div>
        <div class="item">
          <div :id="roomId + `14`">下边</div>
        </div>
        <div class="item">
          <div :id="roomId + `15`">下右边</div>
        </div>
        <div class="item">
          <div :id="roomId + `16`">下右角</div>
        </div>
      </div>
    </div>

CSS:

.box {
    width: 400px;
    height: 400px;
    border-radius: 4px;
    border: 1px solid #DCDFE6;
    position: relative;

    .title {
      position: absolute;
      cursor: pointer;
      -webkit-transform: translateY(-50%);
      transform: translateY(-50%);
      top: 50%;
      left: 0;
      right: 0;
      text-align: center;
      margin: 0 25%;
      padding: 20% 10%;
      font-size: 1em;
      letter-spacing: 0.1em;

      .gear-size {
        width: 1.1em;
        height: 1.1em;
      }
    }

    .top {
      display: grid;
      text-align: center;
      height: 15%;
      grid-template-columns: 2rem 2fr 1fr 2fr 2rem;
      grid-gap: 5px 5px;

      .item {
        display: flex;
        justify-content: center;
        align-items: start;
      }

      .gear-size {
        width: 1.1em;
        height: 1.1em;
      }
    }

    .left {
      display: grid;
      float: left;
      vertical-align: middle;
      margin: 5px 0px;
      width: 2rem;
      height: 67.5%;
      grid-template-rows: repeat(3, 1fr);
      grid-gap: 5px 5px;

      .item {
        display: flex;
        align-items:center;
      }

      .gear-size {
        width: 1.1em;
        height: 1.1em;
      }
    }

    .right {
      display: grid;
      text-align: right;
      float: right;
      margin: 5px 0px;
      width: 2rem;
      height: 67.5%;
      grid-template-rows: repeat(3, 1fr);
      grid-gap: 5px 5px;

      .item {
        display: flex;
        justify-content: right;
        align-items:center;
      }

      .gear-size {
        width: 1.1em;
        height: 1.1em;
      }
    }

    .bottom {
      display: grid;
      text-align: center;
      clear: both;
      height: 15%;
      grid-template-columns: 2rem 2fr 1fr 2fr 2rem;
      grid-gap: 5px 5px;

      .item {
        display: flex;
        justify-content: center;
        align-items: end;
      }

      .gear-size {
        width: 1.1em;
        height: 1.1em;
      }
    }
  }

  .item {
    font-size: 14px;
    // border: 1px solid #DCDFE6;
  }

三、添加文字效果

在这里插入图片描述
HTML代码:

<html>
    <head>
        <title></title>
    </head>
    <body>
        <div class="box" id="room-1001">
            <div class="top">
                <div class="item">
                    <div id="room-1001-1">上左角</div>
                </div>
                <div class="item">
                    <div id="room-1001-2">上左边</div>
                </div>
                <div class="item">
                    <div id="room-1001-3">上边</div>
                </div>
                <div class="item">
                    <div id="room-1001-4">上右边</div>
                </div>
                <div class="item">
                    <div id="room-1001-5">上右角</div>
                </div>
            </div>
            <div class="left">
                <div class="item">
                    <div id="room-1001-6">左上边</div>
                </div>
                <div class="item">
                    <div id="room-1001-7">左边</div>
                </div>
                <div class="item">
                    <div id="room-1001-8">左下边</div>
                </div>
            </div>
            <div class="right">
                <div class="item">
                    <div id="room-1001-9">右上边</div>
                </div>
                <div class="item">
                    <div id="room-1001-10">右边</div>
                </div>
                <div class="item">
                    <div id="room-1001-11">右下边</div>
                </div>
            </div>
            <div class="bottom">
                <div class="item">
                    <div id="room-1001-12">下左角</div>
                </div>
                <div class="item">
                    <div id="room-1001-13">下左边</div>
                </div>
                <div class="item">
                    <div id="room-1001-14">下边</div>
                </div>
                <div class="item">
                    <div id="room-1001-15">下右边</div>
                </div>
                <div class="item">
                    <div id="room-1001-16">下右角</div>
                </div>
            </div>
        </div>
    </body>
</html>

3.1 替换图标效果

在这里插入图片描述
替换为图标函数:
ImageWrapper为自己封装的一个图标组件。
本方法的重点在将布局中的如id为“room-1001-8”的div通过Vue的$mount()方法挂载为想要替换的组件。

showDev(devList) {
      for (let index = 0; index < devList.length; index++) {
        const dev = devList[index]
        const name = this.roomId + dev.id
        const room = document.getElementById(name)
        // 监控
        if (dev.type === this.$const.deviceType.CCTV) {
          const id = 'icon-node-' + index
          const ImageWrapper = Vue.extend(imageWrapper)
          this.curDetail = new ImageWrapper({
            propsData: {
              src: this.cctvIcon,
              id: id
            }
          }).$mount(room)
        }
        // 温湿度仪
        if (dev.type === this.$const.deviceType.TEMHUM) {
          const ImageWrapper = Vue.extend(imageWrapper)
          this.curDetail = new ImageWrapper({
            propsData: {
              src: this.tempIcon
            }
          }).$mount(room)
        }
        // γ射线检测仪
        if (dev.type === this.$const.deviceType.RAYDTC) {
          const ImageWrapper = Vue.extend(imageWrapper)
          this.curDetail = new ImageWrapper({
            propsData: {
              src: this.radioIcon
            }
          }).$mount(room)
        }
      }
    }

四、其他

上面的布局效果可以使用函数动态生成。

initRoomLayout(lab) { // 初始化房间方法
      // const lab = this.$refs.room
      const box = lab.appendChild(document.createElement('div'))
      box.className = 'box '
      box.id = 'room-1001'

      const title = box.appendChild(document.createElement('span'))
      title.className = 'title'

      const top = box.appendChild(document.createElement('div'))
      top.className = 'top'
      for (let index = 1; index <= 5; index++) {
        const item = top.appendChild(document.createElement('div'))
        item.className = 'item'
        const div = item.appendChild(document.createElement('div'))
        // 设置ID
        div.id = box.id + '-' + index
      }

      const left = box.appendChild(document.createElement('div'))
      left.className = 'left'
      for (let index = 6; index <= 8; index++) {
        const item = left.appendChild(document.createElement('div'))
        item.className = 'item'
        const div = item.appendChild(document.createElement('div'))
        // 设置ID
        div.id = box.id + '-' + index
      }

      const right = box.appendChild(document.createElement('div'))
      right.className = 'right'
      for (let index = 9; index <= 11; index++) {
        const item = right.appendChild(document.createElement('div'))
        item.className = 'item'
        const div = item.appendChild(document.createElement('div'))
        // 设置ID
        div.id = box.id + '-' + index
      }

      const bottom = box.appendChild(document.createElement('div'))
      bottom.className = 'bottom'
      for (let index = 12; index <= 16; index++) {
        const item = bottom.appendChild(document.createElement('div'))
        item.className = 'item'
        const div = item.appendChild(document.createElement('div'))
        // 设置ID
        div.id = box.id + '-' + index
      }
    }

注:本文介绍重点为实现思路。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值