将页面过渡淡入锚点

Fade page transition to an anchor

我正在尝试平滑过渡到页面中的锚点。 objective 是当您单击指向锚点的 link 时,页面淡出(滚动)并随着调用的锚点本身淡入。

我有这个标记,它淡出 in/out 正确,URL 更改为被调用的锚点,但它不会滚动到被调用的元素

$(document).ready(function() {
  $("a.transition").click(function(event) {
    event.preventDefault();
    linkLocation = this.href;
    $(".container").fadeOut(500, redirectPage);

  });

  function redirectPage() {
    window.location = linkLocation;
    $(".container").fadeIn(500);
  }
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<div class="container">
  <div id="A">This is A <a href="#B" class="transition">Go to B</a>
  </div>

  ...some large text...

  <div id="B" style="margin-top: 3000px;">This is B <a href="#A" class="transition">Go to A</a>
  </div>
</div>

部分问题是您没有将 linkLocation 变量传递给 redirectPage 函数。显然,如果 linkLocation 是一个全局变量,您可以在函数回调内部访问它,但我不确定这是否是您想要的。您可以使用 .bind() 方法将其直接传递给函数:redirectPage.bind(this, this.href).

第二个问题是您无法滚动到隐藏容器中的元素。滚动到 fadeIn 回调中的元素,或者在 fadeIn 动画开始后滚动到它:

$("a.transition").click(function(event) {
  event.preventDefault();
  $(".container").fadeOut(500, redirectPage.bind(this, this.href));
});

function redirectPage(link) {
  $(".container").fadeIn(500);
  setTimeout(function () {
    window.location = link;
  }, 0);
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<div class="container">
  <div id="A">This is A <a href="#B" class="transition">Go to B</a>
  </div>

  ...some large text...

  <div id="B" style="margin-top: 3000px;">This is B <a href="#A" class="transition">Go to A</a>
  </div>
</div>

这是使用 CSS 和原版 javascript 的替代方法:

var initialiseFadePageLink = [];

function fadePage(i) {
var container = document.getElementsByClassName('container')[0];
var transitionAnchors = document.getElementsByClassName('transition');
var current = '#' + transitionAnchors[i].parentNode.getAttribute('id');
var destination = transitionAnchors[i].getAttribute('href');

transitionAnchors[i].setAttribute('href', current);
container.classList.add('fadeout');

setTimeout(function(){
window.location.hash = destination;
container.classList.remove('fadeout');
transitionAnchors[i].setAttribute('href', destination);
}, 1000);

}


function fadePageLinks(i) {
return function(){
var transitionAnchors = document.getElementsByClassName('transition');
transitionAnchors[i].addEventListener('click',function(){fadePage(i);},false);
};
}


function initialiseFadePageLinks() {
var transitionAnchors = document.getElementsByClassName('transition');
for (var i = 0; i < transitionAnchors.length; i++) {
initialiseFadePageLink[i] = fadePageLinks(i);
initialiseFadePageLink[i]();
}
}

window.addEventListener('load',initialiseFadePageLinks,false);
#B {
margin-top: 3000px;
}

.container {
opacity: 1;
transition: opacity 0.5s ease-in-out;
-moz-transition: opacity 0.5s ease-in-out;
-webkit-transition: opacity 0.5s ease-in-out;
}

.container.fadeout {
opacity: 0;
}
<div class="container">
<div id="A">This is A <a href="#B" class="transition">Go to B</a></div>
...some large text...
<div id="B">This is B <a href="#A" class="transition">Go to A</a></div>
</div>