一部のページ内でjQueryのページスクロールを使用しようとしていたため、スムーズなページスクロールを正常に行うことができました。私が今抱えている唯一の問題は、別のページからそれをしようとするときです。つまり、ページ内のリンクをクリックすると、新しいページが読み込まれ、特定のdiv要素までスクロールするはずです。
ページ内のスクロールに使用したコードは次のとおりです。
var jump=function(e)
{
//prevent the "normal" behaviour which would be a "hard" jump
e.preventDefault();
//Get the target
var target = $(this).attr("href");
//perform animated scrolling
$('html,body').animate(
{
//get top-position of target-element and set it as scroll target
scrollTop: $(target).offset().top
//scrolldelay: 2 seconds
},2000,function()
{
//attach the hash (#jumptarget) to the pageurl
location.hash = target;
});
}
$(document).ready(function()
{
$('a[href*=#]').bind("click", jump);
return false;
});
アイデアが明確であることを願っています。
ありがとう
非常に重要な注意:上記のコードは同じページ内でうまく機能しますが、私が望んでいるのは、あるページからリンクをクリックして別のページに移動し、ターゲットまでスクロールすることです。私はそれが今明確であることを望みます。ありがとう
基本的にこれを行う必要があります:
href="other_page.html#section"
_)ready
ハンドラーで、通常ハッシュによって指示されたハードジャンプスクロールをクリアし、できるだけ早くページをトップにスクロールしてjump()
を呼び出します。これは非同期で行う必要があります。jump()
で、イベントが指定されていない場合、_location.hash
_をターゲットにしますhtml,body
_を非表示にし、スクロールしてゼロに戻すと表示し直しますこれは上記を追加したコードです:
_var jump=function(e)
{
if (e){
e.preventDefault();
var target = $(this).attr("href");
}else{
var target = location.hash;
}
$('html,body').animate(
{
scrollTop: $(target).offset().top
},2000,function()
{
location.hash = target;
});
}
$('html, body').hide();
$(document).ready(function()
{
$('a[href^=#]').bind("click", jump);
if (location.hash){
setTimeout(function(){
$('html, body').scrollTop(0).show();
jump();
}, 0);
}else{
$('html, body').show();
}
});
_
Chrome/Safari、Firefox、Operaでの動作確認済み。 Dunno about IEしかし。
リンクにハッシュを入れます:
<a href="otherpage.html#elementID">Jump</a>
他のページでは、次のことができます。
$('html,body').animate({
scrollTop: $(window.location.hash).offset().top
});
他のページでは、スクロールするelementID
に設定されたidを持つ要素が必要です。もちろん、名前を変更できます。
PetrとSarfrazの回答を組み合わせて、私は次のことに到達しました。
Page1.htmlで:
<a href="page2.html#elementID">Jump</a>
Page2.htmlで:
<script type="text/javascript">
$(document).ready(function() {
$('html, body').hide();
if (window.location.hash) {
setTimeout(function() {
$('html, body').scrollTop(0).show();
$('html, body').animate({
scrollTop: $(window.location.hash).offset().top
}, 1000)
}, 0);
}
else {
$('html, body').show();
}
});
</script>
ScrollToプラグインの使用をお勧めします
http://demos.flesler.com/jquery/scrollTo/
Jquery cssセレクターによってscrolltoを設定できます。
_$('html,body').scrollTo( $(target), 800 );
_
私はこのプラグインとそのメソッドの精度に大きな幸運がありました。.offset()
や.position()
を使用するような同じ効果を達成する他の方法は、過去。あなたがそのような方法を使用できないと言っているのではなく、私はそれをクロスブラウザで行う方法があると確信しています、私はscrollToがより信頼できるとちょうど見つけました。
これを行うことができる再利用可能なプラグインを作成しました...プラグイン自体の外部のイベントへのバインディングを残しました。
_jQuery(function ($) {
/**
* This small plugin will scrollTo a target, smoothly
*
* First argument = time to scroll to the target
* Second argument = set the hash in the current url yes or no
*/
$.fn.smoothScroll = function(t, setHash) {
// Set time to t variable to if undefined 500 for 500ms transition
t = t || 500;
setHash = (typeof setHash == 'undefined') ? true : setHash;
// Return this as a proper jQuery plugin should
return this.each(function() {
$('html, body').animate({
scrollTop: $(this).offset().top
}, t);
// Lets set the hash to the current ID since if an event was prevented this doesn't get done
if (this.id && setHash) {
window.location.hash = this.id;
}
});
};
});
_
次に、これをオンロードしてハッシュをチェックし、ハッシュがある場合はそれをjQueryのセレクターとして直接使用しようとします。今はこれを簡単にテストすることはできませんでしたが、少し前に実稼働サイト用に同様のものを作成しました。これがすぐに機能しない場合はお知らせください。そこで得られたソリューションを調べます。
(スクリプトはonloadセクション内にある必要があります)
_if (window.location.hash) {
window.scrollTo(0,0);
$(window.location.hash).smoothScroll();
}
_
次に、href属性にハッシュのみを含むアンカーのonclickにプラグインをバインドします。
(スクリプトはonloadセクション内にある必要があります)
_$('a[href^="#"]').click(function(e) {
e.preventDefault();
$($(this).attr('href')).smoothScroll();
});
_
マッチ自体が失敗した場合、jQueryは何もしないので、ページ上のターゲットが見つからない場合のニースフォールバックがあります。
更新
ハッシュのみがある場合に上部にスクロールする代替のonclickハンドラー:
_$('a[href^="#"]').click(function(e) {
e.preventDefault();
var href = $(this).attr('href');
// In this case we have only a hash, so maybe we want to scroll to the top of the page?
if(href.length === 1) { href = 'body' }
$(href).smoothScroll();
});
_
また、ページ内のスクロールを示す単純なjsfiddleもあります。onloadの設定は少し難しいです...
http://jsfiddle.net/sg3s/bZnWN/
更新2
そのため、ウィンドウが要素onloadに既にスクロールしていると問題が発生する可能性があります。これにより、以下が修正されます。window.scrollTo(0,0);
これは、ページを左上にスクロールするだけです。上記のコードスニペットに追加しました。
function scroll_down(){
$.noConflict();
jQuery(document).ready(function($) {
$('html, body').animate({
scrollTop : $("#bottom").offset().top
}, 1);
});
return false;
}
ここで、「bottom」は、スクロール先のdivタグIDです。アニメーション効果を変更するには、時間を「1」から別の値に変更できます
クリックしたアンカーがページに含まれているかどうかを検出し、そうでない場合は通常のページに移動し、そうでない場合は特定のセクションにスクロールするものを作成しました。
$('a[href*=\\#]').on('click',function(e) {
var target = this.hash;
var $target = $(target);
console.log(targetname);
var targetname = target.slice(1, target.length);
if(document.getElementById(targetname) != null) {
e.preventDefault();
}
$('html, body').stop().animate({
'scrollTop': $target.offset().top-120 //or the height of your fixed navigation
}, 900, 'swing', function () {
window.location.hash = target;
});
});