function print_side_block()でアイコンと項目がズレて表示される

function print_side_block()でアイコンと項目がズレて表示される

- Tatsuya Shirai の投稿
返信数: 7

 携帯電話やゲーム機のブラウザ(PlayStation3)でMoodleのコース画面などを表示すると,添付した図のようにアイコンと項目の文字列がズレて表示されます.

 HTMLソースを見てみると,

<div class="content">
    <ul class='list'>
        <li class="r0">
            <div class="icon column c0">
                <img src="http://mysite.com/moodle/pix/f/web.gif"; height="16" width="16" alt="" />
            </div>
            <div class="column c1">
                <a href="http://mysite.com/"; target="_blank">鈴鹿高専</a>
                <em></em>
            </div>
        </li>

おおよそこのような構造になっています.リストタグの要素の中に二つのブロック要素が<div>アイコン</div><div>項目</div>のように入っています.その結果,アイコンの後に改行が入って表示されるのか.私の理解が浅いのですが,この部分を<span>アイコン</span><div>項目</div>のようにアイコンの部分だけをインライン要素にすればPCブラウザと同様の画面表示になります.携帯電話とPS3のブラウザはNetFrontのようですので,CSSへの対応が完全ではありません.そのせいで見た目が変わるのかも知れません.

 関係するソースコードは,lib/weblib.phpのfunction print_side_block()で,以下のように改造すれば望みどおりに表示されます.ただ,副作用は怖いですね.

         if ($list) {
            $row = 0;
            //Accessibility: replaced unnecessary table with list, see themes/standard/styles_layout.css
            echo "\n<ul class='list'>\n";
            foreach ($list as $key => $string) {
                echo '<li class="r'. $row .'">';
                if ($icons) {
//                  echo '<div class="icon column c0">'. $icons[$key] .'</div>';
                    echo '<span class="icon column c0">'. $icons[$key] .'</span>';
                }
                echo '<div class="column c1">'. $string .'</div>';
                echo "</li>\n";
                $row = $row ? 0:1;
            }
            echo "</ul>\n";
        }


まぁ,これくらい仕方がないかなぁ,と思って我慢していたのですが,ちょっとここを直すだけでPS3使用時の劣等感が一気に解消します.

 なぜ,divを使うのか.spanではいけないかったのでしょうか.

添付 print_side_block.jpg
Tatsuya Shirai への返信

Re: function print_side_block()でアイコンと項目がズレて表示される

- Mitsuhiro Yoshida の投稿
画像 Developers 画像 Particularly helpful Moodlers 画像 Translators
> なぜ,divを使うのか.spanではいけないかったのでしょうか.

恐らく、W3C XHTML Strict 1.0に準拠するためだと思います。
ご参考までに、下記報告をご覧ください。

[XHTML 1.0 Validation Error activity label <span class="label">]
http://tracker.moodle.org/browse/MDL-19653

Mitsuhiro Yoshida への返信

Re: function print_side_block()でアイコンと項目がズレて表示される

- Tatsuya Shirai の投稿

 読んでみました.

 あの1.9.3に対して1.9.5で改変された部分というのは,<span></span>というインライン要素の中に<div></div>というブロック要素が含まれていることに対する警告と理解したのですが,読み間違いでしょうか.

 リスト要素はブロック要素らしいので,その中にインライン要素を入れること自体は問題が無いですよね.あと少し気になるのはCSSで<span>に対してclass="icon column c0"の3つが定義されていないといけない気もしますね.あ,Firebugならば調べられるかな?

 調べてみました.div.columnがありますね.

.sideblock div.column {
margin:0 4px 0 0;
padding:0;
}
.sideblock div.column.c0 {
float:left;
}
.sideblock div.column.c1 {
display:inline;
}
.sideblock .content .c0 img.icon {
margin:0;
}

theme/standard/style.phpから生成されるようです.これのspan版は無いですから,そういう意味ではよろしくないですね.アイコンは<div class="icon column c0">,その右に表示して欲しい項目名の文字列は<div class="column c1">で括られています.display:inlineで<div>なんだけれどもインライン要素に変換している,ということでしょうか.でもアイコン(c0)がブロック要素のままですからねぇ.


 いまCSSの入門者用のページを見ながら勉強しています^^;

 その上で質問したいのですが,

.sideblock div.column.c1 {
display:inline;
}

これはこれで良いのですか? 自動的に<div class="column">と<div class="c1">の両方に同じスタイルが設定されるという便利な書き方(分かりにくいが...)と考えて良いのでしょう.

Tatsuya Shirai への返信

Re: function print_side_block()でアイコンと項目がズレて表示される

- Tatsuya Shirai の投稿

 theme/standard/styles_layout.cssの

 .sideblock div.column.c0 {
  float: left;
}

.sideblock div.column.c0 {
  display:inline;
}

に変更すると同じ効果が得られますね.PCの画面上でも一応,悪影響は無いように見えます.float: left;を残しているとNGですね.

Tatsuya Shirai への返信

Re: function print_side_block()でアイコンと項目がズレて表示される

- Tatsuya Shirai の投稿

 なんてことだ.同じ結論に到達(出発点は違いますが)した人が居ますね.評価&返信してきました.

http://moodle.org/mod/forum/discuss.php?d=123331

最大評点: お役立ち度: ★★★★★★★ (1)
Tatsuya Shirai への返信

Re: function print_side_block()でアイコンと項目がズレて表示される

- Mitsuhiro Yoshida の投稿
画像 Developers 画像 Particularly helpful Moodlers 画像 Translators
> あの1.9.3に対して1.9.5で改変された部分というのは,<span></span>というインライン要素の中 に<div></div>というブロック要素が含まれていることに対する警告と理解したのですが,読み間違いでしょうか.

明らかに私の読み間違いです。
大変失礼致しました。

Mitsuhiro Yoshida への返信

Re: function print_side_block()でアイコンと項目がズレて表示される

- Tatsuya Shirai の投稿

 いえいえ,私,実はHTMLを真面目に勉強していません.

 PostScriptと同じように,システムやアプリケーションが自動的に生成するものであって,人間が学ぶべきものではないと考えていましたし,本当の意味でのエンドユーザにおいてはそうあるべきだと考えています.まさか自分がWebアプリケーションの開発に携わるとは思っていませんでしたし...

 HTML1.0,2.0,XHTMLと,さらにCSS.本当はきちんと勉強しないといけないですね.