CSS Grid Game

2020-05-21  本文已影响0人  JunChow520

网格布局可使用智能回流元素(Intelligently Reflow Elements),比如典型游戏界面五大区块:标题、统计、主面板、得分、控制区。

区域 描述
title 标题区,标题区和主面板对齐。
stats 统计区,统计区显示在标题区之下。
score 得分区,得分区和统计区在列方向对齐。
board 主面板区,主面板在统计区和标题区右侧。
ctrls 控制区,控制区集中放置在主面板下方。

当游戏页面达到最低高度时,主面板底部和统计区底部对齐,否则主面板将扩展到屏幕可用空间。

横屏布局

横屏时界面被划分为2列3行的网格

横屏时列宽设置

grid-template-columns:auto minmax(min-content, 1fr);
列号 列宽 描述
第1列 auto 根据内容自动控制列宽
第2列 minmax(min-content, 1fr) 使用剩余空间,列宽不小于主面板区和控制区的最小宽度。

横屏时行高设置

 grid-template-rows:auto minmax(min-content, 1fr) auto;
行号 行宽 描述
第1行 auto 根据内容自动控制列宽
第2行 minmax(min-content, 1fr) 使用剩余空间,列宽不小于主面板区和控制区的最小行高。
第3行 auto 根据内容自动控制列宽

横屏时的区块分布

使用grid-template-areas定义区域,取值中每个字符串表示一行,字符串中每个单词用于定义区域名称,字符串中单词的数量则用于确定列的数量,每个字符串中单词数量必须相同。

grid-template-areas:
  "title board" 
  "stats board" 
  "score ctls";
横屏

竖屏布局

竖屏时的区块分布

grid-template-areas:
  "title stats" 
  "score stats" 
  "board board" 
  "ctrls ctrls";
竖屏

完整代码

<div class="flex">
  <div class="layout">
    <div class="title flex box">title</div>
    <div class="score flex box">score</div>
    <div class="stats flex box">stats</div>
    <div class="board flex box">board</div>
    <div class="control flex box">control</div>
  </div>
</div>
*, *:before, *:after{box-sizing:border-box; margin:0; padding:0;}
.flex{display:flex; justify-content:center; align-items:center;}
.box{border:1px dashed #ddd; padding:.5em;}
.area{background-color:rgba(255, 0, 0, .5); padding:1em; border-radius:.5em; color:#fff; text-align:center; height:100%;}

.layout{background-color:#f9f9f9; margin:1em;}
.title{grid-area:title;}
.stats{grid-area:stats;}
.score{grid-area:score;}
.board{grid-area:board; height:50vh;}
.ctrls{grid-area:ctrls;}

@media (orientation:landscape){
  .layout{
    display:grid;
    grid-template-columns:auto minmax(min-content, 1fr);
    grid-template-rows:auto minmax(min-content, 1fr) auto;
    grid-template-areas:"title board" "stats board" "score ctls";
  }
.title{gird-column:1; grid-row:1;}
.stats{grid-column:1; grid-row:2;}
.score{grid-column:1; grid-row:3;}
.board{grid-column:2; grid-row:1 / span 2;}
.ctrls{grid-column:2; grid-row:3 / span 2;}
}

@media (orientation:portrait){
  .layout{
    display:grid;
    grid-template-columns: auto minmax(min-content, 1fr);
    grid-template-rows: auto auto minmax(min-content, 1fr) auto;
    grid-template-areas:"title stats" "score stats" "board board" "ctrls ctrls";
  }
}
上一篇下一篇

猜你喜欢

热点阅读