效果演示
实现了一个网格布局,其中每个网格是一个复选框,可以选择是否显示。每个复选框都有一个漂浮的天花板,表示它是一个房间的天花板。每个房间的天花板都有一个不同的形状和颜色,分别对应不同的房间。整个页面的背景是一个由两种颜色组成的渐变背景,其中一种颜色在页面顶部,另一种颜色在页面底部。整个页面的布局非常简洁,适合用于显示房间的天花板和选择是否显示。
Code
<form>
<fieldset class="roof left">
<input type="checkbox">
<input type="checkbox">
<input type="checkbox">
<input type="checkbox">
<input type="checkbox">
<input type="checkbox" checked>
<input type="checkbox">
<input type="checkbox" checked>
<input type="checkbox">
<input type="checkbox">
<input type="checkbox">
<input type="checkbox">
<input type="checkbox" checked>
<input type="checkbox">
<input type="checkbox" checked>
<input type="checkbox">
<input type="checkbox">
<input type="checkbox" checked>
<input type="checkbox">
<input type="checkbox">
</fieldset>
<fieldset class="roof" style="--windows:2;">
<input type="checkbox">
<input type="checkbox">
<input type="checkbox" checked>
<input type="checkbox" checked>
<input type="checkbox">
<input type="checkbox">
<input type="checkbox">
<input type="checkbox" checked>
<input type="checkbox">
<input type="checkbox">
</fieldset>
<fieldset class="roof center" style="--windows:2;gap:1vw;">
<input type="checkbox" checked>
<input type="checkbox">
<input type="checkbox">
<input type="checkbox">
<input type="checkbox" checked>
<input type="checkbox" checked>
<input type="checkbox">
<input type="checkbox">
<input type="checkbox">
<input type="checkbox" checked>
<input type="checkbox">
<input type="checkbox">
<input type="checkbox" checked>
<input type="checkbox">
<input type="checkbox">
<input type="checkbox" checked>
<input type="checkbox">
<input type="checkbox">
</fieldset>
<fieldset class="roof" style="--windows:3;--gap:1.5vw;">
<input type="checkbox" checked>
<input type="checkbox">
<input type="checkbox">
<input type="checkbox" checked>
<input type="checkbox">
<input type="checkbox">
<input type="checkbox">
<input type="checkbox">
<input type="checkbox">
<input type="checkbox">
<input type="checkbox" checked>
<input type="checkbox">
<input type="checkbox">
<input type="checkbox" checked>
<input type="checkbox">
<input type="checkbox">
<input type="checkbox">
<input type="checkbox">
</fieldset>
<fieldset class="roof antenna" style="--gap:.75vw;">
<input type="checkbox">
<input type="checkbox" checked>
<input type="checkbox">
<input type="checkbox" checked>
<input type="checkbox">
<input type="checkbox">
<input type="checkbox" checked>
<input type="checkbox">
<input type="checkbox">
<input type="checkbox">
<input type="checkbox">
<input type="checkbox">
<input type="checkbox" checked>
<input type="checkbox">
<input type="checkbox" checked>
<input type="checkbox">
<input type="checkbox">
<input type="checkbox">
<input type="checkbox" checked>
<input type="checkbox">
<input type="checkbox">
<input type="checkbox">
<input type="checkbox">
<input type="checkbox">
<input type="checkbox" checked>
<input type="checkbox">
<input type="checkbox" checked>
<input type="checkbox">
<input type="checkbox">
<input type="checkbox">
<input type="checkbox" checked>
<input type="checkbox">
</fieldset>
</form>
body {
background: linear-gradient(200deg, hsl(190, 10%, 10%), hsl(220, 30%, 30%)) no-repeat;
background-attachment: fixed;
display: grid;
height: 100%;
margin: 0;
padding: 0 1vw;
}
fieldset {
background: hsl(190, 10%, 10%);
border: 0;
display: grid;
gap: var(--gap, 2vw);
grid-template-columns: repeat(var(--windows, 4), 1fr);
margin: 0;
padding: var(--p, 3vw 2vw);
position: relative;
}
[type=checkbox] {
all: unset;
aspect-ratio: 1 / 1.25;
background: hsl(190, 10%, 20%);
transition: background .3s ease-in;
width: 100%;
&:checked {
background: #ffffae;
}
}
form {
align-items: end;
align-self: end;
display: grid;
gap: 1vw;
grid-auto-flow: column;
max-height: 85vh;
}
html {
display: grid;
min-height: 100vh;
}
/* Roofs */
.antenna {
--asr: 1 / 1;
--clp: polygon(25% 100%, 25% 75%, 45% 75%, 45% 0, 55% 0%, 55% 75%, 75% 75%, 75% 100%);
}
.center {
--asr: 1 / .4;
--clp: polygon(0 100%, 50% 0, 100% 100%);
}
.left {
--asr: 1 / .25;
--clp: polygon(0 0, 100% 100%, 0 100%);
}
.roof {
&::before {
aspect-ratio: var(--asr, 1 / .4);
background-color: inherit;
clip-path: var(--clp, polygon(0 100%, 100% 0, 100% 100%));
content: "";
position: absolute;
bottom: calc(100% - 1px);
width: 100%;
}
}
实现思路拆分
body {
background: linear-gradient(200deg, hsl(190, 10%, 10%), hsl(220, 30%, 30%)) no-repeat;
background-attachment: fixed;
display: grid;
height: 100%;
margin: 0;
padding: 0 1vw;
}
这段代码定义了页面的样式。其中,background
属性定义了页面的背景,使用了渐变背景,其中第一组颜色为hsl(190, 10%, 10%)
,第二组颜色为hsl(220, 30%, 30%)
,使用了linear-gradient
函数。background-attachment
属性设置为fixed
,表示背景不会随着页面滚动而移动。display
属性设置为grid
,表示使用网格布局。height
属性设置为100%
,表示页面的高度为整个屏幕的高度。margin
属性设置为0
,表示页面没有外边距。padding
属性设置为0 1vw
,表示页面的内边距为左右各1vw。
fieldset {
background: hsl(190, 10%, 10%);
border: 0;
display: grid;
gap: var(--gap, 2vw);
grid-template-columns: repeat(var(--windows, 4), 1fr);
margin: 0;
padding: var(--p, 3vw 2vw);
position: relative;
}
这段代码定义了复选框的样式。其中,background
属性定义了复选框的背景,使用了hsl(190, 10%, 10%)
。border
属性设置为0
,表示复选框没有边框。display
属性设置为grid
,表示使用网格布局。gap
属性设置为var(--gap, 2vw)
,表示网格之间的间距,如果没有设置--gap
变量,则默认为2vw。grid-template-columns
属性设置为repeat(var(--windows, 4), 1fr)
,表示网格的列数,如果没有设置--windows
变量,则默认为4列。margin
属性设置为0
,表示复选框没有外边距。padding
属性设置为var(--p, 3vw 2vw)
,表示复选框的内边距,如果没有设置--p
变量,则默认为3vw 2vw。position
属性设置为relative
,表示复选框的定位方式为相对定位。
[type=checkbox] {
all: unset;
aspect-ratio: 1 / 1.25;
background: hsl(190, 10%, 20%);
transition: background.3s ease-in;
width: 100%;
&:checked {
background: #ffffae;
}
}
这段代码定义了复选框的样式。其中,all: unset;
表示清除所有默认样式。aspect-ratio
属性设置为1 / 1.25
,表示复选框的宽高比为1:1.25。background
属性定义了复选框的背景,使用了hsl(190, 10%, 20%)
。transition
属性定义了复选框的过渡效果,表示背景颜色的变化效果需要300毫秒,使用了ease-in
函数。width
属性设置为100%
,表示复选框的宽度为100%。:checked
伪类表示复选框被选中时的样式,其中background
属性定义了复选框被选中的背景颜色,使用了#ffffae
。
form {
align-items: end;
align-self: end;
display: grid;
gap: 1vw;
grid-auto-flow: column;
max-height: 85vh;
}
这段代码定义了复选框的样式。其中,align-items: end;
表示表单元素在交叉轴上对齐方式为右对齐。align-self: end;
表示表单元素在交叉轴上对齐方式为右对齐。display
属性设置为`grid
html {
display: grid;
min-height: 100vh;
}
这段代码定义了整个页面的样式。其中,display
属性设置为grid
,表示使用网格布局。min-height
属性设置为100vh
,表示页面的最小高度为整个屏幕的高度。
.antenna {
--asr: 1 / 1;
--clp: polygon(25% 100%, 25% 75%, 45% 75%, 45% 0, 55% 0%, 55% 75%, 75% 75%, 75% 100%);
}
.center {
--asr: 1 /.4;
--clp: polygon(0 100%, 50% 0, 100% 100%);
}
.left {
--asr: 1 /.25;
--clp: polygon(0 0, 100% 100%, 0 100%);
}
.roof {
&::before {
aspect-ratio: var(--asr, 1 /.4);
background-color: inherit;
clip-path: var(--clp, polygon(0 100%, 100% 0, 100% 100%));
content: "";
position: absolute;
bottom: calc(100% - 1px);
width: 100%;
}
}
这段代码定义了房间的天花板的样式。其中,.antenna
类定义了天花板的样式,其中--asr
变量定义了天花板的宽高比,--clp
变量定义了天花板的形状。.center
类定义了中央天花板的样式,其中--asr
变量定义了天花板的宽高比,--clp
变量定义了天花板的形状。.left
类定义了左侧天花板的样式,其中--asr
变量定义了天花板的宽高比,--clp
变量定义了天花板的形状。.roof
类定义了房屋的屋顶的样式,其中::before
伪元素定义了房屋的屋顶的背景,其中aspect-ratio
属性定义了背景的宽高比,background-color
属性定义了背景的颜色,clip-path
属性定义了背景的形状,content
属性定义了伪元素的内容,position
属性定义了伪元素的定位方式,bottom
属性定义了伪元素距离底部的距离,width
属性定义了伪元素的宽度。