탭 전환 등을 통해 내용 내용의 높이를 변경합니다. 디스플레이:none로 전환할 때 이 전환된 내용 아래의 위치에서 스크롤 위치를 유지합니다.
이해하기 어렵지만 이 위쪽은 라벨이고 아래쪽은 내용이다.
그리고 이 탭에는 어떤 것이든 내용을 바꿀 수 있는 내용이 위아래로 있습니다.
아래쪽 화살표
그러니까
이런 느낌.
그럼 문제는
/첫 번째 높이만 적어
·
display: block
및 display:none
로 교환두 개.
높이가 변하지 않으면 디스플레이로 전환해도 문제없습니다.
또는 고도의 변화가 있으면display가 아니라opacity와visibility로 제거하고 내용 자체가 가장 큰 일반적인 배치를 제외하고 absolute로 중첩하면 된다.그러나 이렇게 되면 아래의 라벨부터 내용까지 이윤이 흐트러진다.
그렇다면 디스플레이에서 내용의 존재에 따라 이윤을 통일할 수밖에 없다.
그래서 이 방침만 있으면 문제가 있다.
우선 위의 탭으로 전환하면 스크롤 위치가 고정되어도 문제가 없습니다.
하지만 아래 탭으로 전환하면 문제가 있습니다.
위의 그림에서 보듯이 첫 번째 레이블에 표시되는 컨텐트의 높이가 작고 두 번째 레이블에 표시되는 컨텐트의 높이가 크면 첫 번째 → 두 번째 레이블을 전환할 때 동일한 스크롤 위치의 값이면 두 번째 레이블에서 컨텐트의 가운데 왼쪽이 됩니다.
(참고로 크롬의 느낌이 잘 보완되어 아래 탭을 눌렀을 때의 외관으로 바뀌었다. 실제로 크롬도 위치에서 벗어난다...?)
그렇다면 이럴 때의 대책 방법.
var $tabItems = $(".voice__tabItem");
$tabItems.on("click", function() {
// 現時点で選ばれている箱の高さ
var beforeHeight = $(".voice__box.is-selected").height();
// ここからタブクリックでコンテンツ入れ替える記述
// タブをクリックしたらその何番目のタブか
var $tab = $(this).parent();
var $item = $tab.find(".voice__tabItem");
var index = $item.index($(this));
// タブをクリックしたらそのタブにクラス付与、上のタブも下のタブも
$tabItems.removeClass("is-selected");
$(".voice__tab--top .voice__tabItem")
.eq(index)
.addClass("is-selected");
$(".voice__tab--bottom .voice__tabItem")
.eq(index)
.addClass("is-selected");
// タブの順番と同じボックスにクラス付与
$(".voice__box").removeClass("is-selected");
$(".voice__box")
.eq(index)
.addClass("is-selected");
// ここまでタブクリックでコンテンツ入れ替える記述
// タブ押した後に選ばれた箱の高さ
var afterHeight = $(".voice__box.is-selected").height();
// 前に選ばれていた箱と選ばれた箱の高さの差
var changeHeight = afterHeight - beforeHeight;
// Safariでタブクリック時にスクロール位置がずれてしまう(macOSとiOSどちらも)
// Windowsで見たらIEもEdgeもだめでした
// 箱の高さが変わるが、その際にwindowの一番上からのスクロールトップの値がずれてしまうため。
// おそらくChromeは良い感じに補完してくれている
// Chrome以外の時を判定する記述
if (!_browser.chrome) { // ←ここはなんかChromeの判定をうまく書いてください
// クリックしたタブの親がクラスにvoice__tab--bottomを持っていたら
// 上のタブはvoice__tab--topとクラスふってる、
// 上のタブならスクロール位置補完してあげる必要がないので
if (
$(this)
.parent()
.hasClass("voice__tab--bottom")
) {
// タブクリックして箱が新しくなった時のスクロール位置を保存
var scrtop = $(window).scrollTop();
// 上記の上記のスクロール位置から箱の変化分を足す、かかる時間は0秒
$("html,body").animate(
{ scrollTop: scrtop + changeHeight },
{ duration: 0 }
);
}
}
});
우선 탭을 눌러 내용을 바꾸는 기술이 적혀 있다.그런 다음 를 클릭하여 컨텐트를 교체하기 전과 후에 각 컨텐트의 높이를 가져옵니다.
beforeHeight
및 AfterHeight
앞뒤 값의 차이를 취하다.changeHeight
그런 다음 컨텐트를 교체한 후 스크롤 위치를 찾습니다.scrTop
jQuery의 animate에서.내용 교체 후 스크롤 위치 scrTop+내용 교체 전후 높이 차이
changeHeight
를 추가하여 이동합니다.예:
위 그림에서 첫 번째 레이블의 컨텐트 높이는 1200이고 두 번째 레이블의 컨텐트 높이는 2000입니다.
beforeHeight
1200, afterHeight
2000.changeHeight
는 800입니다.첫 번째 레이블을 선택한 상태에서 아래쪽 레이블의 두 번째 레이블을 누릅니다.
아래 탭을 누르기 전에 스크롤 위치를 3000으로 설정하면 움직이지 않기 때문에 두 번째 탭의 내용으로 바꾸더라도 스크롤 위치는 3000입니다.
scrTop
는 3000입니다.그렇다면 상기 그림에서 보듯이 스크롤 위치가 3000을 유지하면 두 번째 내용을 표시한 상태에서 아래 탭을 클릭할 수 있는 위치에 있지 않고 내용 중의 위치에 스크롤 위치가 3000이다.
따라서 똑같아 보이기 위해서는 이 벗어난 높이change Height를 엇갈려야 한다.그래서 3000+800=3800.
첫 번째 컨텐트를 표시한 상태에서 아래 탭을 누른 화면의 모양과 동일한 모양 (이번에는 3000) 을 유지하고 두 번째 컨텐트로 교체하기 위해 순간적으로 3800 으로 스크롤 위치를 설정해야 합니다.
Reference
이 문제에 관하여(탭 전환 등을 통해 내용 내용의 높이를 변경합니다. 디스플레이:none로 전환할 때 이 전환된 내용 아래의 위치에서 스크롤 위치를 유지합니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/XxGodmoonxX/items/769b5e9771818e3eb8cb텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)