(特に最初の荷積みで)反応でアンカー名に対するCash - Hash断片をロードする方法
14452 ワード
どのようにURLのハッシュを実装し、最初の読み込みでの反応の名前をアンカーにスクロール?
URLのハッシュフラグメント(すなわち、)www.mypage.com/article#fragment ) アンカー名には
によるとw3.org , それは2つの規則、ユニークさを観察しなければなりません:文書内でユニークでなければならないと言われて、ストリングマッチング:断片識別子とアンカー名の比較は正確な(大文字と小文字を区別する)マッチによってされなければなりません.
The
この例では、H 2要素にアンカーを配置するID属性の使用を示します.
この動作はいくつかの理由で起こります.理由は、ページが最初のDOMをロードした後にアンカー名オフセットが実行されるためです.別の理由は、オフセットが外部APIからページコンテンツを取得する前に発生し、ページにコンポーネントをロードしていない(またはスケルトンロードを使用する)場合です.
この問題の解決策は、URLのハッシュを取得するスクロールの手動処理を
イメージなしで
ドキュメントが外部リンクを取得しなければならないイメージがない場合、次のように使用できます.
画像で
我々がそうするならば起こることができる1つのもの
あなたはそれについて別のフックを補完し、この問題を修正することができます.
あなたが記事が好きであるならば、私を以下に従ってください
URLのハッシュフラグメント(すなわち、)www.mypage.com/article#fragment ) アンカー名には
name
or id
アンカーのコンテキストで使用する属性.によるとw3.org , それは2つの規則、ユニークさを観察しなければなりません:文書内でユニークでなければならないと言われて、ストリングマッチング:断片識別子とアンカー名の比較は正確な(大文字と小文字を区別する)マッチによってされなければなりません.
The
id
属性を使用して、任意の要素の開始タグにアンカーを作成することができます.この例では、H 2要素にアンカーを配置するID属性の使用を示します.
...later in the document
<H2 id="section2">Section Two</H2>
...
単純なHTMLドキュメントでは、すべてのDOMがブラウザ上でレンダリングされているので、完全に読み込み時に動作しますが、通常はdiv
...
<div id="root"></div>
...
そして、あなたがChorperハッシュ断片を通してセクションにアクセスしようとするならば(すなわち).www.mypage.com/article#fragment ) 目的のセクションにスクロールしないでください.この動作はいくつかの理由で起こります.理由は、ページが最初のDOMをロードした後にアンカー名オフセットが実行されるためです.別の理由は、オフセットが外部APIからページコンテンツを取得する前に発生し、ページにコンポーネントをロードしていない(またはスケルトンロードを使用する)場合です.
この問題の解決策は、URLのハッシュを取得するスクロールの手動処理を
window.location
とEventListener'hashchange'
場合によっては、ページ全体が反応コンポーネントから読み込まれると、同じ動作を維持します.以下のすべてのフックを参照してください.import { useEffect } from "react";
export function useHashFragment(offset = 0, trigger = true) {
useEffect(() => {
const scrollToHashElement = () => {
const { hash } = window.location;
const elementToScroll = document.getElementById(hash?.replace("#", ""));
if (!elementToScroll) return;
window.scrollTo({
top: elementToScroll.offsetTop - offset,
behavior: "smooth"
});
};
if (!trigger) return;
scrollToHashElement();
window.addEventListener("hashchange", scrollToHashElement);
return window.removeEventListener("hashchange", scrollToHashElement);
}, [trigger]);
}
最初のパームoffset
ページの上に粘着性のメニューがあれば、2番目は1ですtrigger
をクリックすると、いつでもスクロールします.イメージなしで
ドキュメントが外部リンクを取得しなければならないイメージがない場合、次のように使用できます.
import { useHashFragment } from "./hooks/useHashFragment";
import "./styles.css";
export default function App() {
const sectionArrary = [1, 2, 3, 4, 5];
useHashFragment();
const handleOnClick = (hash: string) => {
navigator.clipboard
.writeText(`${window.location.origin}${window.location.pathname}#${hash}`)
.then(() => {
alert(
`Link: ${window.location.origin}${window.location.pathname}#${hash}`
);
});
};
return (
<div className="App">
<h1>How to implement URL hashes and deep-link in react</h1>
{sectionArrary.map((item) => (
<section id={`section${item}`}>
<h2>
Title Section {item}{" "}
<button onClick={() => handleOnClick(`section${item}`)}>
copy link
</button>
</h2>
<p>
Lorem ipsum ...
</p>
</section>
))}
</div>
);
}
付加的なhandleOnClick
キャッチ#hash-fragment
からwindow.location
で定義されているアンカー名/id<section id="section3">
とnavigation.clipboard.writeText
約束 const handleOnClick = (hash: string) => {
navigator.clipboard
.writeText(`${window.location.origin}${window.location.pathname}#${hash}`)
.then(() => {
alert(
`Link: ${window.location.origin}${window.location.pathname}#${hash}`
);
});
};
ここでチェックすることができますdemo whithout images .画像で
我々がそうするならば起こることができる1つのもの
<img/>
外部リンクを持つタグは、すべての画像が読み込まれる前に名前付きアンカーにスクロールするときに、読み込まれた画像によってドキュメントのサイズが変更されるため、スクロールが失敗することになります.あなたはそれについて別のフックを補完し、この問題を修正することができます.
あなたが記事が好きであるならば、私を以下に従ってください
Reference
この問題について((特に最初の荷積みで)反応でアンカー名に対するCash - Hash断片をロードする方法), 我々は、より多くの情報をここで見つけました https://dev.to/alejomartinez8/how-to-load-a-hash-fragment-to-an-anchor-name-in-react-especially-in-first-loading-g3iテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol