ラベル bulma の投稿を表示しています。 すべての投稿を表示
ラベル bulma の投稿を表示しています。 すべての投稿を表示

2019年7月5日金曜日

Bulma CSS で Navbar を使う場合にはスマホ用のハンバーガメニューの ON/OFF は自分で実装しなければならない

概要

Hero を使ってヘッダーを実装している場合、スマホ表示用にハンバーガーメニューが使えます
ボタンや CSS の処理はサンプルから引っ張ればいいのですが実際にメニューの表示/非表示を実現するには自分で JavaScript を実装しなければなりません
今回はその方法を紹介します

環境

  • macOS 10.14.5
  • Bulma 0.7.5

準備

今回は Ruby を使ってアプリを作成します

アプリ雛形作成

  • bundle init
  • vim Gemfile
gem "sinatra"
  • bundle install --path vendor
  • mkdir views
  • touch views/index.erb
  • mkdir -p public/js
  • touch public/js/custom.js
  • touch app.rb

アプリ作成

  • vim app.rb
require 'sinatra'

get '/' do
  erb :index
end

Bulma をロードしたテンプレート作成

CDN があるのでそれを使います
jQuery も使いたいので CDN からロードしています
Hero のサンプルはこのあたり からコピペしているだけです
section タグを body 内に貼り付ければ OK です

  • views/index.erb
<html>
<head>
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bulma/0.7.5/css/bulma.min.css" integrity="sha256-vK3UTo/8wHbaUn+dTQD0X6dzidqc5l7gczvH+Bnowwk=" crossorigin="anonymous" />
  <script src="https://code.jquery.com/jquery-3.4.1.min.js" integrity="sha256-CSXorXvZcTkaix6Yvo6HppcZGetbYMGWSFlBw8HfCJo=" crossorigin="anonymous"></script>
  <script src="/js/custom.js"></script>
</head>
<body>
<section class="hero is-success is-fullheight">
  <!-- Hero head: will stick at the top -->
  <div class="hero-head">
    <header class="navbar">
      <div class="container">
        <div class="navbar-brand">
          <a class="navbar-item">
            <img src="https://bulma.io/images/bulma-type-white.png" alt="Logo">
          </a>
          <span class="navbar-burger burger" data-target="navbarMenuHeroC">
            <span></span>
            <span></span>
            <span></span>
          </span>
        </div>
        <div id="navbarMenuHeroC" class="navbar-menu">
          <div class="navbar-end">
            <a class="navbar-item is-active">
              Home
            </a>
            <a class="navbar-item">
              Examples
            </a>
            <a class="navbar-item">
              Documentation
            </a>
            <span class="navbar-item">
              <a class="button is-success is-inverted">
                <span class="icon">
                  <i class="fab fa-github"></i>
                </span>
                <span>Download</span>
              </a>
            </span>
          </div>
        </div>
      </div>
    </header>
  </div>

  <!-- Hero content: will be in the middle -->
  <div class="hero-body">
    <div class="container has-text-centered">
      <h1 class="title">
        Title
      </h1>
      <h2 class="subtitle">
        Subtitle
      </h2>
    </div>
  </div>

  <!-- Hero footer: will stick at the bottom -->
  <div class="hero-foot">
    <nav class="tabs is-boxed is-fullwidth">
      <div class="container">
        <ul>
          <li class="is-active"><a>Overview</a></li>
          <li><a>Modifiers</a></li>
          <li><a>Grid</a></li>
          <li><a>Elements</a></li>
          <li><a>Components</a></li>
          <li><a>Layout</a></li>
        </ul>
      </div>
    </nav>
  </div>
</section>
</body>
</html>

custom.js の作成

ここにハンバーガーメニューの表示/非表示を実装します
基本は is-active をトグルすれば OK です

  • vim public/js/custom.js
$(document).ready(function(){
  var burger = $('.burger');
  var menu = $('#' + burger.data('target'));
  burger.on('click', function() {
    burger.toggleClass('is-active');
    menu.toggleClass('is-active');
  });
});

. burger クラスをクリックしたら burgermenu の DOM をトグルしているだけです
menuburger.data('target')id="navbarMenuHeroC" の DOM を取得しています

動作確認

  • bundle exec ruby app.rb

localhost:4567 にアクセスしましょう
ブラウザのデベロッパーツールを起動してビューをスマホモードに切り替えましょう
ハンバーガーメニューとして表示されるのはスマホからアクセスしたときだけです

最後に

Bulma css の Hero でハンバーガーメニューを実装してみました
HTML と CSS はサンプルにありますが JS がないので自分で作る必要があるという話でした

2018年4月17日火曜日

bulma でモーダルを制御してみる

概要

bulma にはモーダルを表示するための機能があります
https://bulma.io/documentation/components/modal/

今回はそれを使ってみました
説明のベースとなるアプリは過去に紹介した Sinatra アプリになります
必要な部分のコードのみ紹介します
ただ、今回紹介するコードでは Sinatra アプリ側のコードは一切登場しないので Sinatra 環境がなくても全く問題ありません

環境

  • macOS 10.13.2
  • Ruby 2.4.1p111
  • sinatra 2.0.1
  • bulma 0.6.2
  • jQuery 3.3.1

モーダルを表示するボタンの作成

id 属性を使ってボタンを特定できるようにします

<a class="button is-small is-primary" id="show_action">Show</a></td>

モーダル用の div タグを作成

HTML 内のどこでもいいのでモーダル表示用の div タグを追記しましょう
今回は body タグの直前に記載しました

... 省略

  <div class="modal">
    <div class="modal-background"></div>
    <div class="modal-content">
      <div class="notification is-danger">
        This area has danger messages.
      </div>
    </div>
  <button class="modal-close is-large" aria-label="close"></button>
  </div>
  <script async type="text/javascript" src="../js/bulma.js"></script>
  <script async type="text/javascript" src="../js/form.js"></script>
</body>
</html>

表示する内容は bulma の notification を使っています
ここの内容は何でも OK なので好きなものを設置してください

ボタンを押した際の処理を実装

jQuery を使っています
ポイントはボタンを押した際に先ほどの div タグの modal クラスに is-active というクラスを追加してあげる点です

$("#show_action").on("click", function() {
  $("div.modal").addClass("is-active");
})

$('div.modal-background,button.modal-close').on('click', function() {
  $("div.modal").removeClass("is-active");
})

またモーダルが表示されたあとに画面をクリックしたらモーダルが消える処理も追加しています
モーダルを消すのは単純に追加した is-active クラスを削除するだけで OK です

動作確認

では動作確認してみましょう
今回であれば以下のように動作すれば OK です
bulma_modal1.gif

最後に

bulma のモーダル機能を使ってみました
JavaScript を使って表示/非表示を制御する必要はありますが簡単に使えると思います

参考サイト

2018年4月15日日曜日

Sinatra + bulma で簡単ダッシュボード作成

概要

bulma はモダンな WebUI がデザインできる CSS フレームワークです
今回は Sinatra と組み合わせて動的なダッシュボード UI を作成してみます

環境

  • macOS 10.13.2
  • Ruby 2.4.1p111
  • sinatra 2.0.1
  • bulma 0.6.2

テンプレートファイルの作成

bulma には様々なテンプレートが準備されておりその中にダッシュボード用のテンプレートがあります
これを Sinatra で動くように移植していきます

  • mkdir views
  • cd views
  • wget 'https://raw.githubusercontent.com/dansup/bulma-templates/master/templates/admin.html'
  • mv admin.html admin.erb

テンプレート用のディレクトリを作成しここに用意されているテンプレートファイルを配置します
更に Ruby から参照できるように拡張子を .erb に変更します

変数埋め込み

とりあえず今回はタイトルの部分を変数にしてみたいと思います

  • vim admin.erb
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>Admin - Free Bulma template</title>
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css" integrity="sha256-eZrrJcwDc/3uDhsdt61sL2oOBY362qM3lon1gyExkL0=" crossorigin="anonymous" />
  <link href="https://fonts.googleapis.com/css?family=Open+Sans:300,400,700" rel="stylesheet">
  <!-- Bulma Version 0.6.0 -->
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bulma/0.6.0/css/bulma.min.css" integrity="sha256-HEtF7HLJZSC3Le1HcsWbz1hDYFPZCqDhZa9QsCgVUdw=" crossorigin="anonymous" />
  <link rel="stylesheet" type="text/css" href="../css/admin.css">
</head>
<body>

  <!-- START NAV -->
  <nav class="navbar is-white">
    <div class="container">
      <div class="navbar-brand">
        <a class="navbar-item brand-text" href="../">
          <%= @title %> 
        </a>

長いので先頭から対象部分まで表示しています
下の方でタイトル部分を <%= @title %> に変更しています
この変数を Sinatra アプリでいろいろと変更してみたいと思います

bulma に必要なファイルの設定

css と js が必要なものがあるので配置します

  • mkdir -p public/css
  • mkdir -p public/js
  • cd public/css
  • wget 'https://github.com/dansup/bulma-templates/raw/master/css/admin.css'
  • cd public/js
  • wget 'https://github.com/dansup/bulma-templates/raw/master/js/bulma.js'

これらもすでに用意されているテンプレートから取得します

コントローラ側の実装

先ほど作成した .erb のテンプレートファイルに埋め込んだ変数の値をコントローラ側で設定します

  • vim app.rb
require 'sinatra'

get '/' do
  @title = ['bulma admin', 'ぶるまあどみん', '管理画面'].sample
  erb :admin
end

ランダムでタイトル用の値を設定しているだけです
あとは erb メソッドを使って先ほどの admin.html をシンボルで参照します

動作確認

これで localhost:4567 にアクセスすると以下のように表示されると思います
sinatra_bulma1.png

アクセスするごとに左上のタイトル部分が変化するのがわかると思います

今回はタイトル部分しか弄りませんでしたが例えば数字の部分などは MySQL から取得したものを表示するなどの処理を app.rb に書き足してあげれば更に動的な値を表示してあげることもできます

ツリー

今回の成果物のツリー構造です

$ tree -I "vendor" .
.
├── Gemfile
├── Gemfile.lock
├── app.rb
├── public
│   ├── css
│   │   └── admin.css
│   └── js
│       └── bulma.js
└── views
    └── admin.erb

4 directories, 6 files

最後に

Sinatra + bulma で超簡単にダッシュボードを実装してみました

nodejs のように npm でインストールしてやる感じではなく静的ファイルをダウンロードしてやるので直感的に開発はできるかなと思います
あとは CSS や JS をカスタマイズすれば更に動的なページが作れると思います

自分はこのやり方であとは jQuery を使って開発しています
Ruby でというか Sinatra で WebUI を作る場合はどんな感じで進めるのが良いのかベストプラクティスを知りたいです、、、

参考サイト