SVG карта контента

Разработка SVG карта контента

Нет прав для скачивания
SVG карта контента.
Пишем наше тело:
HTML:
<div class="card">
  <div class="card__illustration">
    <svg viewBox="0 0 100 100">
      <g class="face-group">
        <path class="face" d="m38.977 59.074c0 2.75-4.125 2.75-4.125 0s4.125-2.75 4.125 0"></path>
        <path class="face" d="m60.477 59.074c0 2.75-4.125 2.75-4.125 0s4.125-2.75 4.125 0"></path>
        <path class="face" d="m48.203 69.309c1.7344 0 3.1484-1.4141 3.1484-3.1484 0-0.27734-0.22266-0.5-0.5-0.5-0.27734 0-0.5 0.22266-0.5 0.5 0 1.1836-0.96484 2.1484-2.1484 2.1484s-2.1484-0.96484-2.1484-2.1484c0-0.27734-0.22266-0.5-0.5-0.5-0.27734 0-0.5 0.22266-0.5 0.5 0 1.7344 1.4141 3.1484 3.1484 3.1484z"></path>
      </g>
      <path d="m35.492 24.371c0.42187-0.35156 0.48047-0.98438 0.125-1.4062-0.35156-0.42188-0.98438-0.48438-1.4062-0.125-5.1602 4.3047-16.422 17.078-9.5312 42.562 0.21484 0.79688 0.85547 1.4062 1.6641 1.582 0.15625 0.035156 0.31641 0.050781 0.47266 0.050781 0.62891 0 1.2344-0.27344 1.6445-0.76562 0.82812-0.98828 2.0039-1.5391 2.793-1.8203 0.56641 1.6055 1.4766 3.3594 2.9727 4.9414 2.2852 2.4219 5.4336 3.9453 9.3867 4.5547-3.6055 4.5-3.8047 10.219-3.8086 10.484-0.011719 0.55078 0.42187 1.0078 0.97656 1.0234h0.023438c0.53906 0 0.98437-0.42969 1-0.97266 0-0.054688 0.17187-4.8711 2.9805-8.7773 0.63281 1.2852 1.7266 2.5 3.4141 2.5 1.7109 0 2.7578-1.2695 3.3398-2.6172 2.8867 3.9258 3.0586 8.8359 3.0586 8.8906 0.015625 0.54297 0.46094 0.97266 1 0.97266h0.023438c0.55078-0.015625 0.98828-0.47266 0.97656-1.0234-0.007812-0.26953-0.20703-6.0938-3.9141-10.613 7.0781-1.3086 10.406-5.4219 11.969-8.9766 1.0508 0.98828 2.75 2.1992 4.793 2.1992 0.078126 0 0.15625 0 0.23828-0.003906 0.47266-0.023438 1.5781-0.074219 3.4219-4.4219 1.1172-2.6406 2.1406-6.0117 2.8711-9.4922 4.8281-22.945-4.7852-30.457-9.1445-32.621-12.316-6.1172-22.195-3.6055-28.312-0.42188-0.48828 0.25391-0.67969 0.85938-0.42578 1.3477s0.85938 0.67969 1.3477 0.42578c5.7031-2.9688 14.934-5.3047 26.5 0.4375 7.1875 3.5703 9 11.586 9.2539 17.684 0.49609 11.93-4.2617 23.91-5.7344 25.062h-0.015626c-1.832 0-3.4102-1.5742-4.0352-2.2852 0.28906-0.99609 0.44531-1.8672 0.52734-2.5117 0.62891 0.16797 1.2812 0.27344 1.9727 0.27344 0.55469 0 1-0.44922 1-1 0-0.55078-0.44531-1-1-1-7.3203 0-10.703-13.941-10.734-14.082-0.097656-0.40625-0.4375-0.71094-0.85156-0.76172-0.43359-0.050781-0.82031 0.16406-1.0117 0.53906-1.8984 3.7188-1.4297 6.7539-0.67969 8.668-6.2383-2.2852-8.9766-8.6914-9.0078-8.7617-0.17969-0.43359-0.62891-0.68359-1.1016-0.60156-0.46094 0.082032-0.80469 0.47266-0.82422 0.94141-0.14062 3.3359 0.67188 5.75 1.5 7.3164-8.3125-2.4297-10.105-11.457-10.184-11.875-0.097656-0.51562-0.57422-0.86328-1.0898-0.8125-0.51953 0.054687-0.90625 0.50391-0.89062 1.0234 0.41406 13.465-1.8516 17.766-3.2383 19.133-0.66406 0.65625-1.1992 0.67188-1.2383 0.67188-0.53906-0.050781-1.0156 0.31641-1.0938 0.85156-0.078125 0.54688 0.29688 1.0547 0.84375 1.1328 0.03125 0.003906 0.11328 0.015625 0.23828 0.015625 0.36719 0 1.1016-0.09375 1.9414-0.66406 0.050781 0.38672 0.125 0.81641 0.21875 1.2656-1.0273 0.35156-2.6211 1.0781-3.7812 2.4648-0.015625 0.019532-0.054687 0.066406-0.15625 0.046875-0.039062-0.007812-0.13281-0.039062-0.16406-0.15234-2.1875-8.1094-5.7148-28.309 8.8867-40.496zm12.711 51.828c-1.0039 0-1.5898-1.207-1.8672-2.0117 0.48047 0.023438 0.95703 0.050781 1.4531 0.050781 0.74219 0 1.4453-0.035156 2.1289-0.082031-0.24219 0.83594-0.76172 2.043-1.7148 2.043zm-13.148-30.664c1.9531 3.6211 5.6367 7.9102 12.305 8.6992 0.43359 0.046875 0.83984-0.18359 1.0234-0.57422 0.18359-0.39062 0.089844-0.85938-0.22656-1.1523-0.074219-0.070312-1.2734-1.2227-1.9688-3.6367 2 2.6094 5.3359 5.6836 10.305 6.5664 0.42187 0.070312 0.83594-0.125 1.0469-0.49219 0.21094-0.36719 0.16406-0.82812-0.11719-1.1484-0.023437-0.027344-1.9414-2.2969-1.2891-5.8906 1.2227 3.5508 3.7461 9.2227 7.8945 11.551-0.03125 0.55859-0.14844 1.668-0.55078 3.0156-0.085937 0.13672-0.125 0.28516-0.13672 0.44531-1.3008 3.8906-5.0039 9.3281-15.547 9.3281-5.375 0-9.4414-1.418-12.086-4.2109-3.5664-3.7656-3.332-8.8477-3.332-8.8984v-0.011719c1.5898-2.7227 2.5-7.3203 2.6797-13.59z"></path>
    </svg>
  </div>
  <div class="card__content">
    <div class="card__info">
      <h2 class="card__name">Morgan Sweeney</h2>
      <h3 class="card__title">Ant Collector</h3>
      <p class="card__desc">Morgan has collected ants since they were six years old and now has many dozen ants but none in their pants.</p>
    </div>
    <div class="card__actions">
      <button class="btn btn--action">like</button>
      <button class="btn btn--action">trade</button>
    </div>
  </div>
  <button class="btn btn--close">
    <svg viewBox="0 0 24 24">
      <path fill="var(--color-primary)" d="M19,6.41L17.59,5L12,10.59L6.41,5L5,6.41L10.59,12L5,17.59L6.41,19L12,13.41L17.59,19L19,17.59L13.41,12L19,6.41Z"></path>
    </svg>
  </button>
</div>
Пишем стиль:
SCSS:
@import url("https://fonts.googleapis.com/css?family=Roboto:400,400i,700");

:root {
  --color-primary: #43a047;
  --color-primary-darken: #388e3c;
  --color-secondary: #F6D8D1;
  --color-white: white;
  --color-accent: #FCF5F3;
  --spacer: 1.25rem;
 
  // Animation props
  --d: 2000ms;
  --d2: 600ms;
  --e: cubic-bezier(0.445, 0.05, 0.55, 0.95);
  --e2: cubic-bezier(0.23, 1, 0.32, 1);
}

* {
  box-sizing: border-box;
}

body {
  background-color: var(--color-secondary);
  display: grid;
  font-family: 'Roboto', sans-serif;
  height: 100vh;
  margin: 0;
  overflow: hidden;
  padding: var(--spacer);
  place-items: center;
}

.card {
  display: flex;
  flex-direction: column;
  max-width: 350px;
  overflow: hidden;
  padding: 0 var(--spacer);
  perspective: 1200px;
  position: relative;
  transform: translateY(30%);
  transition: transform var(--d2) var(--e2);
 
  &.is-active {
    animation: throw var(--d2) var(--e2) forwards;
  }
 
  &.is-closing {
    transform: translateY(0);
  }
}

.card__illustration {
  cursor: pointer;
  display: flex;
  justify-content: center;
  width: 100%;
  background-color: var(--color-accent);
  z-index: 2;
 
  svg {
    width: 100%;
    max-width: 150px;
    transform: translate(
      calc(var(--x) / 100 * 1px),
      calc(var(--y) / 100 * 1px)
    );
  }
 
  .face-group {
    transform: translate(
      calc(var(--x) / 120 * 1px),
      calc(var(--y) / 120 * 1px)
    );
  }
 
  .is-active &,
  .is-closing & {
    pointer-events: none;
    
    svg,
    .face-group {
      transform: translate(0, 0);
    }
  }
}

.card__content { 
  position: relative;
  transform: scaleY(0);
  transform-origin: 0 0;
  z-index: 1;
 
  .is-closing & {
    animation: slide-up var(--d2) var(--e2) forwards;
    transform: scaleY(1);
  }
 
  .is-active & {
    animation: swing var(--d) calc(var(--d2) / 2) var(--e) forwards;
  }
}

.card__info {
  background-color: var(--color-white);
  padding: var(--spacer);
 
  > * + * {
    margin-top: var(--spacer);
  }
}

.card__name {
  font-size: 1.75rem;
  font-weight: bold;
}

.card__title {
  display: inline-block;
  background-color: var(--color-primary);
  border-radius: 360px;
  color: var(--color-white);
  font-size: 0.75rem;
  letter-spacing: 0.025rem;
  padding: 0.5rem 1rem;
}

.card__desc {
  font-size: 1rem;
  line-height: 1.4;
}

.card__actions {
  display: flex;
  width: 100%;
}

.btn {
  background-color: var(--color-primary);
  border: none;
  color: white;
  cursor: pointer;
  font-family: inherit;
  font-size: 0.75rem;
  letter-spacing: 0.05rem;
  margin: 0;
  outline: none;
  padding: var(--spacer);
  position: relative;
  text-transform: uppercase;
  transition: background-color var(--d2) var(--e2);
  transform-origin: 0 0;
}

.btn--action {
  flex: 1;
 
  &:nth-child(2) {
    background-color: var(--color-primary-darken);
  }
 
  .is-active & {
      & {
        transform: scaleX(0);
      }   

      &:nth-child(1) {
        animation: swing calc(var(--d) * 1.25) calc(var(--d) / 4) var(--e) forwards;
      }

      &:nth-child(2) {
        animation: swing calc(var(--d) * 1.5) calc(var(--d) / 3) var(--e) forwards;
      }
    }
}

.btn--close {
  align-items: center;
  background-color: transparent;
  display: flex;
  justify-content: center;
  opacity: 0;
  position: absolute;
  padding: calc(var(--spacer) / 2);
  right: var(--spacer);
  top: 0.25rem;
  transition: opacity var(--d2) var(--d) var(--e2);
  visibility: hidden;
  z-index: 2;
 
  .is-active & {
    visibility: visible;
    opacity: 1;
  }
 
  > svg {
    width: 1.5rem;
    height: 1.5rem;
  }
}

@keyframes throw {
  40% { transform: translateY(-10%) rotate(-2deg) }
  50% { transform: translateY(30%) rotate(10deg) }
  100% { transform: translateY(0) }
}

@keyframes swing {
  0%  { transform: rotateX(90deg); }
  15% { transform: rotateX(-70deg); }
  30% { transform: rotateX(50deg) }
  45% { transform: rotateX(-30deg) }
  60% { transform: rotateX(15deg) }
  75% { transform: rotateX(-10deg) }
  90% { transform: rotateX(5deg) }
  100% { transform: rotateX(0) }
}

@keyframes slide-up {
  to { transform: translateY(-100%) }
}
Пишем наш js:
JavaScript:
const card = document.querySelector('.card');
const open = card.querySelector('.card__illustration');
const close = card.querySelector('.btn--close');
const content = card.querySelector('.card__content');
const illustration = card.querySelector('.card__illustration')
const cls = {
  active: 'is-active',
  closing: 'is-closing'
};
 
open.addEventListener('click', () => {
  card.classList.add(cls.active);
});

close.addEventListener('click', () => {
  card.classList.add(cls.closing);
  card.classList.remove(cls.active);
});

content.addEventListener('animationend', () => {
  card.classList.remove(cls.closing)
});

illustration.addEventListener('mousemove', function(e) {
  const r = this.getBoundingClientRect()

  this.style.setProperty('--x', e.clientX - (r.left + Math.floor(r.width / 2)))
  this.style.setProperty('--y', e.clientY - (r.top + Math.floor(r.height / 2)))
});

illustration.addEventListener('mouseout', function() {
  this.style.setProperty('--x', 0)
  this.style.setProperty('--y', 0)
});
Смотрим наш результат:
fg43.gif
Автор
baltun
Скачиваний
0
Просмотры
745
Первый выпуск
Обновление
Рейтинг
0.00 звёзд Оценок: 0

Ещё ресурсы от baltun

  • D.C Style - Link Proxy
    D.C Style - Link Proxy
    Дополнение зашифрует внешние ссылки в статье и создаст страницу перенаправления для этих ссылок.
  • D.C Style - Thumbnail
    D.C Style - Thumbnail
    Позволяет пользователям включать изображение обложки и миниатюры для своих тем.
  • XenForo
    Бета XenForo
    Форум Xenforo.
  • [HAL] Виджеты
    Авторские [HAL] Виджеты
    Изменяет виджеты форума и добавляет новые.
  • Veno File Manager
    Veno File Manager
    Файловый обменник.
Назад
Верх Низ