Vuforia Studio CSS備忘録：ボタンウィジェットのスタイルを変更する

#はじめに

Vuforia Studioでは、よく使うウィジェットに、ボタンウィジェットがある。そのボタンウィジェットのスタイルの変更例を備忘録としておく。

#前提

Vuforia Studioで、ARコンテンツを独力で作成できる人が対象。

#ボタンを配置する

ボタンウィジェットをドラッグ＆ドロップで 2Dキャンパスの中央パネルに配置する。スタイル確認用に2つ配置しておく。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297270/e483ebb5-a18a-a122-04f5-856fb326dd0e.png)

#すべてのボタンのスタイルを一括変更する

ボタンウィジェットのスタイルは、button クラスに設定すると一括変更できる。

###色を変更する

画面左の「アプリケーション」をクリックしてスタイル編集を開き、以下のコードを追加する。

```css:
// ボタンウィジェット全体へのスタイル設定
.button {
  border-color: navy;      // 枠線色
  background: royalblue;   // 背景色
  color: white;            // 文字色
  margin: 1px;             // 枠の外の余白
}

```
プロジェクトを保存すると、表示に反映され、下図のようになった。一括で変更されている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297270/c9542d27-a4b7-cccc-94af-53c5a69e2ca4.png)

#個々のボタンのスタイルを変更する

button クラスとしていた設定を、button-1 クラスに変更する。

```css:
// ボタンウィジェットのスタイル設定
.button-1 {
  border-color: navy;      // 枠線色
  background: royalblue;   // 背景色
  color: white;            // 文字色
  margin: 1px;             // 枠の外の余白
}

```
そして、ボタンウィジェット（ID: bottun-2）のクラスに、「button-1」を入力する。保存して表示に反映すると、以下のようになった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297270/c8c4a6f5-b524-a4f8-a46c-8e935ae917cd.png)

###ボタンの高さを変更する

height を指定してみる。まずは大きくしてみる。

```css:
// ボタンウィジェットのスタイル設定
.button-1 {
  border-color: navy;      // 枠線色
  background: royalblue;   // 背景色
  color: white;            // 文字色
  margin: 1px;             // 枠の外の余白
  height: 100px;           // ボタンの高さ
}

```
大きくなった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297270/51bd0f90-43a4-95de-6538-cd19880ab94a.png)

この結果で比較すると、左のボタンのデフォルトの高さは、100pxの半分近くのようだ。そこで、デフォルトの高さよりも小さくなるように、height: 25px;  と小さくしてみる。
ところが、デフォルトよりも高さは小さくならない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297270/70abed8a-aef8-e256-c0fe-e379da299569.png)
これは、**min-height: 47px;** と、**line-height: 42px;** という設定があるからのようだ。ボタンが小さくなると押しにくくなることを考慮して、これらの設定があるものと思われる。ただ、例えばスマホ画面やウェアラブルデバイス画面のように画面サイズがそれほど大きくない場合は、高さをさらに小さくしたい場合がある。そこで、高さを小さくする設定を試す。

```css:
// ボタンウィジェットのスタイル設定
.button-1 {
  border-color: navy;      // 枠線色
  background: royalblue;   // 背景色
  color: white;            // 文字色
  margin: 1px;             // 枠の外の余白
  height: 25px;            // ボタンの高さ
  min-height: 25px;        // ボタンの高さ最小値（デフォルトは 47px）
  line-height: 23px;       // 文字の行の高さ（デフォルトは 42px）
}

```
おぉ、ボタンの高さが小さくなった！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297270/fb21c7ed-d1c8-1f43-9ba6-f9fcc66f0f4b.png)

###ボタンの横幅を変更する（ボタン上の文字を基準に）

width: 100px; を追加してみる。横幅が大きくなった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297270/a7db0630-9df5-13d0-de08-889c4c124089.png)
次に、横幅を小さくするにあたりボタン表示をよく見てみると、枠内で文字の左右に余白がそこそこある。これは、**paddingによる文字の左右余白 12px** の設定があるからのようだ。width: 100px; を削除して、 padding: 0 1px; を追加してみる（左の 0 は文字の上と下の分、右の 1px は文字の左と右の分）。「ボタンB」の４文字が窮屈だが表示された小さいボタンになった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297270/9ee5dd97-2f34-df95-ea9a-c127109cc496.png)
今度は、ボタンウィジェットのテキストの「ボタンB」を「B」だけにしてみる。文字の左右にまた余白が現れた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297270/2e519181-9919-eb6d-bc19-e65d79328e7f.png)
これは、 **min-width: 52px;** の設定があるためのようだ。min-widh: 25px; を追加してみる。

```css:
// ボタンウィジェットのスタイル設定
.button-1 {
  border-color: navy;      // 枠線色
  background: royalblue;   // 背景色
  margin: 1px;             // 枠の外の余白
  color: white;            // 文字色
  height: 25px;            // ボタンの高さ
  min-height: 25px;        // ボタンの高さ最小値、デフォルトは 47px）
  line-height: 23px;       // 文字の行の高さ（デフォルトは 42px）
  padding: 0 1px;          // 枠内余白（デフォルトは、上下 0、左右 12px）
  min-width: 25px;         // ボタンの横幅最小値、デフォルトは 52px）
}

```
これで、縦 25px、横 25px のボタンになった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297270/4127fb45-4cc6-5cfe-b1fd-e331d0b174a2.png)
この小ささで実用的か？ は実際の使用時の検討に任せるとして、ともかく、ボタン上の文字の周囲の余白をなるべく小さくするボタンにすることが可能であることはわかった。

###ボタンの横幅を変更する（配置先レイアウトに応じた横幅にする）

今度は、ボタンの横幅を、配置先のレイアウトの横幅に応じた自動設定にする。そのようなスタイル設定が Vuforia Studio には用意されている。
各ボタンを選択して、画面右のクラスに、「button-block」を追加する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297270/74441d59-56c6-01f4-b96d-9d98609bd3d5.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297270/236d98a6-b7fc-3842-626f-f4528ffcb6fa.png)
編集画面上ではこの設定は反映されていないが、プレビューを見ると、配置先の中央パネルの幅に応じたボタン横幅になっている。スタイルに width 設定があっても、それよりもこちらの自動設定が優先されるようだ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297270/8ac0d876-0066-35a8-b07d-5c8ed9b2d85b.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297270/7973757f-68b9-e6f7-b776-79c37a9bf972.png)

###文字のフォントスタイルを変更する

font-size: 24px;         // 文字サイズ
font-weight: bold;       // 文字の太さ

などで、デフォルトのフォントサイズ 16px ではない他のフォントスタイルに変更できる。尚、これらを変更すると、height、min-height、line-height、width, min-width, padding、などと大きさの整合確認が必要な場合がある。
また、font-family でフォントの指定もできるが、プロジェクトを実際に実行するデバイスがそのフォントを利用できるかに依存する点に注意が必要と思われる。

###ボタンとフォントの大きさを簡単に変更する

Vuforia Studio では、button-small と、button-large の２つのクラスが用意されている。
ボタンB のクラスに button-small を入力してみる。フォントサイズは 12px とのこと。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297270/08efe25c-09a3-8324-13e3-74a0c38d8555.png)
ボタンB のクラスに button-large を入力してみる。フォントサイズは 20px とのこと。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297270/8b070b0b-f150-5337-057c-cec8cf41be15.png)
尚、フォントだけでなく、幅と高さも相応に変更される。

###ボタンの配色を簡単に変更する

Vuforia Studio では、ボタンの配色例が用意されている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297270/47e41f03-f741-7c4f-7974-58e83d0951c0.png)
上図の上から順に、ボタンのクラス欄に「button button-dark」「button button-positive」「button button-balanced」「button button-assertive」を入力している。何を用意してあるかは、画面左上の「テーマ」をクリックして表示し確認できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297270/18207cc5-1d78-1e2e-2477-fd318bc34bec.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297270/41590812-9aba-c571-0ad1-1169eeafad70.png)

###配色を簡単に変更する＋フォントサイズを変更する

例えば、button-balanced で背景色を緑にしつつ、フォントサイズを変える場合、ボタンのクラスに、button button-balanced button-large と入力することで組合せての設定ができる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297270/0d4f9ee8-d716-67ea-0e75-84afe20f8f66.png)
button-largeだと、ボタンサイズも大きくなってしまう。フォントサイズだけ大きくしたいのであれば、フォントサイズを指定するクラス名（下記の例では font-20）を、button-large の代わりに入力すればよい。

```css:
// 文字サイズ設定
.font-20 {
  font-size: 20px;         // 文字サイズ
}
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297270/e8e5be36-641d-a817-579a-00b9254654aa.png)

###配色を簡単に変更する＋ボタンの大きさを変更する

例えば、以下では、ボタンの大きさを button-2 クラスで定義して、ボタンウィジェットのクラスには、button button-balanced button-2 を設定している。

```css:
// ボタンウィジェットのスタイル設定
.button-2 {
  margin: 1px;             // 枠の外の余白
  height: 30px;            // ボタンの高さ
  min-height: 25px;        // ボタンの高さ最小値、デフォルトは 47px）
  line-height: 23px;       // 文字の行の高さ（デフォルトは 42px）
  padding: 0 4px;          // 枠内余白（デフォルトは、上下 0、左右 12px）
  min-width: 25px;         // ボタンの横幅最小値、デフォルトは 52px）
}

```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297270/381cf3e2-f1c6-8d74-f6ad-cde26f09a787.png)


###ボタンの背景を(半)透明にする

上記の簡単配色の場合は、クラス欄にさらに、 button-outline を追加することで、背景を透明にできる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297270/4583fd7c-3f4c-6cf7-a711-cb5b58de8b75.png)

または、スタイルの設定にて、background: rgba(65, 105, 225, 0.7); とすることで、背景色を(半)透明にできる。（0.7 を 0 にすれば透明にできる） 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297270/11998701-b1ab-9410-e2d7-88847f097c4e.png)

opacity: 0.7; などを追加してボタン全体を半透明にできる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297270/349704d9-5bec-6b78-f928-f3e78968063d.png)

###ボタン全体を透明にする

ボタンのクラス欄に、button-clear を追加すると、押すことが可能なボタンを非表示にできる。ボタンの表示プロパティをオフにするとボタンは押せなくなってしまう点が、同じ非表示でも異なる。写真やイラストとの重ね合わせで写真やイラストに複数のボタンを埋め込んだり、ウェアラブルデバイスでボタンは見えないがボイスコマンドを使えるようにする、などの応用が考えられる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297270/e7a97783-09ff-5f39-276e-21d855720b7a.png)
プレビューや Vuforia View での再生時は非表示になるが、押して JavaScriptファンクションを実行できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297270/54d87b04-7fbb-5db4-5265-d8e26bac0825.png)
尚、opacity: 0.01; でも、同様に透明なボタンにできる。

#ボタンの構成要素

ボタン表示は、以下のような CSSボックスモデルの要素から構成されているとのこと。Vuforia Studioの場合、ボタンサイズを小さくしたい場合には、min-height（heightの最小値）と line-height がデフォルトで設定されていることで高さの制限があり、min-width（widthの最小値）と padding がデフォルトで設定されていることで横幅の制限がある点に注意が必要だった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297270/7cafa85b-0915-7c7e-aca4-4477341f0a71.png)

#ボタンにイメージを使う

これまでは、文字を表示するボタンについて記してきた。次は、ボタン上にイメージを表示する方法について記す。

###イメージボタンにする（イメージを登録して使う）

・[CSS を使用したイメージボタンの作成 @Vuforia Studioヘルプ](http://support.ptc.com/help/vuforia/studio/ja/index.html#page/Studio_Help_Center/IntermediateCSSImageButton.html)
に、作成例が記載されている。これを参考に、試してみる。以下のクラスを追加する。

```css:
// イメージを背景に使う設定
.image-1, .image-1.activated {
  background-image: url(#{$resources}/Uploaded/btn_1_sm.png); // 背景イメージ
  background-repeat: no-repeat;  // 背景イメージは繰り返しなしで拡大
  background-position: center;   // 背景イメージの位置
}

// クリック時にイメージ背景を暗くする設定
.image-1.activated {
  	-webkit-filter: opacity(30%) drop-shadow(1px 1px 0px gray);
}

```
この例では、 btn_1_sm.png というファイル名のイメージを使う。そこで、画面左下のリソースに緑の＋ボタンをクリックしてファイル選択してアップロードする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297270/208f8172-4aad-d6e0-987b-ff531ff87226.png)
ボタンウィジェットのクラスに、上記の image-1 を入力して指定する。すると、ボタンの背景として登録したイメージが表示された。この方法では、ボタンウィジェットのテキストに表示文字を指定すれば、イメージと文字の組合せボタンを作成できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297270/5f2e2d8e-1c93-0aef-96a9-afae6d660309.png)
プレビューしてみる。クリックすると、暗くする設定の通りに暗くなった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297270/3211aed4-b38f-385d-11c4-2fd005f2bd00.png)


###アイコンボタンにする（Ionicアイコンを使う）

・ [【AR】Vuforia Studioで作った画面を少し飾り付けたい by PentagonJrさん](https://qiita.com/PentagonJr/items/4ec7ce5661eef6579e0f) 
では、Ionic framework の CSS Components を使い、文字ボタンでなくアイコンボタンに変更する方法が記載されている。こちらも是非ご一読を。

###ボタンウィジェットでなく、切り替えボタンウィジェットを使う

実は、この切り替えボタンウィジェットを使う方法が一番簡単な方法だと思う。
切り替えボタンウィジェットをドラッグ＆ドロップで配置後、ボタンを押したときのイメージ、ボタンを押していないときのイメージ、背景色、ボタンを押したときの背景色、幅、高さ、などを指定すればよい。押しているときと押していないときの値を同じにして、イベントのクリックの JS に実行する JavaScriptのファンクションを指定すれば、ボタンと同様に機能する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297270/fe92749b-4658-fa97-621d-441d19466253.png)

#おわりに

コンテンツの作成工数を考えると、デフォルトのボタンのままで使えるのであれば、それが最もよい。しかし、画面サイズの制約、色合いの関係、半透明にして背後も見えるようにする、などでボタンのスタイルの変更が必要な場面はある。スタイルの変更には、この備忘録が必ず役に立つはず。色、サイズ、透明化など用意済のクラスを指定することで簡単に変更できればよし。どうしても詳細なスタイル設定が必要となれば、この備忘録を参考に設定できるだろう。

#参考

・[ボタン @Vuforia Studioヘルプ](http://support.ptc.com/help/vuforia/studio/ja/index.html#page/Studio_Help_Center/WidgetButton.html)

・[CSS を使用したイメージボタンの作成 @Vuforia Studioヘルプ](http://support.ptc.com/help/vuforia/studio/ja/index.html#page/Studio_Help_Center/IntermediateCSSImageButton.html)

・ [【AR】Vuforia Studioで作った画面を少し飾り付けたい by PentagonJrさん](https://qiita.com/PentagonJr/items/4ec7ce5661eef6579e0f) 

・[Vuforia Studio で作成できるAR例～タブレットAR例、3D形状の特徴で実物にARを重畳（モデルターゲット）、2D画面上の表示や操作を組合せ](https://players.brightcove.net/1532789042001/HknUe20R_default/index.html?directedMigration=true&videoId=6120145841001)