CSS で要素の相対的な位置指定 (2) のつづき
1. 伸縮する領域を作成したい
ウェブページにおいて、
縦横に伸縮する区画
を作成したい。
例えば、以下のような影のある領域を作成し、領域内にある文字の量と、ウィンドウのリサイズに応じて、「高さ・幅」が伸縮するようにしたい。
2. 方法
a. 画像の分割
上記のデザインを Gimp を使って作成。できたものを各パーツに分割する。分割する対象は、影になっている角の部分 3 つと、影の縦・横線を最小限の長さで取り出す。
背景となる色については、Web ページでは CSS により指定をするので、 Color Picker Tool を使って色を確認しておく。 Foreground Color をダブルクリックして、開かられるダイアログに HTML notation が表示されるので控えておく。
b. 構成要素の位置関係の概略
さて、上記のように分割した画像を使って領域を作成していく。以下の図では、影の部分を緑色で示している。また、角がわかりやすくなるように、角の大きさを拡大して示した。
上図は 7 つの層から構成される。
下の層から、
- 右側の影
- 右上の角 (ぴったり重ねる)
- 右下の角 (下にずらす)
- 下側の影 (左にずらす)
- 左下の影 (左にずらす)
- 背景の色の部分 ( 上にずらす。 JavaScript で幅を動的に設定)
- 文字を書く部分 (ぴったり重ねる)
上記の位置を考えるときは、同じ大きさの小さな紙を用意し、それぞれにパーツに必要な画像に相当するものを書き込み、いろいろと重ね方を試行錯誤する方法が理解しやすかった。 実際には、 CSS において background の transparent を指定するので、透明な紙であると仮定して考える必要がある。
これを頭の中、または絵を描くだけでは、わけがわからなくなってしまった。 ^^;
c. JavaScript によるリサイズ
ウィンドウのリサイズによる JavaScript の操作については、「JavaScript でブラウザのウィンドウのリサイズに合わせて HTML の要素の値を更新」を参照。
HTML の要素の幅を取得するには、element.offsetWidth – MDC によると、offsetWidth を使うようだ。
Typically, an element's
offsetWidthis a measurement which includes the element borders, the element horizontal padding, the element vertical scrollbar (if present, if rendered) and the element CSS width.
3. ソースコード
HTML のソースを以下に示す。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional/EN">
<html>
<head>
<title>伸縮する領域</title>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<script type="text/javascript">
<!--
/* このページが読み込まれたときに呼出される関数 */
function setup(){
resizeContent();
}
/* ウィンドウをリサイズしたときに呼出される関数
* id が topLeft の要素の幅を広げる
*/
function resizeContent(){
topRightDiv = document.getElementById("topRightCorner");
contentDiv = document.getElementById("topLeft");
contentDiv.style.width = topRightDiv.offsetWidth + 11 + "px";
}
-->
</script>
<style type="text/css">
<!--
/* 右側の縦の影のライン */
#rightLine{
position: relative;
background: transparent url("rightLine.png") right repeat-y;
margin: 15%;
}
/* 右上の角の影 */
#topRightCorner{
position: relative;
background: transparent url("topRightCorner.png") top right no-repeat;
}
/* 右下の角の影 */
#bottomRightCorner{
position: relative;
top: 10px;
background: transparent url("bottomRightCorner.png") bottom right no-repeat;
}
/* 下の横の影のライン */
#bottomLine{
position: relative;
left: -10px;
background: transparent url("bottomLine.png") bottom repeat-x;
}
/* 左下の角の影 */
#bottomLeftCorner{
position: relative;
left: -10px;
background: transparent url("bottomLeftCorner.png") bottom left no-repeat;
}
/* 背景となる色を指定する領域。
* リサイズにより、JavaScript でこの領域の幅を変更する。
*/
#topLeft{
position: relative;
background-color: #dddbff;
top: -9px;
}
/* 文字を表示する領域 */
#content{
position: relative;
padding: 20px;
}
-->
</style>
</head>
<body onresize="resizeContent()" onload="setup()">
<div id="rightLine">
<div id="topRightCorner">
<div id="bottomRightCorner">
<div id="bottomLine">
<div id="bottomLeftCorner">
<div id="topLeft">
<div id="content">
ウィンドウのリサイズに合わせて幅と高さが変化する領域。
JavaScript でoffsetWidth により要素の幅を取得し、
width に設定する。
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</body>
</html>
これにより、ウィンドウのリサイズによって、以下のように伸縮する。
Windows 上の、Firefox 3, IE 7, Opera 9.5, Safari 3.1 において動作した。ただし、 Safari の動作がちょっと微妙… (+_+) 昔のブラウザだとどうなのかなぁ~
それにしても、もっと簡単な方法はないかな? (@_@;)
4. その後
後で気がついたが、「左下の影」を左にずらすことなく、「下側の影」にぴったりと重ねた場合、 JavaScript を利用しなくてもよいはず。
重ねたものを上から見ると、ちょうど大きさが納まっていることがわかる。
しかし、この方法では、文字のある要素において、 CSS の padding を指定すると、Firefox, Opera, Safari では問題なく表示されるが、 IE で表示が崩れてしまった…。なぜだろう。
パタッ(o_ _)o~†
それにしても、CSS って指定の方法はややこしいしい、ブラウザによって微妙に動作が違うのでやだなぁ~。統一してくれ~ (+_+)
0コメント:
コメントを投稿