Grid Layout を使用して、2つのdiv:#container
と#left
の親である#right
divを使用して簡単なサイトを作成しました。
左の列を修正する方法はありますか?左のテキストをその位置に保持し、右のテキストを現在のままスクロールできるようにしたいと思います。 position: fixed
を#left
に追加すると、レイアウトが壊れます。
この質問はすでに解決されていることは承知していますが、グリッドレイアウトで動作させる方法を評価したいと思います。
ありがとう。
body {
margin: 0 0 0 0;
}
#container {
display: grid;
grid-template-columns: 50% 50%;
}
.section {
padding: 5% 5% 5% 5%;
}
#left {
background-color: aquamarine;
}
#right {
background-color: beige;
}
<div id="container">
<div id="left" class="section">
<p>This should not scroll</p>
</div>
<div id="right" class="section">
<p>
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla aliquet consectetur purus nec volutpat. Donec vel libero nec est commodo facilisis vel et nisl. Praesent porta sed eros eu porta. Cras dolor nulla, ullamcorper et tincidunt quis, porta ut
tellus. Maecenas cursus libero sed accumsan luctus. Integer sed consequat ante. Morbi sit amet lectus tempor elit tempor cursus ut sed enim. Donec placerat bibendum volutpat.
</p>
<p>
Nunc sit amet eleifend sapien, sed tincidunt neque. Donec id sapien et nunc scelerisque iaculis dignissim nec mauris. Fusce at pretium nulla. Maecenas vel rutrum tellus, a viverra nunc. Aenean at arcu vitae dui faucibus dapibus. Vivamus hendrerit blandit
mollis. Aenean sit amet lectus a metus faucibus condimentum. Proin vel eros ut elit pharetra lacinia vitae eu orci. Etiam massa massa, aliquam at pulvinar ut, porttitor eu mauris. Ut in iaculis sapien.
</p>
<p>
In vitae rhoncus arcu. Maecenas elementum nunc quis magna finibus, vitae imperdiet diam pulvinar. Phasellus sit amet nibh eu massa facilisis luctus. Nulla ullamcorper sodales ante id vestibulum. Fusce felis nisi, lacinia sit amet mauris vel, euismod suscipit
neque. Mauris quis libero eget enim facilisis pharetra. Fusce non ligula auctor nunc pretium dignissim eget eget turpis. Nam ultricies dolor ac libero maximus vestibulum. Mauris et tortor vitae nisi ultrices vestibulum ac id mauris. Proin interdum
dapibus sollicitudin. Phasellus ultricies vulputate sem id hendrerit. Cras eget posuere nunc, in placerat velit. Pellentesque sed ante at elit ornare efficitur. Donec sed condimentum nisl. Curabitur dapibus leo id ligula dignissim pharetra.
</p>
</div>
</div>
あなたが書いた:
左の列を修正する方法はありますか?
グリッドレイアウトで動作させる方法をいただければ幸いです。
要素をグリッドアイテムのままにする場合、答えは「いいえ」です。
要素にposition: absolute
またはposition: fixed
( これは絶対位置の形式であり、ビューポートを参照 )があれば、新しい特性を取ります:
仕様から:
グリッドコンテナの絶対位置の子は、グリッドアイテムではなくフロー外にあるため、他のアイテムの配置やグリッドのサイズ設定には影響しません。
したがって、grid itemは絶対配置ではうまく機能しません。
ただし、position: fixed
をgrid containerに適用しても問題はありません。
#left
要素と#right
要素を別々に管理することを検討してください。 #left
は、固定位置のグリッドコンテナにすることができます。 #right
は別のグリッドコンテナにでき、インフローのままにできます。
また、余談ですが、グリッドアイテムにパーセントベースのパディングを指定しました。
.section {
padding: 5% 5% 5% 5%;
}
margin
およびpadding
をグリッドアイテム(およびフレックスアイテム)に適用する場合は、パーセント単位から離れることをお勧めします。ブラウザは値を異なる方法で計算する場合があります。
これらのCSSルールをID #leftに追加することでこれを実現できます。
position: sticky; // See link
top: 0; //to make it stick to the top of the screen
height: 100vh; // make the height equal to 100 view height
スティッキー位置のリンク: CSSのみのあるスティッキー位置
stickyは、CSS3 Layout Module Specの一部として追加されたpositionプロパティの新しい値です。ドキュメントフローから何も削除しないという点で、相対的な配置と同様に機能します。つまり、スティッキー要素は、隣接する要素の位置には影響せず、親要素を折りたたむことはありません。
それがあなたを助けることを願っています
編集(ジャンプの動作を修正)
ページの最後で左の部分が跳ね上がるのを避けるために、ID #leftに次のCSSルールを追加します。
box-sizing: border-box;
更新されたコードスニペットをご覧ください。
body {
margin: 0 0 0 0;
}
#container {
display: grid;
grid-template-columns: 50% 50%;
}
.section {
padding: 5% 5% 5% 5%;
}
#left {
background-color: aquamarine;
position: sticky;
top: 0;
height: 100vh;
box-sizing: border-box;
}
#right {
background-color: beige;
}
<div id="container">
<div id="left" class="section">
<p>This should not scroll</p>
</div>
<div id="right" class="section">
<p>
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla aliquet consectetur purus nec volutpat. Donec vel libero nec est commodo facilisis vel et nisl. Praesent porta sed eros eu porta. Cras dolor nulla, ullamcorper et tincidunt quis, porta ut tellus. Maecenas cursus libero sed accumsan luctus. Integer sed consequat ante. Morbi sit amet lectus tempor elit tempor cursus ut sed enim. Donec placerat bibendum volutpat.
</p>
<p>
Nunc sit amet eleifend sapien, sed tincidunt neque. Donec id sapien et nunc scelerisque iaculis dignissim nec mauris. Fusce at pretium nulla. Maecenas vel rutrum tellus, a viverra nunc. Aenean at arcu vitae dui faucibus dapibus. Vivamus hendrerit blandit mollis. Aenean sit amet lectus a metus faucibus condimentum. Proin vel eros ut elit pharetra lacinia vitae eu orci. Etiam massa massa, aliquam at pulvinar ut, porttitor eu mauris. Ut in iaculis sapien.
</p>
<p>
In vitae rhoncus arcu. Maecenas elementum nunc quis magna finibus, vitae imperdiet diam pulvinar. Phasellus sit amet nibh eu massa facilisis luctus. Nulla ullamcorper sodales ante id vestibulum. Fusce felis nisi, lacinia sit amet mauris vel, euismod suscipit neque. Mauris quis libero eget enim facilisis pharetra. Fusce non ligula auctor nunc pretium dignissim eget eget turpis. Nam ultricies dolor ac libero maximus vestibulum. Mauris et tortor vitae nisi ultrices vestibulum ac id mauris. Proin interdum dapibus sollicitudin. Phasellus ultricies vulputate sem id hendrerit. Cras eget posuere nunc, in placerat velit. Pellentesque sed ante at elit ornare efficitur. Donec sed condimentum nisl. Curabitur dapibus leo id ligula dignissim pharetra.
</p>
</div>
</div>
このようなことができます
これが fiddle です
ここにコードがあります
body {
margin: 0 0 0 0;
}
#container {
display: grid;
}
.section {
padding: 5% 5% 5% 5%;
}
#left {
background-color: aquamarine;
height: 100%;
position: fixed;
width: 50%
}
#right {
background-color: beige;
overflow: scroll;
width: 50%;
right: 0;
position: absolute;
}
左をスティッキーにすることはできませんが、その中のすべてのコンテンツをスティッキーにすることができます。このためには、次のようにスティッキーラッパー要素を作成し、その中にすべてのコンテンツを配置する必要があります。
HTML:
<div class="grid">
<div class="left">
<div class="sticky_wrapper">Content</div>
</div>
<div class="right">
Content
</div>
</div>
CSS:
.grid { display: grid; grid-template-columns: 50% 50%; }
.left { background-color: aquamarine; }
.right { background-color: beige; }
.sticky_wrapper { position: sticky; top: 0; }
そのため、スティッキーラッパーのすべてのコンテンツはスクロールしません。
スクロールするパネルを右パネルにもう1つdivを追加し、_max-height
およびoverflow: auto;
そのため、左パネルは固定され、右パネルのコンテンツはスクロールします。
body {
margin: 0 0 0 0;
}
#container {
display: grid;
grid-template-columns: 50% 50%;
}
.section {
padding: 5% 5% 5% 5%;
}
#left {
background-color: aquamarine;
}
#right {
background-color: beige;
}
.scroll-div {
max-height: 300px;
overflow: auto;
}
<div id="container">
<div id="left" class="section">
<p>This should not scroll</p>
</div>
<div id="right" class="section">
<div class="scroll-div">
<p>
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla aliquet consectetur purus nec volutpat. Donec vel libero nec est commodo facilisis vel et nisl. Praesent porta sed eros eu porta. Cras dolor nulla, ullamcorper et tincidunt quis, porta ut tellus. Maecenas cursus libero sed accumsan luctus. Integer sed consequat ante. Morbi sit amet lectus tempor elit tempor cursus ut sed enim. Donec placerat bibendum volutpat.
</p>
<p>
Nunc sit amet eleifend sapien, sed tincidunt neque. Donec id sapien et nunc scelerisque iaculis dignissim nec mauris. Fusce at pretium nulla. Maecenas vel rutrum tellus, a viverra nunc. Aenean at arcu vitae dui faucibus dapibus. Vivamus hendrerit blandit mollis. Aenean sit amet lectus a metus faucibus condimentum. Proin vel eros ut elit pharetra lacinia vitae eu orci. Etiam massa massa, aliquam at pulvinar ut, porttitor eu mauris. Ut in iaculis sapien.
</p>
<p>
In vitae rhoncus arcu. Maecenas elementum nunc quis magna finibus, vitae imperdiet diam pulvinar. Phasellus sit amet nibh eu massa facilisis luctus. Nulla ullamcorper sodales ante id vestibulum. Fusce felis nisi, lacinia sit amet mauris vel, euismod suscipit neque. Mauris quis libero eget enim facilisis pharetra. Fusce non ligula auctor nunc pretium dignissim eget eget turpis. Nam ultricies dolor ac libero maximus vestibulum. Mauris et tortor vitae nisi ultrices vestibulum ac id mauris. Proin interdum dapibus sollicitudin. Phasellus ultricies vulputate sem id hendrerit. Cras eget posuere nunc, in placerat velit. Pellentesque sed ante at elit ornare efficitur. Donec sed condimentum nisl. Curabitur dapibus leo id ligula dignissim pharetra.
</p>
</div>
</div>
</div>
同じ問題が少しありました。スクロール可能なコンテンツ(col 2)を持つ固定sidenav(col 1)が必要でした。ここで私が問題を解決した方法を示します(styled-componentを使用していますが、通常のcss、sass、less、その他何でも確実に実行できます)。
<Grid>
<SideNav>
<Sider>
</SideNav>
<Content />
<Grid>
これらのスタイル付きコンポーネントのそれぞれのcssプロパティ:
const Grid = styled.div`
position: relative;
display: grid;
height: 100%;
grid-template-columns: auto 1fr;
grid-template-areas: 'sidenav content';
`
const Sidenav = styled.div`
position: relative;
grid-area: sidenav;
`
const Content = styled.div`
position: relative;
grid-area: content;
width: 100%;
`
const Sider = styled.aside`
position: fixed;
height: 100vh;
`
このように見えますが、グリッドにヘッダーとフッターもあり、サイドナブは折りたたみ可能であるため、もう少し複雑です。しかし、これはあなたのために働くと思います。
これを試して:
body {
margin: 0 0 0 0;
}
#container {
display: grid;
grid-template-columns: 50% 50%;
}
.section {
padding: 5% 5% 5% 5%;
}
#left {
background-color: aquamarine;
p {
position: fixed;
}
}
#right {
background-color: beige;
}