<div id="contents">
<h1 class="ttl">スクロール位置によって要素を固定する<span class="code">" position:sticky; "</span></h1>
<div class="inner flexbox">
<main>
<section>
<h2 id="ttl1" class="sticky">見出し1</h2>
<p>見出し固定のサンプルコード。ここではJavaScriptを使用せずにCSSのみでスクロールに応じた見出し固定を実現しています。<code>position: sticky;</code>を指定した要素の位置までスクロールすると固定されます。</p>
<p><img src="https://placehold.jp/640x480.png" alt="" /></a></p>
<p>あのイーハトヴォのすきとおった風、夏でも底に冷たさをもつ青いそら、うつくしい森で飾られたモーリオ市、郊外のぎらぎら光る草の波。あのイーハトヴォのすきとおった風、夏でも底に冷たさをもつ青いそら、うつくしい森で飾られたモーリオ市、郊外のぎらぎら光る草の波。あのイーハトヴォのすきとおった風、夏でも底に冷たさをもつ青いそら、うつくしい森で飾られたモーリオ市、郊外のぎらぎら光る草の波。</p>
<p>見出し1はここを過ぎると固定が解除されます。</p>
</section>
<section>
<h2 id="ttl2" class="sticky">見出し2</h2>
<p>見出し2はここから固定されます。</p>
<p>親要素に<code>overflow:hidden;</code>があるとうまく動かないみたい。Internet ExplorerやEdgeでは使えないので使いどころが悩む所。</p>
<p><img src="https://placehold.jp/640x480.png" alt="" /></a></p>
<p>あのイーハトヴォのすきとおった風、夏でも底に冷たさをもつ青いそら、うつくしい森で飾られたモーリオ市、郊外のぎらぎら光る草の波。あのイーハトヴォのすきとおった風、夏でも底に冷たさをもつ青いそら、うつくしい森で飾られたモーリオ市、郊外のぎらぎら光る草の波。あのイーハトヴォのすきとおった風、夏でも底に冷たさをもつ青いそら、うつくしい森で飾られたモーリオ市、郊外のぎらぎら光る草の波。</p>
<p>見出し2はここを過ぎると固定が解除されます。</p>
</section>
<section>
<h2 id="ttl3" class="sticky">見出し3</h2>
<p>見出し3はここから固定されます。</p>
<p>テーブルなんかも<code>posisition:sticky;</code>を使えばExcelのように見出し部分を固定することだって可能。ただし、FirefoxとOperaだとバグでうまく動作しないようです。<code>border-collapse:collapse;</code>との相性が悪いらしいので、テーブルで使用する際は<code>border-collapse:separate;</code>にしておきましょう。</p>
<table>
<thead class="thead-sticky">
<tr>
<th></th>
<th>音声通話プラン</th>
<th>データSMSプラン</th>
<th>データ専用プラン</th>
<th>音声通話プラン</th>
<th>データSMSプラン</th>
<th>データ専用プラン</th>
<th>音声通話プラン</th>
<th>データSMSプラン</th>
<th>データ専用プラン</th>
</tr>
</thead>
<tbody>
<tr>
<th class="th-sticky">3GB</th>
<td>1,600円</td>
<td>1,050円</td>
<td>900円</td>
<td>1,600円</td>
<td>1,050円</td>
<td>900円</td>
<td>1,600円</td>
<td>1,050円</td>
<td>900円</td>
</tr>
<tr>
<th class="th-sticky">7GB</th>
<td>1,600円</td>
<td>1,750円</td>
<td>1,600円</td>
<td>1,600円</td>
<td>1,750円</td>
<td>1,600円</td>
<td>1,600円</td>
<td>1,050円</td>
<td>900円</td>
</tr>
<tr>
<th class="th-sticky">13GB</th>
<td>3,500円</td>
<td>2,950円</td>
<td>2,800円</td>
<td>3,500円</td>
<td>2,950円</td>
<td>2,800円</td>
<td>1,600円</td>
<td>1,050円</td>
<td>900円</td>
</tr>
<tr>
<th class="th-sticky">3GB</th>
<td>1,600円</td>
<td>1,050円</td>
<td>900円</td>
<td>1,600円</td>
<td>1,050円</td>
<td>900円</td>
<td>1,600円</td>
<td>1,050円</td>
<td>900円</td>
</tr>
<tr>
<th class="th-sticky">7GB</th>
<td>1,600円</td>
<td>1,750円</td>
<td>1,600円</td>
<td>1,600円</td>
<td>1,750円</td>
<td>1,600円</td>
<td>1,600円</td>
<td>1,050円</td>
<td>900円</td>
</tr>
<tr>
<th class="th-sticky">13GB</th>
<td>3,500円</td>
<td>2,950円</td>
<td>2,800円</td>
<td>3,500円</td>
<td>2,950円</td>
<td>2,800円</td>
<td>1,600円</td>
<td>1,050円</td>
<td>900円</td>
</tr>
<tr>
<th class="th-sticky">3GB</th>
<td>1,600円</td>
<td>1,050円</td>
<td>900円</td>
<td>1,600円</td>
<td>1,050円</td>
<td>900円</td>
<td>1,600円</td>
<td>1,050円</td>
<td>900円</td>
</tr>
<tr>
<th class="th-sticky">7GB</th>
<td>1,600円</td>
<td>1,750円</td>
<td>1,600円</td>
<td>1,600円</td>
<td>1,750円</td>
<td>1,600円</td>
<td>1,600円</td>
<td>1,050円</td>
<td>900円</td>
</tr>
<tr>
<th class="th-sticky">13GB</th>
<td>3,500円</td>
<td>2,950円</td>
<td>2,800円</td>
<td>3,500円</td>
<td>2,950円</td>
<td>2,800円</td>
<td>1,600円</td>
<td>1,050円</td>
<td>900円</td>
</tr>
<tr>
<th class="th-sticky">3GB</th>
<td>1,600円</td>
<td>1,050円</td>
<td>900円</td>
<td>1,600円</td>
<td>1,050円</td>
<td>900円</td>
<td>1,600円</td>
<td>1,050円</td>
<td>900円</td>
</tr>
<tr>
<th class="th-sticky">7GB</th>
<td>2,300円</td>
<td>1,750円</td>
<td>1,600円</td>
<td>2,300円</td>
<td>1,750円</td>
<td>1,600円</td>
<td>1,600円</td>
<td>1,050円</td>
<td>900円</td>
</tr>
<tr>
<th class="th-sticky">13GB</th>
<td>3,500円</td>
<td>2,950円</td>
<td>2,800円</td>
<td>3,500円</td>
<td>2,950円</td>
<td>2,800円</td>
<td>1,600円</td>
<td>1,050円</td>
<td>900円</td>
</tr>
<tr>
<th class="th-sticky">3GB</th>
<td>1,600円</td>
<td>1,050円</td>
<td>900円</td>
<td>1,600円</td>
<td>1,050円</td>
<td>900円</td>
<td>1,600円</td>
<td>1,050円</td>
<td>900円</td>
</tr>
<tr>
<th class="th-sticky">7GB</th>
<td>2,300円</td>
<td>1,750円</td>
<td>1,600円</td>
<td>2,300円</td>
<td>1,750円</td>
<td>1,600円</td>
<td>1,600円</td>
<td>1,050円</td>
<td>900円</td>
</tr>
<tr>
<th class="th-sticky">13GB</th>
<td>3,500円</td>
<td>2,950円</td>
<td>2,800円</td>
<td>3,500円</td>
<td>2,950円</td>
<td>2,800円</td>
<td>1,600円</td>
<td>1,050円</td>
<td>900円</td>
</tr>
</tbody>
</table>
<p>あのイーハトヴォのすきとおった風、夏でも底に冷たさをもつ青いそら、うつくしい森で飾られたモーリオ市、郊外のぎらぎら光る草の波。あのイーハトヴォのすきとおった風、夏でも底に冷たさをもつ青いそら、うつくしい森で飾られたモーリオ市、郊外のぎらぎら光る草の波。あのイーハトヴォのすきとおった風、夏でも底に冷たさをもつ青いそら、うつくしい森で飾られたモーリオ市、郊外のぎらぎら光る草の波。</p>
<p class="yohaku">そんなにスクロールしても何もないよ。フッターまで見ちゃうタイプなんですね。</p>
</section>
<!-- /#contents -->
</main>
<aside>
<div class="bnr">
<div class="sticky"><a href="#bnr"><img src="https://placehold.jp/300x250.png" alt="" /></a></div>
</div>
<div class="toc sticky">
<h2>目次</h2>
<ul class="tocList">
<li class="list"><a href="#ttl1">見出し1</a></li>
<li class="list"><a href="#ttl2">見出し2</a></li>
<li class="list"><a href="#ttl3">見出し3</a></li>
</ul>
<!-- /.toc --></div>
</aside>
<!-- /.inner.flexbox --></div>
</div>
// Google Font
@import url('https://fonts.googleapis.com/css?family=Poppins');
// mixin
$red: #f22;
$webfont: 'Poppins', sans-serif;
body {
background-color:#f2f2f2;
}
#contents {
max-width: 980px;
margin:0 auto;
background-color: #fff;
h1 {
padding: 40px 10px;
font-size: 1.5rem;
line-height: 1.5;
text-align: center;
}
.code {
display: inline-block;
margin-left: 5px;
color: $red;
font-weight: bold;
font-family: $webfont;
vertical-align: middle;
}
.flexbox {
display: -webkit-box;
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
-webkit-flex-wrap: wrap;
-ms-flex-wrap: wrap;
flex-wrap: wrap;
list-style: none;
-webkit-box-orient: horizontal;
-webkit-box-direction: normal;
-webkit-flex-direction: row;
-ms-flex-direction: row;
flex-direction: row;
-webkit-box-pack: justify;
-webkit-justify-content: space-between;
-ms-flex-pack: justify;
justify-content: space-between;
main, aside {
box-pack: justify;
-webkit-box-pack: justify;
-webkit-justify-content: space-between;
-ms-flex-pack: justify;
}
}
img {
max-width:100%;
height: auto;
}
/* ↓スクロールに応じて要素を固定↓ */
.sticky {
position: -webkit-sticky; // Safari用
position:sticky; // 要素をスクロールに応じて固定
top:0; // 縦スクロールに追従
z-index: 100; // z-indexで最前面に持ってくる
}
.thead-sticky {
position: -webkit-sticky; // Safari用
position: sticky; // 要素をスクロールに応じて固定
top: 0; // 縦スクロールに追従
z-index: 3; // z-indexで前面に持ってくる
}
.th-sticky {
position: -webkit-sticky; // Safari用
position: sticky; // 要素をスクロールに応じて固定
left: 0; // 横スクロールに追従
z-index: 2; // z-indexで前面に持ってくる
}
/* ↑スクロールに応じて要素を固定↑ */
h2 {
padding: 1em 1.25em;
line-height: 1.25;
border-top:2px solid $red;
box-shadow:0 1px 4px rgba(0,0,0,0.3);
background-color: #fff;
}
main {
flex:1;
width:48%;
section {
padding-bottom: 30px;
p.yohaku { margin-top: 2000px; }
}
p {
margin:1.25em;
line-height:1.7;
}
code {
display: inline-block;
margin: 5px;
padding: 5px 12px 3px;
background-color: #f2f2f2;
font-family: $webfont;
font-size: 13px;
color:#888;
line-height: 1.25;
vertical-align: middle;
border-radius:3px;
}
table {
width: 100%;
max-width: 680px;
height:300px;
overflow: auto;
white-space: nowrap;
display: inline-block;
overflow-x: auto;
table-layout:fixed;
box-sizing:border-box;
tr {
th, td {
position:relative;
padding:1em;
text-align:center;
vertical-align:middle;
border:1px solid #dedede;
box-sizing:border-box;
}
th {
background-color: #faebeb;
}
}
tbody {
tr:hover {
th { background-color: #fdd8d8; }
td {
background-color: #f2f2f2;
&:hover { background-color: #dedede; }
}
}
}
}
}
aside {
width: 300px;
.bnr {
height: 768px;
}
.toc {
.tocList {
margin-top: 1em;
}
.list {
a {
display: block;
padding: 0.5em 1em;
color: $red;
text-decoration: none;
}
}
}
}
// タブレット以下
@media screen and (max-width: 768px) {
.code {
display: block;
}
.flexbox {
display: block;
}
.sticky:not(h2) {
position:static;
}
main, aside {
width: auto;
}
main {
table {
max-width: 768px;
font-size: 14px;
}
}
aside {
.bnr {
position:static;
height:auto;
text-align: center;
}
.toc {
margin-top: 1.25em;
}
}
}
@media screen and (max-width: 480px) {
main table {
font-size: 12px;
}
}
}
View Compiled
This Pen doesn't use any external CSS resources.
This Pen doesn't use any external JavaScript resources.