グリッドレイアウトの各列を個別にスクロールしたい。
現在、モバイル専用のWebアプリケーションを開発しています。縦向きと横向きに異なるグリッドレイアウトを使用したい。
縦向きは1列だけで、すべての要素が次々に並んでいます。ここで問題ありません。
横向きでは2列を使用します。コンテンツ全体が左側に表示され、ナビゲーションが右側に移動します。今、私は両方の部分に別々のスクロールを持たせたいです。これを実装する方法はありますか?また、現在の列のコンテンツが終了すると、スクロールが停止します。
CodePenのコード: https://codepen.io/SuddenlyRust/pen/rmJOqV
.grid-container {
display: grid;
grid-template-columns: 1fr;
grid-template-rows: 1fr;
grid-gap: 15px 0;
}
header {
background-color: green;
grid-column: 1;
grid-row: 1
}
main {
background-color: blue;
grid-column: 1;
grid-row: 2;
}
nav {
background-color: pink;
grid-column: 1;
grid-row: 3;
}
footer {
background-color: teal;
grid-column: 1;
grid-row: 4;
}
@media only screen and (orientation: landscape) {
.grid-container {
grid-template-columns: 5fr 4fr;
}
nav {
grid-column: 2;
grid-row: 1 / span 3;
}
footer {
grid-row: 3;
}
}
h1 {
min-height: 200px;
}
<div class="grid-container">
<header>
<h1>Logo</h1>
</header>
<main>
<h1>content</h1>
</main>
<nav>
<h1>Navigation</h1>
</nav>
<footer>
<h1>Footer</h1>
</footer>
</div>
お時間をいただきありがとうございます!
横向きで2列使用したいと思います。コンテンツ全体が左側に表示され、ナビゲーションが右側に移動します。今、私は両方の部分に別々のスクロールを持たせたいです。これを実装する方法はありますか?また、現在の列のコンテンツが終了すると、スクロールが停止します。
左側の列には、header
、main
、footer
の3つのグリッド項目があります。
右側の列には、nav
要素という1つのグリッド項目があります。
垂直または水平のスクロールバーを左の列に追加することは、3つの個別の要素があるため実行できません。単一のスクロールバーを機能させるには、コンテナ内のすべての要素をラップする必要があります。
要素が1つしかないため、垂直または水平のスクロールバーを右側の列に追加するのは簡単です。
垂直スクロールバーについて話していると仮定して、それを機能させる1つの方法を次に示します。
body {
margin: 0;
}
.grid-container {
display: grid;
grid-template-columns: 1fr;
grid-template-rows: 1fr;
grid-gap: 15px 0;
height: 100vh;
}
header {
background-color: green;
grid-column: 1;
grid-row: 1
}
main {
background-color: blue;
grid-column: 1;
grid-row: 2;
}
nav {
background-color: pink;
grid-column: 1;
grid-row: 3;
overflow: auto;
}
footer {
background-color: teal;
grid-column: 1;
grid-row: 4;
}
@media only screen and (orientation: landscape) {
.grid-container {
grid-template-columns: 5fr 4fr;
grid-template-rows: 1fr 1fr 1fr;
}
nav {
grid-column: 2;
grid-row: 1 / span 3;
}
footer {
grid-row: 3;
}
}
<div class="grid-container">
<header>
<h1>Logo</h1>
</header>
<main>
<h1>content</h1>
</main>
<nav>
<h1>Navigation<br><br>nav item<br>nav item<br>nav item<br>nav item<br>nav item<br>nav item<br>nav item<br>nav item<br>nav item<br>nav item<br>nav item<br>nav item<br>nav item<br>nav item<br>nav item<br>nav item<br>nav item<br>nav item<br>nav item<br>nav item<br>nav item<br>nav item<br>nav item<br>nav item<br>nav item<br>nav item<br>nav item<br>nav item<br>nav item<br>nav item<br>nav item<br>nav item<br>nav item<br>nav item<br>nav item<br>nav item<br>nav item<br>nav item<br>nav item<br>nav item<br>nav item<br>nav item<br>nav item<br>nav item<br>nav item<br>nav item<br></h1>
</nav>
<footer>
<h1>Footer</h1>
</footer>
</div>
CSSグリッドのブラウザーサポート
これが全体像です: http://caniuse.com/#search=grid
以前の質問に対する私の回答 からの拡張バージョンは、flexbox
を使用してヘッダー/コンテンツ/メインとナビゲーションの両方のスクロールを取得する方法です。
スタックスニペット
(function(d, timeout) {
window.addEventListener("load", function() {
resizeHandler();
}, false);
window.addEventListener("resize", function() {
if (!timeout) {
timeout = setTimeout(function() {
timeout = null;
// do resize stuff
resizeHandler();
}, 66);
}
}, false);
function resizeHandler() {
if (window.innerHeight < window.innerWidth) {
if (!(d.body.classList.contains('landscape'))) {
d.body.classList.add('landscape');
d.body.appendChild(d.querySelector('nav'));
}
} else {
if (d.body.classList.contains('landscape')) {
d.body.classList.remove('landscape')
d.querySelector('section').appendChild(d.querySelector('nav'));
}
}
}
}(document));
html, body {
margin:0;
}
header, footer, main, nav {
margin: 5px;
padding: 5px;
border-radius: 5px;
min-height: 120px;
border: 1px solid #eebb55;
background: #ffeebb;
}
footer {
order: 2;
}
nav {
order: 1;
}
section {
display: flex;
flex-direction: column;
}
@media only screen and (orientation: landscape) {
main div {
height: 400px;
border: 1px dashed red;
}
nav div {
height: 800px;
border: 1px dashed red;
}
body.landscape {
display: flex;
}
section {
display: block;
width: calc(60% - 10px); /* 10px is for the margin */
box-sizing: border-box;
max-height: calc(100vh - 20px);
overflow: auto;
}
nav {
width: calc(40% - 10px); /* 10px is for the margin */
box-sizing: border-box;
max-height: calc(100vh - 20px);
overflow: auto;
}
}
<section>
<header>header</header>
<main>content
<div>
This div get a height when in landscape to show scroll in section
</div>
</main>
<footer>footer</footer>
<nav>navigation
<div>
This div get a height when in landscape to show scroll in nav
</div>
</nav>
</section>