印刷用表示へ切り替え 通常表示へ切り替え 更新履歴を表示 更新履歴を隠す
MovableType アップロードした画像に影をつけるには

アップロードした画像に影をつけるにはいくつかの方法があるが,それぞれ一長一短がある。一番手間がかからなさそうな CSS を使った方法を導入する。

■ ■ ■
サンプル画像

Movable Type に画像をアップロードすると,自動的にサムネイルが作られる。これはとても便利な機能なのだが,サムネイルは画像を単に縮小しただけなので,単に「画像が貼りついている」というだけで平面的。もしサムネイルに影がつけられれば,立体的になって見栄えが違う。手軽に影がつけられると嬉しい。

以下の方法は,Movable Type でなくてもよく,また,画像はサムネイルでなくてもよい。画像の影はドロップシャドウと呼ばれる。

ざっと調べてみたところ,画像そのものに手を加える方法と,画像には手を加えず CSS で影を後づけする方法の2種類がある。さらに,CSS の方法にも2種類ある。

  • 画像そのものに影をつける方法
    • アップロードする画像にあらかじめ影をつけておく
      • 利点: 画像がインライン要素の中に書ける
      • 欠点1: 影をつける手間がかかる
      • 欠点2: オリジナルの画像に影をつけなければならない
      (アップロード後に自動生成されるサムネイルに影をつけるとよさそうだが,何らかのハックとプログラミングが必要)
  • スタイルシートで影をつける方法
    • 1976design.com の方法(Easy CSS drop shadows | Blog | 1976design.com)
      • 利点: 左寄せ,右寄せが選択できる
      • 欠点1: ブロック要素になるため,p 要素などのインライン要素の中に書けない
      • 欠点2: 画像の幅(width)を指定しなければならない
    • A List Apart の方法(CSS Drop Shadows: A List Apart)
      • 利点: 画像の幅を指定しなくてよい
      • 欠点: ブロック要素になるため,p 要素などのインライン要素の中に書けない

以下では,1976design の改良版である A List Aprt の方法の導入と,若干の追加説明を行う。

  1. 影の GIF ファイルと PNG ファイルをダウンロードする
    1. CSS Drop Shadows: A List Apart にアクセス
    2. GIF file/PNG ファイル(shadow.gif と shadowAlpha.png) をダウンロード
    3. サーバの適当なディレクトリ (例えば /images) にアップロード
  2. スタイルシートに次のスタイルを追加する
    .img-shadow {
            float: left;
            background: url(/images/shadowAlpha.png) no-repeat bottom right !important;
            background: url(/images/shadow.gif) no-repeat bottom right;
            margin: 10px 0px 0px 10px !important;
            margin: 10px 0px 0px 5px;
            }

    .img-shadow img {
            display: block;
            position: relative;
            background-color: #fff;
            border: 1px solid #a9a9a9;
            margin: -6px 6px 6px -6px;
            padding: 4px;
            }
    margin の値は,A List Apart のオリジナルでは「0」のように単位がないが,気持ちが悪いので「0px」としている。同じことだろうか? それとも「0」とすることに何か意味がある?
  3. 画像ファイルの img タグを img-shadow クラスの div 要素で囲む
    例えば,
    <p><a href="..."><img src="...jpg"></a>
    すごい画像</p>
    <div class="img-shadow"><a href="..."><img src="...jpg"></a></div>
    <p>すごい画像</p>
    のようにする。注意としては,div はブロック要素のため,p 要素の中に書くことはできないということである。IE や FireFox では p の中に div が入っていても正しく表示されるが,文法的には正しくなくなってしまう。

スタイルシートでは,「!important」を使って Internet Explorer のバグを上手く回避している。

導入は以上で終了。めでたく影がつくようになるが,若干補足がある。

「文字が消える」という IE のバグの回避方法

この方法では,img-shadow という名前のブロックに float 属性を与えている。IE には float で文字の回りこみをしたときに文字が見えなくなるというバグがある(例えば HepCat Dev and Test: 文字の周り込みとIEのバグ)。これを回避するには,float 画像と文字を含んでいるクラスに width を指定することである。具体的には,Movable Type の場合 blogbody のスタイルに「width: 100%」という属性を追加すればよい(飾り窓の憂鬱。:Blogの投稿記事の文字が消えるIEの不具合について。)。

ところが,「width: 100%」を追加すると,IE の表示は正常になるが,Mozilla や FireFox では blopgbody の幅が少し長くなってしまう。これを防止するため,さらに「w\idth: auto;」を追加する。IE は「\」が入っている属性を解釈できないので「width: 100%」だけが有効となり,それ以外のモダンブラウザでは「\」があっても解釈するので,「width: auto」が優先される。

.blogbody {
        ...
        width: 100%;
        w\idth: auto;

        }

この設定を行っても,まだ文字が消えてしまうことがある。文字が消えるのは,文字が描かれた後に背景で上書きしてしまうのが直接の原因のようだ。したがって,blogbody を含む content や blog の背景色設定を削除するか,明示的に「background: none;」を指定してやるとよい。

.blog {
        ...
        background: none;
        }
.content {
        ...
        background: none;
        }

画像を右寄せしたい場合

サンプル画像

img-shadow クラスは,画像を左寄せして表示するようになっている。これを右寄せするには,「float: left」の部分を「float: right」に変えるだけでよい。右寄せ左寄せを両方使い分けたい場合は,「img-shadow-right」のように別名にしておくと便利。

.img-shadow-right {
        float: right;
        background: url(/images/shadowAlpha.png) no-repeat bottom right !important;
        background: url(/images/shadow.gif) no-repeat bottom right;
        margin: 10px 0px 0px 10px !important;
        margin: 10px 0px 0px 5px;
        }

なお,「.img-shadow img」のスタイルは変更する必要はない。臨時に右寄せしたい場合は,「<div class="img-shadow" style="float: right">」のように無理やりスタイルを指定することでも可能。

文字を回り込ませたくない場合

サンプル画像

img-shadow クラスは,デフォルトでは文字を画像に回りこませるようになっている。これを回避したい場合がある。やり方は2通りある。

  • </div> の後に <br clear="all" /> を追加する。例えば,
    <div class="img-shadow"><a href="..."><img src="...jpg"></a></div>
    <br clear="all" />
    <p>すごい画像</p>
  • スタイルシートの br のスタイルに「clear: both」属性を追加する。例えば
    .blogbody br { clear: both; }
    としておき,本文は <br /> だけを挿入する。
    <div class="img-shadow"><a href="..."><img src="...jpg"></a></div>
    <br />
    <p>すごい画像</p>

場合によって回り込みをさせたりさせなかったりしたい場合は前者を,一律に回り込みをさせたくない場合は後者が便利だろう。もちろん,br 要素を使う代わりに,空のブロック要素(何でもよい)を挿入することでも可能である。フロート解除のビューティフルな方法が ready for the blue: フロートした要素を閉じるには で紹介されているが,文字の回り込み解除には残念ながら使えなかった。

不思議な現象

上記のように影をつけると,なぜか IE と Mozilla (または FireFox) では表示が違ってしまう。IE では画像に枠線がつかないのである。しかし,同じページを Mozilla で保存して,保存したファイルを IE で見ると枠線が表示されるのである。謎である。A List Apart の例では,IE でも Mozilla でも同じように表示されている。原因が分からない。

2005年5月30日追記: コメントをいただいて,上記の不思議な現象の原因が分かりました。<?xml version="1.0" encoding="EUC-JP"?> をHTML文書の最初で宣言しなければ,IE でも画像に枠線がつきます (connect: CSSで写真の周りに枠を表示・・・)。しかし,宣言しないのは推奨されていません。xml 宣言を DOCTYPE 宣言の後に行うという方法もありますが,推奨されません。文書は xml 宣言で始めることが推奨されています (XHTMLの書き方と留意点)。IE での枠線の表示は諦めることにしました。

2008年2月3日追記: xml 宣言については,小粋空間: 標準準拠モードと後方互換モード・DOCTYPE宣言について - IEでドロップシャドウ画像に枠を表示する さんで詳しく解説されています。

Posted by n at 2005-05-15 02:00 | Edit | Comments (3) | Trackback(8)
Trackbacks

  • 「手違いで複数トラックバックを送ってしまった!」という場合でも気にしないでください (重複分はこちらで勝手に削除させていただきます)
  • タイムアウトエラーは,こちらのサーバの処理能力不足が原因です (詳細は トラックバック送信時のエラー をご覧ください)
  • トラックバックする記事には,この記事へのリンクを含めてください(詳細は 迷惑トラックバック対策 をご覧ください)
CSSで画像に枠と影を付ける
nlog(n)さんで「アップロードした画像に影をつけるには」と言うエントリーが Trackbacked from: cider at May 15, 2005 10:24
画像に影をつけるテクニック
 スタイルシートを使って画像に簡単に影をつけるテクニックがnlog(n)さんで紹... Trackbacked from: Look at ... at May 18, 2005 00:08
写真に影を付けてみた
CSSと小さなファイル(影専用)を用いて画像に影をつける試みです。 Trackbacked from: CEFA::Blog at June 12, 2005 11:25
画像に影をつける!
nolog(n)さんの記事を参考にやってみた!... Trackbacked from: てけてけありさの日記 at September 08, 2005 14:21
画像に影をつける!
nolog(n)さんの記事を参考にやってみた! ... Trackbacked from: てけてけありさの日記 at October 06, 2005 18:26
画像に影をつける!【MovableType】
nolog(n)さんの記事を参考にやってみた! ... Trackbacked from: てけてけありさの日記 at October 27, 2005 16:03
アップロードした画像に自動で影をつける!
  実写版モリゾー 部員No.009:KIBEさんに頂きました泣く子も黙るモリゾ... Trackbacked from: DIGITALL!! at December 04, 2005 03:18
ハイパーリンク画像に影を付けてみる
あけましておめでとうございます(遅)。今年も頑張ります。 Trackbacked from: 1byteの備忘録 at January 09, 2007 21:54
Comments

xml宣言の有る無しが原因かもしれません。

Posted by: Vigopants at May 29, 2005 21:20

名前間違った。
なんとなくそう思ったでけではなん意味も無いコメントになってしまうので、ちょっと検索。
こんなところを見つけました。
connect: CSSで写真の周りに枠を表示・・・
http://connect.seesaa.net/article/1768479.html
なのでビンゴ!!

Posted by: Vigorpants at May 29, 2005 21:28

まさにコレです。さんざん検索したのに見つからなかったのでした。それをいとも簡単に! 感謝します。

Posted by: n at May 29, 2005 22:16
Post a comment
  • 電子メールアドレスは必須ですが,表示されません (気になる場合は「メールアドレスのような」文字列でもOKです)
  • URL を入力した場合はリンクが張られます
  • コメント欄内ではタグは使えません
  • コメント欄内に URL を記入した場合は自動的にリンクに変換されます
  • コメント欄内の改行はそのまま改行となります
  • 「Confirmation Code」に表示されている数字を入力してください (迷惑コメント対策です)


(必須, 表示されます)


(必須, 表示されません)


(任意, リンクされます)


Confirmation Code (必須)


Remember info (R)?