4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

ZYYXAdvent Calendar 2019

Day 11

FirebaseとVue.jsを使って息子の教材を作った話

Last updated at Posted at 2019-12-11

はじめに

はじめまして。ジークスの酒井です。
今回は業務とは別で日曜プログラミングネタになります。

中1の息子のために家族で単語カードを作ろうとしてたんですが、あまりに面倒くさいので
ツールを作ってみる事にしました

設計方針

・用紙はミシン目や穴があらかじめ空いている単語カード向け用紙を使います。

・シンプルなPWAとして、入力画面 -> 印刷画面 の2画面構成にする

・vue.jsを使って、画面遷移などを実装する

・最後はFirebaseのHostingを使ってWebサイトにアップする

・印刷はpaper.cssにまかせる

paper.css
https://github.com/cognitom/paper-css

いざ実装

まずは2画面を切り替える仕組みを作ってしまいます。
vueのlistというデータに画面名が入っていて、代入すると画面が切り替わる仕組みです。
入力画面:list、印刷画面:print

JS側

fc_maker.js
data: {
    mode: 'list'
}

HTML側

index.html
    <div v-if="mode === 'list'" id="input-list">
    入力画面
    </div>
    <div v-if="mode === 'print'">
    印刷画面
    </div>

こんなふうに準備しておくと、mode変数に代入するだけで画面を切り替える事ができます。

入力画面はExcelやGoogleスプレッドシートなどからコピペすれば
TAB区切りの文字列になる事を利用して、textareaタグをひとつ用意するだけです。

印刷画面

index.html
    <div v-if="mode === 'print'">
      <section class="sheet" v-for="page in pages" v-bind:class="{front: page.mode === 'front'}">
        <div v-bind:id="'cardbox' + card.id" class="card" v-for="card in page.cards"><p v-bind:id="'card' + card.id" v-html="card.caption"></p></div>
      </section>
    </div>

こんな感じで1ページごとにsectionというタグが生成されるようにしておきます。
あとはpaper.cssにまかせるだけでok!
FC_SS_DATA.png

こんなデータを用意して流し込むだけで
FC_SS_PAGE2.png

こんなふうに、画面で見ると、1ページごとにプレビューが表示されているんですが
印刷すると、ちゃんと枠の中身が印刷されます。

WEBサイトにUP

あとはFirebaseのHostingを使ってアップロードするだけ!
ごめんなさい。Firebaseを使ったのはここだけです^^

できあがったもの

俺のフラッシュカード

https://my-flashcard.web.app/
FC_SS_PAGE1.png

4
2
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?