こんにちは、プログラマーの山本です。

今回は5つの質問に「はい」か「いいえ」で答えていただき、
「はい」の数に応じて結果を変える占い・診断ツールを制作しました。

同様のシステムが必要な方は参考にしてください。

答えを「はい」「いいえ」以外でも、
応用してコードをいじれば制作する事ができると思います。

今回のシステムのデモはこちらです。

HTMLで占いの質問文と回答、結果を作成する

まずは以下のコードを追加しましょう。

WordPressなら、固定ページのコンテンツ部分などに追加してOKです。

<div class="dia_wrapper">
<div id="dia_0">
<div class="dia_h1">あなたの◯◯を診断する</div>
<div class="dia_h2">◯◯チェック診断</div>
<div class="dia_h3">この診断では、◯◯◯◯がわかります。<br />直感であまり深く考えこまずテンポよく回答してください。</div>
<div class="dia_answer">
<div class="dia_start">診断START</div>
</div>
</div>
<div id="dia_1" style="display: none;">
<div class="dia_question">質問1◯◯</div>
<div class="dia_answer">
<div class="dia_yes">はい</div>
<div class="dia_no">いいえ</div>
</div>
</div>
<div id="dia_2" style="display: none;">
<div class="dia_question">質問2◯◯</div>
<div class="dia_answer">
<div class="dia_yes">はい</div>
<div class="dia_no">いいえ</div>
</div>
</div>
<div id="dia_3" style="display: none;">
<div class="dia_question">質問3◯◯</div>
<div class="dia_answer">
<div class="dia_yes">はい</div>
<div class="dia_no">いいえ</div>
</div>
</div>
<div id="dia_4" style="display: none;">
<div class="dia_question">質問4◯◯</div>
<div class="dia_answer">
<div class="dia_yes">はい</div>
<div class="dia_no">いいえ</div>
</div>
</div>
<div id="dia_5" style="display: none;">
<div class="dia_question">質問5◯◯</div>
<div class="dia_answer">
<div class="dia_yes">はい</div>
<div class="dia_no">いいえ</div>
</div>
</div>
<div id="dia_res_a" style="display: none;">
<div class="dia_res_h">診断結果</div>
<div class="dia_result">結果1</div>
<div class="dia_description">◯◯◯◯</div>
</div>
<div id="dia_res_b" style="display: none;">
<div class="dia_res_h">診断結果</div>
<div class="dia_result">結果2</div>
<div class="dia_description">◯◯◯◯</div>
</div>
<div id="dia_res_c" style="display: none;">
<div class="dia_res_h">診断結果</div>
<div class="dia_result">結果3</div>
<div class="dia_description">◯◯◯◯</div>
</div>
</div>
<div id="reload">最初からやり直す</div>

今回は5つの質問で、
「はい」の数によって3つの結果を切り替えて表示します。

CSSで診断ツールのデザインを整える

使用した一通りのデザインを載せておきます。

今回はクライアント様のご希望で、
このツールを複数のエリアで使いまわしたいとのことだったので、

通常のレスポンシブデザインではなく、
設置した要素の横幅に応じてデザインを変えるようにしています。

.dia_wrapper{
  max-width:960px;
  margin:0 auto;
  background-color:#FAF9F4;
  box-shadow: 1px 3px 10px rgb(0 0 0 / 10%);
  padding:50px 40px;
}
.dia_h1{
  font-size:25px;
  text-align: center;
}
.dia_h2{
  font-size:40px;
  text-align: center;
  color: #ff878a;
  margin: 30px 0;
  line-height: 1;
}
.dia_h3{
  font-size:18px;
  text-align: center;
  border-top: 1px solid #000;
  padding: 20px 0;
  line-height: 1.5;
}
.dia_start,.dia_yes,.dia_no,#reload{
  user-select: none;
  -moz-user-select: none;
  -webkit-user-select: none;
  -ms-user-select: none;
}
.dia_start{
  cursor: pointer;
  position: relative;
  max-width: 700px;
  margin: 0 auto;
  text-align: center;
  background: #ff878a;
  width: 100%;
  font-size: 32px;
  letter-spacing: .2em;
  margin-bottom: 0px;
  display: block;
  box-shadow: 1px 3px 10px rgb(0 0 0 / 10%);
  color: #fff !important;
  line-height: 90px;
  border-radius: 45px;
  transition: all 0.5s ease 0s;
}
.dia_start:after{
  position: absolute;
  content: "";
  background-image: url(../sys/sindan-btn.png);
  width: 40px;
  height: 40px;
  right: 25%;
  top: calc(50% - 20px);
  background-size: contain;
  background-repeat: no-repeat;
}
.dia_question{
  max-width: 950px;
  position: relative;
  padding-left: 70px;
  font-size: 32px;
  margin-bottom: 50px;
  line-height: 48px;
}
.dia_question:before{
  content: "Q";
  background: #b69e84;
  position: absolute;
  color: #fff;
  height: 50px;
  width: 50px;
  font-size: 28px;
  border-radius: 50%;
  position: absolute !important;
  left: 0;
  text-align: center;
  line-height: 50px;
  top: 0;
}
.dia_answer{ width:100%; text-align:center; }
.dia_yes,.dia_no{
  cursor: pointer;
  width: 45%;
  max-width: 350px;
  display:inline-block;
  background: #fff;
  text-decoration: none;
  color: #333;
  box-shadow: 1px 3px 10px rgb(0 0 0 / 10%);
  border: 2px solid #ff878a;
  border-radius: 45px;
  font-size: 40px;
  text-align: center;
  line-height: 90px;
  color: #ff878a;
  transition: all 0.5s ease 0s;
}
.dia_yes{
  margin: 0 4% 0 0;
}
#dia_res{
  text-align: center;
  margin: 40px 0 0;
  padding: 20px 0 0 0;
  border-top: 1px solid #000;
}
.dia_res_h{
  font-size:30px;
  position: relative;
  text-align:center;
  line-height: 1;
}
.dia_res_h span{
  background-color:#FAF9F4;
  padding:0 20px;
}
.dia_res_h:before,
.dia_res_h:after {
  border: 1px solid;
  position: absolute;
  top: 15px;
  width: 40%;
  content: "";
}
.dia_res_h:before {
  left: 0px;
}
.dia_res_h:after {
  right: 0px;
}
.dia_result{
  font-size:45px;
  line-height: 1.2;
  background: linear-gradient(transparent 55%, #fff68e 50%);
  width: fit-content;
  margin: 30px auto 40px;
}
.dia_description{
  font-size:20px;
  line-height: 1.5;
}
#dia_res a{
  display: block;
  box-shadow: 1px 3px 10px rgb(0 0 0 / 10%);
  max-width: 450px;
  background-color: #b69e84 !important;
  font-size: 24px;
  color: #fff;
  margin: 10px auto;
  border-radius: 45px;
  line-height: 60px;
  letter-spacing: 5px;
}
#dia_res span{
  color:#ff878a;
  position: relative;
}
#dia_res span:before{
  transform: rotate(-25deg);
  border: 1px solid #aaa;
  position: absolute;
  width: 1px;
  content: "";
  height: 20px;
  left: -15px;
  top: -2px;
}
#dia_res span:after{
  transform: rotate(25deg);
  border: 1px solid #aaa;
  position: absolute;
  width: 1px;
  content: "";
  height: 20px;
  right: -12px;
  top: -2px;
}
#reload,#reload2{
  cursor: pointer;
  text-decoration: underline;
  color: #b69e84;
  text-align: center;
  margin: 30px 0 0;
}
.dia_size2 .dia_h1{
  font-size:22px;
}
.dia_size2 .dia_h2{
  font-size:34px;
}
.dia_size3 .dia_h1{
  font-size:22px;
}
.dia_size3 .dia_h2{
  font-size:32px;
}
.dia_size3 .dia_h3{
  font-size:15px;
}
.dia_size4 .dia_h1{
  font-size:16px;
}
.dia_size4 .dia_h2{
  font-size:22px;
}
.dia_size4 .dia_h3{
  font-size:13px;
}
.dia_size3,.dia_size4{
  padding: 20px;
}
.dia_size2 .dia_start{
  font-size: 30px;
}
.dia_size2 .dia_start:after{
  left: calc(50% + 120px)
}
.dia_size3 .dia_start{
  font-size: 25px;
}
.dia_size3 .dia_start:after{
  left: calc(50% + 90px);
  width: 30px;
  top: 30px;
}
.dia_size4 .dia_start{
  font-size: 20px;
    line-height: 65px;
}
.dia_size4 .dia_start:after{
  left: calc(50% + 70px);
  width: 30px;
  top: 17px;
}
.dia_size2 .dia_yes,
.dia_size2 .dia_no,
.dia_size3 .dia_yes,
.dia_size3 .dia_no{
  font-size:30px;
  line-height: 70px;
}
.dia_size2 .dia_question,
.dia_size3 .dia_question{
  font-size:28px;
}
.dia_size4 .dia_yes,
.dia_size4 .dia_no{
  font-size:25px;
  line-height: 55px;
}
.dia_size4 .dia_question{
  font-size:20px;
  padding-left:40px;
}
.dia_size4 .dia_question:before{
  height: 35px;
  width: 35px;
  font-size: 20px;
  line-height: 35px;
}
.dia_size2 .dia_res_h:before,
.dia_size2 .dia_res_h:after{
  width:32%;
}
.dia_size3 .dia_res_h:before,
.dia_size3 .dia_res_h:after,
.dia_size4 .dia_res_h:before,
.dia_size4 .dia_res_h:after{
  width:25%;
}
.dia_size3 .dia_result{
  font-size: 35px;
}
.dia_size3 #dia_res span{
  font-size:12px;
}
.dia_size4 .dia_result{
  font-size: 30px;
}
.dia_size4 #dia_res span{
  font-size:10px;
}
.dia_size4 #dia_res a{
  font-size:20px;
  letter-spacing: 1px;
}

JavaScriptで占い・診断画面の表示を制御する

いよいよJavaScriptを書いていきます。

開発コストを下げるために、jQueryも使用しています。

jQuery(document).ready(function( $ ){
  function dia_wrapper_resize(){
    const wrapper = document.getElementsByClassName("dia_wrapper")[0];
    wrapper.classList.remove("dia_size2");
    wrapper.classList.remove("dia_size3");
    wrapper.classList.remove("dia_size4");
    if(wrapper.clientWidth < 400){
      wrapper.classList.add("dia_size4");
    }
    else if(wrapper.clientWidth < 500){
      wrapper.classList.add("dia_size3");
    }
    else if(wrapper.clientWidth < 725){
      wrapper.classList.add("dia_size2");
    }
  }
  dia_wrapper_resize();
  window.addEventListener("resize",function(){
    dia_wrapper_resize();
  });
  let yes_cnt = 0;
  document.querySelectorAll(".dia_start,.dia_yes,.dia_no").forEach(function(elem){
    elem.addEventListener("click",function(){
      if(elem.className == "dia_yes"){ yes_cnt++; }
      let parent = elem.parentNode.parentNode;
      parent.style.display = "none";
      //表示
      if(parent.id != "dia_5"){
        let no = parseInt(parent.id.replace("dia_",""));
        $("#dia_"+(no+1)).fadeIn("normal");
      }
      else{
        if(0==yes_cnt){ $("#dia_res_a").fadeIn("normal"); }
        if(1<=yes_cnt && yes_cnt<=3){ $("#dia_res_b").fadeIn("normal"); }
        if(4<=yes_cnt && yes_cnt<=5){ $("#dia_res_c").fadeIn("normal"); }
        $("#dia_res").fadeIn("normal");
      }
    });
  });
  if(document.getElementById("reload") !=null){
    document.getElementById("reload").addEventListener("click",function(){
      location.reload();
    });
  }
});

1〜20行目が、上でもお話した、
設置した要素の横幅に応じてデザインを変えるシステムです。

横幅に応じてCSSを追加・削除しています。

21行目からが、画面表示の切り替え処理になります。

はい or いいえ で今の画面を消して、
次の質問と選択肢を表示させています。

5つ目の回答が終わったら、
そこまでの Yes の数に応じて、どの結果を表示するか決めています。

まとめ

今回は、HTML、CSS、JavaScriptを使って、
複数の質問から結果を出す診断ツールの制作を行いました。

今回はクライアント様のご希望で、
このツールを色々な場所で使いまわしたいとのことでしたので、

設置したエリアの横幅に応じて、画面表示を切り替える、
疑似的なレスポンシブ表示を導入しています。

一般的なレスポンシブデザインの書き方だと、
ブラウザの横幅でしか定義できないので、

特定の要素の幅に応じてデザインを変えたい場合には、
今回のようにJavaScriptを使うとうまくいきます。

今回のシステムのデモはこちらです。

制作の依頼はこちら

もし、今回のツールをご自分で実装するのが難しい場合や、
診断ツールのようなシステムをご希望の場合は、
以下のフォームから弊社にご相談くださいませ。

また、今回のシステム以外にも、

Welcartにおけるシステムの追加やカスタマイズ、
Wordpressのテーマやプラグインのカスタマイズなど、
ウェブに関するご依頼ならほとんど対応可能です。

簡単なシステムなら1件¥3,000(税別)から承っております。

相場よりも費用を抑えて対応させていただくことが可能ですので、
以下のフォームから相談内容を記入して気軽にご連絡ください。

    必須 お名前
    必須 メールアドレス
    任意 サイトのURL
    必須 ご依頼内容や相談内容

    ※出来るだけ具体的に記載していただけると進行がスムーズになります。
    任意 画像やPDF

    ※必要があれば添付してください。




    原則2営業日以内に、ご返信させていただきます。