CSS Grid Layout: how to make the background color the color of several cells?

To assign FreeCodeCamp, I am cloning an iOS calculator in a CSS Grid layout. JavaScript to run is work for later; Now I'm focused on design.

The end result should look something like this:

enter image description here

html { font-size: 20px; } .wrapper { display: grid; grid-template-columns: 1.2fr 1fr 1.2fr; grid-auto-rows: minmax(700px, auto); } .wrapper>div { padding: 0; } .nested-1 { display: grid; grid-template-columns: repeat(3, 1fr); justify-items: center; } .nested-1>div { font-family: "Roboto", sans-serif; font-size: 0.6rem; color: white; } .top-bar { padding-top: 0.3rem; } .flight-modus { justify-self: start; padding-left: 0.3rem; } .charge-status { justify-self: end; padding-right: 0.3rem; } .nested-2 { display: grid; grid-auto-rows: minmax(200px, auto); justify-items: end; } .nested-2>div { font-family: "Roboto", sans-serif; font-size: 5rem; font-weight: lighter; color: white; padding-left: 0.2rem; padding-right: 0.2rem; align-self: end; } .nested-3 { display: grid; grid-template-columns: repeat(4, 1fr); grid-template-rows: repeat(5, 1fr); justify-items: center; font-size: 2.2rem; color: black; background: #ddd; font-family: "Roboto", sans-serif; font-weight: lighter; padding: 1rem; } .operations { font-size: 1.5rem; padding: 1.3rem; } .bg-grey { background: #ccc; } .left-cell { background: black; } .right-cell { background: black; } .calculator { background: #333333; } 
 <body class=""> <div class="wrapper"> <div class="left-cell"> </div> <div class="calculator"> <div class="nested-1 top-bar"> <div class="flight-modus"><img src="http://i63.tinypic.com/sebv9j.png" alt="flight mode"> &nbsp; <img src="http://i67.tinypic.com/5zqf4k.png" alt="wifi signal at full strength"></div> <div>10:10 am</div> <div class="charge-status">96% <img src="http://i67.tinypic.com/30ldxtx.png" alt="battery at near full charge"></div> </div> <div class="nested-2 result"> <div>3,658.8</div> </div> <div class="nested-3 keys"> <div class="operations bg-grey">C</div> <div class="operations bg-grey">+/-</div> <div class="operations bg-grey">%</div> <div class="operations bg-grey">/</div> <div>5</div> <div>5</div> <div>5</div> <div>5</div> <div>5</div> <div>5</div> <div>5</div> <div>5</div> <div>5</div> <div>5</div> <div>5</div> <div>5</div> <div>5</div> <div>5</div> <div>5</div> <div>5</div> </div> </div> <div class="right-cell"> </div> </div> 

What I've done:

I created a shared grid with several nested grids. No. 3 of these nested grids should hold the keys of the calculator (numbers 0-9, basic mathematical operations, the result, clearly).

How to set continuous background-color for a certain number of cells , for example. dark gray, orange, etc.? Now installing bg on my individual divs leaves spaces. Further, cell-borders should also get a solid 1px color, as shown in the example.

Looking through SO and CSS Grid layout / CSS Flexbox tutorials, I couldn’t find a simple solution to this obviously simple task. Should I bring Flexbox to my grid here?

As much as I appreciate the wonderful new dynamics that Grid brings, and its compatibility with Flexbox, I'm still very new to both.

Any tips or comments on my code structure are welcome! Thank you, Chris

+5
source share
3 answers
  • To fix the borders and background of nested-3 , you can set the background and borders using:

     background: #888; grid-gap: 1px; 

    and for all nested-3 children you can set the background:

     .nested-3 > div { background: #ddd; } 
  • Instead of padding on .operations you can add this to nested-3 > div :

     .nested-3 > div {/* ADDED */ background: #ddd; display: flex; justify-content: center; align-items: center; padding: 1.3rem; } 

    and you may need to remove justify-items: center and padding: 1rem from the nested-3 div.

I also tried the design - redid the markup as follows:

 <div class="nested-3 keys"> <!-- MODIFIED HERE --> <div class="operations bg-grey">C</div> <div class="operations bg-grey">+/-</div> <div class="operations bg-grey">%</div> <div>7</div> <div>8</div> <div>9</div> <div>4</div> <div>5</div> <div>6</div> <div>1</div> <div>2</div> <div>3</div> <div class="zero">0</div> <div>.</div> <div class="operations bg-grey op-right">/</div> <div class="op-right">x</div> <div class="op-right">-</div> <div class="op-right">+</div> <div class="op-right">=</div> </div> 

and added these styles:

 .nested-3>.op-right { grid-column-start: 4; grid-row-start: 1; background: #fd8a0d; } .nested-3>.op-right+.op-right { grid-row-start: 2; } .nested-3>.op-right+.op-right+.op-right { grid-row-start: 3; } .nested-3>.op-right+.op-right+.op-right+.op-right { grid-row-start: 4; } .nested-3>.op-right+.op-right+.op-right+.op-right+.op-right { grid-row-start: 5; } .zero { grid-column: span 2; } 

See the snippet below:

 html { font-size: 20px; } .wrapper { display: grid; grid-template-columns: 1.2fr 1fr 1.2fr; grid-auto-rows: minmax(700px, auto); } .wrapper>div { padding: 0; } .nested-1 { display: grid; grid-template-columns: repeat(3, 1fr); justify-items: center; } .nested-1>div { font-family: "Roboto", sans-serif; font-size: 0.6rem; color: white; } .top-bar { padding-top: 0.3rem; } .flight-modus { justify-self: start; padding-left: 0.3rem; } .charge-status { justify-self: end; padding-right: 0.3rem; } .nested-2 { display: grid; grid-auto-rows: minmax(200px, auto); justify-items: end; } .nested-2>div { font-family: "Roboto", sans-serif; font-size: 5rem; font-weight: lighter; color: white; padding-left: 0.2rem; padding-right: 0.2rem; align-self: end; } .nested-3 { display: grid; grid-template-columns: repeat(4, 1fr); grid-template-rows: repeat(5, 1fr); /*justify-items: center;*/ font-size: 2.2rem; color: black; background: #888;/* CHANGED */ grid-gap: 1px;/* ADDED */ font-family: "Roboto", sans-serif; font-weight: lighter; /*padding: 1rem;*/ } .nested-3>div { /* ADDED */ background: #ddd; display: flex; justify-content: center; align-items: center; padding: 1.3rem; } .operations { font-size: 1.5rem; /*padding: 1.3rem;*/ } .bg-grey { background: #ccc; } .left-cell { background: black; } .right-cell { background: black; } .calculator { background: #333333; } /* ADDED THESE BELOW */ .nested-3>.op-right { grid-column-start: 4; grid-row-start: 1; background: #fd8a0d; } .nested-3>.op-right+.op-right { grid-row-start: 2; } .nested-3>.op-right+.op-right+.op-right { grid-row-start: 3; } .nested-3>.op-right+.op-right+.op-right+.op-right { grid-row-start: 4; } .nested-3>.op-right+.op-right+.op-right+.op-right+.op-right { grid-row-start: 5; } .zero { grid-column: span 2; } 
 <body class=""> <div class="wrapper"> <div class="left-cell"> </div> <div class="calculator"> <div class="nested-1 top-bar"> <div class="flight-modus"><img src="http://i63.tinypic.com/sebv9j.png" alt="flight mode"> &nbsp; <img src="http://i67.tinypic.com/5zqf4k.png" alt="wifi signal at full strength"></div> <div>10:10 am</div> <div class="charge-status">96% <img src="http://i67.tinypic.com/30ldxtx.png" alt="battery at near full charge"></div> </div> <div class="nested-2 result"> <div>3,658.8</div> </div> <div class="nested-3 keys"> <!-- MODIFIED HERE --> <div class="operations bg-grey">C</div> <div class="operations bg-grey">+/-</div> <div class="operations bg-grey">%</div> <div>7</div> <div>8</div> <div>9</div> <div>4</div> <div>5</div> <div>6</div> <div>1</div> <div>2</div> <div>3</div> <div class="zero">0</div> <div>.</div> <div class="operations bg-grey op-right">/</div> <div class="op-right">x</div> <div class="op-right">-</div> <div class="op-right">+</div> <div class="op-right">=</div> </div> </div> <div class="right-cell"> </div> </div> 
+2
source

It’s good that you are trying to use the grid, but just do it carefully ( https://rachelandrew.co.uk/archives/2016/03/30/should-i-use-grid-or-flexbox/ ). For your problem, I would use a grid for only three cells (left, center, and right). But I used Flexbox for your "nested-3" -box here with the intention that you can try and play a little with it.

 html{ font-size: 20px; } .wrapper{ display:grid; grid-template-columns: 1.2fr 1fr 1.2fr; grid-auto-rows: minmax(700px, auto); } .wrapper > div{ padding: 0; } .nested-1{ display:grid; grid-template-columns: repeat(3, 1fr); justify-items: center; } .nested-1 > div{ font-family: "Roboto", sans-serif; font-size: 0.6rem; color: white; } .top-bar{ padding-top: 0.3rem; } .flight-modus{ justify-self:start; padding-left: 0.3rem; } .charge-status{ justify-self:end; padding-right: 0.3rem; } .nested-2{ display: grid; grid-auto-rows: minmax(200px, auto); justify-items: end; } .nested-2 > div{ font-family: "Roboto", sans-serif; font-size: 5rem; font-weight: lighter; color: white; padding-left: 0.2rem; padding-right: 0.2rem; align-self: end; } .nested-3{ display: flex; font-size: 2.2rem; color: black; background: #ddd; font-family: "Roboto", sans-serif; font-weight: lighter; } .keys { display: flex; } .wrapper1 { flex: 1 0 75%; display: flex; flex-wrap: wrap; } .wrapper1 > div { flex: 1 0 25%; height: 94px; border: 1px solid #777; display: flex; justify-content: center; align-items: center; } .wrapper1 > div.null { flex-basis:58%; } .wrapper2 { flex: 1 0 25%; display: flex; flex-wrap: wrap; align-items: center; justify-content: center; background-color: orange; color: #fff; } .wrapper2 > div { height: 94px; border: 1px solid #777; flex: 1 0 100%; display: flex; justify-content: center; align-items: center; } .bg-grey{ background: #ccc; } .left-cell{ background: black; } .right-cell{ background: black; } .calculator{ background: #333333; } 
 <!DOCTYPE html> <html lang="en"> <!-- EDIT HEAD INFO INSIDE CODEPEN PREFS --> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <link href="https://fonts.googleapis.com/css?family=Roboto:100,300" rel="stylesheet"> <link rel="stylesheet" href="styles.css"> </head> <body class=""> <div class="wrapper"> <div class="left-cell"> </div> <div class="calculator"> <div class="nested-1 top-bar"> <div class="flight-modus"><img src="http://i63.tinypic.com/sebv9j.png" alt="flight mode"> &nbsp; <img src="http://i67.tinypic.com/5zqf4k.png" alt="wifi signal at full strength"></div> <div>10:10 am</div> <div class="charge-status">96% <img src="http://i67.tinypic.com/30ldxtx.png" alt="battery at near full charge"></div> </div> <div class="nested-2 result"> <div>3,658.8</div> </div> <div class="nested-3 keys"> <div class="wrapper1"> <div>C</div> <div>+/-</div> <div>%</div> <div>7</div> <div>8</div> <div>9</div> <div>4</div> <div>5</div> <div>6</div> <div>3</div> <div>2</div> <div>1</div> <div class="null">0</div> <div>.</div> </div> <div class="wrapper2"> <div>/</div> <div>X</div> <div>-</div> <div>+</div> <div>=</div> </div> </div> </div> <div class="right-cell"> </div> </div> </body> </html> 

Hope this helps! But I said, try to think if it makes sense to use the grid or flexibility for the little ones, thinks and looks at performance too.

+2
source

Tile borders

The easiest way to make black borders is to give the container a black background color.

 .nested-3 { background: black; } 

Then apply your foreground color to each key.

 .nested-3 > div { background: #ddd; display: flex; align-items: center; justify-content: center; } 

(Use flexbox to center the content.)

Then use the grid-gap property to create small gutters that will simulate borders.

 .nested-3 { grid-gap: 1px; } 

jsFiddle daemon

 html { font-size: 20px; } .wrapper { display: grid; grid-template-columns: 1.2fr 1fr 1.2fr; grid-auto-rows: minmax(700px, auto); } .wrapper>div { padding: 0; } .nested-1 { display: grid; grid-template-columns: repeat(3, 1fr); justify-items: center; } .nested-1>div { font-family: "Roboto", sans-serif; font-size: 0.6rem; color: white; } .top-bar { padding-top: 0.3rem; } .flight-modus { justify-self: start; padding-left: 0.3rem; } .charge-status { justify-self: end; padding-right: 0.3rem; } .nested-2 { display: grid; grid-auto-rows: minmax(200px, auto); justify-items: end; } .nested-2>div { font-family: "Roboto", sans-serif; font-size: 5rem; font-weight: lighter; color: white; padding-left: 0.2rem; padding-right: 0.2rem; align-self: end; } .nested-3 { display: grid; grid-template-columns: repeat(4, 1fr); grid-template-rows: repeat(5, 1fr); /* justify-items: center; */ text-align: center; font-size: 2.2rem; color: black; background: black; font-family: "Roboto", sans-serif; font-weight: lighter; padding: 1rem; grid-gap: 1px; } .nested-3>* { background: #ddd; display: flex; align-items: center; justify-content: center; } .operations { font-size: 1.5rem; padding: 1.3rem; } .left-cell { background: black; } .right-cell { background: black; } .calculator { background: #333333; } 
 <div class="wrapper"> <div class="left-cell"> </div> <div class="calculator"> <div class="nested-1 top-bar"> <div class="flight-modus"><img src="http://i63.tinypic.com/sebv9j.png" alt="flight mode"> &nbsp; <img src="http://i67.tinypic.com/5zqf4k.png" alt="wifi signal at full strength"></div> <div>10:10 am</div> <div class="charge-status">96% <img src="http://i67.tinypic.com/30ldxtx.png" alt="battery at near full charge"></div> </div> <div class="nested-2 result"> <div>3,658.8</div> </div> <div class="nested-3 keys"> <div class="operations">C</div> <div class="operations">+/-</div> <div class="operations">%</div> <div class="operations">/</div> <div>5</div> <div>5</div> <div>5</div> <div>5</div> <div>5</div> <div>5</div> <div>5</div> <div>5</div> <div>5</div> <div>5</div> <div>5</div> <div>5</div> <div>5</div> <div>5</div> <div>5</div> <div>5</div> </div> </div> <div class="right-cell"> </div> </div> 

Column / row background color

Standard CSS selectors can handle the task of setting background colors in rows and columns.

Line

 .operations { font-size: 1.5rem; padding: 1.3rem; background-color: orange; } 

jsFiddle daemon

 html { font-size: 20px; } .wrapper { display: grid; grid-template-columns: 1.2fr 1fr 1.2fr; grid-auto-rows: minmax(700px, auto); } .wrapper>div { padding: 0; } .nested-1 { display: grid; grid-template-columns: repeat(3, 1fr); justify-items: center; } .nested-1>div { font-family: "Roboto", sans-serif; font-size: 0.6rem; color: white; } .top-bar { padding-top: 0.3rem; } .flight-modus { justify-self: start; padding-left: 0.3rem; } .charge-status { justify-self: end; padding-right: 0.3rem; } .nested-2 { display: grid; grid-auto-rows: minmax(200px, auto); justify-items: end; } .nested-2>div { font-family: "Roboto", sans-serif; font-size: 5rem; font-weight: lighter; color: white; padding-left: 0.2rem; padding-right: 0.2rem; align-self: end; } .nested-3 { display: grid; grid-template-columns: repeat(4, 1fr); grid-template-rows: repeat(5, 1fr); /* justify-items: center; */ text-align: center; font-size: 2.2rem; color: black; background: black; font-family: "Roboto", sans-serif; font-weight: lighter; padding: 1rem; grid-gap: 1px; } .nested-3>* { background: #ddd; display: flex; align-items: center; justify-content: center; } .operations { font-size: 1.5rem; padding: 1.3rem; background-color: orange; } .left-cell { background: black; } .right-cell { background: black; } .calculator { background: #333333; } 
 <div class="wrapper"> <div class="left-cell"> </div> <div class="calculator"> <div class="nested-1 top-bar"> <div class="flight-modus"><img src="http://i63.tinypic.com/sebv9j.png" alt="flight mode"> &nbsp; <img src="http://i67.tinypic.com/5zqf4k.png" alt="wifi signal at full strength"></div> <div>10:10 am</div> <div class="charge-status">96% <img src="http://i67.tinypic.com/30ldxtx.png" alt="battery at near full charge"></div> </div> <div class="nested-2 result"> <div>3,658.8</div> </div> <div class="nested-3 keys"> <div class="operations">C</div> <div class="operations">+/-</div> <div class="operations">%</div> <div class="operations">/</div> <div>5</div> <div>5</div> <div>5</div> <div>5</div> <div>5</div> <div>5</div> <div>5</div> <div>5</div> <div>5</div> <div>5</div> <div>5</div> <div>5</div> <div>5</div> <div>5</div> <div>5</div> <div>5</div> </div> </div> <div class="right-cell"> </div> </div> 

Column

 .nested-3 > div:nth-child(4n) { background-color: orange; } .nested-3 > div:not(:nth-child(3)):nth-child(4n + 3) { background-color: red; } 

jsFiddle demo

 html { font-size: 20px; } .wrapper { display: grid; grid-template-columns: 1.2fr 1fr 1.2fr; grid-auto-rows: minmax(700px, auto); } .wrapper>div { padding: 0; } .nested-1 { display: grid; grid-template-columns: repeat(3, 1fr); justify-items: center; } .nested-1>div { font-family: "Roboto", sans-serif; font-size: 0.6rem; color: white; } .top-bar { padding-top: 0.3rem; } .flight-modus { justify-self: start; padding-left: 0.3rem; } .charge-status { justify-self: end; padding-right: 0.3rem; } .nested-2 { display: grid; grid-auto-rows: minmax(200px, auto); justify-items: end; } .nested-2>div { font-family: "Roboto", sans-serif; font-size: 5rem; font-weight: lighter; color: white; padding-left: 0.2rem; padding-right: 0.2rem; align-self: end; } .nested-3 { display: grid; grid-template-columns: repeat(4, 1fr); grid-template-rows: repeat(5, 1fr); /* justify-items: center; */ text-align: center; font-size: 2.2rem; color: black; background: black; font-family: "Roboto", sans-serif; font-weight: lighter; padding: 1rem; grid-gap: 1px; } .nested-3>* { background: #ddd; display: flex; align-items: center; justify-content: center; } .operations { font-size: 1.5rem; padding: 1.3rem; } .nested-3>div:nth-child(4n) { background-color: orange; } .nested-3>div:not(:nth-child(3)):nth-child(4n + 3) { background-color: red; } .left-cell { background: black; } .right-cell { background: black; } .calculator { background: #333333; } 
 <div class="wrapper"> <div class="left-cell"> </div> <div class="calculator"> <div class="nested-1 top-bar"> <div class="flight-modus"><img src="http://i63.tinypic.com/sebv9j.png" alt="flight mode"> &nbsp; <img src="http://i67.tinypic.com/5zqf4k.png" alt="wifi signal at full strength"></div> <div>10:10 am</div> <div class="charge-status">96% <img src="http://i67.tinypic.com/30ldxtx.png" alt="battery at near full charge"></div> </div> <div class="nested-2 result"> <div>3,658.8</div> </div> <div class="nested-3 keys"> <div class="operations">C</div> <div class="operations">+/-</div> <div class="operations">%</div> <div class="operations">/</div> <div>5</div> <div>5</div> <div>5</div> <div>5</div> <div>5</div> <div>5</div> <div>5</div> <div>5</div> <div>5</div> <div>5</div> <div>5</div> <div>5</div> <div>5</div> <div>5</div> <div>5</div> <div>5</div> </div> </div> <div class="right-cell"> </div> </div> 
+1
source

Source: https://habr.com/ru/post/1271549/


All Articles