3 sty 2020

Animacja kart css

card animation
Mały przerywnik, coś miłego dla oka - animacja kart.
Każda z kart składa się z nagłówka w którym jest ikona, oraz sekcji z opisem i buttonem "więcej". Powiedzmy 3 karty w rzędzie a gdy zmniejszymy stronę karty ustawiają się w pionie.

Zacznijmy od ikon, tutaj opisałem dokładnie jak dodajemy obecnie ikony svg do strony - nowy sposób serwowania ikon SVG

Najpierw ikony które dodajemy na górze strony.

<svg xmlns="http://www.w3.org/2000/svg" style="display: none;">
  <symbol id="lightning" viewBox="0 0 32 32">
    <path
      d="M12 24l2 2-2 6 6-6-2-2 2-4-6 4zM32 8.427c0-3.072-2.5-5.57-5.573-5.57-.15 0-.298.005-.447.017C24.535 1.072 22.356 0 20 0c-2.355 0-4.535 1.072-5.98 2.874-.148-.012-.298-.017-.449-.017-3.07 0-5.57 2.499-5.57 5.57 0 .322.043.633.094.94-.034.044-.074.085-.107.13-.327-.047-.655-.07-.987-.07-3.859 0-7 3.141-7 7s3.141 7 7 7c.856 0 1.693-.156 2.482-.458.069.06.151.102.221.16l1.77-1.18c-.59-.418-1.141-.883-1.602-1.438-.813.572-1.801.915-2.871.915-2.762 0-5-2.237-5-5 0-2.76 2.238-5 5-5 .676 0 1.316.138 1.902.38.035-.068.078-.125.113-.19.352-.642.785-1.229 1.292-1.753 1.443-1.493 3.448-2.438 5.693-2.438 3.107 0 5.771 1.792 7.096 4.38.353-.146.729-.24 1.117-.302l.787-.078c.771 0 1.492.19 2.145.5.707.339 1.314.836 1.79 1.45.656.845 1.065 1.896 1.065 3.05 0 2.763-2.238 5-5 5-1.07 0-2.057-.344-2.871-.915-.875 1.055-2.027 1.848-3.322 2.348l-.374.746 1.141 1.141c1.066-.415 2.064-1.012 2.944-1.777.789.302 1.626.458 2.482.458 3.859 0 7-3.141 7-7 0-1.604-.565-3.068-1.479-4.25.911-.992 1.479-2.301 1.479-3.75zm-2.902 2.352c-1.155-.84-2.563-1.352-4.098-1.352-.332 0-.66.023-.987.07-1.867-2.543-4.814-4.07-8.013-4.07-2.133 0-4.145.691-5.809 1.897.467-1.428 1.796-2.467 3.379-2.467.484 0 .941.098 1.359.271C15.878 3.279 17.781 2 19.999 2s4.122 1.279 5.068 3.128c.421-.173.88-.271 1.359-.271 1.974 0 3.573 1.599 3.573 3.57 0 .906-.348 1.723-.902 2.352z" />
  </symbol>
  <symbol id="wind" viewBox="0 0 32 32">
    <path
      d="M26.938 12c-1.656 0-3 1.344-3 3 0 .353.073.685.184 1H4.938c-.552 0-1 .448-1 1s.448 1 1 1h22c1.656 0 3-1.344 3-3s-1.344-3-3-3zm-22 2h12c1.656 0 3-1.344 3-3s-1.344-3-3-3-3 1.344-3 3c0 .353.073.685.184 1H4.938c-.552 0-1 .448-1 1s.448 1 1 1zm16 6c-.059 0-.115.013-.174.018-.039-.003-.072-.018-.111-.018H5.225c-.711 0-1.287.448-1.287 1s.576 1 1.287 1h12.897c-.111.315-.184.648-.184 1 0 1.656 1.344 3 3 3s3-1.344 3-3-1.344-3-3-3z" />
  </symbol>
  <symbol id="sun" viewBox="0 0 32 32">
    <path
      d="M16 9c-3.859 0-7 3.141-7 7s3.141 7 7 7 7-3.141 7-7-3.141-7-7-7zm0 12c-2.762 0-5-2.238-5-5s2.238-5 5-5 5 2.238 5 5-2.238 5-5 5zm0-14c.552 0 1-.448 1-1V4c0-.552-.448-1-1-1s-1 .448-1 1v2c0 .552.448 1 1 1zm0 18c-.552 0-1 .448-1 1v2c0 .552.448 1 1 1s1-.448 1-1v-2c0-.552-.448-1-1-1zm7.777-15.365l1.414-1.414c.391-.391.391-1.023 0-1.414s-1.023-.391-1.414 0l-1.414 1.414c-.391.391-.391 1.023 0 1.414s1.023.391 1.414 0zM8.223 22.365l-1.414 1.414c-.391.391-.391 1.023 0 1.414s1.023.391 1.414 0l1.414-1.414c.391-.392.391-1.023 0-1.414s-1.023-.392-1.414 0zM7 16c0-.552-.448-1-1-1H4c-.552 0-1 .448-1 1s.448 1 1 1h2c.552 0 1-.448 1-1zm21-1h-2c-.552 0-1 .448-1 1s.448 1 1 1h2c.552 0 1-.448 1-1s-.448-1-1-1zM8.221 9.635c.391.391 1.024.391 1.414 0s.391-1.023 0-1.414L8.221 6.807c-.391-.391-1.023-.391-1.414 0s-.391 1.023 0 1.414l1.414 1.414zm15.558 12.728c-.392-.391-1.023-.391-1.414 0s-.392 1.023 0 1.414l1.414 1.414c.391.391 1.023.391 1.414 0s.391-1.023 0-1.414l-1.414-1.414z" />
  </symbol>
</svg>

Teraz najważniejsza część html, nie ma się co rozwodzić na nim.

<div class="container">
  <div class="card">
    <div class="icons">
      <svg class="icon">
        <use xlink:href="#lightning"></use>
      </svg>
    </div>
    <div class="info">
      <div class="info__text">
        Gwałtowne burze i błyskawice nawiedzają amerykański stan Waszyngton od początku września. Jeden z filmowców
        postanowił uchwycić piękno i potęgę zjawiska, nie narażając przy tym swojego...
      </div>
      <div class="button">więcej</div>
    </div>
  </div>
  <div class="card">
    <div class="icons">
      <svg class="icon">
        <use xlink:href="#wind"></use>
      </svg>
    </div>
    <div class="info">
      <div class="info__text">
        Na Bałtyku wiatr będzie najsilniejszy, nawet do 90 km/h. Od samego rana mocno wieje i będzie
        wiać coraz mocniej,
        dlatego, że ten wiatr będzie coraz silniejszy.
      </div>
      <div class="button">więcej</div>
    </div>
  </div>
  <div class="card">
    <div class="icons">
      <svg class="icon">
        <use xlink:href="#sun"></use>
      </svg>
    </div>
    <div class="info">
      <div class="info__text">
        Czwartek będzie przeważnie słoneczny. Wieczorem na Nizinie Szczecińskiej mogą pojawić się przelotne opady
        deszczu. Termometry pokażą maksymalnie od 21 stopni Celsjusza na Suwalszczyźnie do 26 st. C na Dolnym Śląsku.
      </div>
      <div class="button">więcej</div>
    </div>
  </div>
</div>

Przyszedł czas na style. Również są dość oczywiste no może jedna rzecz warta jest wytłumaczenia a mianowicie ten wpis grid-template-columns: repeat(3, minmax(250px, 1fr));
Jest to nic innego jak wyświetlenie 3 kolumn za pomocą grida, funkcja minmax ustawia nam minimalną szerokość kart na 250px.

Na górze strony ustalamy kolory.

:root {
  --black: #000;
  --white: #fff;
  --body-color: #e4e4e4;
  --card-background: #b156fb;
  --card-background-hover: #ff5e00;
  --button-border: #000c74;
  --button-border-hover: #3f3f3f;
  --button-background: #202020;
}

.container {
  max-width: 800px;
  display: grid;
  grid-template-columns: repeat(3, minmax(240px, 1fr));
  column-gap: 50px;
  align-items: center;
  margin: auto;
}
@media (max-width: 900px) {
  .container {
    max-width: 270px;
    grid-template-columns: 1fr;
  }
  .container .card {
    margin: 10px;
  }
}

.card {
  box-shadow: 0 0 20px 0px rgba(104, 104, 104, 0.5);
  border-radius: 5px;
  height: 240px;
  cursor: pointer;
  background-color: var(--card-background);
  overflow: hidden;
  transition: all 400ms ease-in-out;
}
.card:hover {
  box-shadow: 0 0 20px 20px rgba(172, 172, 172, 0.5);
  height: 495px;
  background-color: var(--card-background-hover);
}
.card:hover .icons svg {
  fill: var(--black);
}
.card:hover .info {
  transform: translateY(0px);
  opacity: 1;
  z-index: 0;
}

.icons {
  position: relative;
  display: flex;
  justify-content: center;
  align-items: center;
  height: 240px;
  z-index: 2;
  transition: all 500s ease-out;
}
.icons svg {
  width: 40%;
  fill: var(--white);
}

.info {
  position: relative;
  transform: translateY(-300px);
  background-color: var(--white);
  padding: 15px;
  height: 250px;
  text-align: center;
  border-bottom-left-radius: 5px;
  border-bottom-right-radius: 5px;
  opacity: 0;
}

.button {
  position: absolute;
  left: 0;
  right: 0;
  bottom: 15px;
  display: block;
  padding: 10px;
  border: 1px solid var(--button-border);
  width: 100px;
  margin: auto;
  text-transform: uppercase;
  font-size: 1.2rem;
  cursor: pointer;
  transition: all 300ms ease-in-out;
}
.button:hover {
  border: 1px solid var(--button-border-hover);
  background-color: var(--button-background);
  color: var(--white);
}

To chyba tyle. Poniżej jak zwykle działający przykład.

See the Pen
card animation
by Greg (@Tomik23)
on CodePen.