ã¹ãã£ãããŒããããŒã«é ããã¢ã³ã«ãŒãªã³ã¯ã®åé¡ã解決ãCSS scroll-margin-topã䜿ããã¢ãã³ã§ã¯ãªãŒã³ãªæ¹æ³ã§å®ç§ãªããã²ãŒã·ã§ã³ãªãã»ãããå®çŸããŸãã
ã¢ã³ã«ãŒããã²ãŒã·ã§ã³ããã¹ã¿ãŒããïŒCSSã¹ã¯ããŒã«ããŒãžã³ã®æ·±æã
çŸä»£ã®ãŠã§ããã¶ã€ã³ã®äžçã§ã¯ãã·ãŒã ã¬ã¹ã§çŽæçãªãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãäœãåºãããšãæãéèŠã§ãã仿¥æã ãç®ã«ããæãäžè¬çãªUIãã¿ãŒã³ã®äžã€ã«ãã¹ãã£ãããŒããããŒïŒåºå®ããããŒïŒããããŸããããã¯ããŠãŒã¶ãŒãããŒãžãäžã«ã¹ã¯ããŒã«ããŠããäž»èŠãªããã²ãŒã·ã§ã³ããã©ã³ãã£ã³ã°ãéèŠãªã³ãŒã«ãã¥ã¢ã¯ã·ã§ã³ãåžžã«ã¢ã¯ã»ã¹å¯èœãªç¶æ ã«ä¿ã¡ãŸããéåžžã«äŸ¿å©ã§ããäžæ¹ããã®ãã¿ãŒã³ã¯å€å žçã§åä»ãªåé¡ãããªãã¡é ããŠããŸãã¢ã³ã«ãŒãªã³ã¯ãšããåé¡ãåŒãèµ·ãããŸãã
ããªããééããªãçµéšããããšãããã§ããããç®æ¬¡ã®ãªã³ã¯ãã¯ãªãã¯ãããšããã©ãŠã¶ã¯åŸåã«å¯Ÿå¿ããã»ã¯ã·ã§ã³ã«ãžã£ã³ãããŸããããã®ã»ã¯ã·ã§ã³ã®èŠåºãã¯ã¹ãã£ãããŒããã²ãŒã·ã§ã³ããŒã®åŸãã«ãããã«é ããŠããŸããŸãããŠãŒã¶ãŒã¯æèã倱ããæ··ä¹±ããããªããæžåœã«äœãäžããæŽç·Žãããäœéšã¯äžæçã«æãªãããŸããäœå幎ãã®éãéçºè ã¯ãã®åé¡ãšãããã£ã³ã°ãç䌌èŠçŽ ããããã¯JavaScriptã䜿ã£ãæ§ã ãªå·§åŠã§ãããªããäžå®å šãªããã¯ã§æŠã£ãŠããŸããã
幞ããªããšã«ãããã¯ã®æä»£ã¯çµãããŸãããCSSã¯ãŒãã³ã°ã°ã«ãŒãã¯ããŸãã«ãã®åé¡ã«å¯Ÿããå°çšã§ããšã¬ã¬ã³ãã§ãå ç¢ãªè§£æ±ºçãæäŸããŸããããããscroll-marginããããã£ã§ãããã®èšäºã¯ãCSSã®ã¹ã¯ããŒã«ããŒãžã³ãçè§£ãããã¹ã¿ãŒããããã®å æ¬çãªã¬ã€ãã§ãããããªãã®ãµã€ãã®ããã²ãŒã·ã§ã³ãäžæºã®çš®ããåã³ã®æºãžãšå€ãããã®ã§ãã
å€å žçãªåé¡ïŒé ããŠããŸãã¢ã³ã«ãŒã¿ãŒã²ãã
解決çãç¥ãåã«ãåé¡ãå®å šã«åæããŠã¿ãŸãããããã®åé¡ã¯ããã©ã°ã¡ã³ãèå¥åïŒã¢ã³ã«ãŒãªã³ã¯ïŒãšåºå®é 眮ïŒfixed positioningïŒãšãã2ã€ã®åºæ¬çãªãŠã§ãæ©èœã®éã®åçŽãªè¡çªããçããŸãã
äžè¬çãªã·ããªãªã¯æ¬¡ã®ãšããã§ãïŒ
- æ§é ïŒ é·ãã¹ã¯ããŒã«ããŒãžã«æç¢ºãªã»ã¯ã·ã§ã³ããããŸããåäž»èŠã»ã¯ã·ã§ã³ã«ã¯ã`
äŒç€ŸæŠèŠ
`ã®ããã«ãäžæã®`id`屿§ãæã€èŠåºãããããŸãã - ããã²ãŒã·ã§ã³ïŒ ããŒãžã®äžéšã«ã¯ããã²ãŒã·ã§ã³ã¡ãã¥ãŒããããŸããããã¯ç®æ¬¡ã§ãã£ããããµã€ãã®ã¡ã€ã³ããã²ãŒã·ã§ã³ã§ãã£ããããŸããããã«ã¯ã`ç§ãã¡ã®äŒç€Ÿã«ã€ããŠç¥ã`ã®ããã«ããããã®ã»ã¯ã·ã§ã³IDãæãã¢ã³ã«ãŒãªã³ã¯ãå«ãŸããŠããŸãã
- ã¹ãã£ãããŒèŠçŽ ïŒ `position: sticky; top: 0;` ãŸã㯠`position: fixed; top: 0;` ã§ã¹ã¿ã€ã«ãããããããŒèŠçŽ ããããŸãããã®èŠçŽ ã«ã¯ãäŸãã°80ãã¯ã»ã«ã®ãããªèšå®ãããé«ãããããŸãã
- ã€ã³ã¿ã©ã¯ã·ã§ã³ïŒ ãŠãŒã¶ãŒããç§ãã¡ã®äŒç€Ÿã«ã€ããŠç¥ãããªã³ã¯ãã¯ãªãã¯ããŸãã
- ãã©ãŠã¶ã®æåïŒ ãã©ãŠã¶ã®ããã©ã«ãã®æåã¯ãã¿ãŒã²ããèŠçŽ ïŒ`id="about-us"`ãæã€`
`ïŒã®ãŸãã«äžç«¯ããã¥ãŒããŒãã®äžç«¯ãšå®å šã«æãããã«ããŒãžãã¹ã¯ããŒã«ããããšã§ãã
- è¡çªïŒ ããªãã®é«ã80ãã¯ã»ã«ã®ã¹ãã£ãããŒããããŒããã¥ãŒããŒãã®äžéšãå æããŠããããããã©ãŠã¶ãã¹ã¯ããŒã«ããŠè¡šç€ºãã`
`èŠçŽ ãèŠãé ããŠããŸããŸãããŠãŒã¶ãŒã¯èŠåºãã®*äž*ã®ã³ã³ãã³ãã¯èŠããŸãããèŠåºãèªäœã¯èŠããŸããã
ããã¯ãã°ã§ã¯ãããŸããããããã®ã·ã¹ãã ãç¬ç«ããŠæ©èœããããã«èšèšãããçµæã®è«ççãªåž°çµã«ãããŸãããã¹ã¯ããŒã«ã¡ã«ããºã ã¯ããã¥ãŒããŒãã®äžã«éããããåºå®é 眮ã®èŠçŽ ãæ¬è³ªçã«èªèããŠããŸããããã®åçŽãªè¡çªããé·å¹Žã«ãããåµé çãªåé¿çãçã¿åºããŠããŸããã
å€ãããã¯ïŒéå»ã®è§£æ±ºçãæ¯ãè¿ã
`scroll-margin`ã®ãšã¬ã¬ã³ã¹ãçã«çè§£ããããã«ã¯ããã®åé¡ã解決ããããã«ç§ãã¡ã䜿ã£ãŠãããå€ãæ¹æ³ããçè§£ããããšã圹ç«ã¡ãŸãããããã®æ¹æ³ã¯ä»ã§ããŠã§ãäžã®ç¡æ°ã®ã³ãŒãããŒã¹ã«ååšããŠãããããããèªèããããšã¯ã©ã®éçºè ã«ãšã£ãŠãæçšã§ãã
ãã㯠#1ïŒããã£ã³ã°ãšãã¬ãã£ãããŒãžã³ã®ããªãã¯
ããã¯ãæãåæã§æãäžè¬çãªCSSã®ã¿ã®è§£æ±ºçã®äžã€ã§ãããèãæ¹ãšããŠã¯ãã¿ãŒã²ããèŠçŽ ã®äžéšã«ããã£ã³ã°ã远å ããŠã¹ããŒã¹ãäœãããã®åŸãã¬ãã£ãããŒãžã³ã䜿ã£ãŠèŠçŽ ã®ã³ã³ãã³ããå ã®èŠèŠçãªäœçœ®ã«åŒãäžãããšãããã®ã§ãã
ã³ãŒãäŸïŒ
CSS
.sticky-header { height: 80px; position: sticky; top: 0; }
h2[id] {
padding-top: 80px; /* ããããŒã®é«ãã«çããã¹ããŒã¹ãäœæ */
margin-top: -80px; /* èŠçŽ ã®ã³ã³ãã³ããåã³åŒãäžãã */
}
ãªããããããã¯ãªã®ãïŒ
- ããã¯ã¹ã¢ãã«ã倿ŽããïŒ ããã¯ãçŽæçã§ãªãæ¹æ³ã§èŠçŽ ã®ã¬ã€ã¢ãŠããçŽæ¥æäœããŸããäœåãªããã£ã³ã°ã¯ãèæ¯è²ãããŒããŒããã®ä»èŠçŽ ã«é©çšãããã¹ã¿ã€ãªã³ã°ã«å¹²æžããå¯èœæ§ããããŸãã
- è匱æ§ïŒ ããããŒã®é«ããšã¿ãŒã²ããèŠçŽ ã®ã¹ã¿ã€ãªã³ã°ã®éã«å¯æ¥ãªçµåãçã¿åºããŸãããããã¶ã€ããŒãããããŒã®é«ãã倿Žããããšã«æ±ºããå Žåãéçºè ã¯ãã®ããã£ã³ã°/ããŒãžã³ã®ã«ãŒã«ã䜿ãããŠãããã¹ãŠã®å ŽæãèŠã€ããŠæŽæ°ããªããã°ãªããŸããã
- ã»ãã³ãã£ãã¯ã§ãªãïŒ ããã£ã³ã°ãšããŒãžã³ã¯ãçŽç²ã«æ©æ¢°çãªã¹ã¯ããŒã«ã®ç®çã®ããã«ååšããçã®ã¬ã€ã¢ãŠãããã¶ã€ã³äžã®çç±ããã§ã¯ãããŸãããããã«ãããã³ãŒãã®çè§£ãé£ãããªããŸãã
ãã㯠#2ïŒç䌌èŠçŽ ã®ããªãã¯
ããå°ãæŽç·ŽãããCSSã®ã¿ã®ã¢ãããŒãã¯ãã¿ãŒã²ããã«ç䌌èŠçŽ ïŒ`::before`ïŒã䜿çšããããšã§ããç䌌èŠçŽ ã¯å®éã®èŠçŽ ã®äžã«é 眮ãããç®ã«èŠããªãã¹ã¯ããŒã«ã¿ãŒã²ãããšããŠæ©èœããŸãã
ã³ãŒãäŸïŒ
CSS
h2[id] {
position: relative;
}
h2[id]::before {
content: "";
display: block;
height: 90px; /* ããããŒã®é«ã + å°ã
ã®äœçœ */
margin-top: -90px;
visibility: hidden;
}
ãªããããããã¯ãªã®ãïŒ
- ããè€éïŒ ããã¯å·§åŠã§ãããè€éããå¢ãããã®ãã¿ãŒã³ã«æ £ããŠããªãéçºè ã«ãšã£ãŠã¯åããã«ããã§ãã
- ç䌌èŠçŽ ãæ¶è²»ããïŒ `::before`ç䌌èŠçŽ ã䜿ãæãããŠããŸããåãèŠçŽ ã§ä»ã®è£ 食çãŸãã¯æ©èœçãªç®çã§å¿ èŠã«ãªããããããŸããã
- äŸç¶ãšããŠããã¯ïŒ ã¿ãŒã²ããèŠçŽ ã®çŽæ¥ã®ããã¯ã¹ã¢ãã«ããããããšã¯é¿ããŸãããããã§ãæå³ãããç®ç以å€ã§CSSããããã£ã䜿çšããåé¿çã§ãã
ãã㯠#3ïŒJavaScriptã«ããä»å ¥
究極ã®å¶åŸ¡ãæ±ããŠãå€ãã®éçºè ãJavaScriptã«é ŒããŸãããã¹ã¯ãªããã¯ãã¹ãŠã®ã¢ã³ã«ãŒãªã³ã¯ã®ã¯ãªãã¯ã€ãã³ããä¹ã£åããããã©ã«ãã®ãã©ãŠã¶ãžã£ã³ããé²ããããããŒã®é«ããèšç®ãããããŠæåã§ããŒãžãæ£ããäœçœ®ã«ã¹ã¯ããŒã«ãããŸãã
ã³ãŒãäŸïŒæŠå¿µïŒïŒ
JavaScript
document.querySelectorAll('a[href^="#"]').forEach(anchor => {
anchor.addEventListener('click', function (e) {
e.preventDefault();
const headerHeight = document.querySelector('.sticky-header').offsetHeight;
const targetElement = document.querySelector(this.getAttribute('href'));
if (targetElement) {
const elementPosition = targetElement.getBoundingClientRect().top;
const offsetPosition = elementPosition + window.pageYOffset - headerHeight;
window.scrollTo({
top: offsetPosition,
behavior: 'smooth'
});
}
});
});
ãªããããããã¯ãªã®ãïŒ
- éå°ïŒ æ¬è³ªçã«ã¬ã€ã¢ãŠããšãã¬ãŒã³ããŒã·ã§ã³ã®åé¡ã§ãããã®ã解決ããããã«ã匷åãªã¹ã¯ãªããèšèªã䜿çšããŠããŸãã
- ããã©ãŒãã³ã¹ã³ã¹ãïŒ ãã°ãã°ç¡èŠã§ããçšåºŠã§ãããããŒãžã«JavaScriptã®å®è¡ãªãŒããŒãããã远å ããŸãã
- è匱æ§ïŒ ã¯ã©ã¹åã倿Žããããšã¹ã¯ãªãããå£ããå¯èœæ§ããããŸãã远å ã®ãããè€éãªã³ãŒããªãã§ã¯ãåçã«é«ããå€ããããããŒïŒäŸïŒãŠã£ã³ããŠã®ãªãµã€ãºæïŒã«å¯Ÿå¿ã§ããªããããããŸããã
- ã¢ã¯ã»ã·ããªãã£ãžã®æžå¿µïŒ æ éã«å®è£ ããªããšãã¢ã¯ã»ã·ããªãã£ããŒã«ãããŒããŒãããã²ãŒã·ã§ã³ã®æåŸ ããããã©ãŠã¶ã®æåã«å¹²æžããå¯èœæ§ããããŸãããŸããJavaScriptãç¡å¹ã«ãªã£ãŠããããèªã¿èŸŒã¿ã«å€±æããå Žåã«ã¯å®å šã«æ©èœããŸããã
ã¢ãã³ãªè§£æ±ºçïŒ`scroll-margin`ã®å°å ¥
ããã§ç»å Žããã®ã`scroll-margin`ã§ãããã®CSSããããã£ïŒããã³ãã®å奿å®ããããã£ïŒã¯ããã®çš®ã®åé¡ã®ããã«ç¹å¥ã«èšèšãããŸãããããã«ãããèŠçŽ ã®åšãã«ãã¹ã¯ããŒã«ã¹ãããé åã調æŽããããã«äœ¿çšãããå€åŽã®ããŒãžã³ãå®çŸ©ã§ããŸãã
ãããç®ã«èŠããªããããã¡ãŸãŒã³ãšèããŠãã ããããã©ãŠã¶ãïŒã¢ã³ã«ãŒãªã³ã¯ãªã©ãä»ããŠïŒèŠçŽ ã«ã¹ã¯ããŒã«ããããã«æç€ºããããšããèŠçŽ ã®ããŒããŒããã¯ã¹ããã¥ãŒããŒãã®ç«¯ã«æããã®ã§ã¯ãããŸããã代ããã«ã`scroll-margin`é åãæããŸããããã¯ãå®éã®èŠçŽ ããã®ã¬ã€ã¢ãŠãã«äžå圱é¿ãäžããããšãªããã¹ãã£ãããŒããããŒã®äžããæŒãäžããããããšãæå³ããŸãã
䞻圹ïŒ`scroll-margin-top`
ç§ãã¡ã®ã¹ãã£ãããŒããããŒåé¡ã«ãšã£ãŠãæãçŽæ¥çã§äŸ¿å©ãªããããã£ã¯`scroll-margin-top`ã§ããããã¯ãèŠçŽ ã®äžç«¯ã®ãªãã»ãããå ·äœçã«å®çŸ©ããŸãã
ãã®ã¢ãã³ã§ãšã¬ã¬ã³ããªè§£æ±ºçã䜿ã£ãŠãå ã®ã·ããªãªããªãã¡ã¯ã¿ãªã³ã°ããŠã¿ãŸãããããããã¬ãã£ãããŒãžã³ããç䌌èŠçŽ ããJavaScriptãå¿ èŠãããŸããã
ã³ãŒãäŸïŒ
HTML
<header class="site-header">... Your Navigation ...</header>
<main>
<h2 id="section-one">Section One</h2>
<p>Content for the first section...</p>
<h2 id="section-two">Section Two</h2>
<p>Content for the second section...</p>
</main>
CSS
.site-header {
position: sticky;
top: 0;
height: 80px;
background-color: white;
box-shadow: 0 2px 5px rgba(0,0,0,0.1);
}
/* éæ³ã®äžè¡ïŒ */
h2[id] {
scroll-margin-top: 90px; /* ããããŒã®é«ã(80px) + 10pxã®äœçœ */
}
ããã ãã§ããããã¯ãã¯ãªãŒã³ã§ã宣èšçã§ãèªå·±ææžåãããCSSã®äžè¡ã§ãããŠãŒã¶ãŒã`#section-one`ãžã®ãªã³ã¯ãã¯ãªãã¯ãããšããã©ãŠã¶ã¯`
`ã®90ãã¯ã»ã«*äž*ã®ç¹ããã¥ãŒããŒãã®äžéšã«éãããŸã§ã¹ã¯ããŒã«ããŸããããã«ãããèŠåºãã¯80ãã¯ã»ã«ã®ããããŒã®äžã«å®ç§ã«èŠããããã«ãªããå¿«é©ãª10ãã¯ã»ã«ã®äœåãªã¹ããŒã¹ãã§ããŸãã
ãã®å©ç¹ã¯ããã«æããã§ãïŒ
- é¢å¿ã®åé¢ïŒ ã¹ã¯ããŒã«ã®æåã¯ãJavaScriptã«é Œãããšãªãããããå±ããå Žæã§ããCSSã§å®çŸ©ãããŸããèŠçŽ ã®ã¬ã€ã¢ãŠãã¯å šã圱é¿ãåããŸããã
- ã·ã³ãã«ããšå¯èªæ§ïŒ `scroll-margin-top`ãšããããããã£ã¯ããã®æ©èœãèŠäºã«èª¬æããŠããŸãããã®ã³ãŒããèªãã©ã®éçºè ãããã®ç®çãããã«çè§£ããã§ãããã
- å ç¢æ§ïŒ ããã¯ãã©ãããã©ãŒã ãã€ãã£ããªåé¡è§£æ±ºæ¹æ³ã§ãããã¹ã¯ãªããã«ããã©ã®è§£æ±ºçãããå¹ççã§ä¿¡é Œæ§ããããŸãã
- ä¿å®æ§ïŒ å€ãããã¯ãããã¯ããã«ç®¡çã容æã§ããããã«ãåŸã»ã©èª¬æããCSSã«ã¹ã¿ã ããããã£ã䜿ãã°ãããã«æ¹åã§ããŸãã
`scroll-margin`ããããã£ã®æ·±æã
`scroll-margin-top`ã¯ã¹ãã£ãããŒããããŒåé¡ã§æãäžè¬çãªããŒããŒã§ããã`scroll-margin`ãã¡ããªãŒã¯ãã以äžã«å€æ©èœã§ãããã®æ§é ã¯ãããªãã¿ã®`margin`ããããã£ãåæ ããŠããŸãã
å奿å®ããããã£ãšäžæ¬æå®ããããã£
`margin`ãšåæ§ã«ãããããã£ãåå¥ã«èšå®ããããšããäžæ¬ã§èšå®ããããšãã§ããŸãïŒ
scroll-margin-top
scroll-margin-right
scroll-margin-bottom
scroll-margin-left
ãããŠã`margin`ãšåã1ã4ã€ã®å€ã®æ§æã«åŸãäžæ¬æå®ããããã£`scroll-margin`ïŒ
CSS
.target-element {
/* äž | å³ | äž | å·Š */
scroll-margin: 90px 20px 20px 20px;
/* 以äžãšçäŸ¡ïŒ */
scroll-margin-top: 90px;
scroll-margin-right: 20px;
scroll-margin-bottom: 20px;
scroll-margin-left: 20px;
}
ãããã®ä»ã®ããããã£ã¯ããã«ããŒãžã®ã¹ã¯ããŒã«ã¹ãããã«ã«ãŒã»ã«ã®ãããªãããé«åºŠãªã¹ã¯ããŒã«ã€ã³ã¿ãŒãã§ãŒã¹ã§ç¹ã«åœ¹ç«ã¡ãŸããããã§ã¯ãã¹ã¯ããŒã«å ã®ã¢ã€ãã ãã³ã³ããã®ç«¯ã«å®å šã«æ¥ããªãããã«ãããå ŽåããããŸãã
ã°ããŒãã«æèïŒè«çããããã£
çã«ã°ããŒãã«å¯Ÿå¿ã®CSSãæžãããã«ã¯ãå¯èœãªéãç©ççãªããããã£ã®ä»£ããã«è«çããããã£ã䜿çšããããšããã¹ããã©ã¯ãã£ã¹ã§ããè«çããããã£ã¯ç©ççãªæ¹åïŒ`top`ã`left`ã`right`ã`bottom`ïŒã§ã¯ãªããããã¹ãã®æµãïŒ`start`ãš`end`ïŒã«åºã¥ããŠããŸããããã«ãããã¢ã©ãã¢èªãããã©ã€èªã®ãããªå³ããå·ŠïŒRTLïŒãžã®èšèªããããã¯çžŠæžãã¢ãŒããªã©ãç°ãªãæžåæ¹åã«ã¬ã€ã¢ãŠããæ£ããé©å¿ããããšãä¿èšŒãããŸãã
`scroll-margin`ãã¡ããªãŒã«ã¯ãå®å šãªè«çããããã£ã®ã»ããããããŸãïŒ
scroll-margin-block-start
: æšæºçãªæ°Žå¹³ãäžããäžãžã®æžåã¢ãŒãã§ `scroll-margin-top` ã«å¯Ÿå¿ããŸããscroll-margin-block-end
: `scroll-margin-bottom` ã«å¯Ÿå¿ããŸããscroll-margin-inline-start
: å·Šããå³ã®æèã§ `scroll-margin-left` ã«å¯Ÿå¿ããŸããscroll-margin-inline-end
: å·Šããå³ã®æèã§ `scroll-margin-right` ã«å¯Ÿå¿ããŸãã
ç§ãã¡ã®ã¹ãã£ãããŒããããŒã®äŸã§ã¯ãè«çããããã£ã䜿çšããæ¹ãããå ç¢ã§å°æ¥æ§ããããŸãïŒ
CSS
h2[id] {
/* ãããã¢ãã³ã§æšå¥šãããæ¹æ³ã§ã */
scroll-margin-block-start: 90px;
}
ãã®äžã€ã®å€æŽã ãã§ãããã¥ã¡ã³ãã®èšèªãããã¹ãã®æ¹åã«é¢ããããã¹ã¯ããŒã«ã®æåãèªåçã«æ£ãããªããŸããããã¯ãã°ããŒãã«ãªèŠèŽè ã®ããã«æ§ç¯ãããšããã³ãããã¡ã³ãã瀺ãå°ããªè©³çްã§ãã
ã¹ã ãŒãºã¹ã¯ããŒã«ãšã®çµã¿åããã§æŽç·ŽãããUXãå®çŸ
`scroll-margin`ããããã£ã¯ãããäžã€ã®ã¢ãã³ãªCSSããããã£ã§ãã`scroll-behavior`ãšèŠäºã«é£æºããŸããã«ãŒãèŠçŽ ã«`scroll-behavior: smooth;`ãèšå®ããããšã§ããã©ãŠã¶ã«ã¢ã³ã«ãŒãªã³ã¯ã®ãžã£ã³ããç¬æã«è¡ãã®ã§ã¯ãªããã¢ãã¡ãŒã·ã§ã³ãããããã«æç€ºããŸãã
ãã®2ã€ãçµã¿åããããšããããæ°è¡ã®CSSã§ãããã§ãã·ã§ãã«ã§æŽç·ŽããããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãåŸãããŸãïŒ
CSS
html {
scroll-behavior: smooth;
}
.site-header {
position: sticky;
top: 0;
height: 80px;
}
[id] {
/* IDãæã€ä»»æã®èŠçŽ ã«é©çšããæœåšçãªã¹ã¯ããŒã«ã¿ãŒã²ããã«ãã */
scroll-margin-top: 90px;
}
ãã®èšå®ã«ãããã¢ã³ã«ãŒãªã³ã¯ãã¯ãªãã¯ãããšãåªé ãªã¹ã¯ããŒã«ãããªã¬ãŒãããã¿ãŒã²ããèŠçŽ ãã¹ãã£ãããŒããããŒã®äžã«å®ç§ã«é 眮ãããŠè¡šç€ºãããããšã§çµäºããŸããJavaScriptã©ã€ãã©ãªã¯å¿ èŠãããŸããã
å®è·µçãªèæ ®äºé ãšãšããžã±ãŒã¹
`scroll-margin`ã¯åŒ·åã§ãããå®è£ ãããã«å ç¢ã«ããããã®ããã€ãã®å®äžçã§ã®èæ ®äºé ããããŸãã
CSSã«ã¹ã¿ã ããããã£ã§åçãªããããŒã®é«ãã管çãã
`80px`ã®ãããªãã¯ã»ã«å€ãããŒãã³ãŒãã£ã³ã°ããããšã¯ãã¡ã³ããã³ã¹äžã®é çã®çš®ã§ããç°ãªãç»é¢ãµã€ãºã§ããããŒã®é«ããå€ããå Žåã¯ã©ããªãã§ããããïŒãããã¯ããã®äžã«ãããŒã远å ãããå Žåã¯ïŒè€æ°ã®å Žæã§é«ããš`scroll-margin-top`ã®å€ãæŽæ°ããå¿ èŠããããŸãã
解決çã¯ãCSSã«ã¹ã¿ã ããããã£ïŒå€æ°ïŒã䜿çšããããšã§ããããããŒã®é«ãã倿°ãšããŠå®çŸ©ããããšã§ãããããŒã®ã¹ã¿ã€ã«ãšã¿ãŒã²ããã®ã¹ã¯ããŒã«ããŒãžã³ã®äž¡æ¹ã§ãããåç §ã§ããŸãã
CSS
:root {
--header-height: 80px;
--scroll-padding: 1rem; /* ééã«ã¯çžå¯Ÿåäœãäœ¿çš */
}
/* ã¬ã¹ãã³ã·ããªããããŒã®é«ã */
@media (max-width: 768px) {
:root {
--header-height: 60px;
}
}
.site-header {
position: sticky;
top: 0;
height: var(--header-height);
}
[id] {
scroll-margin-top: calc(var(--header-height) + var(--scroll-padding));
}
ãã®ã¢ãããŒãã¯éåžžã«åŒ·åã§ããããã§ãããããŒã®é«ãã倿Žããå¿ èŠããããšãã¯ã`--header-height`倿°ãäžç®æã§æŽæ°ããã ãã§æžã¿ãŸãã`scroll-margin-top`ã¯ã¡ãã£ã¢ã¯ãšãªã«å¿ããŠãèªåçã«æŽæ°ãããŸããããã¯ãDRYïŒDon't Repeat YourselfïŒãã€ãŸãä¿å®æ§ã®é«ãCSSãæžãããšã®å žåã§ãã
ãã©ãŠã¶ãµããŒã
`scroll-margin`ã«é¢ããæé«ã®ãã¥ãŒã¹ã¯ããã®æä»£ãæ¥ããšããããšã§ãã仿¥çŸåšãChromeãFirefoxãSafariãEdgeãå«ãããã¹ãŠã®ã¢ãã³ãªããšããŒã°ãªãŒã³ãã©ãŠã¶ã§ãµããŒããããŠããŸããããã¯ãã°ããŒãã«ãªèŠèŽè ãã¿ãŒã²ãããšãã倧倿°ã®ãããžã§ã¯ãã§ããã®ããããã£ãå®å¿ããŠäœ¿çšã§ããããšãæå³ããŸãã
éåžžã«å€ããã©ãŠã¶ïŒInternet Explorer 11ãªã©ïŒã®ãµããŒããå¿ èŠãªãããžã§ã¯ãã§ã¯ã`scroll-margin`ã¯æ©èœããŸããããã®ãããªå Žåã«ã¯ãå€ãããã¯ã®äžã€ããã©ãŒã«ããã¯ãšããŠäœ¿çšããå¿ èŠããããããããŸãããCSSã®`@supports`ã¯ãšãªã䜿çšããŠã察å¿ãã©ãŠã¶ã«ã¯ã¢ãã³ãªããããã£ãããã以å€ã«ã¯ããã¯ãé©çšã§ããŸãïŒ
CSS
/* ã¬ã¬ã·ãŒãã©ãŠã¶åãã®å€ããã㯠*/
[id] {
padding-top: 90px;
margin-top: -90px;
}
/* ãµããŒããããŠãããã©ãŠã¶åãã®ã¢ãã³ãªãããã㣠*/
@supports (scroll-margin-top: 1px) {
[id] {
/* ãŸããå€ãããã¯ãå
ã«æ»ã */
padding-top: 0;
margin-top: 0;
/* 次ã«ãããè¯ã解決çãé©çšãã */
scroll-margin-top: 90px;
}
}
ããããã¬ã¬ã·ãŒãã©ãŠã¶ã®æžå°ãèãããšããŸãã¢ãã³ãªããããã£ã§æ§ç¯ãããããžã§ã¯ãã®å¶çŽã«ãã£ãŠæç€ºçã«èŠæ±ãããå Žåã«ã®ã¿ãã©ãŒã«ããã¯ãæ€èšããæ¹ããå€ãã®å ŽåããçŸå®çã§ãã
ã¢ã¯ã»ã·ããªãã£ã®åå©
`scroll-margin`ã®äœ¿çšã¯ãåãªãéçºè ã®å©äŸ¿æ§ã§ã¯ãããŸãããã¢ã¯ã»ã·ããªãã£ã«ãšã£ãŠå€§ããªåå©ã§ãããŠãŒã¶ãŒãããŒããŒãã䜿çšããŠããŒãžãããã²ãŒãããéïŒäŸãã°ããªã³ã¯ãã¿ãã§ç§»åããããŒãžå ã¢ã³ã«ãŒã§EnterããŒãæŒãïŒããã©ãŠã¶ã®ã¹ã¯ããŒã«ãããªã¬ãŒãããŸããã¿ãŒã²ããã®èŠåºããé ããªãããã«ããããšã§ããããã®ãŠãŒã¶ãŒã«éèŠãªæèãæäŸããŸãã
åæ§ã«ãã¹ã¯ãªãŒã³ãªãŒããŒã®ãŠãŒã¶ãŒãã¢ã³ã«ãŒãªã³ã¯ãã¢ã¯ãã£ãã«ãããšããã©ãŒã«ã¹ã®èŠèŠçãªäœçœ®ãèªã¿äžããããŠããå 容ãšäžèŽãã匱èŠã®ãŠãŒã¶ãŒã®æœåšçãªæ··ä¹±ãæžãããŸããããã¯ããã¹ãŠã®ã€ã³ã¿ã©ã¯ãã£ããªèŠçŽ ãšãã®çµæãšããŠçããã¢ã¯ã·ã§ã³ãããã¹ãŠã®ãŠãŒã¶ãŒã«ãšã£ãŠæç¢ºã«ç¥èŠå¯èœã§ãªããã°ãªããªããšããååãæ¯æããŸãã
çµè«ïŒã¢ãã³ãªæšæºãåãå ¥ããã
ã¹ãã£ãããŒããããŒã«ãã£ãŠã¢ã³ã«ãŒãªã³ã¯ãé ãããåé¡ã¯ãCSSãããã«å¯ŸåŠããããã®ç¹å®ã®ããŒã«ãæ¬ ããŠããæä»£ã®éºç©ã§ããç§ãã¡ã¯å¿ èŠã«è¿«ãããŠå·§åŠãªããã¯ãéçºããŸãããããããã®åé¿çã«ã¯ä¿å®æ§ãè€éããããã©ãŒãã³ã¹ã®é¢ã§ã³ã¹ãã䌎ããŸããã
`scroll-margin`ããããã£ã«ãããç§ãã¡ã¯ä»ããã®åé¡ãã¯ãªãŒã³ãã€å¹ççã«è§£æ±ºããããã«èšèšãããCSSèšèªã®ç¬¬äžçŽåžæ°ãæã«å ¥ããŸããããããæ¡çšããããšã§ãããªãã¯ããè¯ãã³ãŒããæžãã ãã§ãªãããŠãŒã¶ãŒã®ããã«ããè¯ããããäºæž¬å¯èœã§ãããã¢ã¯ã»ã¹ããããäœéšãæ§ç¯ããŠããã®ã§ãã
ããªãã®éèŠãªãã€ã³ãã¯æ¬¡ã®ãšããã§ãïŒ
- ã¿ãŒã²ããèŠçŽ ã«`scroll-margin-top`ïŒãŸãã¯`scroll-margin-block-start`ïŒã䜿çšããŠã¹ã¯ããŒã«ãªãã»ãããäœæããŸãã
- CSSã«ã¹ã¿ã ããããã£ãšçµã¿åãããŠãã¹ãã£ãããŒããããŒã®é«ãã«é¢ããä¿¡é Œã§ããå¯äžã®æ å ±æºãäœæããã³ãŒããå ç¢ã§ä¿å®ããããããŸãã
- æŽç·Žããããããã§ãã·ã§ãã«ãªæè§Šã®ããã«ã`html`èŠçŽ ã«`scroll-behavior: smooth;`ã远å ããŸãã
- ãã®ã¿ã¹ã¯ã®ããã«ãããã£ã³ã°ããã¯ãç䌌èŠçŽ ããŸãã¯JavaScriptã®äœ¿çšããããŸãããããŠã§ããã©ãããã©ãŒã ãæäŸãããã¢ãã³ã§å°çšã®è§£æ±ºçãåãå ¥ããŸãããã
次ã«ã¹ãã£ãããŒããããŒãšç®æ¬¡ã®ããããŒãžãæ§ç¯ãããšããããªãã¯ãã®ä»äºã«æé©ãªããŒã«ãæã£ãŠããŸãããããã·ãŒã ã¬ã¹ã§ã¹ãã¬ã¹ã®ãªãããã²ãŒã·ã§ã³äœéšãåµé ããŸãããã