【问题标题】:Is it possible to split a grid item to allow different spans?是否可以拆分网格项目以允许不同的跨度?
【发布时间】:2017-09-11 04:43:38
【问题描述】:

我有一篇文章和一个侧边栏(侧边栏)元素 - 很简单,除了文章的标题和子标题需要跨越整行。如果我从文章中取出标题/副标题,则文章元素在语义上不再完整。

有没有办法使用 CSS Grid 来获得以下格式,其中 Title、Sub 和 Content 都是“Article”元素的一部分,而“Aside”是 2 列网格中的第二个?

从我目前的研究来看,这似乎是不可能

【问题讨论】:

  • 你能给个图片作为结果的例子吗?
  • @ReynaldHenryleo - 当然,请参阅更新。
  • 是的,有一种方法,但是您目前所做的 html 和 css 代码是什么?您是使用任何 CSS 框架(例如 bootstrap)还是在没有任何框架的情况下创建它?
  • 我正在尝试使用 CSS Grid 创建这个 - 没有 Bootstrap 或框架

标签: css html grid-layout css-grid


【解决方案1】:

如果您知道,您可以hack嵌套 CSS 网格

  1. aside 部分的width

  2. 标题子标题部分的height

(在许多布局中,这些尺寸是固定的)

您可以使用 pseudo 元素为 aside 元素创建一个 空格,然后将其 潜入 到外部 grid 中容器 - 查看下面的演示:

body {
  margin: 0;
}

* {
  box-sizing: border-box;
}

article,
aside {
  border: 1px solid;
  display: flex;
  align-items: center;
  justify-content: center;
}
div {
  display: grid;
  grid-template-areas: "section aside";
}

section {
  grid-area: section;
  display: grid;
  grid-template-areas: "header header" "subhead subhead" "content empty";
  grid-template-rows: 50px 50px auto;
  grid-template-columns: 80vw auto;
  height: 100vh;
  width: 100vw;
}

section article:first-child {
  grid-area: header;
}

section article:nth-child(2) {
  grid-area: subhead;
}

section article:last-child {
  grid-area: content;
}

section:after {
  content: '';
  display: block;
  grid-area: empty;
}

aside {
  grid-area: aside;
  height: calc(100vh - 100px);
  width: 20vw;
  align-self: flex-end;
  position:relative;
  transform: translateX(-100%);
}
<div>
  <section>
    <article>Article title</article>
    <article>Article sub-heading</article>
    <article>Article content</article>
  </section>
  <aside>Aside</aside>
</div>

【讨论】:

  • 我实际上以不同的方式解决了这个问题,但据我所知,您的方法可能也有效 - sn-p 运行成功。当我有时间时,我会更深入地回顾并与我的比较,看看我是否可以交换。马上,我觉得固定的航向高度对我的雇主来说是个问题……非常感谢您的帮助!
【解决方案2】:

只要文章不浮动,您就可以通过简单地浮动所有单元格来实现 - https://jsfiddle.net/yxbckzcq/1/

<div class="wrapper">
  <article>
    <div style="float:left;width:100%" class="one">One</div>
    <div style="float:left;width:100%" class="two">Two</div>
    <div style="float:left;width:70%" class="three">Three</div>
  </article>
 <div  style="float:left;width:30%" class="four">Four</div>
</div>

【讨论】:

  • 我的偏好是使用 CSS Grid,但从我目前的研究来看,这似乎是不可能的,我需要使用与此类似的方法。
【解决方案3】:

你可以使用这样的东西。

* {box-sizing: border-box;}
.wrapper {
  max-width: 940px;
  margin: 0 auto;
}

.wrapper > div {
  border: 2px solid rgb(233,171,88);
  border-radius: 5px;
  background-color: rgba(233,171,88,.5);
  padding: 10px;
  color: #d9480f;
}.wrapper {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  grid-gap: 10px;
  grid-auto-rows: minmax(100px, auto);
}
.one {
  grid-column: 1 / 4;
  grid-row: 1;
}
.two { 
  grid-column: 1 / 4;
  grid-row: 2;
}
.three {
  grid-column: 1 / 3;
  grid-row: 3;
  min-height:200px;
}
.four {
  grid-column: 3;
  grid-row: 3;
  min-height:200px;
}
<div class="wrapper">
  <div class="one">One</div>
  <div class="two">Two</div>
  <div class="three">Three</div>
  <div class="four">Four</div>
</div>

同时检查Fiddle.

更多详情请访问https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Grid_Layout

【讨论】:

  • 谢谢你,但我的要求(在问题中说明)是你的类“一”、“二”和“三”都是同一元素的一部分 -
  • 你可以用&lt;article class="wrapper"&gt;代替&lt;div class="wrapper"&gt;
  • 但是
  • 另外,GRID CSS 的浏览器支持非常少。所以最好选择其他一些选项。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-18
  • 1970-01-01
  • 2015-09-03
相关资源
最近更新 更多