首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >按行和列灵活调整单元格大小的HTML/CSS/JavaScript方法

按行和列灵活调整单元格大小的HTML/CSS/JavaScript方法
EN

Stack Overflow用户
提问于 2019-11-22 23:46:43
回答 3查看 79关注 0票数 0
代码语言:javascript
复制
-----------------------    -----------------------    -----------------------    -----------------------
| 1 |        2        |    | 1 |                 |    | 1 |        2        |    |                     |
-----------------------    -----                 |    -----------------------    |                     |
|   |                 |    |   |                 |    |                     |    |                     |
| 3 |        4        |    | 3 |        4        |    |          4          |    |          4          |
|   |                 |    |   |                 |    |                     |    |                     |
-----------------------    -----                 |    -----------------------    |                     |
| 5 |        6        |    | 5 |                 |    | 5 |        6        |    |                     |
-----------------------    -----------------------    -----------------------    -----------------------

这是我的网页布局的四张粗略图画。最左边的图形显示了所有数据单元格。它有3行和2列。

顶行是页眉,中间行是内容,底行是页脚。

左栏是带有三个控件块的侧边栏,右栏是content +页眉和页脚的一部分。

我想隐藏整个页眉和/或页脚(第二张图),但我也希望能够只隐藏侧栏列的中间行(第三张图)。在这两种情况下,我都希望剩余的内容填充开放空间,就像在flex容器中一样。我也想隐藏除内容(第四张图)以外的所有内容,但一旦我解决了其他两个布局,这并不困难。

我将使用javascript在这些配置之间切换。

那么这里最好的方法是什么呢?在我看来,我可以使用CSS网格和网格区域来实现,也可以使用HTML表和rowspan/colspan来实现。我也可以用我现有的flex布局和元素的绝对或相对位置来做到这一点。这些方法都不像我希望的那样是自动的,除非我遗漏了什么。我希望CSS网格能有一种同时自动填充行和列的方法,但它似乎使用了"tracks“,并将自己定位为行或列,而不是两者。

EN

回答 3

Stack Overflow用户

发布于 2019-11-23 21:05:54

首先-你不能在css-grid中做L形区域,只允许矩形区域(在MDN上阅读更多)。

因此,(据我所知)不可能只用css-grid在你的第二个和第三个布局之间创建一些东西(例如,你不能同时隐藏32,同时让4占用它们的空间)。

Second - css-grid设计用于调整大小和定位,而不是隐藏项目。在下面的解决方案中,我在不需要的项目上使用了display: none;

记住这一点--有几种方法可以让你做到这一点:

grid-template-areas解决方案

代码语言:javascript
复制
* {
  box-sizing: border-box;
}
body {
  --gap-size: 1rem;
  font-size: 1.5rem;
  margin: 0;
  padding: var(--gap-size);
  background-color: #fbb;
}
.container {
  /* Grid consts */
  --header-height: 50px;
  --footer-height: 50px;
  --sidebar-width: 100px;
  
  height: 300px;
  grid-gap: var(--gap-size);
  border: 2px solid #555;
  padding: var(--gap-size);
  background: #ddd;
  
  /* Grid layout */
  display: grid;
  grid-template-columns: var(--sidebar-width) 1fr;
  grid-template-rows: var(--header-height) 1fr var(--footer-height);
}
.container:not(:last-child) {
  margin-bottom: var(--gap-size);
}
.item {
  border: 2px solid #555;
  padding: var(--gap-size);
  display: flex;
  align-items: center;
  justify-content: center;
  background: #fff;
}

/* Grid-areas */
.item-1 {
  grid-area: item-1;
}
.item-2 {
  grid-area: item-2;
}
.item-3 {
  grid-area: item-3;
}
.item-4 {
  grid-area: item-4;
}
.item-5 {
  grid-area: item-5;
}
.item-6 {
  grid-area: item-6;
}

/* Grid-templates */
.grid-1 {
  grid-template-areas: 
    'item-1 item-2'
    'item-3 item-4'
    'item-5 item-6'
  ;
}
.grid-2 {
  grid-template-areas: 
    'item-1 item-4'
    'item-3 item-4'
    'item-5 item-4'
  ;
}
.grid-3 {
  grid-template-areas: 
    'item-1 item-2'
    'item-4 item-4'
    'item-5 item-6'
  ;
}
.grid-4 {
  grid-template-areas: 
    'item-4 item-4'
    'item-4 item-4'
    'item-4 item-4'
  ;
}

/* Hiding items */
.grid-2 .item-2,
.grid-2 .item-6 {
  display: none;
}
.grid-3 .item-3 {
  display: none;
}
.grid-4 .item-1,
.grid-4 .item-2,
.grid-4 .item-3,
.grid-4 .item-5,
.grid-4 .item-6 {
  display: none;
}
代码语言:javascript
复制
<div class="container grid-1">
  <div class="item item-1">1</div>
  <div class="item item-2">2</div>
  <div class="item item-3">3</div>
  <div class="item item-4">4</div>
  <div class="item item-5">5</div>
  <div class="item item-6">6</div>
</div>

<div class="container grid-2">
  <div class="item item-1">1</div>
  <div class="item item-2">2</div>
  <div class="item item-3">3</div>
  <div class="item item-4">4</div>
  <div class="item item-5">5</div>
  <div class="item item-6">6</div>
</div>

<div class="container grid-3">
  <div class="item item-1">1</div>
  <div class="item item-2">2</div>
  <div class="item item-3">3</div>
  <div class="item item-4">4</div>
  <div class="item item-5">5</div>
  <div class="item item-6">6</div>
</div>

<div class="container grid-4">
  <div class="item item-1">1</div>
  <div class="item item-2">2</div>
  <div class="item item-3">3</div>
  <div class="item item-4">4</div>
  <div class="item item-5">5</div>
  <div class="item item-6">6</div>
</div>

grid-column / grid-row解决方案

代码语言:javascript
复制
* {
  box-sizing: border-box;
}
body {
  --gap-size: 1rem;
  font-size: 1.5rem;
  margin: 0;
  padding: var(--gap-size);
  background-color: #fbb;
}
.container {
  /* Grid consts */
  --header-height: 50px;
  --footer-height: 50px;
  --sidebar-width: 100px;
  
  height: 300px;
  grid-gap: var(--gap-size);
  border: 2px solid #555;
  padding: var(--gap-size);
  background: #ddd;
  
  /* Grid layout */
  display: grid;
  grid-template-columns: var(--sidebar-width) 1fr;
  grid-template-rows: var(--header-height) 1fr var(--footer-height);
}
.container:not(:last-child) {
  margin-bottom: var(--gap-size);
}
.item {
  border: 2px solid #555;
  padding: var(--gap-size);
  background: #fff;
  
  /* Centering content */
  display: flex;
  align-items: center;
  justify-content: center;
}

.grid-2 .item-4 {
  grid-row: 1 / -1;
  grid-column: 2;
}
.grid-3 .item-4 {
  grid-row: 2;
  grid-column: 1 / -1;
}
.grid-4 .item-4 {
  grid-row: 1 / -1;
  grid-column: 1 / -1;
}

/* Hiding items */
.grid-2 .item-2,
.grid-2 .item-6 {
  display: none;
}
.grid-3 .item-3 {
  display: none;
}
.grid-4 .item-1,
.grid-4 .item-2,
.grid-4 .item-3,
.grid-4 .item-5,
.grid-4 .item-6 {
  display: none;
}
代码语言:javascript
复制
<div class="container grid-1">
  <div class="item item-1">1</div>
  <div class="item item-2">2</div>
  <div class="item item-3">3</div>
  <div class="item item-4">4</div>
  <div class="item item-5">5</div>
  <div class="item item-6">6</div>
</div>

<div class="container grid-2">
  <div class="item item-1">1</div>
  <div class="item item-2">2</div>
  <div class="item item-3">3</div>
  <div class="item item-4">4</div>
  <div class="item item-5">5</div>
  <div class="item item-6">6</div>
</div>

<div class="container grid-3">
  <div class="item item-1">1</div>
  <div class="item item-2">2</div>
  <div class="item item-3">3</div>
  <div class="item item-4">4</div>
  <div class="item item-5">5</div>
  <div class="item item-6">6</div>
</div>

<div class="container grid-4">
  <div class="item item-1">1</div>
  <div class="item item-2">2</div>
  <div class="item item-3">3</div>
  <div class="item item-4">4</div>
  <div class="item item-5">5</div>
  <div class="item item-6">6</div>
</div>

票数 0
EN

Stack Overflow用户

发布于 2019-11-24 09:05:19

所以,我意识到这听起来像是一个老派的前端家伙(并不完全是真的),但我认为在这种情况下,浮动实际上给了你更多的灵活性。使用flex,您需要对每一行或每列进行换行,因此您有一个结构,其中项目1-6并不都是siblings...they,或者分组在两个(如果行)中。

代码语言:javascript
复制
<div class="row1">
  <div class="item1"></div>
  <div class="item2"></div>
</div>

或三个(如果是列):

代码语言:javascript
复制
<div class="column1">
  <div class="item1"></div>
  <div class="item3"></div>
  <div class="item5"></div>
</div>

使用网格,所有内容都可以是兄弟级的,但你必须非常明确地定义所有内容,并且对每个布局都这样做variation...which不一定是不好的,但是如果你的内容不是故意非常统一的,你就会在溢出等方面陷入麻烦。

@fen1x已经很好地演示了网格如何做到这一点,所以我不会尝试重新创建它。

So...floats -不管你喜欢还是讨厌它们,它们实际上很好地处理了这个用例,再加上一些定位(使用flexbox你也需要定位,但实际上在那种情况下会更复杂)。

https://codepen.io/ryantdecker/pen/vYYwYKL

如果没有其他问题,它至少让代码保持了相当不错的minimal...just食粮。

票数 0
EN

Stack Overflow用户

发布于 2019-12-03 06:44:49

我稍微改变了我的作用域,并使用CSS Grid找到了一个解决方案。下面是一个代码:https://codepen.io/sidewayss/pen/gObOzxr

范围的变化是现在有3个按钮,每个区域一个:页眉、侧边栏和页脚。页眉和页脚现在独立隐藏。

我的解决方案是使用一个由4个元素组成的数字数组来设置媒体窗格的grid-area样式(在我的原始绘图中是#4)。在javascript的其他地方,我已经以类似的方式处理了SVG viewBox属性。因为网格区域一次只扩展/收缩一行/列,所以我可以递增/递减该数字数组中的相应值。

一旦设置好基础设施,分配就很简单了:

代码语言:javascript
复制
isHide == isFooter ? ++area[index] : --area[index];
element.style.gridArea = area.join("/");

我碰巧已经有了很多相关的基础设施,所以这个解决方案对我来说是有意义的。我的项目代码的文字比代码少:)

下一个问题是当所有窗格都隐藏时显示窗格的UI,尽管这在这里应该是一个单独的问题。在真正的网页(不是代码)中,按钮在导航栏中,导航栏也可以隐藏。是否应该有半透明的浮动按钮来恢复它们?触摸屏与鼠标的对比如何?是否应该有一种方法来悬停并看到它们?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58997549

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档