@@ -348,29 +348,50 @@ document.addEventListener("DOMContentLoaded", () => {
348348
349349 fetchPartials ( pathToPartials , headerFile )
350350 . then ( ( [ headerHtml , footerHtml ] ) => {
351+ // モバイルでは bread-pet のマークアップ自体を挿入しない(CSS/transform 等の影響を排除)
352+ if ( isMobileViewport ( ) ) {
353+ try {
354+ headerHtml = headerHtml . replace (
355+ / < d i v \s + i d = [ " ' ] b r e a d - p e t [ " ' ] [ \s \S ] * ?< \/ d i v > \s * / i,
356+ "" ,
357+ ) ;
358+ } catch ( e ) {
359+ // 正規表現での置換に失敗しても後続の安全策があるため続行
360+ }
361+ }
362+
351363 shell . insertAdjacentHTML ( "afterbegin" , headerHtml ) ;
352364 shell . insertAdjacentHTML ( "afterend" , footerHtml ) ;
353365
366+ // モバイル専用: overflow-x を強制的に隠す(レイアウトの横はみ出し対策)
367+ if ( isMobileViewport ( ) ) {
368+ try {
369+ const style = document . createElement ( "style" ) ;
370+ style . setAttribute (
371+ "data-generated-by" ,
372+ "layout.js:mobile-overflow" ,
373+ ) ;
374+ style . textContent =
375+ "@media (max-width: 768px){html,body{overflow-x: hidden !important;}}" ;
376+ document . head . appendChild ( style ) ;
377+ } catch ( e ) {
378+ // 無視
379+ }
380+ }
381+
354382 // 初期化
355383 setupLanguageSwitch ( currentPath ) ;
356384 setupActiveNav ( currentPath ) ;
357385 setupNavToggle ( ) ;
358386
359387 // bread-pet はモバイル時は初期化しない(表示/ロジックともに除外)
360- // 加えて、念のため header がすでに bread 要素を含む場合は非表示化する
361388 if ( isMobileViewport ( ) ) {
389+ // DOM 上に残っている場合はノード自体を削除して影響を排除
362390 const breadEl =
363391 document . getElementById ( "bread-pet" ) ;
364- if ( breadEl ) {
392+ if ( breadEl && breadEl . parentNode ) {
365393 try {
366- breadEl . style . display = "none" ;
367- breadEl . style . visibility = "hidden" ;
368- breadEl . style . pointerEvents = "none" ;
369- breadEl . setAttribute ( "aria-hidden" , "true" ) ;
370- breadEl . setAttribute (
371- "data-bread-disabled" ,
372- "true" ,
373- ) ;
394+ breadEl . parentNode . removeChild ( breadEl ) ;
374395 } catch ( e ) {
375396 // 無視
376397 }
0 commit comments