前置き
ここ最近は文法編に力を入れていたので
久しぶりの実践編です✨
input内のテキストを
コピーするボタンを作ってみましょう♪
イベントアプリなどでページを作成し、
自動生成されたurlをコピーしたい時なんかに使えます🌟
urlの自動生成まではやりません。
あくまでinputとコピーボタンのみ作成します🎈🧸
スタイリングも省いてます、そこはお好みで♪
まずはinputを作成
コピーボタンの作り方は
3通り用意していますが、
input部分はどれも共通です🍒
divではダメなのか
今回はコピーボタンがあるので
値が見えなくても@click
でコピーさえできればOK⭕️
そのためinput
でやっていますが、
urlを直接選択するような場合は
スクロールの効くdiv
で作成すると良いと思います🌟
divで作る場合も後述しておきます✍️
解説
readonly属性
urlを間違って編集したりしないようにします⚠️:value
今回はユーザーが入力する必要がないので@input
が不要、双方向バインディングが不要です🌟
値だけバインドできればOK⭕️class="text"
input要素
ではありますが、
入力不要でテキスト表示の役割のため。
コンポーネントにする場合もInputText.vue
などの命名にし、$attrs
を使うのが良いと思います💡
双方向バインディング、
v-modelについてはこちら
https://wp.me/pc9NHC-kI
コード
) pages
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
<template> <div class="page"> <input id="input" :value="url" type="text" readonly class="text" > </div> </template> <script> export default { data () { return { url: 'https://aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbb', } }, } </script> |
コピーボタンを作る
コピーと言えばdocument.execCommand()
ですが廃止!
なのでClipboard API
とnuxt-clipboard2
を使ってみましょう🌟
document.execCommand()
も
一応…最後に載せています🐥
方法1: Clipboard API
https://developers.google.com/web/updates/2018/03/clipboardapi
コード
) pages
コピー部分はこれだけnavigator.clipboard.writeText(コピーしたい物)
めちゃくちゃ簡単ですね🤗💕
対応ブラウザの確認のためif(navigator.clipboard)
としています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
<template> <div class="page"> <input id="input" :value="url" type="text" readonly class="text" > <button @click="copy">copy</button> </div> </template> <script> export default { data () { return { url: 'https://aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbb', } }, methods: { copy () { if(navigator.clipboard){ navigator.clipboard.writeText(this.url) console.log('コピー完了') return true } else { return false } }, }, } </script> |
方法2: nuxt-clipboard2
こちらもすごく簡単に実装できます!
実装の仕方はこちらの記事を参考にしました🌟
ここではコードのみ載せます💡
https://qiita.com/at-946/items/aea8ac9938d810feae7b
コード
) pages
コピー部分はこれだけthis.$copyText(コピーしたい物)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
<template> <div class="page"> <input id="input" :value="url" type="text" readonly class="text" > <button @click="copy">copy</button> </div> </template> <script> export default { data () { return { url: 'https://aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbb', } }, methods: { copy () { this.$copyText(this.url) console.log('コピー完了') }, }, } </script> |
方法3: document.execCommand
https://developers.google.com/web/updates/2015/04/cut-and-copy-commands
解説
document.getElementById("input")
id="input"のinputタグを指定select()
input内のすべてのテキストを選択
https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement/select
コード
) pages
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
<template> <div class="page"> <input id="input" :value="url" type="text" readonly class="text" > <button @click="copy">copy</button> </div> </template> <script> export default { data () { return { url: 'https://aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbb', } }, methods: { copy () { let target = document.getElementById("input") target.select() document.execCommand("Copy") alert("コピー完了!" + target.value) }, }, } </script> |
divで作る場合
urlを直接選択してコピーする場合ですね🌟
コピーボタンが不要になるので
さらっと書いておきます🌱input
と違って値が全て見えないといけません👀overflow: scroll;
にしておきましょう。
スクロールバーの部位はこちらが参考になります!
https://unformedbuilding.com/articles/learn-about-webkit-scrollbar/
コード
) pages
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
<template> <div class="text"> <p>{{ url }}</p> </div> </template> <script> export default { data () { return { url: 'https://aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbb', } }, } </script> <style lang="scss" scoped> .text { min-width: 335px; border: 2px solid pink; overflow: scroll; padding: 6px 0px 6px 10px; &::-webkit-scrollbar { height: 5px; } &::-webkit-scrollbar-track { background-color: transparent; } &::-webkit-scrollbar-thumb { background-color: pink; border: solid 1px #4A4A4A; border-radius: 2px; } } </style> |
まとめ
いかがでしたか?💡
v-modelの復習や
コピーボタンの実装が簡単ということが
分かったかと思います❣️😄
こんな記事がほしい!
などがありましたらコメントお願いします✨🙏