【Framer】営業防止!フォームで文字数制限し、ボタンを押せなくする方法!

Framer

2025/06/10

企業サイトに設置している問い合わせフォーム、営業メールばかり来て困っていませんか?
今回は、Framer上で文字数制限を設けて、営業っぽい長文が送信できないようにする方法をご紹介します! Framerはデザイン性が高く簡単にWebサイトを構築できますが、Code Overrideを使うことで実用的なバリデーションも実装可能です。

この記事でできること

  • Textarea に文字数制限を設定

  • 入力が一定文字数を超えたら送信ボタンが押せなくなる

  • 視覚的にもボタンが無効(opacity: 0.5)になる

  • ボタン幅は 100% を維持(デザインが崩れない)

使用する要素と目的

要素目的Textarea入力フィールド(例:お問い合わせ内容)Button送信ボタンCode Override入力文字数によってボタンの挙動を制御

実装コード(そのまま使えます)

tsxコピーする編集するimport { Override } from "framer"
import { useState } from "react"

let setDisabledState: (v: boolean) => void

export function TextareaOverride(): Override {
  return {
    onChange: (e) => {
      const value = e.target.value
      const overLimit = value.length > 10 // ←文字数制限(ここを調整)
      if (setDisabledState) {
        setDisabledState(overLimit)
      }
    },
  }
}

export function ButtonOverride(): Override {
  const [isDisabled, setIsDisabled]

Framerでの使い方

  1. Textarea コンポーネントを選択し、TextareaOverride を適用

  2. Button コンポーネントに ButtonOverride を適用

  3. Framer上でボタンの Widthプロパティは「Fill(親幅いっぱい)」に設定

活用シーンの例

  • スパム営業対策として「長文が送れない」仕組みを追加

  • 無駄な問い合わせを事前にブロック

  • フォームを送る前に「簡潔に要件をまとめてください」と暗黙のメッセージを伝えられる

応用アイデア

  • 特定のキーワード(例:「営業」「御社」「代理店」)を含むと送信不可にする

  • 文字数だけでなく 文字数が極端に少ない場合(例:3文字以下) もブロック

  • エラーメッセージを表示してユーザーにフィードバック

まとめ

Framerはデザインだけでなく、ちょっとしたロジックも CodeOverride を使えば簡単に組み込めます。
スパム防止やUX向上のために、こうした細かな実装もどんどん活用していきましょう!


追記

import { Override } from "framer"
import { useState, useEffect, useRef } from "react"

const MAX_LENGTH = 10

let setDisabledState: (v: boolean) => void

// ✅ Textareaのロジック + スタイル制御
export function TextareaOverride(): Override {
    const ref = useRef<HTMLTextAreaElement>(null)
    const [isOverLimit, setIsOverLimit] = useState(false)
    setDisabledState = setIsOverLimit

    useEffect(() => {
        const el = ref.current
        if (!el) return

        const handleInput = (e: any) => {
            const value = e.target.value
            const over = value.length > MAX_LENGTH
            setIsOverLimit(over)

            el.style.border = over ? "2px solid red" : ""
            el.style.backgroundColor = over ? "#ffecec" : ""
        }

        el.addEventListener("input", handleInput)
        return () => el.removeEventListener("input", handleInput)
    }, [])

    return {
        ref,
    }
}

// ✅ Buttonのスタイル制御(そのまま流用)
export function ButtonOverride(): Override {
    const [isDisabled, setIsDisabled] = useState(false)
    setDisabledState = setIsDisabled

    return {
        whileTap: isDisabled ? {} : { scale: 0.95 },
        style: {
            opacity: isDisabled ? 0.5 : 1,
            pointerEvents: isDisabled ? "none" : "auto",
            width: "100%",
        },
    }
}

これで、赤枠までつきます!


編集者

デザイナズ編集部

デザイナズはデザインで世界を生き生きとさせるとモットーにお客様のブランディング強化のお手伝いをさせていただいております。
ホームページ制作やアプリケーション制作を得意としています。