作成したものの実際には使わなかったコードをスニペットとして残しておきます。
必要な方がいらっしゃいましたらお気軽にご利用ください。
動作としては、特定のidに差し掛かったら自動的に表示されるという動きです。
※コードに関するご質問や修正の依頼はお受けいたしかねます。
もし、修正が必要ならChatGPTに聞くのが良いです。
実際の動き
右側の部分をスクロールすると、セクション2に差し掛かったタイミングでLINEに送るためのブロックが表示されます。
See the Pen Untitled by sakabonji (@-hiro60) on CodePen.
HTML
<!-- LINEに送る -->
<div class="line-reminder line-reminder--mobile">
<button type="button" class="line-reminder__close" aria-label="このメッセージを閉じる">×</button>
<p class="line-reminder__title">
見出し的な部分
</p>
<p class="line-reminder__text">
説明的な部分
</p>
<a
href="LINEのシェアURL"
class="line-reminder__button"
target="_blank"
rel="noopener"
>
LINEで自分に送る
</a>
<p class="line-reminder__note">
※ご自身のLINEに、このページのURLだけが送信されます。こちらから営業メッセージが届くことはありませんのでご安心ください。
</p>
</div>CSS
/* =====================
LINEに送る
===================== */
/* 基本は非表示にしておく(PCなど) */
.line-reminder {
display: none;
}
/* スマホでだけ表示 */
@media (max-width: 768px) {
.line-reminder--mobile {
display: block;
padding: 14px 16px 12px;
background-color: #fff;
border-radius: 12px;
border: 1px solid #e5e5e5;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.08);
font-size: 13px;
line-height: 1.6;
box-sizing: border-box;
opacity: 0;
transform: translateY(20px);
pointer-events: none;
}
.line-reminder__title {
margin: 0 0 6px;
font-size: 14px;
font-weight: 600;
}
.line-reminder__button {
display: block;
padding: 10px 14px;
text-align: center;
font-size: 13px;
font-weight: 600;
text-decoration: none;
border-radius: 999px;
background-color: #06c755; /* LINEっぽいグリーン */
color: #ffffff;
box-shadow: 0 3px 8px rgba(0, 0, 0, 0.12);
}
.line-reminder__button:hover {
opacity: 0.95;
}
.line-reminder__button:active {
transform: translateY(1px);
box-shadow: 0 2px 5px rgba(0, 0, 0, 0.16) inset;
}
.line-reminder__note {
margin: 0;
font-size: 11px;
color: #777777;
}
.line-reminder__close {
position: absolute;
top: 6px;
right: 8px;
border: none;
background: transparent;
font-size: 16px;
line-height: 1;
padding: 0;
color: #999;
}
.line-reminder__close:active {
transform: scale(0.95);
}
/* is-floating 状態では position: fixed で画面下に固定される */
.line-reminder--mobile.is-floating {
position: fixed;
left: 12px;
right: 12px;
bottom: 12px;
margin: 0;
z-index: 50;
opacity: 0;
transform: translateY(16px);
transition: opacity 1.00s ease, transform 1.00s ease;
pointer-events: none;
}
.line-reminder--mobile.is-floating.is-visible {
opacity: 1;
transform: translateY(0);
pointer-events: auto;
}
}JavaScript
// LINEに送るブロック
document.addEventListener('DOMContentLoaded', function () {
const reminder = document.querySelector('.line-reminder--mobile');
const trigger = document.getElementById('表示基準となるid名');
// 安全チェック
if (!reminder || !trigger) return;
// スマホのみ
if (window.innerWidth > 768) return;
// まず固定表示モードにする(透明)
reminder.classList.add('is-floating');
let shown = false;
function checkShow() {
if (shown) return;
const triggerRect = trigger.getBoundingClientRect();
const winHeight = window.innerHeight;
// 表示基準となるid名の上部が画面内に少し入ったら表示
if (triggerRect.top < winHeight - 50) {
reminder.classList.add('is-visible');
shown = true;
}
}
// スクロール時にチェック
window.addEventListener('scroll', checkShow, { passive: true });
// リロード後の位置でもチェック
checkShow();
// ×ボタンで閉じる
const closeBtn = reminder.querySelector('.line-reminder__close');
if (closeBtn) {
closeBtn.addEventListener('click', function (e) {
e.preventDefault();
reminder.classList.remove('is-visible');
});
}
});

コメント