さて、WBCも一応の盛り上がりを見せ、いよいよ明日、日本のプロ野球の開幕ですね。
広島カープファンの僕ですが、今年はAクラスに入れたら上々かなと思ってます。
さて息子の所属少年野球チームのアンオフィシャルサイトの中で、野球の点数つけるスコアボードを入力、表示させるようにしています。
スコアボードをコーディングしていく上で、正しいHTMLでスコアボードをコーディングするとどうなるんだろう?と疑問に思っていろいろ調べてみました。
目次
自分の書き方
僕に限らず、直感でtableタグで実装しようと考える人がほとんどだと思います。
dlで組むこともありっちゃありかもしれませんが、なんか定義してるかっていうと、そうでもないので、違うかなと。
そして書いたコードがこれ。
<table class="score-bord" cellspacing="0" cellpadding="0" border="0"> <tr> <th class="cell-team">チーム</th> <th class="cell-inning">1</th> <th class="cell-inning">2</th> <th class="cell-inning">3</th> <th class="cell-inning">4</th> <th class="cell-inning">5</th> <th class="cell-score">計</th> </tr> <tr> <td class="cell-team">Aチーム</td> <td class="cell-inning">1</td> <td class="cell-inning">1</td> <td class="cell-inning">0</td> <td class="cell-inning">4</td> <td class="cell-inning">0</td> <td class="cell-score">6</td> </tr> <tr> <td class="cell-team">Bチーム</td> <td class="cell-inning">3</td> <td class="cell-inning">0</td> <td class="cell-inning">0</td> <td class="cell-inning">0</td> <td class="cell-inning">1</td> <td class="cell-score">4</td> </tr> </table>
無難でなんの変哲も無い、ただの表組みです。
これをブラウザで確認すると、こんな感じになります。
MLBとNPBを調べてみた
一応スコアボードは出来上がったんですが、この書き方だと気持ち悪くないですか?
だって、tableタグの読み込み順で見ていくと、まず一番上のセルから
- チーム→1→2→3→4→5→計
- Aチーム→1→1→0→4→0→6
- Bチーム→3→0→0→0→1→4
となりますよね?
理想としては、得点は1回の表にAチーム何点、裏にBチーム何点、2回の表にAチーム何点…となるのが理想ですよね。
まぁ、チーム名毎回言うのは鬱陶しいかもしれませんけど。
そこで、MLBとNPBから適当に選んで調べてみました。
MLBサイトのスコアボード
MLBのサイトを見ていたら、ちょうど終わったWBCのページが有りましたので、そこから日本が負けたアメリカ戦のページを見てみます。
スコアボード部分はこんな感じで。
ソースは
<div class="linescore-container"> <section class="embedded_linescore gd-primary-regular linescore-sport-code-int"> <div class="embedded_linescore_container inning-min totalInnings-9"> <div class="fixed"> <table class="secondary teams" cellspacing="0" cellpadding="0" border="0"> <thead> <tr class="status-row"> <th class="show_default spacer first"> <span class="full">Final</span> <span class="short">F</span> </th> </tr> </thead> <tbody> <tr class="team-row away"> <td class="first"> <span class="cap small row light t"></span> <span class="full">United States</span> <span class="short">usa</span> </td> </tr> <tr class="team-row home"> <td class="first"> <span class="cap small row light t"></span> <span class="full">Japan</span> <span class="short">jpn</span> </td> </tr> </tbody> </table> <div class="inning_button prev_button"></div> </div> <div class="right-scroll"> <table class="secondary innings" cellspacing="0" cellpadding="0" border="0"> <thead> <tr> <th class="inningHeader ">1</th> <th class="inningHeader ">2</th> <th class="inningHeader ">3</th> <th class="inningHeader ">4</th> <th class="inningHeader ">5</th> <th class="inningHeader ">6</th> <th class="inningHeader ">7</th> <th class="inningHeader ">8</th> <th class="inningHeader ">9</th> </tr> </thead> <tbody> <tr class="away"> <td class="inning " data-score="0">0</td> <td class="inning " data-score="0">0</td> <td class="inning " data-score="0">0</td> <td class="inning " data-score="1">1</td> <td class="inning " data-score="0">0</td> <td class="inning " data-score="0">0</td> <td class="inning " data-score="0">0</td> <td class="inning " data-score="1">1</td> <td class="inning " data-score="0">0</td> </tr> <tr class="home"> <td class="inning " data-score="0">0</td> <td class="inning " data-score="0">0</td> <td class="inning " data-score="0">0</td> <td class="inning " data-score="0">0</td> <td class="inning " data-score="0">0</td> <td class="inning " data-score="1">1</td> <td class="inning " data-score="0">0</td> <td class="inning " data-score="0">0</td> <td class="inning " data-score="0">0</td> </tr> </tbody> </table> </div> <div class="fixed"> <div class="runs-column-background-faker"></div> <table class="secondary scores" cellspacing="0" cellpadding="0" border="0"> <thead> <tr> <th class="score">R</th> <th>H</th> <th>E</th> </tr> </thead> <tbody> <tr class="away"> <td class="score">2</td> <td>6</td> <td>0</td> </tr> <tr class="home"> <td class="score">1</td> <td>4</td> <td>1</td> </tr> </tbody> </table> <div class="inning_button next_button"></div> </div> </div> </section> <div class="video-highlights"> <a href="http://m.mlb.com/video?game_pk=486940"></a> </div> </div>
ちょっと長いんですけど、ただ単純なtableじゃなくて、チーム名の部分、1回から9回、合計ヒットエラーの3分割されているんですよね。
予想外でおもしろいです。
class名に「button」とかついてたりするので、なんか動きがあるのかなぁ。とも思ったけれど、それは確認できませんでした…。
何があるのか…
勝手に想像すると、チーム名と合計ヒットエラーのtableを囲んでるdivにfixedというクラスがついているので、特定の環境下では1回から9回までが横にスクロールできる形、もしくは1回ずつ進んでいく形になるのかなぁ。と。
まぁ、そもそもWBC用に作られたスコアボードじゃなくて、通常MLBサイトで使ってるのと同じみたいなので、他に汎用性をもたせた作りになってる。ってことなんじゃないかと思います。
NPBサイトのスコアボード
次にNPBですが、広島カープファンとしてオープン戦最終日3月26日にあった対ソフトバンク戦の結果からスコアボードを確認です。
(なんとも言えない試合…中継ぎ不安?)
<div class="scroll_wrapper"> <table> <thead> <tr> <th> </th> <th>1</th> <th>2</th> <th>3</th> <th>4</th> <th>5</th> <th>6</th> <th>7</th> <th>8</th> <th>9</th> <td class="total-1">計</td> <td class="total-2">H</td> <td class="total-2">E</td> </tr> </thead> <tbody> <tr class="top"> <th><span class="flag_h">福岡ソフトバンクホークス</span></th> <td>0</td> <td>0</td> <td>0</td> <td>0</td> <td>1</td> <td>0</td> <td>0</td> <td>0</td> <td>0</td> <td class="total-1">1</td> <td class="total-2">9</td> <td class="total-2">1</td> </tr> <tr class="bottom"> <th><span class="flag_c">広島東洋カープ</span></th> <td>0</td> <td>0</td> <td>0</td> <td>0</td> <td>0</td> <td>0</td> <td>0</td> <td>1</td> <td>0</td> <td class="total-1">1</td> <td class="total-2">4</td> <td class="total-2">0</td> </tr> </tbody> </table> </div>
これも通常のテーブルとはちょっと違って、回を表示する部分は<th>なんですが、合計やヒット、エラーの部分は<td>なんですよね。
この違いはよくわからないですね…。
MLBと違い、NPBはスマートフォンになるとスライドして表示していますね。
MLBの場合はチーム名を3文字くらいで略して表せるので、スマートフォンサイトでもさほど横幅に苦労してないみたいですね。
延長戦はしらないけれど。
日本だと地域名にしたら2文字ですみますね。
あ、ジャイアンツとスワローズかぶるのかな。
東京G、東京Sでいいんじゃないかな。スワローズは東京Yかな…
scope属性を利用する
先程のMLBにもNPBにもなかったんですが、thタグにはscope属性と言うものがあります。
th要素のscope属性は、見出しセル(th要素)の対象を指定する属性。
scope属性 ≪ th要素 ≪ 表(テーブル) ≪ 要素 ≪ HTML5入門
ようは、その見出し「th」が表組みの縦方向に関する値なのか、横方向に関する値なのかを指定してあげるというわけですね。
これを使ってよりいい感じのスコアボードが書ければいいなと思って作ったのが以下のコード。
<table class="score-bord" cellspacing="0" cellpadding="0" border="0"> <thead> <tr> <th class="cell-team" scope="col">チーム</th> <th class="cell-inning" scope="col">1</th> <th class="cell-inning" scope="col">2</th> <th class="cell-inning" scope="col">3</th> <th class="cell-inning" scope="col">4</th> <th class="cell-inning" scope="col">5</th> <th class="cell-score" scope="col">計</th> </tr> </thead> <tbody> <tr> <td class="cell-team" scope="row">Aチーム</td> <td class="cell-inning">1</td> <td class="cell-inning">1</td> <td class="cell-inning">0</td> <td class="cell-inning">4</td> <td class="cell-inning">0</td> <td class="cell-score">6</td> </tr> <tr> <td class="cell-team" scope="row">Bチーム</td> <td class="cell-inning">3</td> <td class="cell-inning">0</td> <td class="cell-inning">0</td> <td class="cell-inning">0</td> <td class="cell-inning">1</td> <td class="cell-score">4</td> </tr> </tbody> </table>
ベースは最初に作ったやつですが、そこにthead、tbodyを入れ、scope要素を入れました。
MLBよりはNPBよりかな。
このコードだと、こう見えます。
はい、ものの見事に変わってません…
まぁ、そうでしょうね…
NPBのを見ていて思ったのは、合計点やH(ヒット)、E(エラー)欄は見出しではないのかどうか。というところ。
個人的には見出しだと思うんだけどなぁ。
まとめ
結局のところ何も変わってないので、完全なる自己満足な内容でした。
色々とみながらtableタグでスコアボードを作ってみましたが、どうでしょうか。
もう少しどうにかなるような気もするので、他にも色々と見ておきたいです。
まぁ、実際はこういう所にこだわる前に、いろいろと機能改善していかないといけないので、あんまり時間かけられないんですけど、なんかここだけはきになりすぎて…。
さて、いよいよプロ野球開幕ですね。
またアイコンでも作ろうかな…
そいぎ~