• TOP
  • ブログ
  • プロフィール
  • お問い合わせ
  • 【Vue.js】タブで切り替えるコンテンツの実装

    【Vue.js】タブで切り替えるコンテンツの実装

    先日、jQeuryでタブ切り替えを実装する方法を書いたのですが、今度はそれをVue.jsで実装してみることにしました。

    作ったもの

    こちらです。

    demo

    実装方法

    HTML

    <div id="tab">
      <ul class="tabMenu">
        <li class="tabItem" v-for="(tab,index) in tabs" v-on:click="activetab=(index+1)" v-bind:class="[ activetab === (index+1) ? 'active' : '' ]">{{tab.tabitem}}</li>
      </ul>
    
      <div class="tabContent">
        <div class="tabBlock" v-for="(item,index) in contents" v-bind:class="[ activetab === (index+1) ? 'show' : '' ]">
          <div class="tabBlock__inner">
            <h3 class="tabBlock__title">{{item.title}}</h3>
            <p class="tabBlock__text">{{item.text}}</p>
          </div>
        </div>
      </div>
    </div>

    CSS

    *{
      box-sizing: border-box;
    }
    ul,li{
      margin: 0;
      padding: 0;
      list-style: none;
    }
    #tab{
      max-width: 640px;
      margin: 0 auto;
    }
    
    .tabMenu{
      display: flex;
      justify-content: space-around;
      align-items: flex-end;
      list-style: none;
      border-bottom: 1px solid #ffa594;
    }
    .tabItem{
      display: flex;
      justify-content: center;
      align-items: center;
      height: 60px;
      flex-basis: 32%;
      flex-shrink: 0;
      border-left: 1px solid #ffa594;
      border-right: 1px solid #ffa594;
      border-top: 1px solid #ffa594;
      border-radius: 10px 10px 0 0;
      color: #ffa594;
      font-weight: bold;
      text-align: center;
    }
    .tabItem.active{
      background-color: #ffa594;
      color: #fff;
    }
    
    .tabContent{
      position: relative;
      border: 1px solid #ffa594;
    }
    .tabBlock{
      position: absolute;
      left: 0;
      top: 0;
      width: 100%;
      padding: 60px;
      opacity: 0;
      transition: .5s;
    }
    .tabBlock.show{
      position: static;
      opacity: 1;
    }

    Javascript(Vue.js)

    var tab = new Vue({
      el: '#tab',
      data: {
        activetab: 1,
    
        tabs: [
          { tabitem: "tab01" },
          { tabitem: "tab02" },
          { tabitem: "tab03" },
        ],
        contents: [
          {
            title: "コンテンツ01",
            text: "テキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキスト"
          },
          {
            title: "コンテンツ02",
            text: "テキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキスト"
          },
          {
            title: "コンテンツ03",
            text: "テキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキスト"
          },
        ],
      }
    });

    簡単な説明

    v-forでタブメニューを生成し、その順番を利用して activetab という変数の値を変化させて、今どれがアクティブな状態なのかを判定しています。
    また、表示するコンテンツの方も、同じようにv-forで生成して、同じ順番のものをアクティブにするようにしています。

    まとめ

    jQueryのものと比べるとこちらの方がややコードがすっきりして見えるように思います。
    実際、編集するときはJSの配列の値を変更するだけなので、触るところも明白かと。
    HTMLが長くなるとどこ触っていいかわからなくなってくるので。。。

    引き続き勉強がてらVue.jsでいろいろやってみたいと思います。

    yori3

    2020年2月5日
    【Web】いろいろ試してみた話
    css, html, vue.js
  • 【jQuery】タブで切り替えるコンテンツの実装

    【jQuery】タブで切り替えるコンテンツの実装

    メモもかねてタブで切り替えるコンテンツをjQueryで作る方法を紹介します。

    これを書こうと思いながら改めてブログを振り返ってると以前にも書いてたんですが、id使ってたりちょっとまどろっこしいなと思ったので、もう少しシンプル目なやつにしました。

    demo

    実装方法

    html

    <div id="tab">
      <ul class="tabMenu">
        <li class="tabItem tabItem-current">tab01</li>
        <li class="tabItem">tab02</li>
        <li class="tabItem">tab03</li>
      </ul>
    
      <div class="tabContent">
        <div class="tabBlock tabBlock-show">
          <div class="tabBlock__inner">
            <h3 class="tabBlock__title">コンテンツ01</h3>
            <p class="tabBlock__text">テキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキスト</p>
          </div>
        </div>
        <div class="tabBlock">
          <div class="tabBlock__inner">
            <h3 class="tabBlock__title">コンテンツ02</h3>
            <p class="tabBlock__text">テキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキスト</p>
          </div>
        </div>
        <div class="tabBlock">
          <div class="tabBlock__inner">
            <h3 class="tabBlock__title">コンテンツ03</h3>
            <p class="tabBlock__text">テキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキスト</p>
          </div>
        </div>
      </div>
    </div>

    CSS

    *{
      box-sizing: border-box;
    }
    ul,li{
      margin: 0;
      padding: 0;
      list-style: none;
    }
    #tab{
      max-width: 640px;
      margin: 0 auto;
    }
    
    .tabMenu{
      display: flex;
      justify-content: space-around;
      align-items: flex-end;
      list-style: none;
      border-bottom: 1px solid #ffa594;
    }
    .tabItem{
      display: flex;
      justify-content: center;
      align-items: center;
      height: 60px;
      flex-basis: 32%;
      flex-shrink: 0;
      border-left: 1px solid #ffa594;
      border-right: 1px solid #ffa594;
      border-top: 1px solid #ffa594;
      border-radius: 10px 10px 0 0;
      color: #ffa594;
      font-weight: bold;
      text-align: center;
    }
    .tabItem.tabItem-current{
      background-color: #ffa594;
      color: #fff;
    }
    
    .tabContent{
      position: relative;
      border: 1px solid #ffa594;
    }
    .tabBlock{
      position: absolute;
      left: 0;
      top: 0;
      width: 100%;
      padding: 60px;
      opacity: 0;
      transition: .5s;
    }
    .tabBlock.tabBlock-show{
      position: static;
      opacity: 1;
    }

    jQuery

    const tabLen = $('.tabItem').length;
    for (i = 0; i < tabLen; i++) {
      tabChange(i);
    }
    
    function tabChange(index) {
      $('.tabItem:nth-child(' + (index + 1) + ')').on('click', function (e) {
        e.preventDefault();
        $('.tabItem.tabItem-current').removeClass('tabItem-current');
        $(this).addClass('tabItem-current');
        $('.tabBlock.tabBlock-show').removeClass('tabBlock-show');
        $('.tabBlock:nth-child(' + (index + 1) + ')').addClass('tabBlock-show');
      });
    }

    簡単な説明

    クリックしたタブが何番目かを取得して、それに対応するコンテンツエリアを表示するようにしています。
    htmlとしては共通のクラスをつけるだけなので、更新がとてもシンプルになるかなと思います。
    複数設置する場合はeach構文などを使えばできるかと思います。

    まとめ

    よく使うので、まとめておきました。
    コードまとめておいておくと使うときコピペして、必要なところだけいじれば使えるので、とても便利です。

    また、自分用にメモしてるやつをいくつかブログに出していくようにしたいと思います。

    同じものVue.jsでもつくりました。

    yori3

    2020年2月2日
    【Web】いろいろ試してみた話
    css, html, jQuery
  • サイトをブロックエディタ化した話【Kansai WordPress Meetup@KyotoのLTの補足】

    サイトをブロックエディタ化した話【Kansai WordPress Meetup@KyotoのLTの補足】

    先日のWordPress Meetup KyotoでLT枠でサイトをブロックエディター化した話をしたので、少し詳細をこちらにまとめたいと思います。

    その時のスライドはこちら

    スタイルの設定

    編集画面の右サイドに出てくる、「スタイル」という設定項目をカスタマイズしました。

    画像ブロックや引用ブロックなど一部のブロックにはデフォルトで入っているのですが、普通は「高度な設定」のところにクラス名を手動で入れないといけないところを、目で見て選択できるようになるというものです。
    あらかじめ設定されたクラスがつくだけなので、やっていることは高度な設定と同じですが、コーディング苦手な人にも優しいつくりになります。

    今回やったのはソースコードブロックに対してスタイルを設定しました。

    prism.jsというシンタックスハイライターを使って、記事に埋め込んだソースコードをハイライトできるようにクラス名をつけるようにしています。
    prism.jsでは「language-{言語名}」というクラスをpreタグにつけると、その中のソースコードをハイライトしてくれるという機能があるので、それにそってクラスがつくようになっています。

    エディター用のJSに下記のように書いて、functions.phpで読み込むだけです。

    //コードシンタックスブロック
    wp.blocks.registerBlockStyle( 'core/code', {
    	name: 'language-html',
    	label: 'HTMLシンタックス',
    	isDefault: false,
    } );
    wp.blocks.registerBlockStyle( 'core/code', {
    	name: 'language-css',
    	label: 'CSSシンタックス',
    	isDefault: false,
    } );
    wp.blocks.registerBlockStyle( 'core/code', {
    	name: 'language-js',
    	label: 'JSシンタックス',
    	isDefault: false,
    } );
    wp.blocks.registerBlockStyle( 'core/code', {
    	name: 'language-php',
    	label: 'phpシンタックス',
    	isDefault: false,
    } );

    こういった技術系の話をする記事ではソースコードを入れることがよくあるので、用意しておくと記事を書くスピードがだいぶ上がっていい感じです。

    固定ページもブロックエディターでつくる

    もともと静的サイトからWordPress化したこともあって、固定ページは静的なHTMLがほとんどの状態で書いていました。

    元々のソースコード(一部抜粋)

    <div class="about__block about__block-profile">
      <h2 class="about__ttl">Profile</h2>
      <div class="profile__img"><img src="<?php echo get_template_directory_uri(); ?>/images/img_mine.jpg" alt=""></div>
      <dl class="profile__content profileList">
        <dt>Name</dt>
        <dd>西村 依泰</dd>
        <dt>Birth/Age</dt>
        <dd>1988.04.01/30歳</dd>
        <dt>Live</dt>
        <dd>大阪府</dd>
        <dt>Work</dt>
        <dd>元小学校教諭(〜2015)<br>マークアップ・CSSコーディング(2016〜)<br>ディレクション(2018〜)</dd>
        <dt>hobby</dt>
        <dd>楽器(ピアノ・ギター)、推理小説、TVゲーム</dd>
        <dt>Like</dt>
        <dd>コーヒー、甘味</dd>
        <dt>Community</dt>
        <dd>Word Camp Kansai 2016 実行委員<br>Word Camp Kyoto 2017 実行委員<br>Word Camp Osaka 2018 実行委員</dd>
      </dl>
    </div>
    
    <div class="about__block about__block-skill">
      <h2 class="about__ttl">Skill</h2>
      <div class="skill__content skill__content-tools">
        <h3>Tools</h3>
        <ul>
          <li>Photoshop</li>
          <li>Illustrator</li>
          <li>Adobe XD</li>
          <li>Dreamweaver</li>
          <li>Atom</li>
          <li>Google Analytics</li>
          <li>Github</li>
        </ul>
      </div>
      <div class="skill__content skill__content-language">
        <h3>Language</h3>
        <ul>
          <li>HTML</li>
          <li>CSS</li>
          <li>SCSS</li>
          <li>Javascript</li>
          <li>jQuery</li>
          <li>Vue.js</li>
          <li>PHP</li>
          <li>WordPress</li>
        </ul>
      </div>
    </div>

    これをブロックエディターに置き換えてみました。

    基本はデフォルトのブロックをつかって、「高度な設定」にクラス名を設定することでレイアウトを作っていきました 。

    ただ、上記コードにもあるように、dlタグを使っているところがあったので、そこは勉強もかねて、ネット上の情報の参考に自分で作ってみることにしました。

    コードを入れると長くなるので省略しますが、下記のサイトを参考に進めました。

    Before Gutenberg – ブロックの入れ子InnerBlockの作成

    Gutenbergブロック開発

    カスタムブロックは割となんでも作れる感じですが、学習コストが高めなので、CSSを用意しておいて高度な設定でクラス名をつけることで対応する方がやりやすそうだと思いました。
    クライアントワークでは前述のスタイルをカスタマイズするか、再利用ブロックを活用することで扱いやすくなるかと思います。

    フロントとエディターの見た目を合わせる

    フロント(サイト側)の見た目とエディター(編集画面)の見た目があっている方が編集時に完成系がわかりやすくていいということがGutenbergハンドブックに書いてある(意訳)ので、それもやってみようと思います。

    こんな風に。

    フロント
    エディター

    やることとしては、エディター用のCSSをつくって、functions.phpで読み込むだけなのですが、厄介だったのはエディター側で生成されるhtmlが階層が深くてややこしかったということです。

    グループブロックなどを使うとdivが二重三重になる上に、独自のクラスがつくので、単純にフロント用のCSSを持ってくるだけではうまくレイアウトが整えられないということがありました。

    結局、枠やリストなどのスタイルをSCSSでmixinにして、それをフロント用とエディター用でそれぞれ読み込むようにしました。
    それでも割と複雑なファイルができてしまったので、その辺りをうまく設計してSCSSファイルをもう少し簡潔にできないか、今後考えていきたいです。

    まとめ

    コアのブロックとCSSの設定だけでもそれなりにページを作ることはできたと思います。
    とりあえず触ってみようと思う人は、まずはコアのブロックでいろいろ試してみるのがいいかなと思います。

    これまでカスタムフィールドでやってたことを置き換えられないかと試行錯誤していますが、なかなかそこまでやるのは骨が折れるなぁと感じています。
    今後の課題ということで。

    yori3

    2020年1月21日
    【Web】いろいろ試してみた話
    css, Javascript, WordPress, ブロックエディタ
  • jQueryで作った診断コンテンツをVue.jsで作り直してみた

    以前案件で、診断コンテンツのあるサイトを制作することになり、jQueryでjsonを読み込んで作成したのですが、もしかしてVue.jsでできるんじゃないかと思い、Vue.jsの練習がてら作り直してみることにしました。

    作ったコンテンツはこちらです。
    demo
    ※見た目はどちらも同じになってます。

    まずは読み込み用のjsonの中身を確認しておきましょう。

    json(質問項目)

    [
      {
        "id":"1",
        "num": "1",
        "question": "吾輩は猫である。<strong>名前はまだ無い。</strong><br>どこで生れたかとんと見当がつかぬ。",
        "links": [
          {
            "link": "2",
            "select": "Yes"
          },{
            "link": "result_1",
            "select": "No"
          }
        ],
        "notes": ""
      },{
        "id":"2",
        "num": "2",
        "question": "吾輩は猫である。<strong>名前はまだ無い。</strong><br>どこで生れたかとんと見当がつかぬ。",
        "links": [
          {
            "link": "3",
            "select": "Yes"
          },
          {
            "link": "result_2",
            "select": "No"
          }
        ],
        "notes": ""
      },{
        "id": "3",
        "num": "3",
        "question": "吾輩は猫である。<strong>名前はまだ無い。</strong>。<br>どこで生れたかとんと見当がつかぬ。",
        "links": [
          {
            "link": "4",
            "select": "Yes"
          },
          {
            "link": "result_3",
            "select": "No"
          }
        ],
        "notes": ""
      },{
        "id": "4",
        "num": "4",
        "question": "吾輩は猫である。<strong>名前はまだ無い。</strong><br>どこで生れたかとんと見当がつかぬ。",
        "links": [
          {
            "link": "5",
            "select": "選択肢1"
          },
          {
            "link": "result_4",
            "select": "選択肢2"
          },
          {
            "link": "result_5",
            "select": "選択肢3"
          }
        ],
        "notes": "※選択肢の数が違うバージョンです。"
      },
      {
        "id": "5",
        "num": "5",
        "question": "吾輩は猫である。<strong>名前はまだ無い。</strong><br>どこで生れたかとんと見当がつかぬ。",
        "links": [
          {
            "link": "result_4",
            "select": "No"
          },
          {
            "link": "result_5",
            "select": "No"
          }
        ],
        "notes": ""
      }
    ]
    

    json(結果項目)

    [
      {
        "id":"1",
        "title":"結果01",
        "text":"ただ彼の掌に載せられてスーと持ち上げられた時何だかフワフワした感じがあったばかりである。<br>掌の上で少し落ちついて書生の顔を見たのがいわゆる人間というものの見始であろう。<br>この時妙なものだと思った感じが今でも残っている。第一毛をもって装飾されべきはずの顔がつるつるしてまるで薬缶だ。"
      },{
        "id":"2",
        "title":"結果02",
        "text":"ただ彼の掌に載せられてスーと持ち上げられた時何だかフワフワした感じがあったばかりである。<br>掌の上で少し落ちついて書生の顔を見たのがいわゆる人間というものの見始であろう。<br>この時妙なものだと思った感じが今でも残っている。第一毛をもって装飾されべきはずの顔がつるつるしてまるで薬缶だ。"
      },{
        "id":"3",
        "title":"結果03",
        "text":"ただ彼の掌に載せられてスーと持ち上げられた時何だかフワフワした感じがあったばかりである。<br>掌の上で少し落ちついて書生の顔を見たのがいわゆる人間というものの見始であろう。<br>この時妙なものだと思った感じが今でも残っている。第一毛をもって装飾されべきはずの顔がつるつるしてまるで薬缶だ。"
      },{
        "id":"4",
        "title":"結果04",
        "text":"ただ彼の掌に載せられてスーと持ち上げられた時何だかフワフワした感じがあったばかりである。<br>掌の上で少し落ちついて書生の顔を見たのがいわゆる人間というものの見始であろう。<br>この時妙なものだと思った感じが今でも残っている。第一毛をもって装飾されべきはずの顔がつるつるしてまるで薬缶だ。"
      },{
        "id":"5",
        "title":"結果05",
        "text":"ただ彼の掌に載せられてスーと持ち上げられた時何だかフワフワした感じがあったばかりである。<br>掌の上で少し落ちついて書生の顔を見たのがいわゆる人間というものの見始であろう。<br>この時妙なものだと思った感じが今でも残っている。第一毛をもって装飾されべきはずの顔がつるつるしてまるで薬缶だ。"
      }
    ]
    

    jQueryでつくったもの

    はじめにjQueryで作ったときのソースを載せておきます。

    html

    <section class="check" id="check">
        <div class="check_box is-show" id="start">
          <h2 class="check_ttl">診断テスト</h2>
          <div class="check_startBtn">
            <div class="btn"><button data-box="q1" class="btn_body check_btn startbtn">診断をはじめる</button></div>
          </div>
        </div>
    
        <div class="question_wrap">
          <!-- 設問 -->
        </div>
    
    
        <div class="check_box result_box">
    
          <!-- 結果出し分け部分 -->
        </div>
    
      </section>

    JS(jQuery)

    /* チェック項目 */
    var html = "";
    var htmlResult = "";
    var data;
    $.ajax({
      type: "GET",
      url: 'js/question.json',
      dataType: 'json',
      data: data,
    }).done(function (json) {
      for (var i = 0; i < json.length; i++) {
        html += '<div class="check_box question_box" id="q' + json[i]["id"] + '">';
        html += '<h3 class="check_qNum">Q' + json[i]["num"] + '</h3>';
        html += '<p class="check_question">' + json[i]["question"] + '</p>';
        html += '<div class="check_questionBtn">';
        var selectLen = json[i]["links"].length;
        for (var j = 0; j < selectLen; j++) {
          html += '<div class="btn"><a href="" data-box="q' + json[i]["links"][j]["link"] + '" class="btn_body check_btn">' + json[i]["links"][j]["select"] + '</a></div>';
        }
        if (json[i]["notes"] != "") {
          html += '<p class="check_notes">' + json[i]["notes"] + '</p>';
        }
        html += '</div>';
        html += '</div>';
    
      }
      $('.question_wrap').append(html);
    }).fail(function () {
      console.log('ERROR')
    });
    
    //結果
    $.ajax({
      type: "GET",
      url: 'js/result.json',
      dataType: 'json',
      data: data,
    }).done(function (jsonResult) {
      for (var resultNum = 0; resultNum < jsonResult.length; resultNum++) {
        htmlResult += '<div class="result_box_inner result_' + jsonResult[resultNum]["id"] + '" id="qresult_' + jsonResult[resultNum]["id"] + '">';
        htmlResult += '<h3 class="result_ttl">';
        htmlResult += '<strong>' + jsonResult[resultNum]["title"] + '</strong><br>';
        htmlResult += '</h3>';
        htmlResult += '<p class="result_text">' + jsonResult[resultNum]["text"] + '</p>';
        htmlResult += '</div>';
        htmlResult += '</div>';
      }
      $('.result_box').prepend(htmlResult);
      $('.result_box_inner').hide();
    }).fail(function () {
      console.log('ERROR')
    });
    
    $(document).on('click', '.check_btn', function (e) {
      e.preventDefault();
      const nextBox = $(this).data('box');
      $(this).parents('.check_box').removeClass('is-show').addClass('is-hide');
      if (!nextBox.match(/result/)) {
        $('#' + nextBox).addClass('is-show');
      } else {
        $('#' + nextBox).show();
        $('.result_box').addClass('is-show');
      }
    });

    htmlは非常にシンプルですが、jQuery側がやたらと長くなって、どこに何を書いてあるのかを探すのが大変です。
    さらにJS内にhtmlのソースを書くので、修正もしづらいです。

    Vue.jsで作り直す

    次にVue.jsで書いたコードです。

    html

    <section class="check">
      <div class="check_box is-show" id="start">
        <h2 class="check_ttl">診断テスト</h2>
        <div class="check_startBtn">
          <div class="btn"><button data-box="q1" class="btn_body check_btn startbtn">診断をはじめる</button></div>
        </div>
      </div>
    
      <div id="question" class="question_wrap">
        <div class="check_box question_box" v-bind:class="'q'+item.id" v-bind:id="'q'+item.id" v-for="item in posts">
          <h3 class="check_qNum" v-text="'Q'+item.num"></h3>
          <p class="check_question" v-html="item.question"></p>
          <div class="check_questionBtn">
            <div class="btn" v-for="link in item.links">
              <button v-bind:data-box="'q'+link.link" class="btn_body check_btn" v-html="link.select" v-on:click="check(item.id,link.link)"></button>
            </div>
            <p class="check_notes" v-if="item.notes" v-text="item.notes"></p>
          </div>
        </div>
      </div>
    
    
    
      <div class="check_box result_box" id="result">
    
        <!-- 結果出し分け部分 -->
        <div class="result_box_inner" v-for="result in results" v-bind:class="'result_'+result.id" v-bind:id="'qresult_'+result.id">
          <h3 class="result_ttl">
            <strong v-html="result.title"></strong>
          </h3>
          <p class="result_text" v-html="result.text"></p>
        </div>
      </div>
    
    </section>

    JS(Vue.js)

    /* チェック項目 */
    const vm = new Vue({
      el: '#question',
      data: {
        posts: []
      },
      created() {
        axios.get('js/question.json')
        .then(response => { this.posts = response.data; })
        .catch(error => {
          window.alert(error);
        } );
      }, methods: {
        check: function (i,j) {
          const thisBoxNum = 'q' + i;
          const nextBoxNum = 'q' + j;
          const thisBoxObj = document.getElementsByClassName(thisBoxNum);
          const nextBoxObj = document.getElementById(nextBoxNum);
          console.log();
          thisBoxObj[0].classList.remove('is-show');
          thisBoxObj[0].classList.add('is-hide');
          const resultBox = document.getElementsByClassName('result_box');
          const clslist = String(nextBoxObj.classList);
          if (!clslist.match(/result/)) {
            nextBoxObj.classList.add('is-show');
          } else {
            nextBoxObj.style.display = 'block';
            resultBox[0].classList.add('is-show');
          }
        }
      }
    });
    
    //結果
    const vm02 = new Vue({
      el: '#result',
      data: {
        results: []
      },
      created() {
        axios.get('js/result.json')
        .then(response => { this.results = response.data; })
        .catch(error => {
          window.alert(error);
        });
      }
    });
    
    //開始ボタン
    const startbtn = document.getElementsByClassName('startbtn');
    document.addEventListener('click',function(e){
      e.preventDefault();
      thisbtn = e.target;
      if (thisbtn === startbtn[0]){
        thisbtn.closest('.check_box').classList.remove('is-show');
        thisbtn.closest('.check_box').classList.add('is-hide');
        const checkBox = document.getElementById('q1');
        checkBox.classList.add('is-show');
      }
    });
    

    htmlのほうはさっきと比べて長くなりましたが、JSの方は少しシンプルな見た目になりました。
    また、htmlも見慣れた形になっているので、修正が入ってもそこまで大変そうな印象はありません。

    やったことまとめ

    Vue.jsを使った方ではaxiosを利用してjsonを読み込むようにしました。

    html側では、v-forでループさせて、各設問内容を呼び出しています。
    v-bind:idでそれぞれにid属性を付与し、あとで操作しやすいようにしています。
    回答の数が設問によって違うので、ボタンのところで再度ループさせています。

    クリックイベントでは、クリックしたときにjsonから値を取得し、その値を渡して、設問の表示非表示を切り替えるようにしています。
    is-showというクラスが付与されると表示されるようになっています。

    苦労したところ

    v-bindで文字列を追加したい

    v-bindの値を、「文字列+jsonの値」としたいときにどうしたらいいかが、はじめわりませんでした。
    いくつか調べると、文字列の方をクウォートで囲って繋げばいいとわかりましたが、調べ方が難しく時間がかかりました。

    ボタンの動作が思い通りいかない

    次の設問へ移るボタンの動作がなかなかうまくいきませんでした。イベントハンドラでmethodsを設定して・・・というところはなんとなくわかっていたのですが、そこからどうしたら考えていることができるのかがなかなかわからず苦戦しました。
    結局、引数にjsonから取得した値を入れるようにして、そこから次に表示する要素のidなどを取得するようにしました。

    この辺りは普通にJSで書いたので、Vue.jsの機能を使ってもう少し効率的に書けないか検討したいと思います。

    まとめ

    探り探りでしたが、なんとか動いてよかったです。
    なんとなくVue.jsで動かせた感じはありますが、実際、もう少しこうした方がいいとかいうところがありそうなので、時間があるときに調べてみたいと思います。

    jsonでコンテンツを吐き出すのは、Vue.jsで書く方がやりやすいかなと思いました。
    クリックイベントの方は、これくらいの簡単な動作ならjQueryで十分なようにも思います。(書きなれてるからかもですが)

    また、Vue.js使って何か作ってみたいので、次のネタ探しを始めます。

    yori3

    2020年1月15日
    【Web】いろいろ試してみた話
  • WordCamp Osaka 2019の実行委員長とテーマが生まれるまで

    WordCamp Osaka 2019の実行委員長とテーマが生まれるまで

    WordCamp Osaka 2019が終わり三週間経ちました。
    今回は実行委員長をするまでの経緯をふまえつつ、テーマについてのお話をしたいと思います。

    実行委員長になるまで

    今回、実行委員長になった経緯として、まずはこれまでのコミュニティとの関わりについて触れたいと思います。

    初めてのコミュニティ

    初めてWordPressのコミュニティに参加したのは2015年のWordCamp Kansaiでした。そのころはWordPressについてほとんどわかっておらず、なんとなく勉強になったらいいなくらいの気持ちで参加しました。

    それなりにセッションを聞いて、懇親会でそれなりに交流したように思うのですが、実際のところあまり覚えていません。
    ただ、そこでコミュニティというものの存在を知り、それからいろいろと参加するようになりました。

    実行委員として参加することに

    WordPressのコミュニティイベントに少しずつ参加するようになったある時、その時参加していた人から誘われて、WordCamp Kansai 2016に実行委員として参加することになりました。

    その時は会場チームの一員として参加しさせてもらったり、ノーコーディングWordPressハンズオンのメンターもさせていただいたこともあり、ここでWordPressやコミュニティへの理解が深まり、興味を持つようになったと思います。

    その後、2017年の京都、2018年の大阪と続いて実行委員をさせていただきました。
    大変なこともありましたが、みんながイベントを楽しんでいること、そして色々な人と交流できることが嬉しくて、ずっと続けていました。

    そして実行委員長に

    コミュニティが自分にとって楽しい場所となり、いろんな人と交流して、いろんな話を聞いて、いろんなことを知って、そうやってコミュニティに参加し続けて、次のWordCampも実行委員やるか、くらいのことを考えていました。

    そろそろ実行委員長かという声もちらほら聞こえてきましたが、なかなかその気にはなれませんでした。
    確かにWordPressのコミュニティは好きだし、WordCampは続けていきたいと思ってる。でも、実行委員長として前に立てるほど、WordPressやコミュニティのことをわかっているのかと言われる自信がありませんでした。

    そんな時、2018年のWordCamp Tokyoに参加した時、もう一人の実行委員長である角田一平(@ippey_s)さんから、「一緒にやりませんか?」とお声かけをいただき、二人でならとお返事しました。
    こうして二人の実行委員長がスタートしたわけです。

    どうしてやることにしたのか

    一人では自信はないけど、二人なら相談しながらできる。なんとかなるかもしれない。その時はそういう思いだけで返事しましたが、それだけではなく、コミュニティという場が好きで続けていきたい、WordPressを広めていきたい、いろんな人にこういう場があるって知ってほしい。お話をいただいた後から徐々にそういう思いが次第に大きくなっていきました。
    そうしてどういうWordCampにするか、何をしたら楽しんでもらえるかといったことを考えるようになりました。

    今回のテーマについて

    さて、WordCampをやろうとなると、考えないといけないことがいろいろとあるのですが、その一つがWordCampのテーマです。

    その回のWordCampをどういったコンセプトで行うのか、それにそって、セッションや企画を選んでいったり、参加者の方にWordCampへのイメージをもってもらうことになったりするので、重要なものになります。

    どうしてテーマを決めたのか

    今回はそのテーマを「__WITH」としました。
    そこに込めたのは、「様々な立場の人がみんな一緒になって参加してもらえるWordCampにしよう」ということでした。

    WordCampについてSNSなどでの発言を見ていると、気になったのは「「子どもを預けられず、長い時間参加することができない」、「初心者が行っていいのかわからない」という声でした。

    でも、そういう普段イベントに参加できずにいるひとこそ、イベントで人との繋がりが必要なのではないかと思っていたので、なんとかそういった人に参加してもらえるようにできないかという風に考えました。

    また、自分自身も今年、子どもが生まれ、子どもがいる状況でイベントに参加するということについて、参加の仕方や頻度などを考える機会があったこともありました。

    そういった理由から様々な立場の人に参加してもらえるWordCampをテーマにしたいと思ったのでした。
    「__with」という言葉はささぴよ(@sasagawaki)さんが考えてくれたもので、みんなで一緒になって何かをしようという意味がこもっているような言葉でとても気に入っています。

    テーマをもとに

    テーマを実現するための具体的な方法として、小さなお子さんを預かるキッズスペース(協力:JUSOコワーキングさん)や子どもでも参加しやすい企画としてレジンのアクセサリー制作(協力:テクノ図工部さん)などがありました。

    これらの企画も「様々な立場の人に参加してもらえるWordCampにしたい」という思いを元に、実行委員のみなさんが意見を出し合って考えて準備してくれたものです。

    なんとか絞り出したテーマを、僕の拙い説明を汲み取ってくれて、想像の何倍ものものを生み出してくれた実行委員のみなさんに本当に感謝です。

    蓋を開けてみれば、初めての参加という方や、子どもづれの方をたくさんお見かけして、それぞれのスペースも盛り上がっていたようで、テーマとしては概ね成功だったのかなという風に思います。

    まとめ

    今回のWordCampでは、実数としてはわからないのですが、初めて参加、久しぶりに参加という声が多かったように思います。
    普段なかなか参加できない人にきてもらうという目標はある程度達成されたのではないかと思っています。
    ですが、それで終わるのではなく、これからも各地のMeetupはじめWordPressのコミュニティイベントに参加していってほしいと思います。

    WordCampでお伝えしきれなかったかもしれないですが、WordCamp、WordPress Meetupなどのイベントは、WordPressに関わる人、WordPressで仕事をしている人、WordPressが好きな人が集まって、交流をし、新たな繋がりをつくっていく場です。
    なので、しつこいぐらい参加して、のめり込むくらい関わってもらえたら、それが今回のWordCampの本当の意味での成功じゃないかなと思います。

    ということでお近くのWordPress Meetupにぜひ!

    関連リンク

    WordCamp Osaka 2019 アドベントカレンダー
    https://wco2019-advent-calendar.netlify.com/

    WordCamp Osaka 2019 セッションのスライド・動画まとめ
    https://2019.osaka.wordcamp.org/2019/12/22/slide-and-movie/

    Kansai WordPress Meetupの情報はこちらから
    https://www.meetup.com/ja-JP/Kansai-WordPress-Meetup/events/

    yori3

    2019年12月31日
    イベント参加した話
  • コミュニケーションは奥深い 〜4LDK Season3を振り返って〜

    コミュニケーションは奥深い 〜4LDK Season3を振り返って〜

    今回の4LDKはコミュニケーションがテーマでした。

    コミュニケーションは普段何気なくやってることのように思うのですが、実はいろいろな抑えるべきポイントがあるのですね。

    学びと変化

    コミュニケーションという日々発生することが題材だったので、日々の仕事の中であったことを思い出し、結びつけて考えることで、ただ話を聞くよりも学ぶことが多かったと思います。

    例えば、電話でのやり取りも、この電話でどういうことを聞けば良いか、この電話が終わったときに何がわかっていて、何が決まっている状態になるのかを意識できるようになったと思います。

    また、社内のやり取りでもクライアントとのやり取りでも、相手に合わせて言葉を選び、状況に応じて伝え方を考えるように意識するようになりました。

    まだまだ「できる」と言える状態ではないですが、これから意識し続けることでできるようにしていこうと思います。

    これからしたいこと

    今回のライブ授業を受けて、まずは日々の業務での取り組み方を考えたいと思います。

    1つ目は、コミュニケーションが発生する場面で意識することを想像することを心がけるということです。
    ただ、言葉を交わすのではなく、その結果、どういうことがわかればいいのか、どういうことを決めないといけないのかをあらかじめ頭に描いて臨むことが大事だと思います。

    2つ目は、「決めるべきを決める」ために何が必要なのかを常に想定しておくことです。
    授業の中で印象的だったのは、会議は決めるべきを決める場だということです。この会議は何を決めるためにやっているのかを常に意識し、そのためには何が必要なのかを想定して準備をするということが大事なのだと思います。

    3つ目は、二転三転が起こらないように、はじめにしっかりと認識合わせをすることです。
    なんとなくで話を進めてしまうと、後で「やっぱりこっちの方がいい」みたいな話になってしまうので、いつまでに何を決めるのか、何を基準に決めるのか、ということをきちんと共有しておくようにすることが大事だと思います。

    まとめ

    今回学んだことは

    • 決めるべきを決めるために必要なことを考える
    • 相手に伝わるようにすることを意識する
    • 後で二転三転しないように認識合わせをする

    というところかと思います。

    コミュニケーションというのは、普段何気なくやっているのに、いざとなると難しいことだと思いました。誤解が生じないように簡潔伝えられるように普段から意識したいなと思います。

    yori3

    2018年10月1日
    イベント参加した話
前のページ
1 2 3 4 5 … 11
次のページ

©️ 2024 yori3 All rights reserved.