Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Overlapping grid items using grid-template-areas / named areas

Tags:

css

css-grid

I'm experimenting with CSS Grids, and this is the layout I'm building:

.grid {
  display: grid;
  align-items: center;
  grid-template-columns: 1fr 4rem 1fr;
  grid-template-rows: 1rem 1fr 1rem;
  max-width: 900px;
  margin: 0 auto;
}

.text {
  /* 
  // Ideally, this should be
  grid-area: text 
  */
  grid-column: 1 / 3;
  grid-row: 2 / 3;
  /* Fix z-index */
  position: relative;
  padding: 4rem;
  background-color: #fff;
}

.image {
  /* 
  // Ideally, this should be
  grid-area: image;
  */
  grid-column: 2 / 4;
  grid-row: 1 / -1;
  background-color: lightgray;
  padding: 1rem;
  /* Center das image */
  display: flex;
  justify-content: center;
}


/* Basic body */

body {
  background-color: #fafafa;
  font-family: sans-serif;
  padding: 2rem;
}

img {
  max-width: 100%;
  height: auto;
}
<div class="grid">
  <div class="text">One morning, when bobby woke from troubled dreams, he found himself transformed in his bed into a horrible vermin. He lay on his leg like back, and if he lifted his head a little he could see his brown belly, slightly domed and divided by arches into
    stiff sections.
  </div>
  <div class="image">
    <img src="http://unsplash.it/400/400" />
  </div>
</div>

(best to preview in full page...)

What I'd like to avoid:

.text and .image both currently are using grid-column: * / *; syntax, instead I'd like to use grid-area: text and grid-area: image;.

Is it possible to define grid-template-{columns|rows} as overlapping areas? I tried using second way of defining grid areas , but that didn't seem to work.

Looks like you can't do [a-start] [b-start] [a-end] [b-end] in that syntax, or at least I didn't manage to.

So - Is there any way to create an overlapping grid using named areas?

I'm trying to use the named areas for convenience purely - so that it's easier to reason about the responsive layout code, instead of repeating myself multiple times in media queries.

Edit Found the answer because of @vals answer below.

This seemed to work just fine, I probably made a syntax error in my previous attempt somewhere:

grid-template-columns: [text-start] 1fr [image-start] 4rem [text-end] 1fr [image-end];
grid-template-rows: [image-start] 1rem [text-start] 1fr [text-end] 1rem [image-end];
like image 480
pyronaur Avatar asked Jan 29 '23 20:01

pyronaur


1 Answers

At least in a more basic layout, it seems to work for me:

.container {
  border: solid 1px green;
  height: 180px;
  width: 300px;
  display: grid;
  grid-template-columns: [left-start] 100px [right-start] 100px [left-end] 100px [right-end];
  grid-template-rows: [left-start] 60px [right-start] 60px [left-end] 60px [right-end];
}

.left {
  grid-area: left;
  background-color: red;
}

.right {
  grid-area: right;
  background-color: lightgray;
  opacity: 0.5;
}
<div class="container">
  <div class="left">
  </div>
  <div class="right">
  </div>
</div>
like image 190
vals Avatar answered Feb 03 '23 06:02

vals