将CSS网格与变换

时间:2017-07-03 14:57:34

标签: html css css3 css-transforms css-grid

有没有办法将CSS Grid与变换结合使用来围绕网格布局移动div?

例如,如果用户单击框B(它将展开以占据当前由其自身保留的空间以及框C和F),我如何使用变换将C和F从新占用的空间中滑出并进入空间目前在电网内无人居住?

Sample grid layout

代码如下:



.grid-wrapper {
  display: grid;
  grid-template-columns: repeat(5, 18% 20px);
  grid-template-rows: repeat(3, 30% 20px);
  height: 95vh;
  width: 95vw;
}

<div class="grid-wrapper">
  <div class="box a">A</div>
  <div class="box b">B</div>
  <div class="box c">C</div>
  <div class="box d">D</div>
  <div class="box e">E</div>
  <div class="box f">F</div>
  <div class="box g">G</div>
  <div class="box h">H</div>
</div>
&#13;
&#13;
&#13;

1 个答案:

答案 0 :(得分:12)

CSS Grid规范提供了许多用于调整布局的属性和方法。

要调整任何网格项的大小和位置,您可以使用已定义的展示位置(而不是自动展示位置)。

以下是一些例子:

&#13;
&#13;
.grid-wrapper {
  display: inline-grid;
  grid-template-columns: repeat(3, 75px);
  grid-template-rows: repeat(3, 75px);
  grid-auto-rows: 75px;
  grid-auto-columns: 75px;
  grid-gap: 10px;
  padding: 10px;
  border: 1px solid black;
}

.a {
  grid-row: 1 / 2;
  grid-column: 1 / 2;
}

.a:hover {
  grid-column: 1 / 4;
  background-color: orange;
}

.b:hover {
  grid-row: 1 / 4;
  grid-column: 1 / 3;
  background-color: aqua;
}

.c:hover~.box {
  grid-column: 1 / 4;
  background-color: pink;
}

.h:hover {
  grid-column-end: span 2;
  background-color: green;
}

.box {
  background-color: lightgreen;
  display: flex;
  align-items: center;
  justify-content: center;
  text-align: center;
}
&#13;
<div class="grid-wrapper">
  <div class="box a">A<br>hover</div>
  <div class="box b">B<br>hover</div>
  <div class="box c">C<br>hover</div>
  <div class="box d">D</div>
  <div class="box e">E</div>
  <div class="box f">F</div>
  <div class="box g">G</div>
  <div class="box h">H<br>hover</div>
</div>
&#13;
&#13;
&#13;

jsFiddle

关于你问题的这一部分:

  

我如何使用变换将C和F从新占用的空间中滑入当前未占用网格的空间?

Grid规范实际上提供了一种实现这种确切行为的方法。

使用grid-auto-flow: dense时,网格自动放置算法会将未占用的单元格填入适合的项目。

  

7.7. Automatic Placement: the grid-auto-flow property

     

未明确放置的网格项会自动放入   通过自动放置在网格容器中的未占用空间   算法

     

grid-auto-flow控制自动放置算法的工作方式,   准确指定自动放置的项目如何流入网格。

     

<强> dense

     

如果指定,自动放置算法使用“密集”打包   算法,如果尝试填充网格中的空洞   较小的物品后来出现。这可能会导致项目出现   乱序,这样做会填补较大项目留下的漏洞。

在下面的示例中,悬停时会激活grid-auto-flow: dense

&#13;
&#13;
.grid-wrapper {
  display: inline-grid;
  grid-template-columns: repeat(5, 50px);
  grid-template-rows: repeat(3, 50px);
  grid-auto-rows: 50px;
  grid-auto-columns: 50px;
  grid-gap: 10px;
  padding: 10px;
  border: 1px solid black;
}

.grid-wrapper:hover {
  grid-auto-flow: dense;
}

.a, .h {
  grid-column-end: span 2;
}

.b, .e {
  grid-row-end: span 2;
}

.f {
  grid-row-end: span 2;
  grid-column-end: span 2;
}

.box {
  background-color: lightgreen;
  display: flex;
  align-items: center;
  justify-content: center;
  text-align: center;
}

.grid-wrapper:hover .g,
.grid-wrapper:hover .h {
  background-color: orange;
}
&#13;
<div class="grid-wrapper">
  <div class="box a">A</div>
  <div class="box b">B</div>
  <div class="box c">C</div>
  <div class="box d">D</div>
  <div class="box e">E</div>
  <div class="box f">F</div>
  <div class="box g">G</div>
  <div class="box h">H</div>
</div>
&#13;
&#13;
&#13;

jsFiddle