初心者webデザイナー・コーダーのための備忘録|Tech Stock 【テックストック】

Switch language

当Webサイトのコンテンツ内にはアフィリエイト広告、Googleアドセンス広告が含まれます。
広告主によって不適切な広告が表示されていることに気付いた方は、お手数でございますが該当の広告の「×」を押していただき、「この広告の表示を停止」し所定の流れに従ってください。

display flex と over-flow auto を併用すると横スクロールできなくなった話と解決策

> HTML・CSS
display: flex;
overflow-x: auto;

上記二つを併用したときに、横スクロール内の左側の要素が画面内に入ってこなくなる問題でドツボにはまったので解決策をメモ。

結論を先に言うと、上記二つというか、中央寄せしたいがために

justify-content: center;

を使っていたから横スクロールがバグっていました。。。

何をしたかったか

要素を横並びにして、ウィンドウ幅を縮めていき、横並びにした要素の横幅を下回ると自動的に横スクロールが始まる仕様を想定しています。

ここでは、横並びの要素は中央寄せにしたい場合を考えます。

ソースを見てみる(うまくいかない ver.)

HTML

<ul class="sample_NG">
	<li><img src="https://placehold.jp/50/3d4070/ffffff/400x200.png?text=いろいろ要素" alt=""></li>
	<li><img src="https://placehold.jp/50/3d4070/ffffff/150x400.png?text=いろいろ要素" alt=""></li>
	<li><img src="https://placehold.jp/50/3d4070/ffffff/500x300.png?text=いろいろ要素" alt=""></li>
	<li><img src="https://placehold.jp/50/3d4070/ffffff/200x300.png?text=いろいろ要素" alt=""></li>
</ul>

css

.sample_NG {
	display: flex;
	align-items: center;
	justify-content: center;
	overflow-x: auto;
}

デモ

スクロール内の左側の要素が隠れてしまって画面に入ってこない状態です。

これがなかなか解決できず苦労しました。

それでは、解決策を見ていきましょう。

ソースを見てみる(うまくいく ver.)

HTML

<div class="sample_OK_wrapper">
	<ul class="sample_OK">
		<li><img src="https://placehold.jp/50/3d4070/ffffff/400x200.png?text=いろいろ要素" alt=""></li>
		<li><img src="https://placehold.jp/50/3d4070/ffffff/150x400.png?text=いろいろ要素" alt=""></li>
		<li><img src="https://placehold.jp/50/3d4070/ffffff/500x300.png?text=いろいろ要素" alt=""></li>
		<li><img src="https://placehold.jp/50/3d4070/ffffff/200x300.png?text=いろいろ要素" alt=""></li>
	</ul>
</div>

css

.sample_OK_wrapper {
	overflow-x: auto;
	margin: 0 1.25rem; /* ←ちょっと注意(後述)*/
}
.sample_OK {
	display: inline-flex;
	align-items: center;

	/* justify-content: center; ←左側が画面に入ってこない原因 */
	/* overflow-x: auto; ←ここに付けてもスクロールしない*/
}

デモ

何が違うか

「うまくいかない ver.」と「うまくいく ver.」の違いは、

  1. <div> で囲む
  2. ↑この <div> に overflow-x: auto; を付ける
  3. 中央寄せにしたいので display: flex; ではなく display: inline-flex; を使う
  4. 中央寄せにしたいので ① の <div> に text-align: center; を付ける

です。

ちょっと注意

上記の「うまくいく ver.」の囲った <div> に

margin: 0 1.25rem;

を付けていますが、これは横スクロール内の要素の左右の余白を空け、画面との余白を作るためのものです。

ただし、これを、

padding: 0 1.25rem;

としてしまうと、横スクロール内の padding の右端でスクロールが止まってしまい、画面との余白を空けることができなくなってしまいます。

上記の二つのデモをじっくり見比べていただくと分かるかと思いますが、横スクロール内の要素の左右の余白の有無が確認できます。

この部分に関しては貴殿の制作中のサイトにあわせて臨機応変に対応してください。m(__)m

今回は以上です。

ありがとうございました。m(__)m




関連記事

【Web初心者必見】CSS が効かない時はこの7つを確認せよ!
こんにちは、管理人です。 今回は初心者必見シリーズ【CSS編】です。 初心者必見シリーズ【CSS編】では、まだコーディングに不慣れな方がCS
【超常用】要素を横並びにする方法【IE8対応】(HTML・CSS実践 )
このサイトは駆け出しのコーダーやwebデザイナーのためにテクニックをストックするサイト『TechStock(テックストック)』である。 この
【初心者向け】サイト作成に必要なツール
駆け出しのwebデザイナー、webコーダーや、これからweb業界のエンジニアを目指す方にとっては、どのソフトが良くてどのツールが便利で、、、
Live Sass Compilerでコンパイル後にインデントがスペースになってしまう時の解決策【VSCode】
Atomがサービス終了してVSCodeに乗り換えようとしていました 2022年12月15日にAtomエディタがサービス終了し、私はAtomか
【脱Atom】VSCodeでscssの出力先をcssフォルダ内にする方法
2022年12月15日にAtomエディタがサービス終了し、私を含め、コーディングエンジニアたちはAtomに替わるエディタソフトを探さなければ



コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です