jQueryページ内リンクの誤差を解決する方法

このQ&Aのポイント
  • フェード効果を追加したページ内リンクをクリックすると、上に300px程ずれてしまうエラーが発生しています。
  • この問題を解決するためには、jQueryのコードを修正する必要があります。
  • まず、jQueryのコードの一部を変更して、リンク先の要素の表示を切り替える方法を修正します。そして、スクロール位置の調整を行うために、アニメーション終了時に`window.location.hash`を使ってスクロール位置を保持し、再度スクロールさせることで正しい位置に表示させます。
回答を見る
  • ベストアンサー

jQueryでページ内リンクに誤差が出る。

フェード効果を追加したページ内リンクをクリックすると、上に300px程ずれてしまうエラーがでてしまいます。 これを解決するにはどうすればいいでしょうか? http://code.jquery.com/jquery-1.6.2.jsを使用 * javascript ************* (function($){ var speed = 300,   active = "actve",   n_active = ":not(." + active + ")",   getTarget = function(elm){    var h, r = $("");    elm.each(function(){     if(h=$(this).attr("href").match(/#.+$/)) r = r.add(h[0]);    });    return r;   }; $.fn.extend({  changer : function(){   var t = $(this).children("a");   getTarget(t.filter(n_active)).hide();   t.click(function(){    var elm, func, t = $(this);    getTarget(t.parent().children("a")).queue([]).stop(1,1);    func = function(){     getTarget(t.addClass(active)).fadeIn(speed);    };    elm = getTarget(t.siblings("."+active).removeClass(active));    if(elm.length) elm.fadeOut(speed, func); else func();    return false;   });  } }); })(jQuery); $(function(){  $("#group1").changer(); }); * html ************* <div style="padding:500px 0 500px;">余白用</div> <div id="group1"> <a href="#text1" class="actve">1を表示</a> <a href="#text2">2を表示</a> <a href="#text3">3を表示</a> </div> <hr> <div id="text1"><p>1111111111111111111111</p><p>1111111111111111111111</p><p>1111111111111111111111</p><p>1111111111111111111111</p><p>1111111111111111111111</p></div> <div id="text2"><p>テストテストテストテストテストテストテストテスト</p><p>テストテストテストテストテストテストテストテスト</p><p>テストテストテストテストテストテストテストテスト</p><p>テストテストテストテストテストテストテストテスト</p></div> <div id="text3"><p>333333</p><p>333333</p><p>333333</p><p>333333</p><p>333333</p><p>333333</p><p>333333</p><p>333333</p><p>333333</p><p>333333</p><p>333333</p><p>333333</p><p>333333</p><p>333333</p></div> 上記の内容で、リンクをクリックすると切り替わったと同時に、上に戻ってしまいます。 見たところ、ランダムではなく、一定の箇所まで戻るといった感じでした。 これを直すにはどうすればいいでしょうか?

  • egtomo
  • お礼率59% (101/170)

質問者が選んだベストアンサー

  • ベストアンサー
  • fujillin
  • ベストアンサー率61% (1594/2576)
回答No.1

どうやら、私の回答だったような… 最初は、ページ内リンクをキャンセルし忘れてブラウザがスクロールしているのかと思いましたが、ちゃんとキャンセルはされているみたいですね。 タブのコンテンツの後ろに、他のコンテンツがあればご指摘のようなスクロールは起こりません。 例えば、ご提示のソースの後ろに  <div style="height:500px;">続き</div> のようなものがあれば、ご指摘のスクロールはおこらないと思います。 原因は、fadeOutしてからfadeInしているので、fadeOutした時に瞬間的にタブコンテンツ表示部分の高さが0になるため、ブラウザはそこをページの最後と判断してしまい、ご提示の例でいえば、<hr>の部分を画面の一番下にくるようにスクロールしてしまうためと思われます。 (その後で、表示部分が追加されても自動的にスクロールはしません) >これを直すにはどうすればいいでしょうか? 方法はいろいろあるかと思いますが、 1)現状では、タブコンテンツの表示部分の高さが可変になっていますが、   固定高さにして表示領域を確保しておく。   (ラッパーのdivの高さを確保しておくなど) 2)タブコンテンツの表示部分をposition:absoluteなどにしておいて、重ねて   表示する方式にし、activeな部分が上にくるようにしてfadeInしながら   それまでの表示要素をfadeOutする。   (現状に近い動作にするなら、fadeInをすぐに始めずにfadeOut終了に    少し前にするとか…) 3)ラッパーのdivの高さを、タブ表示の内容(の高さ)に応じて、明示的に確保  するような処理を追加し、fadeOut後fadeInを行なう(現在の順序)  (高さの変更もアニメーションで行なうとか…) 4)最初に表示していた部分(スクロールの量を)覚えておいて、最後に、同じ位置  を表示するように全体をスクロールする処理を追加する。 などなど。 とりあえず、思いつくのはこんなところでしょうか。

関連するQ&A

  • html5+jqueryでリンクが反映されない

    html5+css3でスマートフォン向けサイトをコーディングしています。 タブナビゲーションを作りたくて、ちょうど良いサンプルを見つけて使わせていただきました。 http://designdrill.jp/wordpress/?p=5082 表示は思った通りに出来たのですが、テキスト部分にリンクを付けてもソース上では <div id="txt_1"><a href="http://www.google.co.jp/">googleの説明文</a></div> このように問題無く表記されているのですが、クリックしても何も反応しません。 動作確認はPCでしています。 ソースは以下の通りです。 ※オリジナルの方はjquery-1.7.min.jsでしたが、1.8.2使用です。 html部分------------------- <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script> <script type="text/javascript"> $(function(){ $("#textArea>div").hide(); var select_id = 1; $("#btn_" + select_id).addClass("selected"); $("#txt_" + select_id).show(); $('#tab').on("click touchstart", "li:not(.selected)",function() { var click_id = this.id.split("_")[1]; var myColor = $("#btn_" + click_id).css("background-color"); $("#textArea").css("background-color", myColor); //alert(myColor) $("#btn_" + select_id).removeClass("selected"); $("#txt_" + select_id).hide(); $("#btn_" + click_id).addClass("selected"); $("#txt_" + click_id).show(); select_id = click_id; }) }) </script> </head> <body> <section id="tab"> <ul> <li id="btn_1" class="yellow">google</li> <li id="btn_2" class="pink">yahoo</li> <li id="btn_3" class="blue">apple</li> </ul> <div id="textArea"> <div id="txt_1"><a href="http://www.google.co.jp/">googleの説明文</a></div> <div id="txt_2">yahooの説明文</div> <div id="txt_3">appleの説明文</div> </div> </section> css部分------------------- #tab { -webkit-tap-highlight-color: rgba(0,0,0,0); /* デフォルトのタップハイライトを停止 */ } #tab ul { margin: 10px; } #tab ul li { float: left; padding:5px 15px 5px 15px; border-top: 1px #ddd solid; border-left: 1px #ddd solid; border-right: 1px #ddd solid; -webkit-border-top-left-radius: 8px; -webkit-border-top-right-radius: 8px; color: #999; height:15px; line-height:15px; margin: 5px 0px 0px 5px; } #tab ul li.selected { color: #000; height:20px; line-height:20px; margin: 0px 0px 0px 5px; } #textArea{ position:relative; top:-1px; z-index:-1; clear:left; background-color:#ffd; margin:0px 10px 10px 10px; padding:10px; height:100px; border: 1px #ddd solid; -webkit-border-radius: 5px; } .yellow{ background-color:#ffd; } .pink{ background-color:#fdf; } .blue{ background-color:#dff; } 見た目とタブをクリックして同一ページ内で遷移する動きは希望通りですが、リンクが反映されない点だけが難点です。 (テキスト内のリンクは内容上必須です) 今現在、完全に煮詰まっていますのでヒントだけでもいただけたらと思い投稿しました。 よろしくお願い致します。

    • ベストアンサー
    • HTML
  • jQueryについて

    jQueryのクロスフェードとlightboxを同一ページに設定しています。 よく分かっていないのに、コピペで作っていますが、 クロスフェードをするとlightboxが動作しません。 設定をどう変更したら出来るようになりますか? どなたか助けてください。 <link rel="stylesheet" type="text/css" href="cssjs/jquery.lightbox-0.5.css" media="screen" /> <script type="text/javascript" src="cssjs/scriptaculous.js?load=effects,builder"></script> <script type="text/javascript" src="cssjs/jquery.lightbox-0.5.js"></script> <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.5.2/jquery.min.js"></script> <script type="text/javascript" src="cssjs/target.js"></script> <script type="text/javascript"> $(function(){ var setImg = '#rightimg'; var fadeSpeed = 1500; var switchDelay = 5000; $(setImg).children('img').css({opacity:'0'}); $(setImg + ' img:first').stop().animate({opacity:'1',zIndex:'20'},fadeSpeed); setInterval(function(){ $(setImg + ' :first-child').animate({opacity:'0'},fadeSpeed).next('img').animate({opacity:'1'},fadeSpeed).end().appendTo(setImg); },switchDelay); }); </script> <script type="text/javascript"> $(function() { $('#gallery a').lightBox(); }); </script> <script type="text/javascript"> $(function() { $('#gallery a').lightBox(); }); </script> <title>あかさたな</title> </head> <body> <div id="outer"><!--outer START--> <div id="container"> <div id="header"><!--header START--> <h1>いろはにほへと</h1> </div><!--header END--> <div id="menu"><!--menu START--> <ul id="bar"> <li><a href="index.html">HOME</a></li> <li><a href="ka.html">ABC</a></li> <li><a href="history.html">DEF</a></li> <li><a href="kaga.html">GHJ</a></li> <li><a href="admission.html">KLM</a></li> <li id="sen"><a href="link.html">りんく</a></li> </ul> </div><!--menu END--> <div class="don"></div> <div id="eyecatch"> <div id="leftimg"></div> <div id="rightimg"> <img src="images/1.jpg" width="300" height="300" alt="" /> <img src="images/2.jpg" width="300" height="300" alt="" /> <img src="images/3.jpg" width="300" height="300" alt="" /> <img src="images/4.jpg" width="300" height="300" alt="" /> </div> </div> <div id="contents"><!--contents START--> <h2>最新ニュース</h2> <h3>あかさたな</h3> <div id="gallery"> <ul> <li><a href="top/3.jpg" title="かきくけこ"><img src="top/3s.jpg" width="193" height="272" alt="かきくけこ" /></a></li> <li><a href="top/1.jpg" title="あいうえお"><img src="top/1s.jpg" width="182" height="272" alt="あいうえお" /></a></li> <li><a href="top/2.jpg" title="あいうえお"><img src="top/2s.jpg" width="182" height="272" alt="あいうえお" /></a></li> </ul> </div>

  • jQueryタブメニュー内、パネル間のリンク方法。

    javascript勉強中です。 立て続けに質問してしまい、ご迷惑おかけしておりますが協力していただければ幸いです。 下記のjQueryタブメニューですが、パネル内から他のパネルへのリンクを実装するには、どのように書いたらいいか教えていただけないでしょうか。例としてtest1のリンクからtab2へ行くように、です。 (下記実装されている機能は、タブメニューと他のページからのタブへのダイレクトリンクです。) <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script> <script type="text/javascript"> jQuery(function($){  $(".area").hide();  var tabs = $(".tab01 li");  tabs.click(function(){   var i = tabs.removeClass("active").index(this);   tabs.eq(i).addClass("active");   $(".content .area").hide().eq(i).fadeIn(400);   return false;  });  var hash = window.location.hash.match(/#tab(\d+)/);  hash = hash?(tabs.eq(hash[1]-1).length?hash[1]-1:0):0;  tabs.eq(hash).click(); }); </script> </head> <body> <div id="tabs"> <ul class="tab01"> <li><a href="#">1</a></li> <li><a href="#">2</a></li> <li><a href="#">3</a></li> </ul> <div class="content"> <div class="area" id="tab1"><a href="#tab2">test1</a></div> <div class="area" id="tab2">test2</div> <div class="area" id="tab3">test3</div> </div> </div> </body> </html> 何卒宜しくお願い申し上げます。

  • jQueryで追加した要素がマウスホバーに反応しない

    jQueryを使って、ボタンを押すと要素を追加しています。 後から追加された要素はマウスホバーなどが有効にならないのですが、 対象方法などあるでしょうか。 下記のようなソースで質問の状態になります。 よろしくお願いします。 <html> <head> <title>test</title> <script type="text/javascript" src="system/jquery-1.3.2.min.js"></script> <script type="text/javascript"> <!-- jQuery(document).ready(function($){ jQuery(".edit").hover( function () { jQuery(this).css("background","yellow"); }, function () { jQuery(this).css("background","none"); } ); jQuery(".insert").click(function () { var html = "<div class='edit'><p>add-text</p></div>"; jQuery("#sortable .edit:first").before(html); }); }); // --> </script> </head> <body> <div><INPUT class="insert" type="button" value=INSERT></DIV> <div id="sortable" style="width:200px;"> <div class="edit"> <p>text1</p> </div> <div class="edit"> <p>text2</p> </div> <div class="edit"> <p>text3</p> </div> </div><!-- id="sortable" --> </body> </html>

  • jqueryの tabを使用して外部リンクをしたい

    jqueryの tabを使用して外部リンクをしたい このサイトの下の方の マウスオーバーで切り替えを使用しているのですが タブをマウスオーバーで切り替えつつ、 タブ部分をクリックしたら外部にリンクさせるようするには どうしたらいいでしょうか? http://5am.jp/jquery/jquery_ui_tabs/ 以下タグです。 初心者で大変申し訳ありませんが、ご教授ください。 とても困っています。 よろしくお願いいたします。 ************************************************************* <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>無題ドキュメント</title> <head> <!-- jQuery --> <script type="text/javascript" src="jquery-1.4.2.js"></script> <script type="text/javascript" src="/jquery-ui-1.8.12.custom.min.js"></script> </head> <body> <script type="text/javascript"> <!-- jQuery( function() { jQuery( '#jquery-ui-tabs' ) . tabs( { event: "mouseover" } ); } ); // --> </script> <div id="jquery-ui-tabs"> <ul> <li><a href="#jquery-ui-tabs-1">タブ1</a></li> <li><a href="#jquery-ui-tabs-2">タブ2</a></li> <li><a href="#jquery-ui-tabs-3">タブ2</a></li> </ul> <div id="tab_area"> <div id="jquery-ui-tabs-1"> <ul> <li>タブ1内容</li> </ul> </div> <div id="jquery-ui-tabs-2"> <ul> <li>タブ2内容</li> </ul> </div> <div id="jquery-ui-tabs-3"> <ul> <li>タブ3内容</li> </ul> </div> <!--/#tab_area--></div> <!--/#jquery-ui-tabs--></div> </body> </html>

  • jquery1.4で画像とリンクの切り替えを行おうとしています。

    jquery1.4で画像とリンクの切り替えを行おうとしています。 ひとまず動き的にはうまくは行っているのですが、切り替え対象の複数の画像をfloat:left;等で 横並びにすると、切り替えるたい画像をクリック後に規定の場所に画面が移動してしまいます。 対処法があれば教えていただけますでしょうか? 【javascript】 $(document).ready( function() { $(".thumbnail p").click( function() { var changeSrc = this.src; var changeHref = this.href; $("#target img").fadeOut("fast", function() { $(this).attr("src", changeSrc); $(this).fadeIn(); } ); $("#target a").attr("href", changeHref); }); $(".thumbnail2 img").click( function() { var changeSrc = this.src; $("#target2").fadeOut( "slow", function() { $(this).attr("src", changeSrc); $(this).fadeIn(); } ); }); $(".thumbnail3 img").click( function() { var changeSrc = this.src; $("#target3").slideUp( "slow", function() { $(this).attr("src", changeSrc); $(this).slideDown(); } ); }); }); </script> 【HTML】 <div> <p id="target"><a href="./main.cgi?mode=details2&sid=1&gid=1S000046"><img src="./g_images/IMG_1457.jpg" width="240" height="320" alt="ブランドカテゴリー" /></a></p> </div> <div class="thumbnail"> <p href="./main.cgi?mode=details2&sid=1&gid=1S000043" src="./g_images/IMG_1457.jpg" class="item"> <img src="./g_images/IMG_1457.jpg" width="90" height="150" alt="ブランドカテゴリー" /> <br /><a href="./main.cgi?mode=details2&sid=1&gid=1S000043">詳細</a></p> <p href="./main.cgi?mode=details2&sid=1&gid=1S000047" src="./g_images/IMG_1469.jpg" class="item"> <img src="./g_images/IMG_1469.jpg" width="90" height="150" alt="ブランドカテゴリー" /> <br /><a href="./main.cgi?mode=details2&sid=1&gid=1S000047">詳細</a></p> </div> 【css】 .thumbnail { height:200px; text-align:center; } .item { float:left; padding-left:10px; margin-left:10px; }

  • Jquery 親要素で順番入れ替え

    Jquery 親要素で順番入れ替え a要素を取得して、その親の親(<div id="shop">)の順番を入れ替えしたいのです。 【HTML】 <div id="shop"> <p><a href="http://www.aaaa.jp">お店の名前</a></p> <p>あああああああああ</p> </div> <div id="shop"> <p><a href="http://www.bbbb.jp">お店の名前</a></p> <p>あああああああああ</p> </div> <div id="shop"> <p><a href="http://www.cccc.jp">お店の名前</a></p> <p>あああああああああ</p> </div> 【Jquery】 $(function(){ $('a[href*="http://www.aaaa.jp"]').parent().parent(); $('a[href*="http://www.bbbb.jp"]').parent().parent(); .... }); これで『http://www.aaaa.jp』のリンクを持つdivと『http://www.bbbb.jp』のリンクを持つdivとを指定できるわけですが、 ページを表示した時に順番を入れ替えするにはどうしたらよいのでしょうか?例えば、 【実行結果HTML】 <div id="shop"> <p><a href="http://www.cccc.jp">お店の名前</a></p> <p>あああああああああ</p> </div> <div id="shop"> <p><a href="http://www.aaaa.jp">お店の名前</a></p> <p>あああああああああ</p> </div> <div id="shop"> <p><a href="http://www.bbbb.jp">お店の名前</a></p> <p>あああああああああ</p> </div> HTMLを直接触って変更できたら楽なんですけどね~。PHPで吐き出されているのでムリなんです。ソースぐちゃぐちゃで仕様書もない始末なので、Jqueryで入れ替えできないものかと・・・

  • jQueryタブメニュー内へのリンク方法。

    javascript勉強中です。 調べたり試してみたりしたのですが、なかなか上手くいかず質問させていただきました。 下記のjQueryを使ったタブメニューなのですが、他のページからタブ内(tab1~tab3)へリンクさせるjavascriptの書き方や方法を教えていただけないでしょうか。 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script> <script type="text/javascript"> $(function($) { $(".area").hide(); $(".tab_content").hide(); }); jQuery.event.add(window,"load",function(){ $(".tab01 li:first-child").addClass("active"); $(".area:first-child").show(); $(".tab01 li").each(function(i){ $(this).click(function(){ $(".content .area").hide(); $(".content .area").eq(i).fadeIn(400); if($(this).hasClass("active")){ $(".tab01 li").removeClass("active");} else {$(".tab01 li").removeClass("active"); $(this).addClass("active"); } }); }); }); </script> </head> <body> <div> <ul class="tab01"> <li><a href="#">1</a></li> <li><a href="#">2</a></li> <li><a href="#">3</a></li> </ul> <div class="content"> <div class="area" id="tab1">tab1</div> <div class="area" id="tab2">tab2</div> <div class="area" id="tab3">tab3</div> </div> </div> </body> </html> どうぞ宜しくお願い致します。

  • jquery uiが動かない

    jquery uiが動きません。 何度も見直し、プログラムを書いてもどこがいけないかわかりません。 教えていただけたら幸いです。お願いいたします <html> <head> <link rel="stylesheet" href="http://code.jquery.com/ui/1.9.2/themes/base/jquery-ui.css"> <script type="text/javascript" src="http://code.jquery.com/jquery-1.8.3.js"></script> <script type="text/javascript" src="http://code.jquery.com/ui/1.9.2/jquery-ui.js"></script> </head> <body> <div id="box">box</div> <style> #box{ width:100px; height:100px; background:red; } </style> <script> $(function(){ $("#box").draggable( axis: 'x'; ); }); </script> </body> </html>

  • jquery ulのtab切り替えについて

    昨日からjqueryを使ってみたのですが、どうしてもうまく表現できません。 書籍のwebcreators6月号を参考にしてほぼそのままのソースを打ち込んだのですが、CSSとJavascriptが機能していません。 ソースは <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=shift_jis" /> <link href="../js/jquery.ui/themes/flora/flora.all.css" rel="stylesheet" type="text/css" title="Flora(Default)" /> <script language="JavaScript" type="text/javascript" src="../js/jquery.ui/ui/ui.tabs.js"></script> <script language="JavaScript" type="text/javascript" src="../js/jquery.ui/jquery-1.2.6.js"></script> <script type"text/javascript"> $(window) .bind ('load',function(){ $('#container-1>ul').tabs(); }); </script> <title>無題ドキュメント</title> </head> <body> <div id="container-1" > <ul> <li><a href="#fragment-1"><span>ホワイト</span></a> </li> <li><a href="#fragment-2"><span>ブラック</span></a></li> </ul> <div id="fragment-1"> <p>ページ1</p> <p>ダミー</p> </div> <div id="fragment-2" style="margin-top:150px;"> <p>ページ2</p> <p>ダミー</p> </div> </div> </body> </html> となっています。 javascriptについてはあまり知識がないので、どの部分が悪いのか教えて頂けないでしょうか? 皆様お忙しい中ご迷惑をおかけしますが、よろしくお願いいたします。

専門家に質問してみよう