前提・実現したいこと
Vue.jsを使って、楽譜を読む練習をするツールを作成しようとしています。
まずは、音符を作成する処理と、音符を削除する処理を作成しました。
https://jsfiddle.net/ichi3270/97k63zew/16/
現時点では、ADDボタンを押したら音符が作られ、DELETEボタンを押したら先頭の音符が削除されるようにしています。
発生している問題・エラーメッセージ
想定どおり、音符の作成と音符の削除ができているのですが、
複数の音符が画面上に表示されている場合に、DELETEボタンで先頭の音符を削除すると、うしろにある音符の位置が変わってしまい困っています。(ガクッと前進してしまう)
(上記 jsfiddle で、ADDボタンを数回押す → DELETEボタンを押す をするとご確認いただけます)
該当のソースコード
HTML
1<template v-for="item in notes"> 2 <li class="note-wrap" v-show="item.show" v-bind:style="item.styles" v-bind:ref="item.refId"> 3 <div class="sign">{{ item.sign }}</div> 4 <div class="note"></div> 5 </li> 6</template>
CSS
1.note-wrap { 2 animation-name: moveNotes; 3 animation-duration: 10s; 4 animation-fill-mode: forwards; 5 animation-timing-function: linear; 6} 7 8@keyframes moveNotes { 9 0% { 10 transform: translateX(100%); 11 } 12 100% { 13 transform: translateX(-15px); 14 } 15}
javascript
1var app = new Vue({ 2 el: '#app', 3 data: { 4 noteId: 0, // 次生成するnoteのID 5 notes: [], // noteデータ配列 6 }, 7 methods: { 8 // *** ノート生成処理 *** 9 createNote: function () { 10 // ランダムで音程を決定 11 const pitch = Math.floor(Math.random() * (45 + 1)) 12 let sign = ""; 13 // 臨時記号を算出 14 switch (pitch % 12) { 15 case 2: 16 case 4: 17 case 6: 18 case 9: 19 case 11: 20 sign = "♯" 21 } 22 const offsetMap = [0, 7.5, 7.5, 15, 15, 22.5, 22.5, 30, 37.5, 37.5, 45, 45] // (E → D#)半音毎の譜面上の上昇px数 23 const offsetTop = 195 - (Math.floor(pitch / 12) * 52.5) - offsetMap[(pitch % 12)] // 譜面最上部からのY位置を算出 24 // 作成処理 25 this.notes.push({ 26 id: this.noteId, // NoteのID 27 refId: `Note_${this.noteId}`, // Dom直接参照用のID 28 show: true, // true:存在 false:削除済 29 pitch: pitch, // 音程 30 sign: sign, // 臨時記号♯♭ 31 styles: { top: `${offsetTop}px` } // css(譜面上辺からの縦距離) 32 }) 33 34 // idカウントアップ 35 this.noteId += 1 36 }, 37 38 // *** ノート削除処理 *** 39 removeNote: function () { 40 this.notes.splice(0,1); 41 }, 42 } 43})
試したこと
音符削除処理のremoveNoteについて、配列の要素削除ではなく、配列の作り直し(下記)も試してみましたが、結果は同じでした。
javascript
1// 試したが結果は変わらず 2this.notes = this.notes.filter(item => item.id !== noteId)
要素を削除せずに、論理削除(v-showで非表示にする)であれば、スムーズに描画されますが、データが削除されずに増えていくのはあまり希望どおりではありません。
javascript
1this.notes.find(item => item.id === noteId ).show = false
論理削除ではない方法で、解決できる方法がありましたらご教示いただけますと幸いです。
宜しくお願いいたします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/06/12 01:14