コンピュータやソフトウェアのあれこれ@道民(&元道民)
CSS
フォントが変わるとアイコンがずれる問題の対策
12月 7th
要素の先頭にアイコンを表示するときには、CSSの「padding」と「background-position」を使うのが一般的です。
a.pdf {
padding-left: 24px;
background: url(../images/parts/pdf_ico.gif) no-repeat 0 0;
}
ですが、対象がテキストリンクなどのインライン要素で、かつアイコンの大きさがフォントサイズギリギリだった場合
「フォントが『メイリオ』や『ヒラギノ角ゴ』だとちゃんと表示されるのに、『MS Pゴシック』だとアイコンの下が欠ける」
という現象が起きてしまいます。
これはWindowsのMS Pゴシックとそれ以外でテキストの開始位置が異なっているために起こる現象らしく、ブラウザ別のCSSハックでは回避できません。
また、最新OSのWindows7でも、ブラウザのデフォルトフォントは「MS Pゴシック」なので、閲覧者のOSやブラウザの設定によっては今後も引き続き対策をしなければいけません。
現状考えられる回避方法をまとめます。
1:アイコンの高さをフォントサイズより小さくする
当たり前っちゃあ当たり前なんですが…現状最も確実な方法ではあります。
だいたい3ピクセル以上小さいと、ずれはしますが欠けないようです。
2:background-positionのY値をem単位で配置する
background-positionは、二つ目の値が上下(Y)になります。
ここの単位を「em」にすると、「px」「%」よりはずれが少ないようです。文字サイズ変更にも追随します。
a.icon {
padding-left: 12px;
background: url(../images/parts/icon.gif) no-repeat 0 0.2em;
}
ただし、変動値になるのでCSSスプライトを使ってサーバーへのリクエストを節約するテクニックが使えません。
インライン要素のリストマークに対してはCSSスプライトは使わない方がよさそうです。
CSSスプライトで画像を円滑に表示させる | Webクリエイターボックス
下にpaddingを取る
本来、インライン要素はpaddingが無効になるはずですが、Internet Explorerでは有効になります。
それを利用してずれそうな分だけ下に余白を取ります。
a.icon {
padding-left: 12px;
padding-bottom: 2px;
background: url(../images/parts/icon.gif) no-repeat 0 0.2em;
}
ただし、有効なのはIEだけで、FirefoxやOperaだったりすると効果がありません。
4:要素をインラインブロックにする
現状で、最も確実に回避できる方法がこれです。
- a要素をインラインブロックにする
- アイコンの高さ分の行高さを取る
- テキストを縦中央にする
a.icon {
display: -moz-inline-box;
display: inline-block;
vertical-align: middle;
line-height: 16px;
padding-left: 12px;
padding-bottom: 2px;
background: url(../images/parts/icon.gif) no-repeat 0 0.2em;
}
要素がインラインではなくなるので、アイコンをフォントに関係なく中央に寄せることができます。
Internet Explorer 6にも対応しています。
ただし、行高さを指定してしまうため、二行以上のリストに対応することができません。
私が把握してるのはこれくらいです。他にないですか…(’д`)
インライン要素の行高さは、メイリオが特に顕著なようです。
bodyのline-heightを「1.5」などにすると、この辺の回避が難しくなります。
デフォルト値は「1.1」としておいて、要素別に都度line-heightを指定するのが、面倒ではありますが無難だと思います。
a-blog cmsの実務制作(7)個別ページの作成
11月 18th
a-blog cmsの実務制作の流れをまとめています。
今回は詳細ページの作成についてです。
コード部分をSyntax Highlighterに対応させてみました。
CMSの独自タグは色分けがうまく行かないようだし、右上にメニューアイコンが出てこないんですが…まあ、前よりは読みやすいだろうということでお願いします…
WordPressだとソースコードが書きにくい…このブログもa-blog cmsに移行したいっす…
HTMLのファイル名について
a-blog cmsにはいくつかのデフォルトテーマがありますが、どのファイル名のHTMLを詳細ページとして扱うかは、テーマによって異なっています。「entry.html」が指定されているものもあれば、「index.html」で全てのテンプレートをまかなっているものもあります。
この辺りはテーマファイルの構成によって臨機応変に…となるのですが、今回は「entry.html」を詳細ページとして扱うことにします。
「カテゴリーのコードネーム」が付いたフォルダに同名のテンプレートがある場合はそちらを優先する仕様は、一覧ページのときと同じです。
なので、基本の詳細ページ用テンプレートをいちばん上の階層に作っておき、レイアウトが違っているカテゴリーのみ、フォルダ内に置いたテンプレートで上書きするのがおすすめです。
編集ページとユニット追加ページ
記事を書いたり編集できるようにするには、「編集画面」のテンプレートが必要になります。
またa-blog cmsの場合、見落としがちですが「一旦作成した記事にユニットを追加するときの画面」のテンプレートも必要です。
これも、テーマによっては「edit.html」「add.html」と別ファイルになっていることがありますが、だいたいは詳細ページと兼用することができます。
今回はこれらのテンプレートも「entry.html」とすることで以降の解説を進めます。
繰り返し・ブロック関連のタグを追加する
モジュールの開始・終了/エントリーループの開始・終了
エントリー詳細を表示しているページのうち、「タイトル」から「前後のページナビゲーション」までの範囲を、「BEGIN_MODULE」〜「END_MODULE」タグで囲みます。
ここでは全ての記事情報を参照できる「Entry_Body」モジュールを使用してください。モジュールIDは特に必要ありません。
また、詳細ページは記事を一回しか繰り返しませんが「entry:loop」タグも入れ子にする形で追加してください。
(エントリータイトル) (エントリー本文) (ページナビゲーション)
ダミーテキストを隠す
一覧ページのときと同じように、不要な文字列を「sample:veil」タグで隠します。本文を囲むくらいでいいのではと思います。
(隠したいダミーテキスト)
ページナビゲーション
新着情報などで前後リンクが必要な場合は、ページナビゲーションを「entry:loop」タグの外側に追加します。
これも一覧ページのときと同様、a-blog cmsの公式スニペットをそのまま利用して良いと思います。「BEGIN serialNavi:veil」〜「END serialNavi:veil」内が前後リンクを表示している箇所です。
以下は、私が自分のコーディングに併せて作った「serialNavi:veil」タグのサンプルです。ここもカスタマイズしたい方は参考にどうぞ。
<div class="page-navi"> <ul> <li class="pnavi-p">«{name}[trim(30, '...')|escape]</li> <li class="pnavi-i">%{CATEGORY_NAME}一覧</li> <li class="pnavi-n">{name}[trim(30, '...')|escape]»</li> </ul> </div>
※%7B・%7Dは「半角波カッコ」にしてください。
記事が見つからない場合
「notFound」タグで囲まれている場所は、記事が見つからない場合に表示されます…が、「404ページ用のテンプレート」が別途指定されていると、これは有効にならないようです。
「404ページ用のテンプレート」に「entry.html」を指定した場合は、「entry:loop」タグの外側に以下のようなコードを追加してください。
<h1>ページが見つかりません</h1> <p class="message">お探しのページはURLが変更されたか、削除された可能性があります。<br /> お手数ですが、ホームから目的のページをお探しください。</p>
記事情報タグを追加する
entry:loopタグ内の記事情報を、a-blog cmsの変数に置き換えていきましょう。
記事情報のタグに関しては、(5)一覧ページの作成の説明を参照してください。
ただし、詳細ページではグローバル変数「%{ENTRY_TITLE}」を使うことができるので、ページタイトル部分はこっちでもいいと思います。
本文にユニットを呼び出す
a-blog cmsは、本文を「ユニット」と呼ばれるブロックを積み重ねる形で表示します。
これらを表示するには、以下のタグを貼付けます。
「column:veil」タグは、エントリー詳細ページでは本文を、編集ページでは各ユニットの入力フォームを呼び出します。
「/include/column.html」は、「system」テーマ内の同じパスから呼び出されているので、新規作成したり、テーマにコピーしたりする必要は特にありません。
編集関連のパーツを呼び出す
このままでは、まだ記事の表示しかできません。さらに、エントリーの編集に必要なパーツを追加していきます。
記事のメタ情報
記事のメタ情報(タイトル・公開日時など)を編集するパーツを呼び出すには、以下のタグを貼付けます。本文のすぐ上が良いと思います。
保存ボタン・ユニット追加ボタン
編集画面で記事を更新したり、ユニットを追加したりするパーツを呼び出すには、以下のタグを貼付けます。これは本文のすぐ下が良いと思います。
「/admin/entry/edit.html」「/admin/entry/add.html」は、「system」テーマ内の同じパスから呼び出されているので、新規作成したり、テーマにコピーしたりする必要は特にありません。
インクルードを囲んでいる「adminEntryEdit」は「エントリー編集画面のみ内側のタグを実行する」という意味のようです。後述するタッチモジュールと似ているようですが、詳しいことはちょっとわかりません。
編集画面へ移動するボタン
保存ボタン・ユニット追加ボタンのすぐ下に、詳細ページから編集ページへ移動するためのパーツを呼び出します。
以下のコードを貼付けてください。
インクルードを囲んでいる「Touch_Login」は「ログインしているときだけ内側のタグを実行する」という意味です。
これが入っていないと、ログアウト後の公開画面でも編集ボタンが出てきてしまいます。
a-blog cmsでは、このようなページの状態による条件分岐タグのことを「タッチモジュール」と呼びます。
条件分岐をうまく使えば、テンプレート数を節約することもできますが、ソースコードがごちゃつきがちになるので、ご利用は計画的に。
タッチモジュール | a-blog cms – Web制作者のためのCMS
表示・動作を確認する
ここで一旦サーバーにアップロードして、きちんと詳細ページが表示されるか、編集が可能かどうかチェックしてみてください。
以下はよくあるトラブルシューティングです。
ユニット編集画面がうまく動作しない
- (4)共通のタグを埋め込むのときに、head要素にJavaScript・CSSを追加するのを忘れていませんか?
- 編集用のパーツを、ループタグの外で呼び出していませんか?
- 開始・終了タグの大文字・小文字を間違えていませんか?
編集画面が崩れる・文字サイズが小さすぎる・サイトの色調に合わない
編集画面の表示は、作成したウェブサイトのスタイルシートの影響を受けます。
たとえば、元のサイトのCSSで以下のような指定をしていると
table td {
font-size: 80%;
}
tdが入れ子になっている、a-blog cmsの編集画面の文字サイズがかなり小さくなってしまいます。
元のサイトのスタイルシートを調整するのがいちばんですが、かなりレガシーなマークアップで編集が難しいと言う場合は、入力フォーム用のCSSを調整する必要があります。
また、a-blog cmsの入力フォームは白系のサイトを想定したカラーリングになっているので、黒ベースのサイトで浮いてしまう、という場合も調整が必要です。
「system」テーマにある「/css/acms.css」をコピーして、作成したテーマの同じパスに置くと、CSSを上書きすることができます。CSSファイル内の説明書きを参考に、任意で編集してみてください。
編集画面で記事情報が変数のまま表示される
今回のように、詳細ページと編集ページを同じテンプレートにしていると、必ずこの現象が起こります。
日付などのEntry_Bodyの変数は、編集画面では変数のまま表示されてしまいます。
この場合は、タッチモジュール「Touch_NotAdmin」で囲むと編集画面で表示しないようにすることができます。
<p class="date">更新:{date#Y}年{date#m}月{date#d}日</p>
詳細ページ・編集ページの作成は、a-blog cmsのテーマ作成でいちばん難しいところです。
公開サイトに編集フォームを埋め込むという仕様のため、公開サイトのCSSを雑に書いていると、もろに編集フォームの崩れにつながってしまいます。
逆に、普段から計画的なコーディングをして、それぞれのタグの意味がわかっていれば、文字を大きくしてみる、不要なHTMLを消す、アイコンを出してみるなど、案件に併せたデザイン変更が自在にできると思います。
a-blog cmsの「Web制作者のためのCMS」というキャッチコピーは、このような特徴によるものなのです。
この記事で、構築に最低限必要なチュートリアルはだいたい終わりです。
今後は「ルール」「カスタムフィールド」機能などについて書いていけたらと思います。
works:deztec.jp
11月 5th
ブロガー・徳保隆夫さんの「趣味のWebデザイン」をはじめとするサイトのテーマ「green」を制作しました。
徳保さんは十年近く前から更新を続けている、息の長いブロガーの一人です。AmazonでWeb制作の技術書・ゲームのレビューも多数投稿しています。
はてなブックマークを利用している方だと、子どもの悪事が明らかになったときの対処とか、お父さんとお母さんにドラゴンクエスト9を遊んでもらっての肯定的なレビューを書いた人、というとわかるかもしれません。
欠点を指摘される

五年以上前の話になりますが、FC2ブログで「テンプレートデザインコンテスト」というのがありました。
当時FC2ブログに注目していた徳保さんは、アマチュア向けにWeb制作のアドバイスもしていた関係で、コンテストの全作品レビューを担当しています。
ご本人は覚えてないと思いますが(笑)
そのときの私の作品に対する徳保さんの感想がこれです。
- webbingstudioさんのテンプレートはソースがきれいだし、レイアウトのアイデアもいい。技量もある。配色の調整がうまくなれば鬼に金棒なのですが。
- アイデアは面白い。たしかにしゃきっとした印象はあります。だから成功といってもよいのですが、配色と余白の設定は再考の余地あり。調整不足の印象。
「色のセンスが悪い+作り込みが足りない」は、当時の私がいちばん気にしていたことです。
趣味で制作をしていると、欠点を指摘されることはなかなかありません。それをできるだけ改善しようと努力するきっかけになったということで、徳保さんには感謝しています。
既存テーマを補う
「相変わらず私自身は「think」がいちばん好きなんだけれども」と仰っている徳保さんが、テーマを外注された理由を考えた結果、やはり「自分とは別の視点で作られた、見た目重視のテーマ」を要望されているのだろうと思いました。
時折閲覧している立場から、これまでのテーマには
- 幅可変テーマは高解像度だと読みにくい
- Vista以降の標準フォント「メイリオ」に対応していない
- 一日分の区切りがつきにくい
という欠点を感じていました。
なので、徳保さんにお伺いした「参考にしてほしいサイト」を元に、これまでのテーマに不足している要素を補うデザインとしました。
余白を大目に取り、ヘッダをコンパクトに抑えたので、スマートフォンでも読みやすいと思います。
当初は室内をテーマにしたラフも描いていたのですが、ブログのファビコンにも使われていて、アーカイブをイメージさせる「恐竜」に意味を持たせたいと思い、今のデザインになっています。
HTMLの制限
通常のCMSでは、本文は平文か、ウィジウィグやWikiによる自動生成HTMLで書かれます。なので対応するCSSもその範疇になります。
それに対し徳保さんは、膨大な情報を扱うためにたくさんのHTML要素を駆使します。
「blockquoteの三重入れ子」とか
「dl>dd>ul>li>blockquote>ol>li>p」とか。
可読性が落ちないよう、できるだけ多くのパターンに対応したつもりです。
また、昔のコンテンツはCMS化されていないので、本文を白く抜くためのdiv要素を加えることができませんでした。
この辺りは見た目とブラウザ間の安定性を重視するということで、文字色を反転する対応で了承をいただきました。
そんなこんなでいろいろと手を入れましたが、今回のお仕事はサイトの一部で行ったパフォーマンスに過ぎません。
コンテンツを訪れる人のうち、数パーセントでも
「お、このテーマ自分向きかも。自分はこれで読もう」
と感じていただければ幸いです。
Frog.jsを使う。(1) – JavaScript Slideshow
11月 22nd
JavaScriptを使ったスライドショーです。
サムネイルをクリックすると、中心に画像が表示されます。
動きがキレイで、さらに実装が簡単なので、使いどころがありそうです。
[ダウンロードと設定]
FrogJS Javascript Gallery
から、FrogJS v1.1をダウンロードします。
内部には必要なスクリプト・サンプルが同胞されています。
prototype.jsとscriptaculous.js(effects.js)が必要ですが、
既にサイトに組み込んでいる場合は、frog.jsだけを設定すればOKです。
prototype.js→scriptaculous.js→frog.jsの順に読み込まれるようにしておきます。
<script type="text/javascript" src="xxxx/prototype.js"></script>
<script type="text/javascript" src="xxxx/scriptaculous.js?load=effects"></script>
<script type="text/javascript" src="xxxx/reflection.js"></script>
[実装方法]
このスライドショーには、表示用画像とサムネイル用画像のセット画像が必要です。
画像を準備したら、次のようにhtmlを記述します。
*画像を囲むブロック要素にid[FrogJS]を設定します。
*リンク要素のパス(href)に表示したい画像のURLを設定します。
*リンク要素のtitleに設定した値は、画像表示時のタイトルとして表示されます。
*リンク要素のrelにURLを設定すると、リンク画像にすることができます。
*img要素のsrcにサムネイル画像のURLを設定します。
*img要素のaltに設定した値は、画像表示時に説明文として表示されます。
<div id="FrogJS">
<a href="[画像URL]" title="[画像タイトル]" rel="[画像をリンクさせる場合はそのURL]">
<img src="[サムネイルURL]" alt="[画像の下に表示される説明文]" />
</a>
<a href="[画像URL]" title="[画像タイトル]" rel="[画像をリンクさせる場合はそのURL]">
<img src="[サムネイルURL]" alt="[画像の下に表示される説明文]" />
</a>
<a href="[画像URL]" title="[画像タイトル]" rel="[画像をリンクさせる場合はそのURL]">
<img src="[サムネイルURL]" alt="[画像の下に表示される説明文]" />
</a>
[以下略]
</div>
[CSS設定]
次のようなidのブロック要素が生成されますので、
お好みに合わせてスタイルを設定してください。
#FrogJS:画像表示部全体
#FrogJSCredit:aタグに指定したtitle表示部
#FrogJSCaption:imgタグに指定したalt表示部
[サンプル]
今回は秋に撮影した紅葉の写真を使用します。
(画像の読み込みが若干重いので動きがスムーズでないです・・・。)
次は若干のカスタマイズ方法と、APIを使って自動的に呼び出した画像を
スライドショーで表示させるプログラムに挑戦してみたいと思います。




