
メインビジュアルとしてCSSで背景画像として指定したものの中にリンクエリアを作って、そこの部分だけにマウスをもってきた時に、リンク先に飛ぶようにしたいのですが、毎回firefox, IE7,IE6でのmargin, padding,の違いに四苦八苦してます。
大抵は、margin-topを違うブラウザ用にpadding-topにして、*htmlや、*:first-child+html等のハックでカバーしてたりするのですが、今回はそれでもうまくいかず、どなたか教えて頂けたらと質問させて頂きました。
以下CSSのソースです。
#main_visual {
background:url(../img/main_visual.jpg) no-repeat;
width:666px;
height:418px;
text-indent:-9999px;
}
#main_visual a{
display:block;
width:338px;
height:43px;
position:relative;
top:324px;
left:308px;
}
上のように、666 X 418の画像の中に、
上から324px 左から308pxの位置に大きさ338 X 43のリンクエリアをつくリたいのですが、、上記だと、IE7 IE6ではうまくいくみたいですが、
firefoxとsafariだと、positionが全くきかず左上の位置(top:0 left:0)にリンクエリアがきてしまってます。。
どのようにリンクエリアを指定するのが最もスマートな方法なのでしょうか? 毎回悩んでます。。ちなみに、*:first-child+html このIE7用のハックってまだ使えたりするんでしょうか?^^;
No.4ベストアンサー
- 回答日時:
ANo.2です。
お役に立てた様で良かったです。
> あと、htmlのほうは、
> <div id="main_visual"><!--MAIN VISUAL-->
> <a href="https://www.rink.com">ここに文言が入ってます。</a>
> </div><!--MAIN VISUAL-->
>
> これだけのシンプルなもんです。。
そうでしたか。であれば、他の方のご指摘にもありますが、マークアップはulでされた方が妥当でしょうね。
ANo.2でのスタイルを、ulでマークアップする場合はちょっとした変更を加えるだけでOKです。
---------------------------------------------------------------------
【HTML】
---------------------------------------------------------------------
(省略)
<body>
<p>リンクより上のブロック</p>
<ul id="main_visual">
<li><a href="#">ここに文言が入ってます。</a></li>
</ul>
<p>リンクより下のブロック</p>
</body>
(省略)
---------------------------------------------------------------------
【CSS】
---------------------------------------------------------------------
ul#main_visual {←"ul"はなくてもいいです(以下同)
position: relative;
background: url(../img/main_visual.jpg) no-repeat;
width: 666px;
height: 418px;
list-style: none;
margin: 0;
padding: 0;
}
ul#main_visual li {
position: absolute;
top: 324px;
left: 308px;
width: 338px;
height: 43px;
}
ul#main_visual a {
display: block;
width: 100%;
height: 100%;
text-indent: -9999px;
}
---------------------------------------------------------------------
ANo.2からの変更点は:
・#main_visualをulのマークアップに都合がよい様にディフォルトのリストスタイルや余白をリセット
・aをliの子要素とする為、位置決めや縦横サイズはliで指定
・aには親要素の幅と高さを継承させる
だけです。リンクエリアとしている背景画像の部分には当然リンク箇所である事がわかる様な文言が明示されているなり、クリックを誘導する様なボタン的デザインがされているものと想定しています。
この回答への補足
度々ご丁寧にご説明頂き、恐縮です><
ほんと、大変ためになりました!ありがとうございます!!
また、改めてCSSの奥深さというか、楽しさ?wに触れましたよー。
ありがとうございます!
No.3
- 回答日時:
この場合、#main_visuaという、祖先ブロック内でabsolute;で位置指定をすべきです。
その場合、祖先要素はposition:static以外でなければなりません。
また、アクセスビリティ・ユーザビリティの意味でポインターが乗ったときにリンクがあることを明示したほうがよいでしょう。
なお、これは余計かもしれませんが、画面表示のためだけに、わざわざ#main_visualという要素を作られているようですが、HTML/CSSの考え方からは、おかしいです。これは、単なるリンクですから、<ul><li><a href=""></a></li></ul>等とマークアップして、@mediaをスクリーン用に指定しておくと、携帯やサーチエンジン、読み上げブラウザにも問題ありません。
もちろん、スタイルシートを解除しても意味のあるソースになります。
★将来的(XHTML2.0)には、<nl>(Navigation List)という要素が加わるでしょう。
とりあえず、それらを含めてソースを示しておきます。
IEは、bodyやhtmlのmargin/paddingに対して解釈が異なるため、このブロック自体の位置は異なりますが、それは簡単にあわせることが出来ますので省きます。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html lang="ja">
<head>
<meta http-equiv="content-type" content="text/html; charset=Shift_JIS">
<title>Untitled</title>
<meta http-equiv="Content-Style-Type" content="text/css">
<style type="text/css">
<!--
@media screen{
ul#navigation_Link {
position:relative;
background:url(../img/navigation_Link.jpg) no-repeat;
width:666px;
height:418px;
padding:0px;
border: 1px solid red;
}
ul#navigation_Link li{
display:block;
width:338px;
height:43px;
position:absolute;
top:324px;
left:308px;
padding:0px;
border:1px solid green;
}
#navigation_Link li a{
position:relative;
top:-4px;
left:-4px;
display:block;
margin:0px;
border:4px solid transparent;
width:100%;
height:100%;
text-align:center;
text-decoration: none;
}
#navigation_Link li a:visited{
border-style:outset;
border-color:transparent;
}
#navigation_Link li a:hover {
border-style:outset;
border-color:gray;
}
#navigation_Link li a:active {
border-style:inset;
border-color:gray;
}
#navigation_Link li a span{
visibility:hidden;
}
}
-->
</style>
</head>
<body>
<h1>title</h1>
<h2>subTitle</h2>
<ul id="navigation_Link">
<li><a href="./index3.html"><span>トップページへ</span></a></li>
</ul>
</body>
</html>
ORUKAさん!教科書のようなご丁寧なアドバイス!!とってもためになりましたっ!!本当にありがとうございます!
>携帯やサーチエンジン、読み上げブラウザにも問題ありません。
なるほど。。そこまで考慮できて、一人前ですよね。。
今回は純粋にソース以外にもCSSに対して色々考えさせられました、ありがとうございました!
No.2
- 回答日時:
> firefoxとsafariだと、positionが全くきかず左上の位置(top:0 left:0)にリンクエリアがきてしまってます。
。※ちなみに、質問者様が提供されたCSSのソースの"#main_visual a"のプロパティ指定の中に全角スペースが入ってます。もしオリジナルのCSSから”そのまま”コピペされたのだとしたら、Firefox等で挙動がおかしいのはそのせいである可能性が高いです。この位置での全角スペースの記述は認められていませんので、プロパティの解釈が無効になります。
以下はオリジナルには全角スペースが入ってない、単なるコピペの際のミス、という前提で話をしています。
質問者様のソースでそのまま再現しても、Firefox2/3、Safari3共に「(top:0 left:0)にリンクエリアがきてしまって」という状況にはなりませんが(DOCTYPE等が不明ですので、一応HTML4.01 StrictとXML宣言付XHTML1.1の両方のサンプルで試してみましたがいずれも同じでした)?
ただ、リンクエリアが#main_visualのボックスに対し、正確に"top: 324px; left: 308px; width: 338px; height: 43px;"となっているかというと、微妙にずれている様です。それは、ちょっと現在のCSSの指定におかしなところがあるからです。
もしも、#main_visualのボックス(この場合はdivでマークアップしてあると仮定します)の中に、リンクエリア以外の要素も含まれるのであれば、positionやtext-indentを指定するポイントが相応しくないと思います。以下は、その点を考慮し、且つリンクエリアが質問者様ご希望の各環境でも"top: 324px; left: 308px; width: 338px; height: 43px;"で表示される様に修正してみたサンプルです。
---------------------------------------------------------------------
【HTML】
---------------------------------------------------------------------
(省略)
<body>
<div id="main_visual">
<p>リンクエリアより前に記述したブロック</p>
<a href="#">リンクエリア</a>
<p>リンクエリアより後ろに記述したブロック</p>
</div>
</body>
(省略)
---------------------------------------------------------------------
【CSS】
---------------------------------------------------------------------
#main_visual {
position: relative;←追加
background: url(../img/main_visual.jpg) no-repeat;
width: 666px;
height: 418px;
}
#main_visual a {
display: block;
position: absolute;←修正
top: 324px;
left: 308px;
width: 338px;
height: 43px;
text-indent: -9999px;←#main_visualではなくこちらに指定
}
---------------------------------------------------------------------
以上のサンプルで、IE6/7、Firefox2/3、Safari3で問題なくご希望通りの挙動になりますが。
本件程度のものであれば、ハックを駆使せずとも実現できるものと思います。ハックはあくまで最終手段なので…
abrilさん、とってもご丁寧なお答えありがとうございました!!
abrilさんのおかげで解決致しました!!!
全角は、、ハイ、コピペミスです^^;
あと、htmlのほうは、
<div id="main_visual"><!--MAIN VISUAL-->
<a href="https://www.rink.com">
ここに文言が入ってます。
</a>
</div><!--MAIN VISUAL-->
これだけのシンプルなもんです。。
なので、
>リンクエリア以外の要素も含まれるのであれば
入ってない、ことになりますよね?
なるほど、、、
relativeを親ボックスにかけておいて、
子ボックスに、absoluteで指定する。。。
よくよく考えてみれば、確かにそうですよね。。
あー、、、リンクエリア以外の、ボックスレイアウトではたまにこうやってレイアウトしてましたが、そうですよね、、リンクエリアもこうやって作ればクロスブラウザーのためにpaddingやら、marginやらで悩む必要や、ハックを使用する必要はないんですよね。。これからそうしようー!!
(以前、ハックは最終的手段だから、と同じことを言われました^^;)
今回は、本当にためになりました!!!質問させて頂いてよかったです。
本当にありがとうございました!
No.1
- 回答日時:
aは元々inline(block化してるけど)だから上位の text-indent:-9999px; の影響を受けてるだけじゃない?
一旦更にdivで囲ってみるか、文字を消したいなら visibility:hidden で対応してみるとか。
SAYKAさん、お答えありがとうございます。
visibility:hiddenだと、文言だけでなく、背景画像も消えてしまい。。。
text-indentってSEO的にも色々議論がわかれるところですけどね。。色々と研究してみたいと思いますー、ありがとうございます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- HTML・CSS 書籍を見つつサイト造りの練習をしているのですが、見た目が一致しません 2 2022/11/28 15:00
- JavaScript vertical sliderをautoplayしたい 2 2022/08/25 14:47
- HTML・CSS ヘッダーの画像にメインエリアがかぶってしまいます 1 2022/11/28 14:06
- JavaScript ソースコードのいじる場所が分かりません。 1 2022/12/23 02:06
- HTML・CSS スクロールすると追従する画像のコードを書いているのですが、追従する画像の大きさの調節が上手くいきませ 2 2022/04/18 12:52
- オープンソース cssで中央寄せ 1 2023/05/19 06:25
- HTML・CSS img と p を縦中央に配置したいのですがうまくいきません。 2 2023/01/12 14:38
- HTML・CSS 吹き出し 下記の吹き出しのスタイルシートについて 下記のスタイルシートは左側にアイコンがでる使用にな 1 2022/11/12 17:55
- JavaScript jQueryでのドラッグアンドドロップについて 1 2022/07/30 09:10
- HTML・CSS 下にスクロールしても、追従するボタンのコードを書いたのですが、ボタンの中の画像が半分しか表示されない 1 2022/04/16 21:31
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
htmlの文字が縦書きになる
-
文字と枠線がくっつきすぎている
-
<div style="overflow">でこん...
-
div入れ子の背景画像
-
表示倍率を変えるとレイアウト...
-
CSSでテーブルのセルが、a:hove...
-
CSSでiframe要素の編集
-
ロールオーバーで画像がずれな...
-
cssで『top』ではなく『_top』...
-
Safariでheight:100%のボックス...
-
CSS、width100%でもできる余白
-
HTMLで同じ行の左右に文字配列
-
Firefoxで文字と画像が重なって...
-
CSSで左に画像、右にテキストを...
-
chromeではbackgroundの画像が...
-
widthやheightの数値に単位(px...
-
画像イメージの上下左右、欲し...
-
IE8・Firefoxで「border:dotted...
-
CSS アンカーの画像の回りが色...
-
画像を横並びに2つと、その右側...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
htmlの文字が縦書きになる
-
widthやheightの数値に単位(px...
-
form input テキストを上下中央...
-
<div>と<div>の間の10px程の...
-
【CSS】ヘッダーの高さが不明の...
-
余分な縦スクロールバーが出て...
-
CSSがなぜかfont-sizeだけ効か...
-
css初心者 フレックスボックス...
-
W3Cのソースコードの検証サービ...
-
表示倍率を変えるとレイアウト...
-
div内に外部のurlを表示させたい
-
画像イメージの上下左右、欲し...
-
table周辺の隙間をなくしたい。
-
divで囲まれたpaddingの指定を...
-
CSSで背景画像を一番下にもって...
-
HTMLのiframeの入れ子について
-
footer を横幅いっぱいに広げる...
-
CSSでボックスのheightが0になる
-
テーブル内の画像をマウスオー...
-
スクロールボックスを中央に配...
おすすめ情報