見出しに画像を使いたい

この記事では、見出しに画像を使用する際に検索ロボットに文字を読ませるための方法として、文字を見えないくらい小さくする方法を紹介しています。
しかし、この方法は、検索エンジンによってスパムと見なされる可能性が出てきました。
(正しく使用していてもロボットにはわかりませんから)

そのため、以下の方法は、今後オススメできません。
新たな方法は、この記事のトラックバックからどうぞ。

--------------------

CGとかFLASHのサイトを作っているなら、ページのタイトルがテキストと罫線だけなんてありえませんよね?
凝ったフォントとデザインで、目を引くタイトル画像を入れたくなります。
でも、CSSでページを作るって決めたら、見出しは h1 とかで示さないといけません。

というわけで、h1タグの再定義です。
たとえば、前の記事で示したページは、h1が画像です。

-- CSS --
h1 {
font-size: 2px;
color: #FFFFFF;
background-image: url(img/title.gif); (←ポイント)
background-repeat: no-repeat;
margin: 0px 0px 10px;
}

-- HTML --
<h1>プロフィール</h1>

見出しの文字は、通常見えては困るので、思いっきり小さくします。
さらに背景色と同色にして見えないようにします。
ちなみに、フォントサイズが 1px でないのは、なぜか 1px にすると表示が崩れるからです。
(h1 のプロパティを display : none にしたら、h1そのものが表示されなくなるのでNG)

他に、

.hidden { display: none; }

<h1>&nbsp;<span class="hidden">プロフィール</span></h1>

という方法もあります。
背景のデザインの問題などで見出しの文字が隠せないときはこれでもいいですが、ちょっと煩雑です。

そして、背景画像として、タイトル用の画像を指定してやります。
これで、検索ロボットは h1 のテキストを読み、見た目には画像が表示されるようになります。

背景の画像は共通で、見出しの文字はテキストにしたいときは、文字を隠さないで、逆に目立つようにしてやればOK。
ただし、重ね合わせ位置は、text-indent プロパティなどでの微調整が必要です。



・・・・ところが!
Macintosh版 Internet Explorer 5 だけは、これが上手くいきませんでした。
最初の方法だと、h1の下に大きな余白があいてしまうのです。

で、いろいろ策を講じてみたのですが、実は、ある一つのバグが原因でした。
「Mac IE5 は、親要素が「position: relative」のとき、子要素が、margin-top, bottom を誤って継承する」というやつで、メインコンテンツを入れる divタグが、見事に「position: relative」だったのです。

他にも、リスト関係の要素の位置がずれまくるので「CSSはだめかなぁ・・・」と思っていたのですが、position: relativeの使い方を注意するだけで、ほとんど問題なくなりました。 ほっ。

| | コメント (1) | トラックバック (1)

画像の配置

文中に画像を配置するとき、従来は tableタグを駆使してレイアウトを作っていました。
文章と画像をセルの一つ一つに入れて配置していくやりかたです。

sample03.gif
テーブルでレイアウトした例

HTML

これを、DREAMWEAVER とかの下手に優秀なソフトを使って、いきあたりばったりでガーッと作っていくと、細かいセルが複雑に結合しあったコードができます。
こうなると、各セルの幅や高さが把握できなくなってしまい、合計が合わなくていきなりテーブルが崩れたりと、修正が困難なものになってしまいます。
まぁ、毎回 Fireworks で修正していればいいわけですが、マウスで境界線を掴み損ねてへんなセルができたり、思わぬ失敗をすることが良くあるのです。

で、これをCSSに置き換えようとしたとき、

とりあえず、セルをdivタグに置き換えて・・・
div なら絶対値で場所が決められるからレイアウトも崩れないし・・・

って、やりそうになりましたが、CSSならそんなことはしなくて良いのです。

CSSでレイアウトする場合は、文章が流れていて、中に画像をおくと、その回りに文章が回り込むと考えます。

文章は、段落ごとにpタグで区切ります。
画像も、pタグで囲みます。キャプションがあれば一緒に囲みます。まだ、classやidはつけません。
(本来は div で囲むのでしょうが、なぜか Mac IE で誤動作するので、原因がわかるまでは p を使います)

次に、文章中のどのあたりに画像を置くかを決めます。
そして、画像の上端と並ぶ文章のpタグの「直前」に、pタグで囲んだ画像を移動します。
そして、画像を囲んだpタグに、classなりidなりをつけて、そのスタイルのfloat属性で回り込みを規定します。
回りこみは float 属性です。left とすれば、画像が左に寄せられ、そのすぐ右上から、次の段落のテキストが流れます。

CSS
style1 { float: left;
}

HTML
<p class="style1"><img src="xxxx"></p>
<p>本文が、画像の右側に回りこむ</p>

さて、画像が回りこむ文章に比べて縦に長いときはこれでOKですが、画像が文章に比べて縦に短くなるときは、次の段落や画像までが回りこんでしまいます。
通常のブラウザ表示では良くても、ブラウザの幅を広げるとNGということもあります。
次の段落や画像が回りこんでほしくないときは、空のpタグをおき、これに clear属性をつけます。

CSS
style2 { clear: both;
}
HTML
<p class="style2"></p>
<p>xxxxxx・・・・・

すると、この後の段落は回りこまなくなります。
次の段落に直接 clear属性を適用しても良さそうなのですが、Mac IE で、
「clear属性を適用した要素の子要素には同じ方向の floatが適用されない」
というバグがあるため、うまくいきません。

sample04.gif
CSSでレイアウトした例

HTML

float と clear は、class で汎用的なものを用意しておいて、他の class と組み合わせて使うとわかりやすいですね。


ちなみに、画像が重なり合って配置されるようなレイアウトなら、positionプロパティでどんどん重ねていけばいいので簡単です。
CSSを使うようになると、スライスという技術は必要なくなるかも知れませんね。

| | コメント (0) | トラックバック (0)

リストをテーブルみたいに使う

CSSの常套手段のひとつに、テーブルの代わりにリストを使うというものがあります。

「Cherry Pie Web」では、プロフィールのページで使っています。

-- HTML --
<dl>
<dt>CPU</dt>
<dd>HT Pentium4-2.60CMHz</dd>
<dt>PRINTER</dt>
<dd>ALPS MD-2010J</dd>
</dl>

-- CSS --
dl {
font-family: "MS Pゴシック", Osaka;
font-size: 14px;
line-height: 15px;
}
dt {
font-weight: bold;
color: #990000;
float: left;
width: 200px;
clear: both;
margin: 0px;
}
dd {
padding-left: 210px;
margin: 0px;
padding-top: 0px;
padding-right: 0px;
padding-bottom: 0px;
}

このように、dtタグに float属性をつけて、続くddタグを右に回り込ませると、テーブルっぽいレイアウトが実現できます。
dtタグにwidth属性をつけて幅を指定しないと、うまく回り込まないことがあります。
(テキストなど、幅が明確にならないものは、widthを指定しましょう)
ddタグには、padding:left で、左の空きを定義します。
padding で指定しておくと、dd に border属性をつけて線を引いたときに、dtタグまで含めて線を引くことができます。
(正確には、padding で指定した長さ)
margin で指定すると、ddタグの上下にだけ線が引かれます。
padding や margin を指定しなくても表示されますが、微妙な挙動をすることがあるみたいなので、指定したほうがいいと思います。



しかし・・・ここでやっぱり Mac IE で問題がおきました。
ひとつではありません。続々と問題がおきました。

・dl と dt の間に文字がないと、dd が回り込まない(1段ずれる・・・以下同じ)。
・dt の margin-bottom が 0 だと、dd が回り込まない。
・dt に float:left を指定すると、dd が回り込まない。
・dd が2行以上になると回り込まない。
・dt の対になる dd が2つ以上だと回り込まない。
・dl の直後の dt の位置が、position:absolute の位置(親要素の左上)になる。

はっきり言って、これじゃ使い物になりません。
あーもうだめだー と思ったとき、ひとつの原因が思い浮かびました。
もしや・・・

はい、そうです。親要素の position 属性が relative だったんですねー
親要素を position:absolute にしてやると、うそのように、すべての問題が起こらなくなりました。



さて、次で、リストをテーブルみたいに使うための方法をもうひとつ紹介します。
しかし、これは実は危険なワザなのです・・・

| | コメント (0) | トラックバック (0)

負のマージンは危険

CSSの解説で、リストをテーブルのように使う方法として、

「ddタグの margin-top属性に、-1em のマージンを指定する」

としているものがあります。

確かに、ブラウザの見た目はこれでも大丈夫です。
しかし、この方法を使ったページは、

Win IE で印刷 または 印刷プレビュー するとクラッシュします。

また、Mac IE では、負のマージンを指定した dd タグの部分が印刷されません

どっちかというとブラウザのバグだと思いますが、だからといってクラッシュするような危険なバグが潜んでいる方法は使いたくないですね。

ちなみに、Netscape では問題ありません。



あ、今、気づきましたが、この方法って、dt タグに対して dd タグが複数対応するような構造だと、2つめ以降の dd タグの内容が、上の dd タグの内容に重なってしまいますね。
・・・だめじゃん

| | コメント (0) | トラックバック (0)

Googleでヒットさせるために

「Cherry Pie Web」は、Yahoo Japan に「アンミラ」で登録されている数少ないサイトなので、Yahooで検索すると、かなり上位でヒットします。

でも・・・いまどき Yahoo でもないですよね?
というわけで、Google で検索したら・・・
あれれ、50件目くらいにやっと出てきます。
さすがに「これはまずいな」と思ったので、なんとか手段を講じることにしました。

目標は、Google で「アンミラ」で検索したときに、10番目までにはいること!

まずは

1.TITLEタグに「アンミラ」という言葉を入れる。
2.METAタグに name="description" ~説明文~ を記述する。

これらはとても基本的なことだったんですが、実は全然やっていませんでした。
で、こんな基本的なことでも割と効果がありました。
50件目くらいだったのが、30件目くらいになりました。
しかし、アンミラと関係ない blog のサイトなどに全然負けてます。

さて、上位に出てくるサイトと、いったい何が違うんでしょうか?

SEO対策関連のサイトを調べてみると、どうやら、ページのテキスト情報内で、キーワードが出てくる位置などに問題があるらしいことがわかってきました。

リニューアル前のトップページは、BODYタグの直後に、レイアウトのための TABLEタグやロールオーバーの記述が何十行にもわたってされていて、肝心のテキストを、検索エンジンが重要だと認識しにくい構造です、

そして、この問題の最も有効な解決策と思われたのが CSSによるレイアウトでした。
サイトを CSSでリニューアルしようと思った一番の理由がこれです。

CSSで何をするのか、どれくらい変わるのかは、次の記事で明らかにします。

| | コメント (0) | トラックバック (0)

Googleで順位が上がりました

前の記事で、レイアウトをCSSに変えただけで順位が上がるものかなぁと書いていましたが、実際に10ほど上がりました。
現在は、20位以内に表示されるようです。

index.html に入れているテキストの内容はほとんど変わっていないのに、この結果ですから、まさにCSSの効果といえるでしょうね。
テーブルを使わずCSSでレイアウトしたことにより、余計なタグがなくなり、サイトの説明文や新着情報がHTMLコードのはじめのほうに配置できるようになったことが、順位アップの要因だと思います。

効果が確認できたことで、自信が出てきました。

では、改めて、CSS前後でどれくらい変わっているのかを見ていきます。

| | コメント (0) | トラックバック (0)

ファイルサイズがこんなに違う

まず、CSS前後の表示を見てみます。

●CSS前
top-old.jpg
ファイルサイズ:22,190 バイト

●CSS後
top-new.jpg
ファイルサイズ:7,375 バイト


内容はほとんど変わらないのに、ファイルサイズは3分の1以下です。
ちょっと驚きですよね。
HTMLコードが少ないということは、ブラウザがHTMLを処理する時間も当然早くなるわけで、検索エンジン対策としてもかなり有効です。

実は、CSS前としてある方でもフォントの指定などはCSSを使っており、外部CSSをリンクしています。
それでもこれだけ違うのは、何が原因なのでしょうか。

では、HTMLコードを見てみます。

●CSS前

●CSS後

HTMLを見てまずわかるのは、CSS前には、Javascript や、レイアウトのためのHTMLタグなど、実際の内容と関係のないコードが非常に多いということです。

その原因のひとつには、Fireworks で作成した、複雑なイラストの部分があります。
左上には、テキストで新着情報があり、女の子の目は瞬き、コンテンツの上にマウスを乗せると説明文が表示されるなどの仕掛けをしています。
この部分のレイアウトのためのテーブル部分だけで、HTMLコードは62行に及びます。
(Javascriptのコードは含んでいません)

これが、CSS後では、画像配置のためのHTMLコードが3行、
コンテンツ説明の部分が30行です。
しかし、CSS前はコンテンツ説明は画像、CSS後はテキストです。このためにCSS後では12行増えているので、これを差し引くと18行。
つまり、実質、41行減っている計算になります。

もう少し詳しく説明すると・・・

CSS前では、画像とテキストを重ねて配置、静止画像内にアニメーションGIFを配置、マウスロールオーバーを大きな画像に重なるなど、ちょっと自分でも自慢したくなるような(笑)凝りに凝った仕組みを作っていました。

ところが、CSS後では、大きな画像とテキスト、アニメーションGIF、マウスロールオーバーとの重なりは、それぞれを divタグで囲んで、positionプロパティで重なるように指定するだけでよいわけですから、全然頭を使わなくて良いのです。
正直、CSS前の苦労は何だったんだと思いました。



余計なタグがなくなるだけでも、かなりCSSの良さが実感できます。
でも、次の効果は、最初に知ったときは愕然としました・・・

| | コメント (0) | トラックバック (0)

見せたいものと読ませたいもの

Webページは人間が見るものです。
でも検索エンジンは人間でなくロボットです(Yahooは人が見ているそうですが)。
そして、人間に見せたいものと、ロボットに読ませたいものは違います。

Webページの一般的な構成としては、上部にタイトルロゴ、左にメニュー、真ん中にメインコンテンツがある・・という感じです。
これを普通にHTMLで書くと、最初にタイトルロゴをおいて、次にメニュー、最後にメインコンテンツをおくことになります。

検索エンジンの仕組みとして、ページの最初のほうにあるテキストほど重要視する傾向があります。
また、長すぎるコードは途中までしか読み込んでくれません。


では、実際にコードを見てください。
以前にもお見せした、プロフィールのページです。

sample02.gif

●CSS前

ここも含め、私のサイトの全てのページでは、上部に共通のメニューがあります。
これは Fireworks で作ったテーブルで作られていて、55行あります。
つまり、メインコンテンツに関係ないコードが、すべてのページの先頭に55行もあるわけです。

●CSS後

CSS後でも、ページの上部にはタイトルロゴとメニューがあります。
でも、HTMLの最初にあるコードは、メインコンテンツです。
メニューのコードはその後においてあります。

CSS後では、各コンテンツをDivタグでくくり、スタイルシートのpositionプロパティで各Divタグの位置を指定しています。
これで、Divタグ単位で自由に配置ができるようになるので、画面で最も上の位置にあるものを、HTMLコードの一番下に置くことができます。

これ、ちょっと驚きでした。

実はこれってスタイルシートの基本なのですが、以前持っていたスタイルシート辞典には、positionプロパティの説明はあっても、こういう使い方があるなんて書いてなかったんです。

このテクニックのおかげで、ページ上部に広告バナーやスクリプトだらけの動的メニューを置いても、HTMLコードの最初にはメインコンテンツをおくことができます。


さて、CSS後のコードを見て、もうひとつ気づかれたことはないでしょうか?
CSS前ではあんなにだらだらと長かったメニューは、いったいどこへ行ってしまったのでしょう?

| | コメント (0) | トラックバック (0)

新・見出しに画像を使いたい

CGとかFLASHのサイトを作っているなら、ページのタイトルがテキストと罫線だけなんてありえませんよね?
凝ったフォントとデザインで、目を引くタイトル画像を入れたくなります。
でも、CSSでページを作るって決めたら、見出しはテキストで示さないといけません。

方法としては、HTML上はテキスト、CSSで背景画像として画像を指定するわけですが、問題は、画像を見せてテキストを見せない方法をどうするか? です。
通常なら、画像とテキストが重なって表示されてしまいます。
(↓こんな感じ)
hi-title01

考えられる方法は
1. テキストを小さく、または背景と同色にして隠す。
2. テキストの位置を画面外に指定する
3. テキストの上に画像を重ねる

まず、1.は、最近、検索エンジンが不正な方法として認識するようになってきました。
この方法でテキストを隠していることが検索ロボットに解析されると、不正にアクセス向上を図っているサイトとして、検索結果の順位を下げられてしまうのです。

また、1. と 2. は、ユーザがブラウザの設定で画像表示をオフにしている場合、見出しを見ることができません。(表示の高速化のため、画像表示をオフにしている人は意外に多いものです)

これに対し、3. の方法は、画像表示をオフにすると下のテキストを見ることができます。
マウスで選択もできるのです。

そこで、3. の方法を実現する方法を紹介します。
これは「スタイルシートスタイルブック」という書籍で紹介されている方法です。

まず、H1 のCSSです。

h1 {
font-family: "MS ゴシック", "Osaka-等幅";
font-weight: bold; (←見出しらしい大きさ、ウェイト、色を指定する)
font-size: 20px; (←見出しらしい大きさ、ウェイト、色を指定する)
color: #000000; (←見出しらしい大きさ、ウェイト、色を指定する)
margin: 10px; (←テキストが画像からはみ出さないように)
height: 50px; (←タイトル画像の大きさに合わせる)
width: 400px; (←タイトル画像の大きさに合わせる)
}
h1 span {
background-image: url(title.jpg); (←タイトル画像)
background-repeat: no-repeat; (←繰り返さない)
position: absolute; (←絶対位置指定)
top: 0px;
left: 0px;
height: 50px; (←タイトル画像の大きさ)
width: 400px; (←タイトル画像の大きさ)
}

そして、HTMLで次のように指定します。

<H1><SPAN></SPAN>見出しのテキスト</H1>

(↓結果)
hi-title03

カラクリがお分かりになるでしょうか?
H1タグ内に置いた SPANタグに画像を指定することで、テキストの上に画像が重なります。
H1の背景ではなく、H1の中にある、SPANという別の要素の背景として画像を指定しているので、テキストの上に重なるわけです。

SPANタグの代わりに他のタグを使っても同じことができると思いますが、他のタグではデフォルトで表示に何らかの影響を及ぼしますので工夫が必要です、SPANタグを使うのが一番簡単です。

SPANタグの位置指定には position : absolute を使っています。
これを使うと、画面上のH1の位置を正確に割り出して位置を決めなければならないのではないか? と思われる方がいるかもしれませんが、そんな必要はありません。
H1は、画面上のどこにあっても大丈夫です。
なぜなら、absolute は、親要素の位置から自分の位置を割り出すからです。
つまり、親要素である H1 の位置から自分の位置を割り出すので、

position : absolute、left = 0px、top = 0px

で、H1の左上に正確に画像が重なります。

画像表示をオフにしている場合も、レイアウトが崩れることなく見出しに位置にテキストが表示されます。
(↓実際は違いますが、こんな感じです)
hi-title02


注意点としては、

・H1タグの width、height指定を画像と同じにしておくこと
・画像は透過GIFにしないこと

です。

もうひとつ、注意点があります。
Macintosh版IE では、H1につづく段落にfloat属性が指定されていると、テキストが見えてしまうというバグがあるようです。(詳細は未確認です)

----------

ただ、この方法がいつまで正当な方法として通用するかは私にはわかりません。

今回は、いつまでも過去の技術に頼らず、常に情報を収集することがとっても大事なんだと痛感させられました。

| | コメント (0) | トラックバック (0)

サイトのメニューはリストで(テキスト編)

サイトの上や左にメニューを配置して、マウスを重ねると表示が変わる仕組み自体は、サイトを作っている人にはもう必須とも言えるようなものになってきています。
でも、それを実現するために使われているのは、ほとんど JavaScript による、イメージの置き換えという手法です。
これは、DreamWeaver + Fireworks で自動的にコードが作成される機能が実現されて以来、多くの Webオーサリングソフトに実装され、誰でも簡単に使える定番の仕組みになりました。

しかし、定番といわれてきたこの手法が最近になって問題とされてきています。
●内容と関係のない部分(イメージの置き換えのためのコード)が非常に大きくなるため、検索エンジンに対して不利になる(内容が検索されにくい)。
●修正時には、Webオーサリングソフトを使用して、オリジナルファイルから作り直さないといけない。
●画像やJavaScript がオフだと機能しないので、代替手段が必要になる。
といったことです。


では、これをCSSで書き直すとどうなるでしょう?

実際にコードを見てください。
もう、何度もお見せした、プロフィールのページです。

sample02.gif

実際のサイトはこちら

●ページ全体のHTML

サイト上部に置かれたメニューは、マウスを置くと色が変わって、ちょっと動くようになっています。
で、この部分のHTMLはというと

<div id="navi">
<a name="pagetop"></a>
<ul>
<li><a href="../index.html">Top</a></li>
<li><a href="../shop/pieshp_0.html">AnnaMiller's</a></li>
<li><a href="../flash/flash_0.html">Flash</a></li>
<li><a href="../cg/cg_0.html">Illustration</a></li>
<li><a href="http://cherrypie.cocolog-nifty.com/">CSS</a></li>
<li><a href="profile.html">Profile</a></li>
<li><a href="../ftalk_1.html">BBS</a></li>
<li><a href="../link/link_0.html">Link</a></li>
</ul>
</div>

と、単なるリンクのリストになっています。
信じてくださいね。メニュー部分のHTMLは、本当にこれだけです。
これを、メニューに変えるのが CSS というわけです。

では、CSS です。

#navi {
position: absolute;
left: 120px;
top: 39px;
height: 16px;
width: 640px;
z-index: 1;
}
#navi ul {
margin: 0px;
padding: 0px;
}
#navi ul li, #navi ul li a, #navi ul li a:visited {
list-style-type: none;
display: inline;
text-decoration: none;
margin: 0px;
padding-top: 2px;
padding-right: 4px;
padding-bottom: 4px;
padding-left: 4px;
font-family: "MS Pゴシック", Osaka;
color: #FFFFCC;
font-size: 16px;
font-style: normal;
font-weight: bold;
}
#navi ul li a:hover {
position: relative;
left: 2px;
top: 1px;
padding-top: 2px;
padding-right: 2px;
padding-bottom: 4px;
padding-bottom: 0px;
display: inline;
background-color: #CC0000;
color: #FFFF00;
border: 1px groove #CC0000;
}

メニューに関わる全ての定義部分に #navi がついているのは、これらがメニューの部分(div id="navi"で囲まれた部分)だけの定義だということを示しています。
(他の部分のリストがメニューみたくなってはまずいですから)

#naviの定義部分では、メニューが表示される位置を決めています。
position:absolute で、ヘッダ部分ののサイトロゴに重ねています。

ul タグを再定義しているのは、メニューの位置がずれるのを防ぐためです。
Webブラウザのデフォルトでは ulタグにマージンが指定されていて、使用するブラウザによって位置がずれてしまいます。

そして、liタグの再定義が、今回の一番のキモです。
通常、liタグの要素は要素ごとに改行され、縦に並びます。
ここで、display:inline とすることで、liタグの要素が改行されず、横に並びます。
そして、paddingで要素間の距離を決めます。
li a:hover は、マウスが乗ったときの振る舞いを定義します。
ここで、position:relative で、top, left を指定して、マウスが乗っていないときから相対的に位置をずらします。
右下にずらし、背景と周囲の色を変えることによって、押されたような感じを表しています。

これだけで、簡単なメニューが実現できるのです。
画像もJavaScriptも使用していないので、ブラウザの設定でオフになっていても問題ありません。
さらに、リンク部分がリストで作られていると、音声ブラウザや検索エンジンがこの部分をひとかたまりの構造として捉えてくれるので、アクセシビリティの面でもSEOの面でも非常に有利です。

しかし、もっとも良い点は、更新のしやすさ。
CSSは全て相対的な指定になっているので、メニューの内容が変わったり、増えたり減ったりしても、HTMLのリスト部分を変えるだけで更新できるのです。
注意すべきは、メニュー項目を増やしたときの横方向の長さだけ。
結構、すごくありませんか?

ここまできて、ちょっと不満な方もいらっしゃるでしょう。
「テキストでなく、画像を使ってこういうことは実現できないの?」
と思われる方はきっと多いはずです。

はい、まかせてください。
これほど単純ではありませんが、従来の方法からは考えられないほど簡単に、画像によるメニューが実現できます。
もちろん、画像オフでも問題なく、アクセシビリティもSEOも考慮したものです。
(つづく)

| | コメント (0) | トラックバック (0)

«新・見出しに画像を使いたい