WordPressには様々なプラグインがあります。
Word Balloonというプラグインを使うと、
簡単に吹き出しを入れることができますが、
残念ながら、そのままですと、写真枠に入れられるのは男性のシルエット(謎の人)だけです。
1人のつぶやきとして使うなら、
選ぶだけでいろいろなバリエーションの吹き出しを作ることができ、
これだけで十分なのですが、
もっといろいろ入れて、会話形式にできたらいいなぁと、
前回の記事を書きながら思っていました。
今回は、会話形式で使える吹き出しを
プラグインなしで入れられるようにしてみたいと思います。
吹き出しとは
主に漫画で登場人物のセリフを表現するために、絵の中に設けられる空間のこと。「吹き出し」とも書く。英語では”Speech balloon”という。
引用:wikipedia
一人考えている時の吹き出し、
悩んでもやもやしているときの吹き出し、
電話の会話の吹き出し
伝言するときの吹き出し
怒っているときの吹き出し
など、様々な吹き出しに加え、感情を表すイラストを一緒に使うことで、
そのときの感情を可視化して見せることができますね。
吹き出し作成参考サイト
いくつか、吹き出しを作成されている方のブログを拝見しました。
吹き出し用のHTMLとCSSを記述する形式が多い中、
ナコさんのブログでは、PHPとCSSで吹き出しを作られており、
更に、クリックタグ化もされていて、とても魅力的です✨
ここからは、ナコさんのブログを参考に、
こんなのを作りたい!
と思います★
吹き出しの設定に必要なもの
吹き出しを使うために変更が必要なファイルは何があるのでしょうか?
吹き出しを設定するには、以下2か所の設定と、アイコン用画像が必要です。
①functions.php
利用しているテーマ内で汎用的に使われるコードを記載するファイルです。
共通的に利用する関数などを記載しておき、
その関数を使いたい場所(例えば投稿画面)で、呼び出すことで使うことができます。
このファイルに、吹き出しを使うための関数を記述します。
②style.css
見え方を設定するファイルです。
吹き出しのデザイン設定コードを記述します。
吹き出しを設定しよう①(アニメーション用ファイルのダウンロード)
アニメーション用のマーク(怒り、汗など)を使う準備をしたいと思います。
ダウンロード手順
①ナコさんブログの下記リンクで
「動く会話チャット画面Ver.1.0をダウンロードする(balloon_animetion_css.zip)」をクリックする。
なお、zipファイルの中身は以下となっております。
※今回使うのは、青字部分のファイルです。
②zipファイルを解凍する。
③WordPressサーバ上にファイルをアップロードするため、SCPにログインする。
※私はwinSCPを利用しています。
④iconフォルダを以下に配置する。
WordPressディレクトリ/wp-content/themes/<利用しているテーマ>
吹き出しを設定しよう②(人物等ファイルの)アップロード
この猫の顔のようなイラストファイルを準備します
ファイルはご自身で作られても、
アイコン作成サイト等を利用されても構いません。
ただ、正方形がいいようです。
今回私が使ったアイコンは「フリーペンシル」さんのを利用させていただきました。
優しいタッチの、かわいいイラストがたくさんあります★
作成したら、先ほどSCPでアップロードしたiconフォルダ内に、アップロードしましょう。
WordPressディレクトリ/wp-content/themes/<利用しているテーマ>/icon
※WordPress のメディアにアップロードし、
URLを確認する方法でも問題ありません。
吹き出しを設定しよう③(functions.php)
吹き出しを設定したいと思います。
まずは、バックアップを取ってから、設定をしていきましょう。
functions.phpの編集手順
※「Snippets」というプラグインを使って編集をします。
※本来、functions.phpは利用しているテーマフォルダの中にあるファイルを編集しますが、
Snippetsを使うと、どのテーマからもSnippetsのコードを呼び出すことができるため、
もしテーマを変更したとしても、もう一度functions.phpを編集しなくてもよくなります。
①Snippetsプラグインの「Add New」をクリックする。
②任意のタイトルをつける。
③ダウンロードしたfunctions.phpの1行目「<?php」部分を削除し、
残りのコードをコード記入欄に貼り付ける。
③「Run snippet everywhere」を選択し、「Save changes」をクリックする。
④追加したsnippetが有効になっていることを確認する。
functions.phpに設定したコードの意味を確認しよう
ただ書くだけでも使う分には問題ないですが、
折角なので、コードの意味を確認し、理解を深めたいと思います。
クイックタグ用コード
- function add_button_quicktag() {
add_button_quicktagという名前の関数を作ります。
- function add_button_quicktag() {
- ?>
- <script type=”text/javascript”>
- </script>
- <?php
script typeにJavaScriptを指定することで、
?> から <?php で囲った部分までがJavaScriptコードとして出力されて呼びだされるようになります。
例えば以下のようなJavaScriptです。
WordPressの記事作成画面で、「テキスト」を設定したときに表示するクリックタグを追加しています。
記事作成画面で「ふきだし(汗)」という名前のクリックタグをクリックすると、
anime_balloon position=”left” name=”名前” text=”本文” img=”icon/img_sweat.png” animetion=”icon_sweat”
の文字を表示し、
必要に応じて、以下を変更します。
※functions.phpは以下フォルダ内にあります。
WordPressディレクトリ/wp-content/themes/<利用しているテーマ>/functions.php
以下フォルダに画像ファイルを置いたとします。
WordPressディレクトリ/wp-content/themes/<利用しているテーマ>/icon/img_sweat.png
この場合、以下のように指定します。
- add_action(‘admin_print_footer_scripts’, ‘add_button_quicktag’);
作成した関数を呼び出して実行します。
※add_action関数の詳細はCODEXご参照。
アニメ吹き出し用ショートコード
- function anime_balloon_func($atts) {
- ~~~
- }
anime_balloon_funcという名前の関数を用意します。
- shortcode_atts( array(
- ‘animetion’ => ”,
- ‘position’ => ”,
- ‘img’ => ”,
- ‘name’ => ”,
- ‘text’ => ”,
- ), $atts )
arrayは配列と言います。
電車を思い浮かべてみてください。
1つ1つの項目が1両だと思ってみてください。
その車両の中に”animetion”、”position”などのデータを入れています。
shortcode_attsという関数は下記のように使われます。
shortcode_atts(
【必須】使用したいキーとデフォルト値の宣言[],
【必須】ショートコードに渡されたキーと値[],
【任意】フィルター用の文字列
);
【必須】使用したいキーとデフォルト値の宣言[]
例えば、今回では「’animetion’ => ”」はanimetionという配列の1つ目に空データをデフォルト値として入れています。
今回作成している「anime_balloon_func」関数は、
“animetion”、”position”、”img”、”name”、”text”に値が渡されることを前提に実装されています。
そのため、配列を用意し、それぞれの項目に空データをデフォルト値として入れています。
クイックタグボタンをクリックすると、以下のようなコードが表示され、
必要に応じて、””の中を編集して利用します。
anime_balloon position=”left” name=”名前” text=”本文” img=”icon/img_sweat.png” animetion=”icon_sweat”
しかし、想定していない情報を利用者が設定する可能性も0ではありません。
そこで、ショートコードから想定するキーの値が入力値にある場合はそれらをそのまま使い、
なかった場合はデフォルト値を使用することで、入力による誤作動を防いでいます。
【必須】ショートコードに渡されたキーと値[]
利用者が設定した値は「$atts」に入っています。
- extract( shortcode_atts( array(
- ‘animetion’ => ”,
- ‘position’ => ”,
- ‘img’ => ”,
- ‘name’ => ”,
- ‘text’ => ”,
- ), $atts ) );
extract関数は、配列を別々に扱うことができるようにする関数です。
配列は下記のように車両がつながっている状態でした。
これを、電車全体としてではなく、車両個別に使えるようにするものです。
配列のときは、1つの要素を使いたいときでも、電車全体を呼び出す必要がありましたが、
バラバラにすると、電車全体を意識する必要がなくなります。
- $code_balloon = <<<EOT
- ~~
- EOT;
code_balloonという箱に、<<<EOT~EOT;で囲まれたコードを代入しています。
1つの箱(変数と言います)に長い文字列を入れる場合に、<<<EOT~EOT;を使います。
この「EOT」という文字列は、必ずEOTにする必要はなく、任意の文字列で構いません。
<div class="balloon__contener $animetion">
<div class="balloon__$position">
<figure>
<span class="icon_emotion"></span>
<img src="$img" />
<figcaption>$name</figcaption>
</figure>
<div class="balloon__text">
$text
</div>
</div>
</div>
- 吹き出しの位置
- 吹き出し用の画像
- アニメーション画像
- 画像下につける名前
- 吹き出しに入れる文字
をHTMLコードにセットしています。
anime_balloon_func関数の処理が終わると、
code_balloonという箱を結果として返します。
- add_shortcode(‘anime_balloon’, ‘anime_balloon_func’);
作成した関数を呼び出して実行します。
※add_action関数の詳細はCODEXご参照。
吹き出しを設定しよう④(style.css)
見た目をよくするために、style.cssを編集しましょう。
style.cssの編集手順
※ここでは、Simple Custom CSS and JSプラグインでCSSを追加しますが、
外観>カスタマイズ>追加CSSに記載しても構いません。
①Simple Custom CSS and JSプラグインで、「カスタムCSSの追加」をクリックする。
②任意の名前をつけ、コード記入欄に例えば以下を入力する。
「 background: url」の部分は、SVGファイルの保管ディレクトリを指定してください。
相対パスでの記載でも問題ありませんが、
その場合、style.cssをカレントディレクトリとした相対パスを書く必要があります。
パスが間違っていると、アニメーション画像が表示されないため、書いた後、正しく表示されているか確認してください。
パスを間違えると表示されないよ💦
/*/////////////////////////////////////////////////
//チャット画面(会話方式)を記事に表示する方法
/////////////////////////////////////////////////*/
.balloon__contener {
clear: both;
width: 100%;
padding: 10px 0;
}
.balloon__contener:after {
content: ".";
display: block;
clear: both;
height: 0;
visibility: hidden;
}
.balloon__contener figure {
width: 60px;
position: absolute;
padding: 0;
margin: 0;
top: 0;
/* 正方形を用意 */
}
.balloon__contener figure img {
border-radius: 50%;
width: 60px;
height: 60px;
border: solid 1px #dddddd;
}
.balloon__contener figure figcaption {
color: #000000;
width: 60px;
position: absolute;
top: 60px;
text-align: center;
font-size: 70%;
line-height: 100%;
}
.balloon__contener .balloon__left {
width: 100%;
position: relative;
display: block;
max-width: 80%;
clear: both;
}
.balloon__contener .balloon__left figure {
left: 0;
}
.balloon__contener .balloon__left .balloon__text {
margin-left: 80px;
position: relative;
padding: 20px;
border-radius: 10px;
background-color: #d8f4f8;
}
.balloon__contener .balloon__left .balloon__text::after {
content: "";
position: absolute;
display: block;
width: 0;
height: 0;
left: -10px;
top: 12px;
border-right: 15px solid #d8f4f8;
border-top: 15px solid transparent;
border-bottom: 15px solid transparent;
}
.balloon__contener .balloon__right {
width: 100%;
position: relative;
display: block;
float: right;
max-width: 80%;
clear: both;
}
.balloon__contener .balloon__right figure {
right: 0;
}
.balloon__contener .balloon__right .balloon__text {
margin-right: 80px;
position: relative;
padding: 20px;
border-radius: 10px;
background-color: #eeeeee;
}
.balloon__contener .balloon__right .balloon__text::after {
content: '';
position: absolute;
display: block;
width: 0;
height: 0;
right: -10px;
top: 12px;
border-left: 15px solid #eeeeee;
border-top: 15px solid transparent;
border-bottom: 15px solid transparent;
}
@media only screen and (max-width: 767px) {
.balloon__contener .balloon__left,
.balloon__contener .balloon__right {
max-width: 100%;
}
}
/*/////////////////////////////////////////////////
//チャット画面(会話方式)にアイコンを追加する方法
/////////////////////////////////////////////////*/
.balloon__contener .icon_emotion {
width: 30px;
height: 30px;
position: absolute;
top: 0px;
left: 40px;
background-size: auto 100%;
padding: 0;
z-index: 1;
}
.balloon__contener .balloon__right .icon_emotion {
left: 0px;
}
/*//// ガーン /////*/
@-webkit-keyframes icon_shock {
0% {
opacity: 0;
}
50% {
opacity: 0;
-webkit-transform: translateY(-50%);
transform: translateY(-50%);
}
51%,
100% {
opacity: 1;
}
}
@keyframes icon_shock {
0% {
opacity: 0;
}
50% {
opacity: 0;
-webkit-transform: translateY(-50%);
transform: translateY(-50%);
}
51%,
100% {
opacity: 1;
}
}
.icon_shock .balloon__left .balloon__text {
background-color: #c7ade2;
}
.icon_shock .balloon__left .balloon__text::after {
border-right: 15px solid #c7ade2;
}
.icon_shock .icon_emotion {
background: url("<サイトのトップページアドレス>/wp-content/themes/<利用しているテーマ>/icon/icon_shock.svg") repeat-x 0 0;
-webkit-animation: icon_shock 1s ease-in-out infinite alternate;
animation: icon_shock 1s ease-in-out infinite alternate;
}
/*//// 汗 /////*/
@-webkit-keyframes icon_sweat {
16.65% {
-webkit-transform: translateX(6px);
transform: translateX(6px);
}
33.3% {
-webkit-transform: translateX(-5px);
transform: translateX(-5px);
}
49.95% {
-webkit-transform: translateX(4px);
transform: translateX(4px);
}
66.6% {
-webkit-transform: translateX(-2px);
transform: translateX(-2px);
}
83.25% {
-webkit-transform: translateX(1px);
transform: translateX(1px);
}
100% {
-webkit-transform: translateX(0);
transform: translateX(0);
}
}
@keyframes icon_sweat {
16.65% {
-webkit-transform: translateX(6px);
transform: translateX(6px);
}
33.3% {
-webkit-transform: translateX(-5px);
transform: translateX(-5px);
}
49.95% {
-webkit-transform: translateX(4px);
transform: translateX(4px);
}
66.6% {
-webkit-transform: translateX(-2px);
transform: translateX(-2px);
}
83.25% {
-webkit-transform: translateX(1px);
transform: translateX(1px);
}
100% {
-webkit-transform: translateX(0);
transform: translateX(0);
}
}
.icon_sweat .balloon__left .balloon__text {
background-color: #a5d4d8;
}
.icon_sweat .balloon__left .balloon__text::after {
border-right: 15px solid #a5d4d8;
}
.icon_sweat .icon_emotion {
background: url("<サイトのトップページアドレス>/wp-content/themes/<利用しているテーマ>/icon/icon_sweat.svg") repeat-x 0 0;
-webkit-animation: icon_sweat 1s ease-in-out infinite alternate;
animation: icon_sweat 1s ease-in-out infinite alternate;
}
/*//// 気分UP /////*/
@-webkit-keyframes icon_up {
0% {
opacity: 1;
}
100% {
opacity: 0;
-webkit-transform: translateY(1em);
transform: translateY(1em);
}
}
@keyframes icon_up {
0% {
opacity: 1;
}
100% {
opacity: 0;
-webkit-transform: translateY(1em);
transform: translateY(1em);
}
}
.icon_up .balloon__left .balloon__text {
background-color: #f0d2a7;
}
.icon_up .balloon__left .balloon__text::after {
border-right: 15px solid #f0d2a7;
}
.icon_up .icon_emotion {
background: url("<サイトのトップページアドレス>/wp-content/themes/<利用しているテーマ>/icon/img_shock.svg") repeat-x 0 0;
-webkit-animation: icon_up 1s ease-in-out infinite alternate;
animation: icon_up 1s ease-in-out infinite alternate;
}
/*//// 怒る /////*/
@-webkit-keyframes icon_angry {
50% {
-webkit-transform: scale(1.5);
transform: scale(1.5);
}
}
@keyframes icon_angry {
50% {
-webkit-transform: scale(1.5);
transform: scale(1.5);
}
}
.icon_angry .balloon__left .balloon__text {
background-color: #e7b3b1;
}
.icon_angry .balloon__left .balloon__text::after {
border-right: 15px solid #e7b3b1;
}
.icon_angry .icon_emotion {
background: url("<サイトのトップページアドレス>/wp-content/themes/<利用しているテーマ>/icon/icon_angry.svg") repeat-x 0 0;
-webkit-animation: icon_angry 1s ease-in-out infinite alternate;
animation: icon_angry 1s ease-in-out infinite alternate;
}
/*//// ハート /////*/
@-webkit-keyframes icon_heart {
50% {
-webkit-transform: scale(1.5);
transform: scale(1.5);
}
}
@keyframes icon_heart {
50% {
-webkit-transform: scale(1.5);
transform: scale(1.5);
}
}
.icon_heart .balloon__left .balloon__text {
background-color: #f9d7e8;
}
.icon_heart .balloon__left .balloon__text::after {
border-right: 15px solid #f9d7e8;
}
.icon_heart .icon_emotion {
background: url("<サイトのトップページアドレス>/wp-content/themes/<利用しているテーマ>/icon/icon_heart.svg") repeat-x 0 0;
-webkit-animation: icon_heart 1s ease-in-out infinite alternate;
animation: icon_heart 1s ease-in-out infinite alternate;
}
/*//// 気分ダウン /////*/
@-webkit-keyframes icon_down {
0% {
opacity: 0;
}
50% {
opacity: 0;
-webkit-transform: translateY(-50%);
transform: translateY(-50%);
}
51%,
100% {
opacity: 1;
}
}
@keyframes icon_down {
0% {
opacity: 0;
}
50% {
opacity: 0;
-webkit-transform: translateY(-50%);
transform: translateY(-50%);
}
51%,
100% {
opacity: 1;
}
}
.icon_down .balloon__left .balloon__text {
background-color: #adbedb;
}
.icon_down .balloon__left .balloon__text::after {
border-right: 15px solid #adbedb;
}
.icon_down .icon_emotion {
background: url("<サイトのトップページアドレス>/wp-content/themes/<利用しているテーマ>/icon/icon_down.svg") repeat-x 0 0;
-webkit-animation: icon_down 1.3s ease-in-out infinite alternate;
animation: icon_down 1.3s ease-in-out infinite alternate;
}
※お好みに応じて、
- 吹き出しの背景色(background-color)や、
- 吹き出しの枠線(border-left/border-right/border-top/border-bottom)、
- 吹き出しの角の丸め(border-radius)
を変更することができます。
まとめ
いかがでしたでしょうか?
正しく表示されましたか?
パスが正しくないと、せっかくの吹き出しがきちんと表示されず、
試行錯誤した結果、結局相対パスではなく、絶対パスで書いてしまいました。
カスタムCSSを利用すると、テーマごとに用意されているファイルと異なるフォルダに配置されます。
パスを書いた後、必ずプレビューして表示を確認しましょう。
もっとパスの書き方勉強しないとな💦