スコアボードってどんなHTML書く?


さて、WBCも一応の盛り上がりを見せ、いよいよ明日、日本のプロ野球の開幕ですね。
広島カープファンの僕ですが、今年はAクラスに入れたら上々かなと思ってます。

さて息子の所属少年野球チームのアンオフィシャルサイトの中で、野球の点数つけるスコアボードを入力、表示させるようにしています。
スコアボードをコーディングしていく上で、正しいHTMLでスコアボードをコーディングするとどうなるんだろう?と疑問に思っていろいろ調べてみました。

目次

  1. 自分の書き方
  2. MLBとNPBを調べてみた
    1. MLBサイトのスコアボード
    2. NPBサイトのスコアボード
  3. scope属性を利用する
  4. まとめ

自分の書き方

僕に限らず、直感で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. チーム→1→2→3→4→5→計
  2. Aチーム→1→1→0→4→0→6
  3. 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>&nbsp;</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タグでスコアボードを作ってみましたが、どうでしょうか。
もう少しどうにかなるような気もするので、他にも色々と見ておきたいです。

まぁ、実際はこういう所にこだわる前に、いろいろと機能改善していかないといけないので、あんまり時間かけられないんですけど、なんかここだけはきになりすぎて…。

さて、いよいよプロ野球開幕ですね。

またアイコンでも作ろうかな…

そいぎ~


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA