決まった位置にリンクの説明をタイプライター風で表示



0   名前: Javaer : 2007/02/23(金) 21:09  ID:ANmnEXBb sub-t1
【何をしたいのか】
<a href="xxx.html">リンク</a>にマウスを乗せると、
決まった位置に別々の説明をタイプライター風に表示したいのです。
下記リンクに詳しく書きました。
http://www.geocities.jp/persona_gokko/java3.html

【現在の状況】
下のスレで解決できたと思ったのですが、いざ重ねて使おうとしたら説明が変わらない、ウィンドウサイズによって
位置が変わってしまうの問題が出てしまいました。
前スレはこちら↓
http://www.tagindex.com/cgi-lib/q4bbs/patio.cgi?mode=view&no=977

【何をしてみたのか】
JavaScript無能の私の独断で編集したら、全くうまくいきませんでした。
何をどうしたら変わるのかさえも分かりません。

【備考】
IE、基本的なHTMLとCSSならば知っています。

1   名前: 匿名 : 2007/02/23(金) 21:09  ID:rEkc4Z1y sub-kJ
そのスクリプトはスタイルに干渉していない。つまり、位置がずれるというのは純粋に CSS の問題であって、JavaScript とは無関係。

とりあえず、

(1). 以下の記述は修正。
style="font-size:10pt; position:absolute;top:140;left:20;"

style="font-size:10px; position:absolute;top:140px;left:20px;"

(2). どういうレイアウトが理想的なのか分からないので、現時点では修正案が浮かばない。

上記に関しては、スタイルシート質問板にて再質問した方が良い。

スクリプトに関しては、

(3). 『メニューごとの説明を変わる様にもしたい』だが、typeMes2() に引数を与えれば良い。関数の引数について調べてみてはどうだろうか。

2   名前: 匿名 : 2007/02/23(金) 21:09  ID:rEkc4Z1y sub-kJ
オマケ。以下は dt 要素をポイントすると、対応する dd 要素(説明)を表示する。タイプライタ風という条件上、dd 要素内のテキストのみ(dd の子要素を含めてタイプライタ風に出すのは、自分でチャレンジして)。定位置だとかえって面倒なので >>0 と同じく絶対配置にしてある。
<script type="text/javascript">

/*@cc_on@*/
if (document.implementation &&
  /*@if (@_jscript)
    document.implementation.hasFeature ('HTML', '1.0') &&
    @_jscript_version > 5.5 &&
    typeof attachEvent != 'undefined' &&
    typeof document.createStyleSheet != 'undefined' &&
    @else@*/
//  document.implementation.hasFeature ('Core'       , '3.0') &&
//  document.implementation.hasFeature ('Layout'     , '3.0') &&
    document.implementation.hasFeature ('HTML'       , '2.0') &&
    document.implementation.hasFeature ('StyleSheets', '2.0') &&
    document.implementation.hasFeature ('CSS2'       , '2.0') &&
    document.implementation.hasFeature ('HTMLEvents' , '2.0') &&
    document.implementation.hasFeature ('MouseEvents', '2.0') &&
    typeof Function.prototype.call != 'undefined' &&
  /*@end@*/
    true)

(function () {
/************************************************************************/

var UserConfiguration = {
    typingInterval :  100,  // 文字タイピング間隔(ミリ秒)
    retypeInterval : 1000,  // 繰り返し間隔(ミリ秒)
    showTimeOut    :  500,  // ポイントしてから表示までの間隔(ミリ秒)
    hideTimeOut    :  500,  // ポインタを外して消去までの間隔(ミリ秒)
    
    dummy : null };

//______________________________________________________________________

function addEventLi$tener (type, listener, useCapture) {
    this./*@if (@_jscript) attachEvent ('on' + @else@*/
         addEventListener (/*@end@*/ type, listener, useCapture);
}

function removeEventLi$tener (type, listener, useCapture) {
    this./*@if (@_jscript) detachEvent ('on' + @else@*/
         removeEventListener (/*@end@*/ type, listener, useCapture);
}

//______________________________________________________________________

var TOListener = function () {
    var callee = arguments.callee;
    var data, timeout;
    
    if (callee.index < callee.message.length - 1) {
        data = callee.message.substring (0, callee.index).concat ('_');
        timeout = callee.typingInterval;
        callee.index = callee.index + 1;
    } else {
        data = callee.message;
        timeout = callee.retypeInterval;
        callee.index = 0;
    }
    callee.output (data);
    callee.timerId = setTimeout (callee, timeout);
};

TOListener.typingInterval = UserConfiguration.typingInterval;
TOListener.retypeInterval = UserConfiguration.retypeInterval;

TOListener.start = function (data) {
    this.message = data;
    this.index = 0;
    this ();
};

TOListener.stop = function () {
    clearTimeout (this.timerId);
    this.timerId = null;
    this.output ('');
};

TOListener.output = function (data) {
    this.target.data = data;
        /* // for Safari
        var p = this.target.parentNode;
        p.removeChild (this.target);
        p.appendChild (this.target);
        */
};

TOListener.message = '';
TOListener.index   = 0;
TOListener.timerId = null;
TOListener.target  = document.createElement ('ins').
                     appendChild (document.createElement ('p')).
                     appendChild (document.createTextNode (''));

//______________________________________________________________________

var MOListener = function (event) {
    var callee  = arguments.callee;
    var target  = event.target || window.event.srcElement;
    callee.cancelShowing ();
    
    if (callee.contains (target)) {
        callee.cancelHiding ();
    } else {
        callee.startHiding (callee);
        var node = callee.find (target);
        
        if (node && node.nodeName == 'DD') {
            callee.startShowing (callee, node, callee.measure (event || window.event));
        }
    }
};

MOListener.TOListener  = TOListener;
MOListener.element     = TOListener.target.parentNode.parentNode;
MOListener.showTimeOut = UserConfiguration.showTimeOut;
MOListener.hideTimeOut = UserConfiguration.hideTimeOut;
MOListener.showTimerId = null;
MOListener.hideTimerId = null;

MOListener.find = function (node) {
    while (node && node.nodeName != 'DT') node = node.parentNode;
    
    if (node) {
        do node = node.nextSibling; while (node && node.nodeName == '#text');
    }
    return node;
};

MOListener.contains = function (node) {
    while (node && node != this.element) node = node.parentNode;
    return Boolean (node);
};

// 位置の統一が困難な場合、ブラウザごとにこのメソッドをオーバーライドする
MOListener.measure = function (event) {
  /*@if (@_jscript)
    var b = document[ (document.compatMode == 'CSS1Compat') ? 'documentElement' : 'body' ];
  /*@end@*/
    return {
        clientX     : event.clientX,
        clientY     : event.clientY,
      /*@if (@_jscript)
        innerWidth  : b.clientWidth,
        innerHeight : b.clientWidth,
        pageXOffset : b.scrollLeft,
        pageYOffset : b.scrollTop
        @else@*/
        innerWidth  : innerWidth,
        innerHeight : innerHeight,
        pageXOffset : pageXOffset,
        pageYOffset : pageYOffset
      /*@end@*/
    };
};

MOListener.show = function (node, layout) {
    this.hide ();
    
    var ow = this.element.offsetWidth;
    var oh = this.element.offsetHeight;
    
    if (layout.innerWidth < layout.clientX + ow) {
        layout.clientX = layout.innerWidth - ow;
        if (layout.clientX < 0) layout.clientX = 0;
    }
    if (layout.innerHeight < layout.clientY + oh) {
        layout.clientY = layout.innerHeight - oh;
        if (layout.clientY < 0) layout.clientY = 0;
    }
    this.element.style.left = layout.clientX + layout.pageXOffset + 'px';
    this.element.style.top  = layout.clientY + layout.pageYOffset + 'px';
    
    this.TOListener.start (node.textContent || node.innerText || '');
};

MOListener.hide = function () {
    this.element.style.left = -9999 + 'px';
    this.element.style.top  = -9999 + 'px';
    this.TOListener.stop ();
};

MOListener.startShowing = function (listener, node, layout) {
    listener.showTimerId = setTimeout (function () {
        listener.show (node, layout); }, listener.showTimeOut);
};

MOListener.startHiding = function (listener) {
    listener.hideTimerId = setTimeout (function () {
        listener.hide (); }, listener.hideTimeOut);
};

MOListener.cancelShowing = function () {
    clearTimeout (this.showTimerId);
};

MOListener.cancelHiding = function () {
    clearTimeout (this.hideTimerId);
};

//______________________________________________________________________

var LoListener = function () {
    var callee   = arguments.callee;
    var element  = document.getElementsByTagName ('body')[0].
                            appendChild (callee.MOListener.element);
    element.className = 'inserted-message';
    callee.addStyle ();
    removeEventLi$tener.call (window, 'load', callee, false);
};

LoListener.addStyle = function () {
    /*@if (@_jscript)
    document.createStyleSheet().addRule ('dd', 'display: none', 0);
    @else@*/
    var style = document.getElementsByTagName ('head')[0]
                        .appendChild (document.createElement ('style'));
    style.sheet.insertRule ('dd { display: none; }', 0);
    /*@end@*/
};

LoListener.MOListener = MOListener;

//______________________________________________________________________

var ULListener = function () {
    var callee = arguments.callee;
    removeEventLi$tener.call (document, 'mouseover', callee.MOListener, false);
    removeEventLi$tener.call (window  , 'unload'   , callee           , false);
};

ULListener.MOListener = MOListener;

//______________________________________________________________________

addEventLi$tener.call (document, 'mouseover', MOListener, false);
addEventLi$tener.call (window  , 'load'     , LoListener, false);
addEventLi$tener.call (window  , 'unload'   , ULListener, false);

//______________________________________________________________________

UserConfiguration = MOListener = TOListener = LdListener = ULListener = null;

/************************************************************************/
} )();
</script>

3   名前: 匿名 : 2007/02/23(金) 21:09  ID:rEkc4Z1y sub-kJ
続き。
<style type="text/css">

.inserted-message {
  padding: .5em .8em;
  position: absolute;
  top: -9999px;
  left: -9999px;
  width: 30%;
  color: #fff;
  background: #000;
  text-decoration: none;
  opacity: 0.8;
}

/* for Safari */
/* dd { display: none; }*/

</style>

<!--[if IE]>
<style type="text/css">

.inserted-message {
  filter:progid:DXImageTransform.Microsoft.Alpha(opacity=80);
}
</style>
<![endif]-->

HTML 本文に書き加えるものは何も無い。dl 要素を普通通り書くだけ。
<dl>
<dt><a href="novel.html">PICS&amp;NOVELS</a></dt>
<dd>イラストやテキストなど。</dd>

<dt><a href="links.html">UP TO DATE</a></dt>
<dd>Last Update, 20 FEB.</dd>
</dl>

4   名前: 匿名 : 2007/02/23(金) 21:09  ID:rEkc4Z1y sub-kJ
ごめん、遊び過ぎたので一応。

『メニューごとの説明を変わる様にもしたい』に関しては、以下のように応急処置すれば何とかなるんじゃなかろうか。試してないけど。
function tipeMes2(cnt) {

・tipeMes() 関数内の cnt++ を削除(1 箇所)。
<a onmouseover="tipeMes2(0)"
   onmouseout="stopMessage()">PICT&amp;NOVEL</a>
<a onmouseover="tipeMes2(1)"
   onmouseout="stopMessage()">UP TO DATE</a>

5   名前: Javaer : 2007/02/23(金) 21:09  ID:ANmnEXBb sub-t1
匿名さん>
おぉお…すごいです…
これだけの量、わざわざ書いていただいてありがとう御座います!

ですが、
私の説明が悪くて全く違うモノを書かせてしまった事を先に謝ります。
すみませんでした。
ポップアップコメントではなくあくまでも定位置(決められた場所)に表示したいんです。
↓の簡単なスクリプトをタイプライターで表示したいだけです。
http://www.geocities.jp/persona_gokko/java3.html
組み合わせるのが簡単かどうかは、script無知の私には分かりかねます。
私のせいで違う目的のスクリプトを書いてしまい、本当に失礼なのですが
もう1度おねがいできますでしょうか?
お願いします。

6   名前: 匿名 : 2007/02/23(金) 21:09  ID:rEkc4Z1y sub-kJ
> あくまでも定位置(決められた場所)に表示したい

だから、それはスクリプトとは全然関係ないんだってばよ。位置指定は CSS の領域。

……今ふと思ったが、ひょっとして『定位置』というのは固定配置(position: fixed)のこと?
#mySTR2 {
  position: fixed;
  top: 140px;
  left: 20px;
  /* forIE */ position: expression('absolute');
  /* forIE */ top: expression(documentElement.scrollTop + 140 + 'px');
  /* forIE */ left: expression(documentElement.scrollLeft + 20 + 'px');
}

IE 互換モードなら body に変更。これは >>3 を使う場合も同じ。

7   名前: Javaer : 2007/02/23(金) 21:09  ID:ANmnEXBb sub-t1
匿名さん>
> あくまでも定位置(決められた場所)に表示したい
タイプミスです、すいません。
正しくは、
<script type="text/javascript">
<!--
msg=new Array();
msg[0]="";
msg[1]="トップページに移動します。";
msg[2]="My Documentに戻ります。";
function Msg(index){
    if(document.all){
        box.innerHTML = msg[index];
    }else if(document.layers){
        document.box.document.open();
        document.box.document.write(msg[index]);
        document.box.document.close();
    }
}
//-->
</script>

</head>

<body>

<br><br><br><br><br><br>

<div id="box" style="position:absolute;top:10;left:10;"></div><br>
<br>
<a href="../index.htm" onMouseOver="Msg(1)" onMouseOut="Msg(0)">トップページへ</a><br>
<a href="#" onMouseOver="Msg(2)" onMouseOut="Msg(0)">My Document</A>

</body>

のように、divにidを指定しておき、更にdivの位置は絶対位置で固定しておく。
aはdivに説明が出るように設定する。
ということです。
言い方がややこしかったです、すいません。

8   名前: Javaer : 2007/02/23(金) 21:09  ID:ANmnEXBb sub-t1
> divにidを指定しておき、更にdivの位置は絶対位置で固定しておく。
> aはdivに説明が出るように設定する。
> ということです。

書き忘れ、以下追加文です。

説明の表示位置はaをdivに繋ぎ、説明表示のターゲットdivを絶対位置で表示。
それが自分が↑で書いたjavascriptです。
msg=new Array();
msg[0]="";
msg[1]="トップページに移動します。";
msg[2]="My Documentに戻ります。";
function Msg(index){
    if(document.all){
        box.innerHTML = msg[index];
    }else if(document.layers){
        document.box.document.open();
        document.box.document.write(msg[index]);
        document.box.document.close();
    }
}
このJavaScriptだけ改造してタイプライターにできるでしょうか?
お願いします。

9   名前: 匿名 : 2007/02/23(金) 21:09  ID:9jO6XtAy sub-kJ
ごめん、俺が >>2-3 で変な投稿をしたから話が混乱してしまった。


>>7-8
すまないが、>>1 をもう一度よく読み返してくれ。

もう一度言うが、div の配置に関しては JavaScript とは一切関係ない。スクリプト抜きでそのレイアウトができないのなら、CSS 板に再質問した方が良い。

それと、>>8 は古すぎる。今どきのブラウザでは動かない。
<ul>
<li><a href="1" onmouseover="start ('トップページ');" onmouseout="stop ();">トップページへ</a></li>
<li><a href="2" onmouseover="start ('My Document');" onmouseout="stop ()">My Document</a></li>
</ul>

<script type="text/javascript">
document.write ('<p id="message"><\/p>');

function start (data) {
    TimerListener.listener.start (data);
}

function stop () {
    TimerListener.listener.stop ();
}

function TimerListener () {
    arguments.callee.listener.handleTimer ();
};

TimerListener.listener = {
    typing   : 100,
    retyping : 1000,
    timerId  : null,
    message  : '',
    index    : 0,
    parent   : TimerListener,
//  target   : document.getElementById ('message'),
    targetId : 'message',
    handleTimer : function () {
        var data, timeout;
        
        if (this.index < this.message.length - 1) {
            data = this.message.substring (0, this.index).concat ('_');
            timeout = this.typing;
            this.index = this.index + 1;
        } else {
            data = this.message;
            timeout = this.retyping;
            this.index = 0;
        }
        
        this.output (data);
        this.timerId = setTimeout (this.parent, timeout);
    },
    start : function (data) {
        this.message = data;
        this.index = 0;
        this.parent ();
    },
    stop : function () {
        clearTimeout (this.timerId);
        this.output ('');
    },
    output : function (data) {
//      this.target.firstChild.data = data;
        var target = document.getElementById ('message');
        target.innerHTML = data;
    }
};

</script>

繰り返すが、メッセージ表示領域のレイアウトに関しては、スクリプトでは一切干渉していない。CSS で好きな位置に好きなように置いてくれ。CSS に関する質問は、CSS 板へ。

10   名前: Javaer : 2007/02/23(金) 21:09  ID:ANmnEXBb sub-t1
匿名さん>
はい。このスクリプトです!
ですが、どこにstyle="position:absolute;top:400;left:250;"
をいれればいいんでしょうか?
aにつけてみたら、他の文章や画像などが全部下に下がってしまいました。
何回も質問で申し訳ありません。

11   名前: 匿名 : 2007/02/23(金) 21:09  ID:9jO6XtAy sub-kJ
>>0 で CSS の基本は知っているとあったので、そのつもりでいたのだがなあ orz。普通、style 属性なんて使わんよ。

あと君、>>1 を全く読んでないだろ。単位を付けろと言ったはず。


理想とするレイアウトを画像にでもして、そのためには下記のソースをどう修正したら良いかを CSS 板で再質問しる。
<style type="text/css">
#message {
  position: absolute;
  top: 400px;
  left: 250px;
}
</style>

<ul>
<li><a href="1">トップページへ</a></li>
<li><a href="2">My Document</a></li>
</ul>

<p id="message">メッセージ</p>

12   名前: 匿名 : 2007/02/23(金) 21:09  ID:9jO6XtAy sub-kJ
すまん、嫌みが過ぎた。許してくれ。

手順を整理しよう。

(1). 以下の HTML を用意する(メニューなんだから、リストでマークアップするのは大丈夫だよね。br なんて使っちゃ駄目だ)。
<ul>
<li><a href="1">トップページへ</a></li>
<li><a href="2">My Document</a></li>
</ul>

<p id="message">メッセージ</p>

(2). これに対し CSS でレイアウト指定する。
<style type="text/css">
#message {
  position: absolute;
  top: 400px;
  left: 250px;
}
</style>

(3). レイアウトが決まったら、>>9 の script 要素と、イベントリスナ(onmouseover/out)を組み込む。なお、この手順に従う場合、script 要素内の最初の document.write('...'); は削除してくれ


スクリプトを組み込むのは、あくまで HTML と CSS が決定してから(スクリプトなしでも問題ないようにしてあるのだから、当然だ)。

で、もう一度言うが、私は現時点で、どういうレイアウトになれば良いのか未だに分からない(絶対配置を使う理由も分からない)。だから、できれば画像などにして説明してほしい。それを、スタイルシート板に投げてくれ

13   名前: Javaer : 2007/02/23(金) 21:09  ID:ANmnEXBb sub-t1
匿名さん>できました!
長いスクリプトタグや板違いのCSSに、毎回答えてありがとう御座いました。
使用したのは
function start (data) {
    TimerListener.listener.start (data);
}

function stop () {
    TimerListener.listener.stop ();
}

function TimerListener () {
    arguments.callee.listener.handleTimer ();
};

TimerListener.listener = {
    typing   : 50,
    retyping : 50000,
    timerId  : null,
    message  : '',
    index    : 0,
    parent   : TimerListener,
//  target   : document.getElementById ('message'),
    targetId : 'message',
    handleTimer : function () {
        var data, timeout;
        
        if (this.index < this.message.length - 1) {
            data = this.message.substring (0, this.index).concat ('_');
            timeout = this.typing;
            this.index = this.index + 1;
        } else {
            data = this.message;
            timeout = this.retyping;
            this.index = 0;
        }
        
        this.output (data);
        this.timerId = setTimeout (this.parent, timeout);
    },
    start : function (data) {
        this.message = data;
        this.index = 0;
        this.parent ();
    },
    stop : function () {
        clearTimeout (this.timerId);
        this.output ('');
    },
    output : function (data) {
//      this.target.firstChild.data = data;
        var target = document.getElementById ('message');
        target.innerHTML = data;
    }
};
です。
それでは、失礼しました。

一覧へ戻る