ΠŸΠ΅Ρ€Π΅Ρ‚ΡΠΆΠΊΠ°, ΠŸΡ€Π΅ΠΌΠΈΡ Π’ΠŸΡ€ΠΎΠ³Π΅Ρ€, 13.11
ΠŸΠ΅Ρ€Π΅Ρ‚ΡΠΆΠΊΠ°, ΠŸΡ€Π΅ΠΌΠΈΡ Π’ΠŸΡ€ΠΎΠ³Π΅Ρ€, 13.11
ΠŸΠ΅Ρ€Π΅Ρ‚ΡΠΆΠΊΠ°, ΠŸΡ€Π΅ΠΌΠΈΡ Π’ΠŸΡ€ΠΎΠ³Π΅Ρ€, 13.11

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π°Π½ΠΈΠΌΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° Π½Π°Π²ΠΈΠ³Π°Ρ†ΠΈΠΈ Π½Π° сайтС

БущСствуСт мноТСство классных Π³ΠΎΡ‚ΠΎΠ²Ρ‹Ρ… ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² Π½Π°Π²ΠΈΠ³Π°Ρ†ΠΈΠΈ. А Ρ‡Ρ‚ΠΎ насчёт своСго собствСнного? РазбираСмся, ΠΊΠ°ΠΊ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΎΠΉ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Vue.js ΠΈ TweenMax.

ОблоТка: Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π°Π½ΠΈΠΌΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° Π½Π°Π²ΠΈΠ³Π°Ρ†ΠΈΠΈ Π½Π° сайтС

Π’ Π΄Π°Π½Π½ΠΎΠΉ ΡΡ‚Π°Ρ‚ΡŒΠ΅ Π²Ρ‹ Π½Π°ΡƒΡ‡ΠΈΡ‚Π΅ΡΡŒ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Π½Π°Π²ΠΈΠ³Π°Ρ†ΠΈΠΎΠ½Π½ΡƒΡŽ панСль с Π°Π½ΠΈΠΌΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌΠΈ ΠΊΠ½ΠΎΠΏΠΊΠ°ΠΌΠΈ-ΠΈΠΊΠΎΠ½ΠΊΠ°ΠΌΠΈ. Π’Π΄ΠΎΡ…Π½ΠΎΠ²Π΅Π½ΠΈΠ΅ΠΌ послуТил этот ΠΏΡ€ΠΈΠΌΠ΅Ρ€. ΠšΠΎΠ½Π΅Ρ‡Π½Ρ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚:

ΠŸΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠ°

Основная Ρ‡Π°ΡΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρ‹ выполняСтся Π² Vue.js, Π° для Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ TweenMax.

НС Π·Π°Π±ΡƒΠ΄ΡŒΡ‚Π΅ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ эту ссылку для ΠΈΠΌΠΏΠΎΡ€Ρ‚Π° ΠΈΠΊΠΎΠ½ΠΎΠΊ Font Awesome:

			<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.0.13/css/all.css" integrity="sha384-DNOHZ68U8hZfKXOrtjWvjxusGo9WQnrNx2sqG0tfsghAvtVlRW3tvkXWZh58N9jp" crossorigin="anonymous">
		

ΠΠ°Ρ‡Π°Π»ΡŒΠ½Π°Ρ Ρ€Π°Π·ΠΌΠ΅Ρ‚ΠΊΠ°

Начнём с HTML. Для этого ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° ΠΏΠΎΡ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ ΠΈ ΠΊΠ½ΠΎΠΏΠΊΠΈ. Для ΠΊΠ½ΠΎΠΏΠΎΠΊ Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΈΠΊΠΎΠ½ΠΊΠΈ Font Awesome. Они Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ ΠΎΡ‚ ΠΈΠΊΠΎΠ½ΠΎΠΊ Π² ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅, Π½ΠΎ это Π½Π΅ ΡΡ‚Ρ€Π°ΡˆΠ½ΠΎ.

			<div id="app">
  <div class="btn-container">
    <div class="btn">
      <i class="fas fa-comment"></i>
    </div>
    <div class="btn">
      <i class="fas fa-user"></i>
    </div>
    <div class="btn">
      <i class="fas fa-map-marker"></i>
    </div>
    <div class="btn">
      <i class="fas fa-cog"></i>
    </div>
  </div>
</div>
		

Π’ ΠΈΡ‚ΠΎΠ³Π΅ Ρƒ вас Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒΡΡ Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ ΠΈΠΊΠΎΠ½ΠΊΠΈ. Π‘Π°ΠΌΠΎΠ΅ врСмя Π·Π°Π½ΡΡ‚ΡŒΡΡ ΠΈΡ… ΠΎΡ„ΠΎΡ€ΠΌΠ»Π΅Π½ΠΈΠ΅ΠΌ.

ΠžΡ„ΠΎΡ€ΠΌΠ»Π΅Π½ΠΈΠ΅

Π—Π°Π΄Π°ΠΉΡ‚Π΅ Ρ†Π²Π΅Ρ‚ Ρ„ΠΎΠ½Π° Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π΅. Для Π½Π°Ρ‡Π°Π»Π° ΠΏΡƒΡΡ‚ΡŒ Π±ΡƒΠ΄Π΅Ρ‚ Ρ‡Ρ‘Ρ€Π½Ρ‹ΠΉ. Π’ дальнСйшСм Π²Ρ‹ смоТСтС ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ этот Ρ†Π²Π΅Ρ‚. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ flex ΠΈ justify-content для выравнивания элСмСнтов ΠΏΠΎ Π³ΠΎΡ€ΠΈΠ·ΠΎΠ½Ρ‚Π°Π»ΠΈ ΠΈ отступы (padding) для выравнивания ΠΏΠΎ Π²Π΅Ρ€Ρ‚ΠΈΠΊΠ°Π»ΠΈ.

			.btn-container {
  display: flex;
  background-color: black;
  
  /* Π²Π΅Ρ€Ρ‚ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎΠ΅ Π²Ρ‹Ρ€Π°Π²Π½ΠΈΠ²Π°Π½ΠΈΠ΅ ΠΏΠΎ Ρ†Π΅Π½Ρ‚Ρ€Ρƒ */
  padding-top: 150px;
  padding-bottom: 150px;
  /* Π³ΠΎΡ€ΠΈΠ·ΠΎΠ½Ρ‚Π°Π»ΡŒΠ½ΠΎΠ΅ Π²Ρ‹Ρ€Π°Π²Π½ΠΈΠ²Π°Π½ΠΈΠ΅ ΠΏΠΎ Ρ†Π΅Π½Ρ‚Ρ€Ρƒ */
  justify-content: center;
}
		

РасполоТитС ΠΊΠ½ΠΎΠΏΠΊΠΈ Π΄Ρ€ΡƒΠ³ рядом с Π΄Ρ€ΡƒΠ³ΠΎΠΌ Ρ‡Π΅Ρ€Π΅Π· Ρ‚Π΅Π³ inline-block.

Π—Π°Π΄Π°ΠΉΡ‚Π΅ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΊΠ½ΠΎΠΏΠΎΠΊ, ΠΈΡ… содСрТимоС ΠΈ Ρ†Π²Π΅Ρ‚Π° ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ. Π—Π°Ρ‚Π΅ΠΌ ΠΏΡ€ΠΈΠ΄Π°ΠΉΡ‚Π΅ ΠΈΠΌ ΠΊΡ€ΡƒΠ³Π»ΡƒΡŽ Ρ„ΠΎΡ€ΠΌΡƒ Ρ‡Π΅Ρ€Π΅Π· border-radius ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚Π΅ нСсколько ΠΏΡ€Π°Π²ΠΈΠ» для выравнивания:

			.btn {
  display: inline-block;
  cursor: pointer;
  width: 50px;
  height: 50px;
  margin: 5px;
  font-size: 25px;
  color: gray;
  
  /* круглая Ρ„ΠΎΡ€ΠΌΠ°  */
  border-radius: 25px;
  background-color: white;

  /* Ρ†Π΅Π½Ρ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈΠΊΠΎΠ½ΠΎΠΊ */
  text-align: center;
  line-height: 50px;
  
  /* для мобильной вСрсии убираСтся подсвСтка синим ΠΏΡ€ΠΈ Π½Π°ΠΆΠ°Ρ‚ΠΈΠΈ */
  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
}
		

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚:

ПовСдСниС

Π’ экзСмплярС Vue ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚Π΅ Π΄Π°Π½Π½Ρ‹Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π² ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π΅. Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π²Ρ‹Π±ΠΎΡ€Π° Ρ†Π²Π΅Ρ‚Π° ΠΏΠΎΠ΄Π±Π΅Ρ€ΠΈΡ‚Π΅ Ρ†Π²Π΅Ρ‚Π° для ΠΊΠ½ΠΎΠΏΠΎΠΊ ΠΈ Ρ„ΠΎΠ½Π°. Π§Ρ‚ΠΎΠ±Ρ‹ дальшС Π² ΠΊΠΎΠ΄Π΅ ΡΡΡ‹Π»Π°Ρ‚ΡŒΡΡ Π½Π° Ρ†Π²Π΅Ρ‚Π°, Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ ΠΈΡ… Π² структуру экзСмпляра:

			new Vue({
  el: '#app',
  data: {
    buttons: [
      {icon: 'comment', bgColor: '#DE9B00', color: '#EDB205'},
      {icon: 'user', bgColor: '#3EAF6F', color: '#4BD389'},
      {icon: 'map-marker', bgColor: '#BE0031', color: '#E61753'},
      {icon: 'cog', bgColor: '#8E00AC', color: '#B32DD2'}
    ],
    selectedBgColor: '#DE9B00',
    selectedId: 0
  },
})
		

ΠžΠ±ΡŠΡΠ²ΠΈΡ‚Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ Ρ†Π²Π΅Ρ‚ Ρ„ΠΎΠ½Π°, ΠΈ Π·Π°Π΄Π°ΠΉΡ‚Π΅ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠΉ ΠΊΠ½ΠΎΠΏΠΊΠΈ.

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π²Π½ΡƒΡ‚Ρ€ΠΈ массива ΠΊΠ½ΠΎΠΏΠΎΠΊ ΡΠΎΡ…Ρ€Π°Π½ΡΡŽΡ‚ΡΡ Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΠΎ ΠΈΠΊΠΎΠ½ΠΊΠ°ΠΌ, Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ΄ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ HTML для Ρ€Π΅Π½Π΄Π΅Ρ€ΠΈΠ½Π³Π° ΠΊΠ½ΠΎΠΏΠΎΠΊ Ρ‡Π΅Ρ€Π΅Π· Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ v-for ΠΈ большСй динамичности ΠΊΠΎΠ΄Π°.

На Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ этот Π±Π»ΠΎΠΊ Π½Π΅ поддСрТиваСтся, Π½ΠΎ ΠΌΡ‹ Π½Π΅ Π·Π°Π±Ρ‹Π»ΠΈ ΠΎ Π½Ρ‘ΠΌ!Наша ΠΊΠΎΠΌΠ°Π½Π΄Π° ΡƒΠΆΠ΅ занята Π΅Π³ΠΎ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΎΠΉ, ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ доступСн Π² блиТайшСС врСмя.

Π¦Π²Π΅Ρ‚ Ρ„ΠΎΠ½Π° Π² ΠΊΠΎΠ΄Π΅ ΡƒΠΆΠ΅ привязан ΠΊ ΡΡ‚ΠΈΠ»ΡŽ div Π² btn-container.

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Π² ΠΊΠΎΠ΄ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ @click . Он запускаСт Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ selectButton(). ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Π² ΠΊΠΎΠ΄Π΅ присутствуСт Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ ref, благодаря ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ ΠΌΠΎΠΆΠ½ΠΎ ΡΡΡ‹Π»Π°Ρ‚ΡŒΡΡ Π½Π° ΠΊΠ½ΠΎΠΏΠΊΠΈ ΠΏΡ€ΠΈ создании ΠΈΡ… Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΈ.

НаТатиС Π½Π° ΠΊΠ½ΠΎΠΏΠΊΡƒ

Для Π½Π°Ρ‡Π°Π»Π° ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ selectButton() для экзСмпляра Vue:

			// ... Π΄Π°Π½Π½Ρ‹Π΅,
  methods: {
    selectButton (id) {
      this.selectedId = id
    }
  }
		

ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· ΠΏΡ€ΠΈ Π½Π°ΠΆΠ°Ρ‚ΠΈΠΈ ΠΊΠ½ΠΎΠΏΠΊΠΈ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ selectedId Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ своё Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π΅ ΠΎΡ‚ 0 Π΄ΠΎ 3. Однако это Π½ΠΈΠΊΠ°ΠΊ Π½Π΅ отразится Π½Π° Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π΅.

Анимация ΠΊΠ½ΠΎΠΏΠΎΠΊ начинаСтся с самого простого β€” измСнСния Ρ†Π²Π΅Ρ‚Π° Ρ„ΠΎΠ½Π°. Для этого Π½ΡƒΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ вычисляСмоС свойство, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠΏΠ°Π΄Π°Ρ‚ΡŒ информация ΠΎ Π²Ρ‹Π±ΠΎΡ€Π΅ ΠΊΠ½ΠΎΠΏΠΊΠΈ. Π—Π°Ρ‚Π΅ΠΌ, Π½Π° основании этих Π΄Π°Π½Π½Ρ‹Ρ…, Π±ΡƒΠ΄Π΅Ρ‚ ΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ Ρ†Π²Π΅Ρ‚ Ρ„ΠΎΠ½Π°.

ПослС измСнСния selectedId потрСбуСтся Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ ΠΊ исходному Ρ†Π²Π΅Ρ‚Ρƒ элСмСнта.

			// ... Π΄Π°Π½Π½Ρ‹Π΅
 methods: {
    selectButton (id) {
      this.selectedId = id
      this.animateBgColor()
    },
    animateBgColor () {
      TweenMax.to(this, 0.2, {
        selectedBgColor: this.selectedButton.bgColor
      })
    }
  },
  computed: {
    selectedButton () {
      return this.buttons[this.selectedId]
    }
  }
		

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΡ€ΠΈ Π½Π°ΠΆΠ°Ρ‚ΠΈΠΈ Π½Π° ΠΊΠ½ΠΎΠΏΠΊΡƒ мСняСтся Ρ†Π²Π΅Ρ‚ Ρ„ΠΎΠ½Π°.

Анимация ΠΊΠ½ΠΎΠΏΠΎΠΊ

ΠΠ½ΠΈΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ½ΠΎΠΏΠΊΠΈ Π½Π΅ Ρ‚Π°ΠΊ ΡƒΠΆ просто. Для Π½Π°Ρ‡Π°Π»Π° сохранитС Π΄Π²Π΅ ссылки: Π½Π° ΡƒΠΆΠ΅ Π²Ρ‹Π±Ρ€Π°Π½Π½ΡƒΡŽ (Π°ΠΊΡ‚ΠΈΠ²Π½ΡƒΡŽ) ΠΊΠ½ΠΎΠΏΠΊΡƒ ΠΈ Ρ‚Ρƒ, которая Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π±ΠΈΡ€Π°Ρ‚ΡŒΡΡ Π΄Π°Π»Π΅Π΅.

Π­Ρ‚ΠΎ дСлаСтся Ρ‡Π΅Ρ€Π΅Π· Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ $refs с индСксом Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠΉ ΠΊΠ½ΠΎΠΏΠΊΠΈ. Π”Π°Π½Π½Ρ‹ΠΉ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ добавляСтся ΠΏΠ΅Ρ€Π΅Π΄ строкой, ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‰Π΅ΠΉ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ ΠΊΠ½ΠΎΠΏΠΊΡƒ:

			// ... Π΄Π°Π½Π½Ρ‹Π΅
  methods: {
    selectButton (id) {
      const previousButton = this.$refs[`button_${this.selectedId}`]
      const nextButton = this.$refs[`button_${id}`]
      // ... ΠΎΡΡ‚Π°Π»ΡŒΠ½ΠΎΠΉ ΠΊΠΎΠ΄
		

ПослС Ρ‚ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ Π²Ρ‹ ΠΏΡ€ΠΎΠΏΠΈΡˆΠ΅Ρ‚Π΅ ссылки, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ нСсколько ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ²: 1) для Π΄Π΅Π°ΠΊΡ‚ΠΈΠ²Π°Ρ†ΠΈΠΈ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ ΠΊΠ½ΠΎΠΏΠΊΠΈ ΠΈ 2) для Π°ΠΊΡ‚ΠΈΠ²Π°Ρ†ΠΈΠΈ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΠΊΠ½ΠΎΠΏΠΊΠΈ:

			// ... ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹
    selectButton (id) {
      const previousButton = this.$refs[`button_${this.selectedId}`]
      const nextButton = this.$refs[`button_${id}`]
      
      this.selectedId = id
      this.animateBgColor()
      
      this.animateOut(previousButton)
      this.animateIn(nextButton)
    },
    animateIn (btn) {      
      // Для Π°ΠΊΡ‚ΠΈΠ²Π°Ρ†ΠΈΠΈ ΠΊΠ½ΠΎΠΏΠΊΠΈ 
    },
    animateOut (btn) {
      // Для Π΄Π΅Π°ΠΊΡ‚ΠΈΠ²Π°Ρ†ΠΈΠΈ ΠΊΠ½ΠΎΠΏΠΊΠΈ 
    }
		

ΠŸΠ΅Ρ€Π΅Π΄ Ρ‚Π΅ΠΌ ΠΊΠ°ΠΊ ΡΠ°Π΄ΠΈΡ‚ΡŒΡΡ Π·Π° написаниС ΠΊΠΎΠ΄Π°, ΠΏΡ€ΠΎΠ΄ΡƒΠΌΠ°ΠΉΡ‚Π΅ всС Π΄Π΅Ρ‚Π°Π»ΠΈ Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΈ. Gif-Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΡŽ ΠΊΠ½ΠΎΠΏΠΊΠΈ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚ΡŒ Π½Π° Π΄Π²Π΅ ΡΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠ΅:

  1. Π¦Π²Π΅Ρ‚ ΠΊΠ½ΠΎΠΏΠΊΠΈ ΠΈ ΠΈΠΊΠΎΠ½ΠΊΠΈ.
  2. Π¨ΠΈΡ€ΠΈΠ½Π° ΠΊΠ½ΠΎΠΏΠΊΠΈ.

ΠŸΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ Ρ†Π²Π΅Ρ‚ΠΎΠ² ΠΏΡ€Π΅Π΄Π΅Π»ΡŒΠ½ΠΎ прост. Если ΠΊΠ½ΠΎΠΏΠΊΠ° Π½Π΅Π°ΠΊΡ‚ΠΈΠ²Π½Π°, Ρ‚ΠΎ Ρ†Π²Π΅Ρ‚ Ρ„ΠΎΠ½Π° β€” Π±Π΅Π»Ρ‹ΠΉ. ΠŸΡ€ΠΈ Π²Ρ‹Π±ΠΎΡ€Π΅ ΠΊΠ½ΠΎΠΏΠΊΠΈ Ρ†Π²Π΅Ρ‚ бСрётся ΠΈΠ· свойства color. Для ΠΈΠΊΠΎΠ½ΠΊΠΈ Ρ†Π²Π΅Ρ‚ мСняСтся с сСрого Π½Π° Π±Π΅Π»Ρ‹ΠΉ.

Π˜Π½Ρ‚Π΅Ρ€Π΅ΡΠ½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ связан с Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠ΅ΠΉ ΡˆΠΈΡ€ΠΈΠ½Ρ‹ ΠΊΠ½ΠΎΠΏΠΊΠΈ. ΠŸΡ€ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ своСго состояния ΠΊΠ½ΠΎΠΏΠΊΠ° становится «эластичной», Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Π»ΠΈΠ±ΠΎ суТаСтся, Π»ΠΈΠ±ΠΎ растягиваСтся.

Π’ΠΈΠ·ΡƒΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ GSAP позволяСт ΠΏΠΎΠ΄ΠΎΠ±Ρ€Π°Ρ‚ΡŒ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΡ‡Π½Ρ‹Π΅ Ρ†Π²Π΅Ρ‚Π° ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΎΠ².

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ ΠΊΠΎΠ΄ для ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² animateIn() ΠΈ animateOut():

			// ... ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹
   animateIn (btn) {      
      // animate icon & bg color
      TweenMax.to(btn, 0.3, {
        backgroundColor: this.selectedButton.color,
        color: 'white'
      })
                  
      // анимация ΡˆΠΈΡ€ΠΈΠ½Ρ‹ ΠΊΠ½ΠΎΠΏΠΊΠΈ
      TweenMax.to(btn, 0.7, {
        width: 100,
        ease: Elastic.easeOut.config(1, 0.5)
      })
    },
    animateOut (btn) {
      // анимация Ρ†Π²Π΅Ρ‚Π° ΠΈΠΊΠΎΠ½ΠΊΠΈ
      TweenMax.to(btn, 0.3, {
        backgroundColor: 'white',
        color: 'gray'
      })
      
      // анимация ΡˆΠΈΡ€ΠΈΠ½Ρ‹ ΠΊΠ½ΠΎΠΏΠΊΠΈ
      TweenMax.to(btn, 0.7, {
        width: 50,
        ease: Elastic.easeOut.config(1, 0.5)
      })
    }
  },
		

ΠžΡΡ‚Π°Π»ΡΡ послСдний ΡˆΡ‚Ρ€ΠΈΡ…. ΠŸΡ€ΠΈ запускС прилоТСния всС ΠΊΠ½ΠΎΠΏΠΊΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ Π½Π΅Π²Ρ‹Π±Ρ€Π°Π½Π½Ρ‹ΠΌΠΈ. Π­Ρ‚ΠΎ дСлаСтся Ρ‡Π΅Ρ€Π΅Π· Π²Ρ‹Π·ΠΎΠ² ΠΌΠ΅Ρ‚ΠΎΠ΄Π° selectButton() Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρ…ΡƒΠΊΠ° mounted():

			mounted () {
    // ΠΈΠ½ΠΈΡ†ΠΈΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π°
    this.selectButton(0)
  }
		

Π“ΠΎΡ‚ΠΎΠ²ΠΎ! ΠšΠΎΠ½Π΅Ρ‡Π½Ρ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ Π½Π° CodePen.

Π Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΠ΅ΠΌ