Web/DB プログラミング徹底解説

ホーム > JavaScript プログラミング > スクロールについてくる要素

スクロールについてくる要素

今回はCSS と JavaScript を使って、「 ウィ ンドウのスクロールについてくる要素」  を作ります。

このコードのポイントは、ウィンドウのスクロー ル量を正しく求めるところです。他は面倒なところはありません。 スクロール量、X, Y はそれぞれ下記のコードの getScrollPosX, getScrollPosY で求めています。 

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
    "http://www.w3.org/TR/html4/strict.dtd ">
<html>
<head>
<title>スクロールについてくる</title>
<meta http-equiv="Content-Type" content="text/html; charset=euc-jp">
<script type="text/javascript">
function getScrollPosX() {
    if (typeof window.pageXOffset != 'undefined') {
        return window.pageXOffset;
    }
    else if (typeof document.documentElement.scrollLeft != 'undefined'
      && document.documentElement.scrollLeft > 0) {
        return document.documentElement.scrollLeft;
    }
    else if (typeof document.body.scrollLeft != 'undefined') {
        return document.body.scrollLeft;
    }
    return 0;
}

function getScrollPosY() {
    if (typeof window.pageYOffset != 'undefined') {
        return window.pageYOffset;
    }
    else if (typeof document.documentElement.scrollTop != 'undefined'
      && document.documentElement.scrollTop > 0) {
        return document.documentElement.scrollTop;
    }
    else if (typeof document.body.scrollTop != 'undefined') {
        return document.body.scrollTop;
    }
    return 0;
}

function addEvent(element, eventType, fn, useCapture) {
    if (element.addEventListener) {
        element.addEventListener(eventType, fn, useCapture);
        return true;
    }
    else if (element.attachEvent) {
        var r = element.attachEvent('on' + eventType, fn);
        return r;   
    }
    else {
        element['on'+eventType] = fn;
    }
}

function onScroll(evt) {
    var elm = document.getElementById('viewer');
    var x = getScrollPosX();
    var y = getScrollPosY();
    moveElm(elm,x,y);
}

function moveElm(elm,x,y) {
    var elm = document.getElementById('viewer');
    elm.style.left = 0; // relative!
    elm.style.top = y + 'px';
}

function init(evt) {
    addEvent ( window, 'scroll', onScroll, false );
    var elm = document.getElementById('viewer');
    moveElm(elm, 0,0);
}

addEvent (window, 'load', init, false );

</script>
<style type="text/css">
.foo {
    width: 150px;
    background: #e8eefa;
    text-align: center;
    position: relative;
    border-style: solid;
    border-width: 1px;
    border-color: #999999;   
}
</style>
</head>
<body>
<table border='1'>
<tr>
<td width='100%'>
  <div style='height: 1000px;'></div>
</td>
<td id='right_column' valign='top'>
  <div class="foo" id="viewer" align='center'>
  Hello, world!
  </div>
</td>
</tr>
</table>
</body>
</html>

もうひとつのポイントとしては、今回はテーブルの右カラムに対する相対座標として <div> 要素の座標を定義した所です。これによって、div 要素の x 座標は常に 0 で良いことになります。