いくつかのSNSボタンを貼り付けようと思ったが、コピペで済む良さげなものがないため自分で作ってしまいました。
公式のものはスクリプトの読み込みで遅くなったり、デザインがバラバラなため見送った。 シェアできれば良いので、ブックマークやいいねの数は表示は不要。 (数値が上がると嬉しいため、今後表示できるようにするかもしれません)
いろいろと探していたら、作れる気がしたのでNuxt用に作ってみました! Vue.jsでも少しの変更で導入できるかと思います。 早速この記事の上下にも配置してあります。
よろしければシェアおねがします<__>
できたもの
Twitter, はてなブックマーク, Pocketの3つを用意しました。
Google+は2019年にサービスが終了します。 facebookとLINEは今後追加して行きたいと思います。
デザインは大きめのボタン風にして、幅がレスポンシブに変化します。 このブログではBulmaをCSSフレームワークとして利用しているおり、アイコンはWebフォントのMaterial Design Iconsです。
利用していないものもありますが、アイコンの宣言を載せておきます。
<!-- Twitter -->
<i class="mdi mdi-twitter"/>
<!-- facebook -->
<i class="mdi mdi-facebook"/>
<!-- google-plus -->
<i class="mdi mdi-google-plus"/>
<!-- Pocket -->
<i class="mdi mdi-pocket"/>
<!-- はてなブックマーク -->
<b>B!</b>
<!-- LINE -->
<b>LINE</b>
はてブとLINEはなかったので強調タグで囲みます。
コード
components/ShareButtons.vue
一つのファイルにまとめてありますが、見やすくするためtemplate
, script
, style
に分けてあります。
template
<template>
<section class="section">
<aside>
<ul class="social-list">
<li class="social-list-item">
<a
class="social-list-link icon-twitter"
:href="twitterUrl()"
target="_blank"
title="Twitterで共有"
><i class="mdi mdi-twitter"/></a>
</li>
<li class="social-list-item">
<a
class="social-list-link icon-hatebu"
:href="hatebuUrl()"
target="_blank"
:data-hatena-bookmark-title="encodeURIComponent(url)"
title="このエントリーをはてなブックマークに追加"
><b>B!</b></a>
</li>
<li class="social-list-item">
<a
class="social-list-link icon-pocket"
:href="pocketUrl()"
target="_blank"
title="pocketで共有"
><i class="mdi mdi-pocket"/></a>
</li>
</ul>
</aside>
</section>
</template>
script
<script>
export default {
name: "ShareButtons",
props: ["title"],
data() {
return {
url: `https://www.suzu6.net${this.$route.path}`,
twitter_url: "https://twitter.com/intent/tweet?url={0}&text={1}",
hatebu_url:
"http://b.hatena.ne.jp/add?mode=confirm&url={0}&title={1}",
pocket_url: "http://getpocket.com/edit?url={0}"
};
},
methods: {
formatByArr(msg) {
// フォーマット(引数可変(配列)版)
var args = [];
for (var i = 1; i < arguments.length; i++) {
args[i - 1] = arguments[i];
}
// URLエンコード
args = args.map(x => encodeURIComponent(x));
return msg.replace(/\{(\d+)\}/g, function(m, k) {
return args[k];
});
},
// それぞれパラメータを埋め込む
twitterUrl() {
return this.formatByArr(this.twitter_url, this.url, this.title);
},
hatebuUrl() {
return this.formatByArr(this.hatebu_url, this.url, this.title);
},
pocketUrl() {
return this.formatByArr(this.pocket_url, this.url);
}
}
};
</script>
style
<style scoped>
.social-list {
list-style: none;
display: flex;
justify-content: flex-end;
flex-wrap: wrap;
width: 100%;
margin: auto;
margin-bottom: 60px;
}
.social-list-item {
height: 40px;
line-height: 40px;
}
.social-list-item {
flex-grow: 1;
height: 50px;
line-height: 50px;
min-width: 90px;
text-align: center;
}
.social-list-link.icon-twitter {
background: #00b0ed;
}
.social-list-link.icon-hatebu {
background: #008fde;
}
.social-list-link.icon-pocket {
background: #eb4654;
}
/* .social-list-link.icon-line {
background: #00c300;
} */
.social-list-link {
display: block;
color: #ffffff;
}
a {
color: inherit;
text-decoration: none;
}
.content li + li {
margin-top: 0;
}
</style>
使い方
親コンポーネント
<template>
<!-- シェアボタンを置きたい位置 -->
<share-buttons :title="title" />
</template>
<script>
import ShareButtons from "~/components/ShareButtons"
export default {
components: {
ShareButtons
}
}
</script>
コンポートからimportしてShareButtonsを宣言する。
シェアボタンを設置したい位置に<share-buttons>
を置く。
親からv-bind
でtitleを渡してあげる。
ページのURLはShareButtonsの中で取得することができます。
他にも渡したいパラメータがある場合は、propsを拡張してください。
SNSシェアボタンの公式スタイル
それぞれ、htmlにコピペできるコードをくれる。
ただ、スクリプトの読み込みで遅くなったり、デザインがバラバラなためカスタマイズすることを選んだ。
参考にしたサイトとメモ
Google+, Facebook, Twitter それぞれのシェアリンクを HTML a タグから直接作る方法 | yu8mada
サイトのデザインに合わせてSNSシェアボタンをカスタマイズできるように、リンクだけでシェアできる方法です。 どのようなURLを入れたら良いかまとまっている。 クエリパラメータの解説もあるのでとても参考になった。
URLエンコード用のJavaScriptのみでできるため、シェアの数を表示しない場合はこちらの方法にするとよい。
SNSシェアボタンのためのメタタグやogpタグの実装例やGoogleアナリティクスと連携方法が載っている。 まだ、そこまでできていないので参考にして追加していきたい。
// 引数を埋め込む関数
formatByArr("url={0}&text={1}", url, text)
JavaScriptでこんな感じに、引数で渡したパラメータを埋め込んで文字列を返してくれる方法です。
Vue.jsのドキュメント。子要素の中でも$route.path`で現在のURLパスが取得できるのは便利。
NuxtだけでなくVueも勉強しないとダメですね。
ボタンのデザインはこのページを参考にした。 ただし、コピペの方ではない。記事の前後にあるボタンを参考にしている。
(おそらく)WordPressのプラグインかテーマのもので、良いまとまり感がある。 アニメーションも取り入れたい。
Nuxtの静的サイトでは使えなかった。
おわりに
ブックマークやいいね数の表示などリッチなことはできないが、URLだけでシェアボタンが機能することがわかった。
今回はNuxt用に作ったが、JavaScript
とVue
用に軽いものを作っておきたい。
この下に今回制作したボタンがあるので、たくさん押して確かめてみて下さい^^
書籍
Nuxtについての書籍はありますが、個人的には公式のドキュメントやGoogle先生頼りでいいかなと思います。 それよりも、Vueについての理解を深めると捗りますね。