【问题标题】:Overiding CSS grid-template-columns individually单独覆盖 CSS 网格模板列
【发布时间】:2019-10-04 13:54:06
【问题描述】:

我正在尝试创建两个按钮,每个按钮在使用 CSS grid 时切换一个特定的列。

  • 我有一个简单的网格,可以切换第一列和最后一列的宽度。 (见 sn-p)

  • 我希望能够独立切换列宽(无需进一步的 javascript)

  • 因为active类应用于容器,每一列都无法推断出另一列的活动状态。

  • 使用 flex,活动类将直接应用到列 (例如 item1,这不是问题。

问题

是否有 CSS 网格列宽属性可以应用于列(例如 item1 覆盖 grid-template-columns 中的设置?

是否有像 grid-template-columns 这样的 CSS 网格属性可以针对单个列而不是一个属性中的所有列?

$("#js-btn-left").on("click", function () {
  $(".grid-container").toggleClass("active");
});
$("#js-btn-right").on("click", function () {
  $(".grid-container").toggleClass("active");
});
.grid-container {
  display: grid;
  grid-template-columns: 50px auto 50px;
  grid-gap: 10px;
}

.grid-container > div {
  background-color: #b00;
  border:2px solid #000;
  text-align: center;
  padding: 20px 0;
  font-size: 30px;
}
.grid-container.active{
  grid-template-columns: 100px auto 100px;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<input id="js-btn-left" type="button" value="TOGGLE COLUMN 1"/>
<input id="js-btn-right" type="button" value="TOGGLE COLUMN 3"/>
<div class="grid-container">
  <div class="item1">1</div>
  <div class="item2">2</div>
  <div class="item3">3</div> 
</div>

【问题讨论】:

  • 不...我不相信这是可能的。这些不是元素,因此不能由 JS 或 CSS 选择。解析和调整template-columns 是一种方法,这很复杂。

标签: html css css-grid


【解决方案1】:

使用 CSS 变量定义列,然后简单地调整变量:

$("#js-btn-left").on("click", function () {
  $(".grid-container").toggleClass("active1");
});
$("#js-btn-right").on("click", function () {
  $(".grid-container").toggleClass("active3");
});
.grid-container {
  display: grid;
  grid-template-columns: var(--c1,50px) auto var(--c3,50px);
  grid-gap: 10px;
}

.grid-container > div {
  background-color: #b00;
  border:2px solid #000;
  text-align: center;
  padding: 20px 0;
  font-size: 30px;
}
.grid-container.active1{
  --c1:100px;
}
.grid-container.active3{
  --c3:100px;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<input id="js-btn-left" type="button" value="TOGGLE COLUMN 1"/>
<input id="js-btn-right" type="button" value="TOGGLE COLUMN 3"/>
<div class="grid-container">
  <div class="item1">1</div>
  <div class="item2">2</div>
  <div class="item3">3</div> 
</div>

另一种hacky方式是依赖隐式网格,调整grid-auto-column

$("#js-btn-right").on("click", function () {
  $(".grid-container").toggleClass("active");
});
.grid-container {
  display: grid;
  grid-template-columns:  auto ; /* only one column on the explicit grid */
  grid-auto-flow:column; /*Make the flow column*/
  grid-auto-columns:50px;
  grid-gap: 10px;
}

.item1 {
   /* Make the item1 at the left of the explicit grid 
       to undestand how it works: 
       https://stackoverflow.com/a/57750033/8620333 */
  grid-column: random -1; 
}
.grid-container.active{
  grid-auto-columns:100px;
}



.grid-container > div {
  background-color: #b00;
  border:2px solid #000;
  text-align: center;
  padding: 20px 0;
  font-size: 30px;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<input id="js-btn-right" type="button" value="TOGGLE COLUMN"/>
<div class="grid-container">
  <div class="item1">1</div>
  <div class="item2">2</div>
  <div class="item3">3</div> 
</div>

如果您只想定位一列:

$("#js-btn-right").on("click", function () {
  $(".grid-container").toggleClass("active");
});
.grid-container {
  display: grid;
  grid-template-columns: 50px auto ;
  grid-auto-flow:column; 
  grid-auto-columns:50px;
  grid-gap: 10px;
}

.grid-container.active{
  grid-auto-columns:100px;
}



.grid-container > div {
  background-color: #b00;
  border:2px solid #000;
  text-align: center;
  padding: 20px 0;
  font-size: 30px;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<input id="js-btn-right" type="button" value="TOGGLE COLUMN"/>
<div class="grid-container">
  <div class="item1">1</div>
  <div class="item2">2</div>
  <div class="item3">3</div> 
</div>

或者,您可以简单地更改每个项目应占用的列数,而不是更改列宽:

$("#js-btn-left").on("click", function () {
  $(".grid-container").toggleClass("active1");
});
$("#js-btn-right").on("click", function () {
  $(".grid-container").toggleClass("active3");
});
.grid-container {
  display: grid;
  grid-template-columns: 50px 40px auto 40px 50px; /* 40px because we have 10px of gap so the total will be 100px */
  grid-gap: 10px;
}

.grid-container > div {
  background-color: #b00;
  border:2px solid #000;
  text-align: center;
  padding: 20px 0;
  font-size: 30px;
}
.item2 {
  grid-column:span 3;
}
.grid-container.active3 .item3,
.grid-container.active3 .item2,
.grid-container.active1 .item1,
.grid-container.active1 .item2{
  grid-column:span 2;
}

.grid-container.active1.active3 .item2{
  grid-column:initial;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<input id="js-btn-left" type="button" value="TOGGLE COLUMN 1"/>
<input id="js-btn-right" type="button" value="TOGGLE COLUMN 3"/>
<div class="grid-container">
  <div class="item1">1</div>
  <div class="item2">2</div>
  <div class="item3">3</div> 
</div>

【讨论】:

  • 这是个好主意,我会试探性地使用,但我很好奇 grid 是否可以达到类似的效果。
  • @DreamTeK 您不能简单地设置元素的宽度并将模板设置为自动吗?像这样你只需改变元素的宽度,网格就会自动调整
  • @DreamTeK 添加了另一个想法
  • 我不知道自动列。很好的补充你的答案。谢谢。
  • 这很聪明。有些人说这是不可能的:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-21
  • 1970-01-01
相关资源
最近更新 更多