『モバゲーのような携帯サイトを作るためにはどうしたらいいんですか?』
っていう質問を最近良く受けます。
おそらく、モバゲーがとても有名で、ある種モバゲーが携帯サイト界のデファクトスタンダードのような
位置づけになってきているのでしょうか。
確かに、携帯サイトを作ってきている身としても、
モバゲーのサイトデザインにするには、結構難しいことも多いし、学ぶことも多い。しかし、最近の携帯サイトは、実機からしかアクセスできないようになっていて、PCからコードを覗くことができないことも多く、学ぶことも難しいようです。
ということで、今回は実際にモバゲータウンに携帯でアクセスして、携帯の画面を見ながら、デザインを真似て新しく自分なりに作ってみましたので、そこから得た経験をTipsとして公開したいと思います。
ちなみに、左のスクリーンショットは、自分が似せて作った偽モバゲーのサイトの画像。おそらく、本家と変わらないデザインとなっていると思います。
なお、本来なら、HTMLやCSSのコードを公開してしまうほうが理解という意味では、最善だとは思うのですが、それをしてしまうとそのまま他のサイトにアップロードして、悪用する輩が必ず現れるので、残念ですが、公開はできません。コードを公開することは目的ではありませんし、悪用されることは本意ではありませんので、何卒ご理解ください。
さて、では順に説明していきます。なお、今回のサイトは3キャリア対応版ということで、1枚のHTMLですべて完成させています。
Tips 1. XHTMLで作成する。
画面の「新着ニュース」や「お知らせ」にあるように、ブロックレベル要素に背景をつけるためには、ドコモではXHTMLで書かなければなりません。TABLEタグを使用することもできますが、その場合だと対応する端末の敷居を高くする結果となるので、XHTMLで全体をコーディングする必要があります。
XHTMLでHTMLを書くにはPC向けとは異なり、少々テクニックが必要です。これについては、前回の記事で詳しく書きましたので、そちらをご覧ください。
参照) iモードHTMLとiモードXHTMLを正しく切り替える方法
Tips 2. キャリアごとの仕様の差は外部CSSで。
モバゲーのように文字を1段階小さくして全体のテキストを表示する場合など、キャリアごとに若干差が出てきてしまう場合もあります。この場合、特に(ドコモ)と(au・ソフトバンク)に差がでることが多いので、こういうケースでは、外部CSSを読めるブラウザ(au・ソフトバンク)と読めないブラウザ(ドコモ)
の仕様の差を埋めるために、あえて外部CSSを読み込ませ、こちらにau、ソフトバンク向けのスタイルを記述することで解決します。
参考) 外部CSSの読み込み有無で微妙なレイアウトの違いを出す
Tips 3. 文字サイズを
(補足有り)
文字を小さくして表示するサイトも最近はよく見かけます。サイト全体の文字を一括で指定する方法は残念ながらありません。これは、ドコモが対応していないから。BODYタグに、インラインCSSで「font-size:smaller;」のように記述できないからです。
なので、これは文字ごとに指定してやるしかないです。
ではどうするかというと、私はこう書きました。たとえば、画像の「[マイページ | 友達紹介]」の部分は、
<div style="text-align:center;" class="small">
<span style="font-size:smaller;">[<a href="test.html">マイページ</a> | <a href="test.html">友達紹介/a>]</span>
</div>
と書いてます。ここで、DIVタグのclass属性の「small」は外部CSSにスタイルを記述していますが、
そこには以下のように書いています。
.small {
font-size:12pt;
}
外部CSSが読み込まれるauとソフトバンク携帯の場合、文字サイズが12ptという情報が初期の段階で読み込まれます。一方、ドコモではこの情報は無視されますが、SPANタグに書いたインラインCSSで文字サイズを一段階小さくする記述をしているので、文字は小さくなる。なお、このSPANタグのCSSは
※追記
ごめんなさい。ちょっと誤解を招く書き方をしてしまいました。
CSSによる携帯サイトの文字サイズ指定については後日改めて記事にします。
※さらに追記
どうやら、以下のようにDIVタグにfont-sizeプロパティを指定して、bodyタグ以下の属性として
記述してやれば、全体で文字サイズを指定することも可能な様子。
BODYタグに記述しても不可なのは確かですが、この方法なら簡単ですね。
ドコモの仕様ではSPANタグしかfont-sizeは指定できないって書いてあるのに…
<body>
<div style="font-size:small;">
本文
</div>
</body>
Tips 4. ロゴ画像のサイズは横240ピクセル
最近の携帯はほとんどが横240ピクセルより高解像度化していますが、auやドコモのブラウザでは、画像を自動的に拡大縮小する機能が備わっており、横240ピクセルで作っておけば、大抵は画面ピッタリに収まるようになっています。ただし、ソフトバンクは高解像度のまま表示する他に合わせないKYな仕様をしている端末もあり、240ピクセルでは画像が小さく表示されてしまう端末もありました。
参考) 3キャリア対応サイトを作る際の注意点 (画像フォーマット編)
Tips 5. 流れる文字はDIVタグで
実際のモバゲーにはないのですが、電光掲示板のような流れる文字を表示させることもできます。この場合、HTMLタグにマーキータグがありますが、今回はXHTMLで書いているので、以下のようにDIVタグを使いました。
参考) 狭くて小さな画面だからこそ携帯に適したマーキー(marquee)タグ
<div style="display:-wap-marquee;">
この画面はモバゲータウンに似せて作ったテスト画面です。
</div>
Tips 6. 反転文字
「新着ニュース」のような背景をつけた反転文字はどのように表現するかというと、
<div style="text-align:center;background-color:#007128;">
<span style="color:white;">新着ニュース</span>
</div>
としてます。
背景はDIVタグにbackground-colorプロパティでCSSで指定します。
※追記
ドコモでもcolorプロパティはDIVタグに適用できるので、一度に併記しても構いません。
参考) iモードHTMLとiモードXHTMLを正しく切り替える方法
Tips 7. 色つき水平線
(補足有り)
新着ニュースの帯の前後についている背景の水平線(区切り線)はどのように表現するかというと、
としました。<hr size="1" style="width:100%;height:1px;margin:2px 0;padding:0;color:blue;background:blue;border:1px solid blue;" />
ここでの各キャリアのポイントは以下です。
●ドコモ
XHTMLではすべての属性に非対応
●ソフトバンク
・けい線の上下にマージンがとられる
・hrの余白調整はmargin/paddingプロパティで対応可能
・陰をなくすnoshadeに対応
●au
・ライン色はcolorプロパティで対応
・au以外のキャリアのライン色はbackgroundプロパティで対応
・heightプロパティは非対応(size属性で縦方向の長さを指定)
・borderプロパティは非対応(au以外はけい線の境界線を指定可)
・text-alignプロパティはauのみ対応(au以外はalign属性を使用)
Tips 8. 右寄せ
(補足有り)
画像中の「もっと見る」にあるように、右寄せで文字を表示させる方法は、CSSで「text-align」プロパティを用いるのが良いと思われます。したがって、
<div style="text-align:right;">
<a href="test.html">もっと見る</a>
</div>
とするのが一般的です。中央揃えの場合はCENTERタグを使うこともできますが、XHTMLでは古いので、こちらのほうがよいでしょう。ちなみに。DIVタグではなく、SPANタグで囲む方法もありますが、本来「text-align」プロパティはブロックレベル要素にしか適用できないので、誤用となります。
Tips 9. 画像の回り込み
(補足有り)
画像中のエンタメ内にあるように、画像に文字を回り込ませて、たとえば、モバゲーのように画像の右側に文字を回り込ませる方法は以下。
<img src="./images/firefox.jpg" width="50" height="50" alt="" style="float:left;margin-top:3px;margin-right:3px;margin-bottom:8px;" align="left" border="0" /><a href="game.html">ゲーム</a><br />バスケで給料UP!?<br clear="all" />
です。ここでのポイントは、2つ。
まず、通常回り込みを行う場合は、DIVタグなどにfloatプロパティを用いて実現しますが、auなどではfloatプロパティに対応していないので、上記のようにドコモ用にインラインCSSでIMGタグにfloatプロパティで回り込みさせ、一方au向けにはIMGタグのalign属性で同様に指定します。
そして回り込みを解除したい位置で<br clear="all" />します。
また、その他の方法として、TABLEタグを使って、擬似的な回り込みを実現する方法もありますが、TABLEタグに対応していない端末が多いので、避けるべきです。
参考) Openwave XHTML Mobile Profile レファレンス
Tips 10. 携帯サイトは文字でデザインする!
携帯サイトは文字でデザインするといっても過言ではなく、改行せずに画面いっぱいに表示できる文字数は決まっているので、できる限り文字を短くし、他と文字数が揃うように調整してやりながら、全体としてみたときに上手く調和がとれている必要があります。
参考) 半角カナのなせる技〜オシャレかつスマートに着飾る魅力
たとえば、コミュニティー&アバター内の「友達検索〜友達を誘おう」までの部分を見てください。
メニューとそのメニューの説明が「:」を境に区切られ、しかも全体が揃っているため、見やすくなっています。これをコーディングする際、通常はTABLEタグを使う発想が考えられますが、たぶんモバゲーもTABLEタグは使用していないでしょう。
たとえば、友達検索の部分では、単に
友達検索:友達探そう
として、文字が一文字分足らない「タウン」の部分は、
タウン :身近な仲間も!?
として、タウンの文字の後に単に全角スペースを挿入するに過ぎません。
でも、これでも携帯サイトの場合はOKでしょう。
また、「サークル」の部分では、本来携帯サイトは文字幅の節約をするために、「サークル」のようにカタカナは半角で表示するテクニックが使われますが、今回のように「:」までの文字数はモバゲーの場合は4文字にしているので、あえてサークルを全角で書いているのだと思います。
Tips 11. フッターは最後に。そして質素に。
お問い合わせや利用規約など、あまり読まれないようなリンク先は通常フッターにもってくるのが、普通です。携帯サイトは極端に縦に長いですし、上から順に目を通していくので、あまり目立たせる必要のないメニューはフッターでよいでしょう。また、目立たせる必要がありませんので、背景をつけたり、文字を大きくしたりする必要もなく、簡素に書くことも必要だと思います。
Tips 12. 絵文字のちょっとしたテクニック
ドコモやソフトバンクの絵文字は、文字を一段階小さくした場合でも、そのタグの中に収められた絵文字は文字と同じように縮小されて表示されます。
一方で、auの場合、auの技術情報にあるようにau向けの絵文字を表示させる場合のタグは、
<img localsrc="絵文字番号" />
としますが、この場合だと、絵文字は端末内から呼び出されるので、文字と同じようには縮小されません。つまり、
<div style="font-size:10pt;"><img localsrc="絵文字番号" />文字</div>
と表記しても、文字は小さくなっても、絵文字は小さくなりません。
これを回避するためには、あえてドコモの絵文字を記述し、auのサーバー側で絵文字をau向けに自動変換させる方法があります。この場合であれば、ドコモの絵文字の記述方法でauに対応させることもできますし、絵文字を縮小表示させることができるので一石二鳥です。
なお、このブログで以前紹介した、携帯絵文字変換スクリプトの改良版では、この縮小表示に対応していますので、もしご興味があれば使用してみてはいかかがでしょうか。
参考) 携帯絵文字変換スクリプト改良版の配布 (3キャリア対応 - PHP)
長くなってしまいましたが、今回はこのへんで。
携帯サイトは仕様が乱立しているだけに、なかなか一筋縄ではいきませんね(笑)
■書籍を出版!
携帯サイト制作について、もっと詳しく書かれた制作本を出版しました。
まだゲットしてない方はぜひ!
初の単著です。

携帯サイト コーディング&デザイン
ソフトバンククリエイティブ
高木 悠介
------------------補足情報 (8月19日)------------------
記事を投稿してからある程度メールやコメントなどでツッコミをいただき、
情報がまとまってきたので、ここで一度補足しておきます。
1. ソフトバンクのVGA端末のKYっぷりをなんとかして
この記事の次でPHPスクリプトを使った解決方法をまとめてみました。
静的なHTMLで対応させるのはやはり難しいようです。
2. HRタグを使うよりスペーサー.gifを使うほうが一般的なのでは
モバゲーのように区切り線を使って段落を分ける場合、HRタグを使うより、spacer.gifを使った方がよいのでは?という指摘がありました。
たぶんご指摘の方法が一般的ですね。ただ、こちらで改めて複数の端末で確認したところ、auとソフトバンクはspacerは使っていませんでした。たぶん、これらのキャリアはCSSで対応させて、ドコモの場合はスペーサーを使ってるかもしれませんね。
3. 12pt+smallerは文字が2段階下がることもある
これは、こちらの書き方が悪かったですね。申し訳ありません。確かに、ソフトバンクの携帯ではCSSの挙動に正確な機種が多いので、この指定方法だと文字サイズが2段階下がる機種も多いです。ただ、私が調べた限りではこの方法がキャリア間の違いが一番少ない指定方法だったので。
ちなみに、実機のソフトバンク携帯で実際のモバゲーを見たのですが、見事に文字サイズが2段階下がってました。機種の文字サイズ設定にもよるので、このへんは大目に見る必要があるのかも。とりあえず上記のTipsはタイトルを修正させていただきました。
もし、1枚のHTMLとCSSで文字サイズを全ての機種で1段階下げる方法を知っている方はぜひ教えてください。もちろんプログラムを使用しないという条件付きでお願いします。
改めて文字サイズについては新しい記事でまとめる予定です。
4. XHTMLはmova非対応
ご指摘はおっしゃるとおりですが、今回の記事の目的はあくまで「モバゲーのようなサイトを作るには」がテーマですので、DIVタグを使った反転文字等の関係で、省略させていただきました。
5. docomoは<br clear="all" />で回り込みを解除できないよ!
仰せの通りです。訂正させてください。
ご指摘の通り、ドコモでは<br clear="all" />だけでは解除できません。
回り込みを正しく解除するには2通りの方法があります。1つは回り込み解除位置の次にHRタグを使用する方法。この場合であれば、HRタグによって<br clear="all" />はなくてもドコモでもauでも回り込みは解除されます。
2つ目は回り込みを解除したい位置の次にくる要素をDIVタグで囲み、以下のように回り込みを解除する方法です。回り込みを解除する位置に<br clear="all" />は必要ありませんが、古い機種も考えると入れておいたほうがよいです。
<br clear="all" />
<div style="clear:both;">
次にくる内容
</div>
ちなみに、画像と回り込みさせる文字のほう側をDIVタグなどのブロックレベル要素で囲ってあげでもドコモでは回り込みは解除できません。また、2つめの方法だとauでは改行されないという指摘がありましたが、そのような現象は確認できませんでした。
下記の情報は古くなっています。
最新のスクリプトは以下で配布しています。
→http://www.dspt.net/tools/emoji/
3キャリア対応サイトを作成するために、ネックなのは絵文字の互換性。
ドコモの絵文字で入力したページを作成して、他のキャリアの携帯で見ると、auはサーバー側で自動変換されますが、ソフトバンクは対応していないので表示されません。
そこで、キャリアに合わせてドコモ&auとソフトバンクという2ページでページを作るのは面倒だし、
3キャリア別々に作成してもいちいち同じ絵文字を探して入力するのは少々面倒です。
そこで、絵文字を自動変換してくれるスクリプトが登場するわけですが、
僕が探したところフリーってのはなかなかないみたいです。
ということで作ってみました。
絵文字を変換するにあたって、まず考えなくてはならないのは、
絵文字の相互変換表を作ること。
そもそも、キャリアによって用意している絵文字数にはかなり開きがあります。auやソフトバンクに比べて、ドコモは拡張絵文字も含めても230個くらいしかないので、相互変換表を作るにしても、数が合わない以上すべての絵文字を同期させることは不可能です。
したがって、自然な流れとしては一番数の少ないドコモの絵文字に他社を合わせる方法をとるのがふつう。ドコモの絵文字を主体に考えるので、ドコモの絵文字を基準に他社の絵文字はそれと似たものが表示されるような設計にします。
ドコモを基準に考えているので、表示できる絵文字数は少ないのが欠点ですが、スクリプトで自動変換する仕組みはあってこしたことはないので、絵文字変換表を作ることにしました。
これを自分で作るのは面倒なのですが、運良くウノウラボさんでEメール用に絵文字の相互変換リストを公開されていたので、ありがたくダウンロードさせていただいて、自作のプログラムで使いやすいようにカスタマイズしてCSVに変換。
ある程度は変換できない絵文字がゲタ「〓」にならないようにしましたが、それでもまだ残っているので、この辺は自分の好きなように変えてもよいかと思います。
■絵文字変換表(emoji.csv)ドコモ→他社
これをもとにPHPで以下のようなプログラムを作成。
■PHP絵文字変換スクリプト(sample.txt)
<?php
//絵文字変換表
$emoji_data = "emoji.csv";
//入力値取得
$num = $_GET["emoji"];
//ファイルオープン
$file =fopen($emoji_data, "r");
//変換表を配列に格納
for ($i = 1; $i <= 300; $i++) {
if (feof($file)) {
break;
}
$emoji_array[$i] = fgetcsv($file, 1000, ",");
}
//ファイルクローズ
fclose($file);
function encode($data) {
$data = mb_convert_encoding($data, "SJIS", "auto");
return $data;
}
//携帯UA取得
$agent = $_SERVER["HTTP_USER_AGENT"];
//携帯端末のユーザエージェントを判定
function mobile($data){
if(preg_match("/^DoCoMo\/[12]\.0/i", $data))
{
return "i";// i-mode
}
elseif(preg_match("/^(J\-PHONE|Vodafone|MOT\-[CV]980|SoftBank)\//i", $data))
{
return "s";// softbank
}
elseif(preg_match("/^KDDI\-/i", $data) || preg_match("/UP\.Browser/i", $data))
{
return "e";// ezweb
}
elseif(preg_match("/^PDXGW/i", $data) || preg_match("/(DDIPOCKET|WILLCOM);/i", $data))
{
return "w";// willcom
}
elseif(preg_match("/^L\-mode/i", $data))
{
return "l";// l-mode
}
else {
return "p";// pc
}
}
//携帯キャリアに合わせて絵文字を出力
function emoji($data) {
global $agent,$emoji_array;
if(preg_match("/[0-9]{1,3}/", $data) && is_numeric($data) && 0 < $data && $data < 253) {
switch(mobile($agent)){
case "i";
$put = $emoji_array[$data][1];
break;
case "e";
if (preg_match("/[^0-9]/", $emoji_array[$data][2])) {
$put = $emoji_array[$data][2];
} else {
$put = "<img localsrc=\"".$emoji_array[$data][2]."\" />";
}
break;
case "s";
if (preg_match("/^[A-Z]{1}?/", $emoji_array[$data][3])) {
$put = "\x1B\$".$emoji_array[$data][3]."\x0F";
} else {
$put = $emoji_array[$data][3];
}
break;
case "p";
$put = "[PCでは絵文字は表示されません]";
break;
}
echo $put;
}
else {
echo "[Error!]\n";
}
}
//処理
emoji($num);
?>
使用される場合は、trans.phpなどの名前で保存し、お使いください。携帯端末の判別は携帯電話(機器)情報サイトさんで公開されている携帯端末のユーザエージェント振り分けを参考にしました。
先ほどの絵文字変換表を元にドコモの絵文字を基準に、各キャリアに合わせたフォーマットで絵文字が出力されるようにしています。予期しない入力値は[Error!]を表示します。
携帯サイト用に使うので、あまりセキュリティは考えていない点はご愛敬とさせてください。
要望があれば直そうかな。
で、このPHPスクリプトをどのように呼び出すかということなのですが、
手っ取り早い方法は携帯サイト全体をすべてPHPで運用する方法。
でもこれだと結構いやがる人が多いし、PHPってだけでちんぷんかんぷんになっちゃう人もいるし(ちょっと前の僕がそうです。)、変えたくない一番の理由は、やっぱり今までのHTMLをPHPに変えるのが面倒だから。
ということで、今までのHTMLのまま、そこからこのスクリプトを呼び出すには、
SSIをHTML内に書いてスクリプトを呼び出す方法が最も簡単。
以下のようなSSIを絵文字を表示したい部分に書けばOKです。もちろん、HTMLでSSIを動かすには、.htaccessなどで拡張子htmlでSSIが動くように設定を有効にしておく必要があります。
<!--#include virtual="/php/trans.php?emoji=絵文字番号"-->
(execでの実行形式だと引数を渡せずエラーになります。また、virtualのディレクトリパスに注意。virtualはトップディレクトリからの相対パスで記述します。)
絵文字番号ってところはドコモを基準にしているので、
こちらの表を参考に、書けば良いです。例えば、一番最初の「晴れ」なら、
<!--#include virtual="/php/trans.php?emoji=1"-->
です。
拡張絵文字の番号は、
基本絵文字の最後の番号から続けての連番になります。
ちなみに、自分の携帯はauなので、ドコモやソフトバンクはちょっと未確認。
特にソフトバンクが心配。テスト要員募集です(笑)。
http://www.dspt.net/data/emoji/test.html
こちらに携帯でアクセスしていただいて、ゴルフの絵文字が表示されたらOKでございます。
バグ等あればご指摘くださいませ。
8月31日
ドコモで絵文字が表示されない問題に対応しました。
emoji.csv、sample.txtが変更されています。
これはブラウザのキャッシュを利用しているのですが、簡単に言えば、キャッシュ保存は携帯に限って言えば、パケット代を節約するために一度見たページの内容を端末に保存しておく便利機能です。画面保存とは少し違います。
現在の常時接続の時代では、キャッシュの保存機能をとやかく言う人はいないのですが、電話回線で接続している時代や、現在の携帯電話など通信料によって課金される従量課金では、一度見たページをキャッシュから再表示する機能はとてもありがたい機能です。







