پیش‌نمایش زنده
کد HTML
<div class="tetris-container">
  <div class="block block-L block-L-90" style="--pos-x: 3; --pos-y: 1;">
    <div class="square"></div>
    <div class="square"></div>
    <div class="square"></div>
    <div class="square"></div>
  </div>
  <div class="block block-O" style="--pos-x: 1; --pos-y: 1;">
    <div class="square"></div>
    <div class="square"></div>
    <div class="square"></div>
    <div class="square"></div>
  </div>
  <div class="block block-Z" style="--pos-x: 2; --pos-y: 2;">
    <div class="square"></div>
    <div class="square"></div>
    <div class="square"></div>
    <div class="square"></div>
  </div>
  <div class="block block-O" style="--pos-x: 4; --pos-y: 3;">
    <div class="square"></div>
    <div class="square"></div>
    <div class="square"></div>
    <div class="square"></div>
  </div>
  <div class="block block-L block-L-270" style="--pos-x: 1; --pos-y: 3;">
    <div class="square"></div>
    <div class="square"></div>
    <div class="square"></div>
    <div class="square"></div>
  </div>
  <div class="block block-I" style="--pos-x: 6; --pos-y: 1;">
    <div class="square"></div>
    <div class="square"></div>
    <div class="square"></div>
    <div class="square"></div>
  </div>
</div>
کد CSS
/*************/
/* Variables */
/*************/

.tetris-container {
  --animation-duration: 10s;
  --grid-size-x: 6;
  --grid-size-y: 9;

  --square-size: 1rem;
}

/*********/
/* Style */
/*********/

/* Container */
/*************/

/* Container */
.tetris-container {
  background: rgba(0, 0, 0, 0.1);
  border: 2px solid rgba(255, 255, 255, 0.1);
  box-sizing: content-box;
  height: calc(var(--grid-size-y) * var(--square-size));
  overflow: hidden;
  position: relative;
  width: calc(var(--grid-size-x) * var(--square-size));
}
/* Container - Grid */
.tetris-container::before {
  background-image: linear-gradient(
      rgba(255, 255, 255, 0.05) 1px,
      transparent 1px
    ),
    linear-gradient(90deg, rgba(255, 255, 255, 0.05) 1px, transparent 1px);
  background-size: var(--square-size) var(--square-size);
  content: "";
  position: absolute;
  inset: 0;
  pointer-events: none;
}

/* Blocks */
/**********/

/* Block */
.block {
  animation-duration: var(--animation-duration);
  animation-iteration-count: infinite;
  animation-name: fallBlock;
  animation-timing-function: linear;
  display: grid;
  gap: 0;
  grid-template-columns: repeat(var(--grid-size-x), var(--square-size));
  grid-template-rows: repeat(var(--grid-size-y), var(--square-size));
  position: absolute;
}
.block-I {
  color: #00ffff;
}
.block-L {
  color: #ff3e3e;
}
.block-O {
  color: #ffff00;
}
.block-S {
  color: #ff9d00;
}
.block-Z {
  color: #00ff9d;
}

/* Block's square */
.square {
  --shadow: inset 2px 2px 2px rgba(255, 255, 255, 0.4),
    inset -2px -2px 2px rgba(0, 0, 0, 0.4);

  animation-duration: var(--animation-duration);
  animation-iteration-count: infinite;
  animation-name: clearSquare;
  animation-timing-function: ease-out;
  background-color: currentColor;
  box-shadow: var(--shadow);
  grid-column-start: var(--square-pos-x);
  grid-row-start: calc(var(--grid-size-y) - var(--square-pos-y) + 1);
  height: var(--square-size);
  width: var(--square-size);
}

/***********/
/* Mapping */
/***********/

/* Block */
/*********/

.block:nth-child(1) {
  --block-index: 1;
}
.block:nth-child(2) {
  --block-index: 2;
}
.block:nth-child(3) {
  --block-index: 3;
}
.block:nth-child(4) {
  --block-index: 4;
}
.block:nth-child(5) {
  --block-index: 5;
}
.block:nth-child(6) {
  --block-index: 6;
}

/* Block's squares */
/*******************/

/* Block I - Line */
.block-I .square:nth-child(1) {
  --square-pos-x: calc(var(--pos-x) + 0);
  --square-pos-y: calc(var(--pos-y) + 0);
}
.block-I .square:nth-child(2) {
  --square-pos-x: calc(var(--pos-x) + 0);
  --square-pos-y: calc(var(--pos-y) + 1);
}
.block-I .square:nth-child(3) {
  --square-pos-x: calc(var(--pos-x) + 0);
  --square-pos-y: calc(var(--pos-y) + 2);
}
.block-I .square:nth-child(4) {
  --square-pos-x: calc(var(--pos-x) + 0);
  --square-pos-y: calc(var(--pos-y) + 3);
}

/* Block L - 90° */
.block-L-90 .square:nth-child(1) {
  --square-pos-x: calc(var(--pos-x) + 0);
  --square-pos-y: calc(var(--pos-y) + 0);
}
.block-L-90 .square:nth-child(2) {
  --square-pos-x: calc(var(--pos-x) + 1);
  --square-pos-y: calc(var(--pos-y) + 0);
}
.block-L-90 .square:nth-child(3) {
  --square-pos-x: calc(var(--pos-x) + 2);
  --square-pos-y: calc(var(--pos-y) + 0);
}
.block-L-90 .square:nth-child(4) {
  --square-pos-x: calc(var(--pos-x) + 2);
  --square-pos-y: calc(var(--pos-y) + 1);
}
/* Block L - 270° */
.block-L-270 .square:nth-child(1) {
  --square-pos-x: calc(var(--pos-x) + 0);
  --square-pos-y: calc(var(--pos-y) + 0);
}
.block-L-270 .square:nth-child(2) {
  --square-pos-x: calc(var(--pos-x) + 0);
  --square-pos-y: calc(var(--pos-y) + 1);
}
.block-L-270 .square:nth-child(3) {
  --square-pos-x: calc(var(--pos-x) + 1);
  --square-pos-y: calc(var(--pos-y) + 1);
}
.block-L-270 .square:nth-child(4) {
  --square-pos-x: calc(var(--pos-x) + 2);
  --square-pos-y: calc(var(--pos-y) + 1);
}

/* Block O - Square */
.block-O .square:nth-child(1) {
  --square-pos-x: calc(var(--pos-x) + 0);
  --square-pos-y: calc(var(--pos-y) + 0);
}
.block-O .square:nth-child(2) {
  --square-pos-x: calc(var(--pos-x) + 1);
  --square-pos-y: calc(var(--pos-y) + 0);
}
.block-O .square:nth-child(3) {
  --square-pos-x: calc(var(--pos-x) + 0);
  --square-pos-y: calc(var(--pos-y) + 1);
}
.block-O .square:nth-child(4) {
  --square-pos-x: calc(var(--pos-x) + 1);
  --square-pos-y: calc(var(--pos-y) + 1);
}

/* Block Z - Snake to left */
.block-Z .square:nth-child(1) {
  --square-pos-x: calc(var(--pos-x) + 1);
  --square-pos-y: calc(var(--pos-y) + 0);
}
.block-Z .square:nth-child(2) {
  --square-pos-x: calc(var(--pos-x) + 2);
  --square-pos-y: calc(var(--pos-y) + 0);
}
.block-Z .square:nth-child(3) {
  --square-pos-x: calc(var(--pos-x) + 0);
  --square-pos-y: calc(var(--pos-y) + 1);
}
.block-Z .square:nth-child(4) {
  --square-pos-x: calc(var(--pos-x) + 1);
  --square-pos-y: calc(var(--pos-y) + 1);
}

/**************/
/* Animations */
/**************/

/* Block - Makes block fall */
@keyframes fallBlock {
  0% {
    bottom: calc(100% * max(0, calc(var(--block-index) - 0)));
  }
  13% {
    bottom: calc(100% * max(0, calc(var(--block-index) - 1)));
  }
  26% {
    bottom: calc(100% * max(0, calc(var(--block-index) - 2)));
  }
  39% {
    bottom: calc(100% * max(0, calc(var(--block-index) - 3)));
  }
  52% {
    bottom: calc(100% * max(0, calc(var(--block-index) - 4)));
  }
  65% {
    bottom: calc(100% * max(0, calc(var(--block-index) - 5)));
  }
  78% {
    bottom: calc(100% * max(0, calc(var(--block-index) - 6)));
  }

  90% {
    opacity: 1;
  }
  95% {
    opacity: 0;
  }

  100% {
    opacity: 0;
  }
}

/* Square - Clear squares */
@keyframes clearSquare {
  0% {
    background: currentColor;
    box-shadow: var(--shadow);
  }

  85% {
    background: currentColor;
    box-shadow: var(--shadow);
  }
  95% {
    background: #fff;
    box-shadow: none;
  }

  100% {
    background: #fff;
    box-shadow: none;
  }
}
نوع: loader
تاریخ ایجاد: 2026/06/06
آخرین بروزرسانی: 2026/06/06