HTML
1
<h1>Animated Mondrian</h1>
2
<div class="grid">
3
<div class="cell"></div>
4
<div class="cell"></div>
5
<div class="cell"></div>
6
<div class="cell"></div>
7
<div class="cell"></div>
8
<div class="cell"></div>
9
<div class="cell"></div>
10
<div class="cell"></div>
11
<div class="cell"></div>
12
<div class="cell"></div>
13
<div class="cell"></div>
14
<div class="cell"></div>
15
<div class="cell"></div>
16
<div class="cell"></div>
17
<div class="cell"></div>
18
<div class="cell"></div>
19
<div class="cell"></div>
20
<div class="cell"></div>
21
<div class="cell"></div>
22
</div>
23
<div class="warning">
24
<p>ℹ️ You are using Chrome but need at least version 107 to check this demo</p>
25
</div>
CSS
x
137
1
@keyframes animate-columns {
2
0% {
3
grid-template-columns: 17vmin 8vmin 5vmin 7vmin 10vmin 15vmin 15vmin;
4
grid-template-rows: 4vmin 9vmin 15vmin 7vmin 13vmin 8vmin 5vmin;
5
}
6
25% {
7
grid-template-columns: 10vmin 8vmin 15vmin 5vmin 7vmin 15vmin 17vmin;
8
grid-template-rows: 15vmin 4vmin 7vmin 8vmin 5vmin 13vmin 9vmin;
9
}
10
50% {
11
grid-template-columns: 15vmin 10vmin 17vmin 5vmin 7vmin 15vmin 8vmin;
12
grid-template-rows: 4vmin 9vmin 5vmin 13vmin 7vmin 8vmin 15vmin;
13
}
14
75% {
15
grid-template-columns: 8vmin 5vmin 7vmin 15vmin 17vmin 15vmin 10vmin;
16
grid-template-rows: 13vmin 4vmin 15vmin 9vmin 5vmin 7vmin 8vmin;
17
}
18
100% {
19
grid-template-columns: 10vmin 8vmin 5vmin 7vmin 15vmin 15vmin 17vmin;
20
grid-template-rows: 4vmin 15vmin 9vmin 7vmin 8vmin 5vmin 13vmin;
21
}
22
}
23
24
.grid {
25
display: grid;
26
gap: 2vmin;
27
padding: 2vmin;
28
grid-template-columns: 17vmin 8vmin 5vmin 7vmin 10vmin 15vmin 15vmin;
29
grid-template-rows: 4vmin 9vmin 15vmin 7vmin 13vmin 8vmin 5vmin;
30
align-items: stretch;
31
justify-items: stretch;
32
background: #333;
33
34
animation: animate-columns 30s ease-in-out infinite alternate;
35
}
36
37
.grid > * {
38
width: 100%;
39
background: rgb(0 0 0);
40
41
--light1: #e5eeeb;
42
--light2: #f2e7d5;
43
--light3: #fcfde7;
44
--light4: #dfe5d0;
45
--light5: #e3ded9;
46
--yellow1: #f2c968;
47
--yellow2: #edcc6b;
48
--red1: #d62d24;
49
--red2: #d73630;
50
--dark1: #130409;
51
--dark2: #0b0205;
52
--dark3: #c0bfba;
53
--blue: #241785;
54
}
55
56
.grid > :nth-child(1n) {
57
background: var(--light1);
58
}
59
.grid > :nth-child(2n) {
60
background: var(--light2);
61
}
62
.grid > :nth-child(3n) {
63
background: var(--yellow1);
64
}
65
.grid > :nth-child(4n) {
66
background: var(--light5);
67
}
68
69
.grid > :nth-child(1) {
70
background: var(--red1);
71
}
72
.grid > :nth-child(2) {
73
grid-column: span 2;
74
background: var(--light3);
75
}
76
.grid > :nth-child(5) {
77
grid-column: span 2;
78
grid-row: span 3;
79
background: var(--yellow1);
80
}
81
.grid > :nth-child(9),
82
.grid > :nth-child(13) {
83
grid-row: span 2;
84
background: var(--yellow2);
85
}
86
.grid > :nth-child(7) {
87
grid-column: span 3;
88
grid-row: span 2;
89
background: var(--blue);
90
}
91
.grid > :nth-child(8) {
92
background: var(--dark3);
93
}
94
.grid > :nth-child(9) {
95
background: var(--light5);
96
}
97
.grid > :nth-child(10) {
98
grid-column: span 3;
99
grid-row: span 4;
100
background: var(--light1);
101
}
102
.grid > :nth-child(12),
103
.grid > :nth-child(17) {
104
grid-row: span 2;
105
}
106
.grid > :nth-child(14),
107
.grid > :nth-child(6) {
108
grid-row: span 3;
109
background: var(--light3);
110
}
111
.grid > :nth-child(16) {
112
background: var(--red2);
113
}
114
.grid > :nth-child(18) {
115
background: var(--dark1);
116
}
117
118
html,
119
body {
120
height: 100%;
121
width: 100%;
122
margin: 0;
123
padding: 0;
124
background: #fcfcfc;
125
}
126
127
body {
128
display: grid;
129
place-content: center;
130
text-align: center;
131
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica,
132
Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
133
}
134
135
.warning {
136
display: none;
137
}
JAVASCRIPT
xxxxxxxxxx
1
13
1
const showWarningInChromiumWithNoSupport = () => {
2
if (!navigator.userAgentData || !navigator.userAgentData.brands) return;
3
4
const chromium = navigator.userAgentData.brands.filter(
5
(b) => b.brand == "Chromium"
6
);
7
if (!chromium) return;
8
9
if (chromium[0].version >= 107) return;
10
document.querySelector(".warning").style.display = "block";
11
};
12
13
showWarningInChromiumWithNoSupport();