東日本大震災 洋野町津波被災(震災後7日目)その2八木から南






















































久々にコードを書いてみた。さっぱりだ。

確かにページ全体の座標が必要というわけではないし、スクロールしてしまうと外れてしまう。
修正:マウスアウトでも外れるように変更。
http://www.tagindex.com/cgi-lib/q4bbs/patio.cgi?mode=view&no=2803

<!DOCTYPE html>
<title></title>
<style type="text/css">
div {
  width : 100px;
  height: 100px;
  background: pink;
  border : 3px #f88 double;
}
#p {
  height:5000px;
  width :600px;
  background: #ffc;
}
</style>

<body>
  <div id="drag0">drag0</div>
  <div id="drag1">drag1</div>
  <div id="p">abc</div>

<script>

(function () {
  function Drag (node) {/*@cc_on@*/
    this.node    = node;
    this.state   = 0;
    this.offsetX = 0;
    this.offsetY = 0;
  }
  
  var memory = [];

  function init (view) {
    if (1 > arguments.length)
      view = window;

    var doc = view.document;
    
    doc./*@if (1) attachEvent ('on' + @else@*/ addEventListener (/*@end@*/'mousedown', onMouseEvent, false);
    doc./*@if (1) attachEvent ('on' + @else@*/ addEventListener (/*@end@*/'mouseup', onMouseEvent, false);
    doc./*@if (1) attachEvent ('on' + @else@*/ addEventListener (/*@end@*/'mousemove', onMouseEvent, false);
    doc./*@if (1) attachEvent ('on' + @else@*/ addEventListener (/*@end@*/'mouseout', onMouseEvent, false);
    view./*@if (1) attachEvent ('on' + @else@*/ addEventListener (/*@end@*/'unload', onUnload, false);

    function getMousePosition (event/*EventObject*/) {
      var cssroot = ('CSS1Compat' === doc.compatMode) 
                    ? doc.documentElement
                    : doc.body;
      return {
        x: event.clientX + /*@if (1) cssroot.scrollLeft @else@*/ view.pageXOffset /*@end@*/,
        y: event.clientY + /*@if (1) cssroot.scrollTop  @else@*/ view.pageYOffset /*@end@*/
      };
    }

    
    function onMouseEvent (event) {
      var cnt = has (event./*@if (1) srcElement @else@*/ target /*@end@*/);
      var obj;
      var point;
      
      if (0 > cnt)
        return;
      
      obj = memory[cnt];
      
      switch (event.type) {
      case 'mousedown' :
        if (! obj.state) {
          point = getMousePosition (event);
          obj.offsetX = obj.node.offsetLeft - point.x;
          obj.offsetY = obj.node.offsetTop  - point.y;
          obj.node.style.zIndex = obj.state = 1;
        }
        break;

      case 'mouseup' : case 'mouseout' :
        obj.node.style.zIndex = obj.state = 0;
        break;

      case 'mousemove' :
        if (obj.state) {
          point = getMousePosition (event);
          obj.node.style.top  = (point.y + obj.offsetY) + 'px';
          obj.node.style.left = (point.x + obj.offsetX) + 'px';
        }
        break;
      }
    }
    
    function onUnload () {
      doc./*@if (1) detachEvent ('on' + @else@*/ removeEventListener (/*@end@*/'mousedown', onMouseEvent, false);
      doc./*@if (1) detachEvent ('on' + @else@*/ removeEventListener (/*@end@*/'mouseup', onMouseEvent, false);
      doc./*@if (1) detachEvent ('on' + @else@*/ removeEventListener (/*@end@*/'mousemove', onMouseEvent, false);
      doc./*@if (1) detachEvent ('on' + @else@*/ removeEventListener (/*@end@*/'mouseout', onMouseEvent, false);
      view./*@if (1) detachEvent ('on' + @else@*/ removeEventListener (/*@end@*/'unload', onUnload, false)
      view = doc = null;
    }
  }


  function has (node) {
    var obj;
    var cnt;
    
    for (cnt = 0; obj = memory[cnt]; cnt += 1)
      if (node === obj.node)
        return cnt;
    return -1;
  };


  function add (node, x, y) {
    var style;

    if (0 > arguments.length)
      return;

    if (0 > has (node)) {
      style = node.style;
      style.position = 'absolute';
      style.top = (y || 0) + 'px';
      style.left = (x || 0) + 'px';
      
      memory.push (new Drag (node));
    }
  }

  //__________________________________
  
  Drag.add  = add;
  Drag.init = init;

  //__________________________________
  this.Drag = Drag;
})();

Drag.init (this);
Drag.add (document.getElementById ('drag0'), 100, 100);
Drag.add (document.getElementById ('drag1'), 200, 200);
</script>