Here’s one way to do this.
I have changed the HTML markup and haven’t used grid-template-areas property. Each grid item is placed in the grid automatically in the order they are placed in the HTML markup.
Its a 4 x 4 grid where first and last columns are 120px in size and middle 2 columns are 75px each. Similarly first and last rows are 120px in size and middle 2 rows are 75px each.
To rotate grid items, i have created individual classes and applied appropriate rotation class on individual grid items which need to be rotated.
* {
box-sizing: border-box;
}
.board {
display: grid;
grid-template-columns: 120px repeat(2, 75px) 120px;
grid-template-rows: 120px repeat(2, 75px) 120px;
justify-content: center;
}
.lg-box {
text-align: center;
background: #999;
border: 1px solid;
overflow: hidden;
}
.sm-box {
width: 100%;
background: blue;
background: red;
height: 100%;
position: relative;
border: 1px solid;
overflow: hidden;
}
.sm-box div {
background: #fff;
height: 85%;
width: 100%;
display: flex;
flex-direction: column;
justify-content: space-between;
text-align: center;
position: absolute;
bottom: 0;
padding: 5px;
}
.lg-box-centered {
background: #fff;
grid-row: 2 / span 2;
grid-column: 2 / span 2;
}
.rot-180 {
transform: rotate(180deg);
}
.lg-rot,
.lg-box-centered {
height: 100%;
display: flex;
align-items: center;
justify-content: center;
}
.rot-135 {
transform: rotate(135deg);
}
.rot-45-reverse {
transform: rotate(-45deg);
}
.rot-45 {
transform: rotate(45deg);
}
.rot-135-reverse {
transform: rotate(-135deg);
}
.rot-90 {
transform: rotate(90deg);
}
.rot-90-reverse {
transform: rotate(-90deg);
}
.sm-box .rot-90,
.sm-box .rot-90-reverse {
position: absolute;
left: 12px;
top: -12px;
width: 75px;
height: 100px;
}
.sm-box .rot-90-reverse {
left: initial;
right: 12px;
}
<div class="board">
<div class="lg-box">
<div class="lg-rot rot-135">Just Visiting</div>
</div>
<div class="sm-box rot-180">
<div>
<span class="title">Title 5</span>
<span class="price">Price 5</span>
</div>
</div>
<div class="sm-box rot-180">
<div>
<span class="title">Title 6</span>
<span class="price">Price 6</span>
</div>
</div>
<div class="lg-box">
<div class="lg-rot rot-135-reverse">Jail</div>
</div>
<div class="sm-box">
<div class="rot-90">
<span class="title">Title 4</span>
<span class="price">Price 4</span>
</div>
</div>
<div class="sm-box">
<div class="rot-90-reverse">
<span class="title">Title 7</span>
<span class="price">Price 7</span>
</div>
</div>
<div class="lg-box-centered">center</div>
<div class="sm-box">
<div class="rot-90">
<span class="title">Title 3</span>
<span class="price">Price 3</span>
</div>
</div>
<div class="sm-box">
<div class="rot-90-reverse">
<span class="title">Title 8</span>
<span class="price">Price 8</span>
</div>
</div>
<div class="lg-box">
<div class="lg-rot rot-45">Just Visiting</div>
</div>
<div class="sm-box">
<div>
<span class="title">Title 2</span>
<span class="price">Price 2</span>
</div>
</div>
<div class="sm-box">
<div>
<span class="title">Title 1</span>
<span class="price">Price 1</span>
</div>
</div>
<div class="lg-box">
<div class="lg-rot rot-45-reverse">Go</div>
</div>
</div>
Here’s an alternative approach with 7 x 7 grid and uses writing-mode property. Only difference between this approach and the previous one is that it uses writing-mode property to properly align text within small boxes from row number 2 to row number 6.
* {
box-sizing: border-box;
}
.board {
display: grid;
grid-template-columns: 120px repeat(5, 75px) 120px;
grid-template-rows: 120px repeat(5, 75px) 120px;
justify-content: center;
}
.lg-box {
text-align: center;
background: #999;
border: 1px solid;
overflow: hidden;
}
.sm-box {
width: 100%;
background: blue;
background: red;
height: 100%;
position: relative;
border: 1px solid;
overflow: hidden;
}
.sm-box div {
background: #fff;
height: 85%;
width: 100%;
display: flex;
flex-direction: column;
justify-content: space-between;
text-align: center;
position: absolute;
bottom: 0;
padding: 5px;
}
.lg-box-centered {
background: #fff;
grid-row: 2 / span 5;
grid-column: 2 / span 5;
}
.rot-180 {
transform: rotate(180deg);
}
.lg-rot,
.lg-box-centered {
height: 100%;
display: flex;
align-items: center;
justify-content: center;
}
.rot-135 {
transform: rotate(135deg);
}
.rot-45-reverse {
transform: rotate(-45deg);
}
.rot-45 {
transform: rotate(45deg);
}
.rot-135-reverse {
transform: rotate(-135deg);
}
.sm-box .rot-90,
.sm-box .rot-90-reverse {
height: 75px;
width: 85%;
writing-mode: vertical-rl;
position: absolute;
left: -10px;
}
.sm-box .rot-90-reverse {
transform: rotate(180deg);
right: 10px;
}
<div class="board">
<div class="lg-box">
<div class="lg-rot rot-135">Just Visiting</div>
</div>
<div class="sm-box rot-180">
<div>
<span class="title">Title 11</span>
<span class="price">Price 11</span>
</div>
</div>
<div class="sm-box rot-180">
<div>
<span class="title">Title 12</span>
<span class="price">Price 12</span>
</div>
</div>
<div class="sm-box rot-180">
<div>
<span class="title">Title 13</span>
<span class="price">Price 13</span>
</div>
</div>
<div class="sm-box rot-180">
<div>
<span class="title">Title 14</span>
<span class="price">Price 14</span>
</div>
</div>
<div class="sm-box rot-180">
<div>
<span class="title">Title 15</span>
<span class="price">Price 15</span>
</div>
</div>
<div class="lg-box">
<div class="lg-rot rot-135-reverse">Jail</div>
</div>
<div class="sm-box">
<div class="rot-90">
<span class="title">Title 10</span>
<span class="price">Price 10</span>
</div>
</div>
<div class="sm-box">
<div class="rot-90-reverse">
<span class="title">Title 16</span>
<span class="price">Price 16</span>
</div>
</div>
<div class="sm-box">
<div class="rot-90">
<span class="title">Title 9</span>
<span class="price">Price 9</span>
</div>
</div>
<div class="sm-box">
<div class="rot-90-reverse">
<span class="title">Title 17</span>
<span class="price">Price 17</span>
</div>
</div>
<div class="lg-box-centered">center</div>
<div class="sm-box">
<div class="rot-90">
<span class="title">Title 8</span>
<span class="price">Price 8</span>
</div>
</div>
<div class="sm-box">
<div class="rot-90-reverse">
<span class="title">Title 18</span>
<span class="price">Price 18</span>
</div>
</div>
<div class="sm-box">
<div class="rot-90">
<span class="title">Title 7</span>
<span class="price">Price 7</span>
</div>
</div>
<div class="sm-box">
<div class="rot-90-reverse">
<span class="title">Title 19</span>
<span class="price">Price 19</span>
</div>
</div>
<div class="sm-box">
<div class="rot-90">
<span class="title">Title 6</span>
<span class="price">Price 6</span>
</div>
</div>
<div class="sm-box">
<div class="rot-90-reverse">
<span class="title">Title 20</span>
<span class="price">Price 20</span>
</div>
</div>
<div class="lg-box">
<div class="lg-rot rot-45">Just Visiting</div>
</div>
<div class="sm-box">
<div>
<span class="title">Title 5</span>
<span class="price">Price 5</span>
</div>
</div>
<div class="sm-box">
<div>
<span class="title">Title 4</span>
<span class="price">Price 4</span>
</div>
</div>
<div class="sm-box">
<div>
<span class="title">Title 3</span>
<span class="price">Price 3</span>
</div>
</div>
<div class="sm-box">
<div>
<span class="title">Title 2</span>
<span class="price">Price 2</span>
</div>
</div>
<div class="sm-box">
<div>
<span class="title">Title 1</span>
<span class="price">Price 1</span>
</div>
</div>
<div class="lg-box">
<div class="lg-rot rot-45-reverse">Go</div>
</div>
</div>
Here’s a 7 x 7 board using first approach
* {
box-sizing: border-box;
}
.board {
display: grid;
grid-template-columns: 120px repeat(5, 75px) 120px;
grid-template-rows: 120px repeat(5, 75px) 120px;
justify-content: center;
}
.lg-box {
text-align: center;
background: #999;
border: 1px solid;
overflow: hidden;
}
.sm-box {
width: 100%;
background: blue;
background: red;
height: 100%;
position: relative;
border: 1px solid;
overflow: hidden;
}
.sm-box div {
background: #fff;
height: 85%;
width: 100%;
display: flex;
flex-direction: column;
justify-content: space-between;
text-align: center;
position: absolute;
bottom: 0;
padding: 5px;
}
.lg-box-centered {
background: #fff;
grid-row: 2 / span 5;
grid-column: 2 / span 5;
}
.rot-180 {
transform: rotate(180deg);
}
.lg-rot,
.lg-box-centered {
height: 100%;
display: flex;
align-items: center;
justify-content: center;
}
.rot-135 {
transform: rotate(135deg);
}
.rot-45-reverse {
transform: rotate(-45deg);
}
.rot-45 {
transform: rotate(45deg);
}
.rot-135-reverse {
transform: rotate(-135deg);
}
.rot-90 {
transform: rotate(90deg);
}
.rot-90-reverse {
transform: rotate(-90deg);
}
.sm-box .rot-90,
.sm-box .rot-90-reverse {
position: absolute;
left: 12px;
top: -12px;
width: 75px;
height: 100px;
}
.sm-box .rot-90-reverse {
left: initial;
right: 12px;
}
<div class="board">
<div class="lg-box">
<div class="lg-rot rot-135">Just Visiting</div>
</div>
<div class="sm-box rot-180">
<div>
<span class="title">Title 11</span>
<span class="price">Price 11</span>
</div>
</div>
<div class="sm-box rot-180">
<div>
<span class="title">Title 12</span>
<span class="price">Price 12</span>
</div>
</div>
<div class="sm-box rot-180">
<div>
<span class="title">Title 13</span>
<span class="price">Price 13</span>
</div>
</div>
<div class="sm-box rot-180">
<div>
<span class="title">Title 14</span>
<span class="price">Price 14</span>
</div>
</div>
<div class="sm-box rot-180">
<div>
<span class="title">Title 15</span>
<span class="price">Price 15</span>
</div>
</div>
<div class="lg-box">
<div class="lg-rot rot-135-reverse">Jail</div>
</div>
<div class="sm-box">
<div class="rot-90">
<span class="title">Title 10</span>
<span class="price">Price 10</span>
</div>
</div>
<div class="sm-box">
<div class="rot-90-reverse">
<span class="title">Title 16</span>
<span class="price">Price 16</span>
</div>
</div>
<div class="sm-box">
<div class="rot-90">
<span class="title">Title 9</span>
<span class="price">Price 9</span>
</div>
</div>
<div class="sm-box">
<div class="rot-90-reverse">
<span class="title">Title 17</span>
<span class="price">Price 17</span>
</div>
</div>
<div class="lg-box-centered">center</div>
<div class="sm-box">
<div class="rot-90">
<span class="title">Title 8</span>
<span class="price">Price 8</span>
</div>
</div>
<div class="sm-box">
<div class="rot-90-reverse">
<span class="title">Title 18</span>
<span class="price">Price 18</span>
</div>
</div>
<div class="sm-box">
<div class="rot-90">
<span class="title">Title 7</span>
<span class="price">Price 7</span>
</div>
</div>
<div class="sm-box">
<div class="rot-90-reverse">
<span class="title">Title 19</span>
<span class="price">Price 19</span>
</div>
</div>
<div class="sm-box">
<div class="rot-90">
<span class="title">Title 6</span>
<span class="price">Price 6</span>
</div>
</div>
<div class="sm-box">
<div class="rot-90-reverse">
<span class="title">Title 20</span>
<span class="price">Price 20</span>
</div>
</div>
<div class="lg-box">
<div class="lg-rot rot-45">Just Visiting</div>
</div>
<div class="sm-box">
<div>
<span class="title">Title 5</span>
<span class="price">Price 5</span>
</div>
</div>
<div class="sm-box">
<div>
<span class="title">Title 4</span>
<span class="price">Price 4</span>
</div>
</div>
<div class="sm-box">
<div>
<span class="title">Title 3</span>
<span class="price">Price 3</span>
</div>
</div>
<div class="sm-box">
<div>
<span class="title">Title 2</span>
<span class="price">Price 2</span>
</div>
</div>
<div class="sm-box">
<div>
<span class="title">Title 1</span>
<span class="price">Price 1</span>
</div>
</div>
<div class="lg-box">
<div class="lg-rot rot-45-reverse">Go</div>
</div>
</div>