Contact Form 7のエラー時に該当箇所へスクロールさせる方法
Contact Form 7を使用していると、エラーが発生した際にフォームの
該当箇所へ自動でスクロールさせたい場面があります。
本記事では、jQueryを使ってエラーが発生したときに適切にスクロールする方法を紹介します。
問題点
以下のコードでは、エラーが発生した際に .wpcf7-not-valid:first
の要素までスクロールしようとしていますが、いくつか問題があります。
jQuery(function ($) {
var wpcf7El = document.querySelector(".wpcf7");
wpcf7El.addEventListener("wpcf7invalid", function() {
var speed = 1000; // スクロール速度
setTimeout(function () {
var firstErrorEl = $(".wpcf7-not-valid:first");
var scrollAmount = firstErrorEl.offset().top;
$("html, body").animate({ scrollTop: scrollAmount }, speed, "swing");
}, 500);
}, false);
});
このコードの問題点
wpcf7El.addEventListener()
でイベントを追加しているが、wpcf7El
はネイティブのquerySelector()
で取得しているため、内部で jQuery ($()
) を使用する際に注意が必要。$(".wpcf7-not-valid:first")
が適切に動作しない可能性がある。setTimeout
を500ms
にしているが、エラーが表示されるタイミングによって.wpcf7-not-valid
が適用される前に処理が実行される可能性がある。
解決策:適切にスクロールする方法
以下のコードに修正することで、エラーが発生した最初の要素へ正しくスクロールすることができます。
jQuery(function ($) {
var wpcf7El = document.querySelector(".wpcf7");
if (wpcf7El) {
wpcf7El.addEventListener("wpcf7invalid", function () {
setTimeout(function () {
var firstErrorEl = $(".wpcf7-not-valid").first();
if (firstErrorEl.length) {
var scrollAmount = firstErrorEl.offset().top - 20; // スクロール位置を少し調整
$("html, body").animate({ scrollTop: scrollAmount }, 800, "swing");
}
}, 600); // エラー表示後の処理タイミングを調整
}, false);
}
});
修正ポイント
.wpcf7-not-valid:first
の取得方法を修正
→ $(".wpcf7-not-valid").first()
を使用し、最初の .wpcf7-not-valid
要素を適切に取得
エラー要素が存在するかを確認
→ if (firstErrorEl.length)
を追加し、該当要素がない場合は処理をスキップ
スクロール位置を調整
→ .offset().top - 20
にすることで、エラー要素が少し上にくるように補正
setTimeout
を 600ms に変更
→ 500ms
→ 600ms
に調整し、エラー表示が確実に反映されるように
追従のヘッダーがある場合
jQuery(function ($) {
var wpcf7El = document.querySelector(".wpcf7");
if (wpcf7El) {
wpcf7El.addEventListener("wpcf7invalid", function () {
setTimeout(function () {
var firstErrorEl = $(".wpcf7-not-valid").first();
if (firstErrorEl.length) {
var headerHeight = $(".fixed-header").outerHeight() || 0; // ヘッダーの高さを取得(クラス名を適宜変更)
var scrollAmount = firstErrorEl.offset().top - headerHeight - 20; // ヘッダー分を引いて調整
$("html, body").animate({ scrollTop: scrollAmount }, 800, "swing");
}
}, 600);
}, false);
}
});
ポイント
ヘッダーの高さを考慮
$(".fixed-header").outerHeight()
で ヘッダーの高さを取得- ヘッダーの高さが
0
の場合(追従ヘッダーがない場合)でも問題なく動作
スクロール位置を調整
firstErrorEl.offset().top - headerHeight - 20
とすることで、ヘッダーの下に隠れないようにする-20
は少し余裕を持たせるための調整
ヘッダーのクラスを適宜変更
- 上記のコードでは
.fixed-header
を想定していますが、実際のヘッダーのクラス名に変更してください(例:.site-header
など)
動作確認
このコードを functions.js
などに記述し、Contact Form 7 のフォームをエラーが出る状態にして送信ボタンを押します。エラー発生後、自動で該当箇所までスクロールされることを確認してください。
この方法を活用することで、ユーザーがエラーをすぐに認識でき、より快適なフォーム体験を提供できます。ぜひ実装してみてください!
Contact Form 7 でお支払い方法に応じた送付先の動的表示とメール送信内容の変更
2月 27, 2025Contact Form 7で選択項目によって必須項目を切り替える方法
2月 25, 2025WordPressのカスタムフィールドを使って投稿の優先順位を設定する方法
2月 6, 2025