スポンサー
Support Framework7

メッセージバー

    Framework7には、メッセージを使用するための、サイズ変更可能な特別なツールバーが用意されています。

    メッセージバーのレイアウト

    メッセージバーのレイアウトはとてもシンプルです。

    <div class="toolbar messagebar">
      <div class="toolbar-inner">
        <div class="messagebar-area">
          <!-- メッセージバーの添付ファイル -->
          <div class="messagebar-attachments">...</div>
          <!-- メッセージバーのサイズ変更可能なテキストエリア -->
          <textarea class="resizable" placeholder="Message"></textarea>
        </div>
        <a href="#" class="link">Send</a>
      </div>
      <!-- メッセーバーシート -->
      <div class="messagebar-sheet">...</div>
    </div>

    構造

    • messagebar-attachments - メッセージバーの添付ファイルを持つブロックです。オプション
    • messagebar-sheet - messagebar シートを含むブロックです。任意

    メッセージバーの場所は非常に重要で、pageの内側で、page-contentの直前でなければなりません。

    <div class="page">
      <!-- ナビバー -->
      <div class="navbar">...</div>
    
      <!-- メッセージバー -->
      <div class="toolbar messagebar">...</div>
    
      <!-- page-content/messages-content -->
      <div class="page-content messages-content">
        ... messages
      </div>
    </div>

    メッセージバーのシートレイアウト

    メッセージに添付できる画像などの追加シートが必要な場合は、そのためにデザインされたエクストラブロックを使用します。

    <div class="messagebar-sheet">
      <!-- 選択可能なシートイメージ -->
      <label class="checkbox messagebar-sheet-image" style="background-image:url(path/to/image1.png)">
        <input type="checkbox" />
        <i class="icon icon-checkbox"></i>
      </label>
    
      <!-- 別の選択可能なシート画像 -->
      <label class="checkbox messagebar-sheet-image" style="background-image:url(path/to/image2.png)">
        <input type="checkbox" />
        <i class="icon icon-checkbox"></i>
      </label>
    
      <!-- カスタムシートアイテム -->
      <div class="messagebar-sheet-item">
        <!-- 任意のカスタムコンテンツ -->
      </div>
    </div>

    メッセージバーの添付ファイルレイアウト

    メッセージの添付ファイルブロックは、現在添付されているメッセージアイテム/画像を表示するように設計されています。

    <div class="messagebar-attachments">
      <!-- 画像の添付 -->
      <div class="messagebar-attachment">
        <img src="path/to/image1.png" />
      </div>
    
      <!-- 削除可能な画像の添付 -->
      <div class="messagebar-attachment">
        <img src="path/to/image2.png" />
        <!-- 添付ファイル削除ボタン -->
        <span class="messagebar-attachment-delete"></span>
      </div>
    </div>
    

    Messagebarアプリのメソッド

    さて、MessagebarのHTMLが完成したら、初期化する必要があります。関連するアプリのメソッドを使う必要があります。

    app.messagebar.create(parameters)パラメータでMessagebarを初期化する
    • parameters - object - Messagebarのパラメータを持つオブジェクト。
    • メソッドは初期化されたMessagebarインスタンスを返します
    app.messagebar.destroy(el)Messagebarインスタンスの破棄
    • el - HTMLElementまたはstring(CSSセレクタ付き)またはobject。破壊するMessagebar要素またはMessagebarインスタンスを指定します。
    app.messagebar.get(el)HTML要素によるMessagebarインスタンスの取得
    • el - HTMLElement または string (with CSS Selector). Messagebarの要素です。
    • メソッドはMessagebarのインスタンスを返します

    Messagebarのパラメータ

    利用可能なパラメータの一覧を見てみましょう。

    ParameterTypeDefaultDescription
    elstring
    HTMLElement
    messagebar要素(div class="messagebar")のCSSセレクタまたはHTML要素
    textareaElstring
    HTMLElement
    messagebarのtextarea要素のCSSセレクタまたはHTML要素。デフォルトでは(渡されなかった場合)、メッセージバーの中の textarea を探します。
    maxHeightnumbernullテキストの量に応じてリサイズされたときの、textareaの最大の高さ。
    attachmentsarray[]添付ファイルを含む配列。例えば、['path/to/image1.png', 'path/to/image2.png']のようになります。
    resizePagebooleantrueメッセージバーのテキストエリアのサイズが変更されたときに、メッセージページのサイズを変更したくない場合は無効にします。
    onobject

    イベントハンドラーを持つオブジェクトです。例えば、以下のようなものがあります。

    var messagebar = app.messagebar.create({
      el: '.messagebar',
      on: {
        change: function () {
          console.log('Textarea value changed')
        }
      }
    })
    Render functions
    renderAttachmentsfunction(attachments)添付ファイルブロックをレンダリングする関数。完全な添付ファイルのHTML文字列を返さなければなりません。
    renderAttachmentfunction(attachment)単一の添付ファイルをレンダリングする関数です。完全な添付ファイルのHTML文字列を返さなければなりません。

    Messagebarのメソッドとプロパティ

    したがって、Messagebarを作成するためには呼び出さなければなりません。

    var messagebar = app.messagebar.create({ /* parameters */ })

    Messagebarを初期化した後、有用なメソッドとプロパティを持つ初期化されたインスタンスを変数(上記の例では messagebar 変数)に格納します。

    Properties
    messagebar.elMessagebarのHTML要素。
    messagebar.$elmessagebar HTML要素を持つDom7要素。
    messagebar.textareaElmessagebar textarea HTML要素。
    messagebar.$textareaElmessagebar textarea HTML要素を持つDom7の要素。
    messagebar.params初期化パラメータが渡されたオブジェクト
    messagebar.attachmentsmessagebar の添付ファイルを含む配列
    Methods
    messagebar.getValue();messagebar textarea の値の取得
    messagebar.setValue(value);メッセージバーのテキストエリアの値/テキストの設定
    messagebar.clear();テキストエリアのクリアとサイズの更新/リセット
    messagebar.focus();メッセージバーのテキストエリアのフォーカス
    messagebar.blur();メッセージバーのテキストエリアからフォーカスを外す
    messagebar.setPlaceholder(placeholder)メッセージバーのプレースホルダーテキストの設定/変更
    messagebar.resizePage()メッセージバーの高さ/サイズに応じてメッセージページのサイズを強制的に変更する
    messagebar.attachmentsCreate()添付ファイルブロックのHTML要素を動的に作成する
    messagebar.attachmentsShow()添付ファイルブロックの表示
    messagebar.attachmentsHide()添付ファイルブロックの非表示
    messagebar.attachmentsToggle()添付ファイルブロックの表示/非表示
    messagebar.renderAttachments()添付ファイルのデータに基づいて添付ファイルブロックを表示する
    messagebar.sheetCreate()ダイナミックに作成されたメッセージバーシートブロックのHTML要素
    messagebar.sheetShow()メッセーバーシートの表示
    messagebar.sheetHide()メッセージバーシートの非表示
    messagebar.sheetToggle()メッセンジャーバーシートのトグル
    messagebar.destroy();メッセーバーインスタンスの破棄

    messagebar のイベント

    messagebarでは、messagebar要素のDOMイベント、appとmessagebarインスタンスのイベントが発生します。

    DOMイベント

    EventTargetDescription
    messagebar:changeMessagebar Element<div class="messagebar">messagebar の textarea の値が変更されると、イベントが発生します。
    messagebar:focusMessagebar Element<div class="messagebar">イベントは、messagebar textareaがフォーカスされたときに発生します。
    messagebar:blurMessagebar Element<div class="messagebar">messagebar の textarea がフォーカスを失ったときにイベントが発生します。
    messagebar:resizepageMessagebar Element<div class="messagebar">イベントは、メッセージバーがメッセージページをリサイズしたときに発生します。
    messagebar:attachmentdeleteMessagebar attachment element<div class="messagebar-attachment">メッセンジャーバーの添付ファイル削除ボタンをクリックするとイベントが発生する
    messagebar:attachmentclickMessagebar attachment element<div class="messagebar-attachment">イベントはメッセージバーの添付ファイルをクリックした時に発生します。
    messagebar:beforedestroyMessagebar Element<div class="messagebar">イベントは、Messagebar インスタンスが破壊される直前に発生します。

    アプリと Messagebar Instance のイベント

    Messagebar インスタンスは、self インスタンスと app インスタンスの両方でイベントを発行します。アプリのインスタンスのイベントは、同じ名前でプレフィックスとして messagebar が付いています。

    EventTargetArgumentsDescription
    changemessagebar(messagebar)イベントは、messagebar の textarea の値が変更された後に発生します。イベントハンドラは引数として、messagebarインスタンスを受け取ります。
    messagebarChangeapp
    focusmessagebar(messagebar)イベントは、messagebar textarea がフォーカスされたときに発生します。As an argument event handler receives messagebar instance
    messagebarFocusapp
    blurmessagebar(messagebar)messagebar textareaがフォーカスを失ったときにイベントが発生します。As an argument event handler receive messagebar instance
    messagebarBlurapp
    resizePagemessagebar(messagebar)messagebarがメッセージページをリサイズするとイベントが発生します。As an argument event handler receive messagebar instance
    messagebarResizePageapp
    attachmentDeletemessagebar(messagebar, attachmentEl, attachmentIndex)メッセージバーの添付ファイル削除ボタンをクリックするとイベントが発生します。イベントハンドラは引数として、メッセージバーインスタンス、クリックされた添付ファイルのHTML要素、添付ファイルのインデックス番号を受け取ります。
    messagebarAttachmentDeleteapp
    attachmentClickmessagebar(messagebar, attachmentEl, attachmentIndex)イベントは、メッセージバーの添付ファイルがクリックされた時に発生します。引数のイベントハンドラは、messagebar インスタンス、クリックされた添付ファイルの HTML 要素、添付ファイルのインデックス番号を受け取ります。
    messagebarAttachmentClickapp
    beforeDestroymessagebar(messagebar)イベントは、Messagebar インスタンスが破棄される直前にトリガーされます。
    messagebarBeforeDestroyapp

    メッセージバーの自動初期化

    もし、Messagebar APIを使用する必要がなく、Messagebarがページ内にあり、ページの初期化時にDOMに表示される場合、追加の messagebar-init クラスをmessagebar要素に追加するだけで、自動初期化することができ、すべての必要なパラメータは data- 属性を使用して渡すことができます。

    <div class="toolbar messagebar messagebar-init" data-max-height="200">
      <div class="toolbar-inner">
        <div class="messagebar-area">
          <textarea placeholder="Message"></textarea>
        </div>
        <a href="#" class="link">Send</a>
      </div>
    </div>

    data-属性でキャメルケースで使用されているパラメータ、例えばmaxHeightは、data-max-heightとしてケバブケースで使用されるべきです。

    CSS Variables

    Below is the list of related CSS variables (CSS custom properties).

    Note that commented variables are not specified by default and their values is what they fallback to in this case.

    :root {
      --f7-messagebar-shadow-image: none;
      --f7-messagebar-textarea-bg-color: transparent;
      --f7-messagebar-attachments-height: 155px;
      --f7-messagebar-attachment-height: 155px;
      --f7-messagebar-attachment-landscape-height: 120px;
      --f7-messagebar-sheet-height: 252px;
      --f7-messagebar-sheet-landscape-height: 192px;
      /*
      --f7-messagebar-inner-padding-left: var(--f7-toolbar-inner-padding-left);
      --f7-messagebar-inner-padding-right: var(--f7-toolbar-inner-padding-right);
      */
      --f7-messagebar-bg-color: #fff;
      --f7-messagebar-bg-color-rgb: 255, 255, 255;
    }
    :root .theme-dark,
    :root.theme-dark {
      --f7-messagebar-bg-color: var(--f7-bars-bg-color);
      --f7-messagebar-bg-color-rgb: var(--f7-bars-bg-color-rgb);
    }
    .ios {
      --f7-messagebar-height: 44px;
      --f7-messagebar-font-size: 17px;
      /*
      --f7-messagebar-link-color: var(--f7-theme-color);
      */
      --f7-messagebar-border-color: transparent;
      --f7-messagebar-textarea-border-radius: 17px;
      --f7-messagebar-textarea-padding: 6px 16px;
      --f7-messagebar-textarea-height: 34px;
      --f7-messagebar-textarea-font-size: 17px;
      --f7-messagebar-textarea-line-height: 20px;
      --f7-messagebar-sheet-bg-color: #d1d5da;
      --f7-messagebar-attachment-border-radius: 12px;
      --f7-messagebar-textarea-text-color: #000;
      --f7-messagebar-textarea-border: 1px solid #c8c8cd;
      --f7-messagebar-attachments-border-color: #c8c8cd;
    }
    .ios .theme-dark,
    .ios.theme-dark {
      --f7-messagebar-textarea-text-color: #fff;
      --f7-messagebar-textarea-border: 1px solid var(--f7-bars-border-color);
      --f7-messagebar-attachments-border-color: var(--f7-bars-border-color);
    }
    .md {
      --f7-messagebar-height: 48px;
      --f7-messagebar-font-size: 16px;
      --f7-messagebar-textarea-border-radius: 0px;
      --f7-messagebar-textarea-padding: 5px 8px;
      --f7-messagebar-textarea-height: 32px;
      --f7-messagebar-textarea-font-size: 16px;
      --f7-messagebar-textarea-line-height: 22px;
      --f7-messagebar-textarea-border: 1px solid transparent;
      --f7-messagebar-sheet-bg-color: #fff;
      --f7-messagebar-attachment-border-radius: 4px;
      --f7-messagebar-link-color: #333;
      --f7-messagebar-border-color: #d1d1d1;
      --f7-messagebar-textarea-text-color: #333;
      --f7-messagebar-attachments-border-color: #ddd;
    }
    .md .theme-dark,
    .md.theme-dark {
      --f7-messagebar-border-color: transparent;
      --f7-messagebar-link-color: rgba(255, 255, 255, 0.87);
      --f7-messagebar-textarea-text-color: rgba(255, 255, 255, 0.87);
      --f7-messagebar-attachments-border-color: rgba(255, 255, 255, 0.2);
    }
    .aurora {
      --f7-messagebar-height: 48px;
      --f7-messagebar-font-size: 16px;
      /*
      --f7-messagebar-link-color: var(--f7-theme-color);
      */
      --f7-messagebar-border-color: transparent;
      --f7-messagebar-textarea-border-radius: 8px;
      --f7-messagebar-textarea-padding: 4px 8px;
      --f7-messagebar-textarea-height: 32px;
      --f7-messagebar-textarea-font-size: 16px;
      --f7-messagebar-textarea-line-height: 22px;
      --f7-messagebar-sheet-bg-color: #fff;
      --f7-messagebar-attachment-border-radius: 8px;
      --f7-messagebar-textarea-text-color: #000;
      --f7-messagebar-textarea-border: 1px solid #c8c8cd;
      --f7-messagebar-attachments-border-color: #c8c8cd;
    }
    .aurora .theme-dark,
    .aurora.theme-dark {
      --f7-messagebar-textarea-text-color: #fff;
      --f7-messagebar-textarea-border: 1px solid var(--f7-bars-border-color);
      --f7-messagebar-attachments-border-color: var(--f7-bars-border-color);
    }
    

    Examples

    <template>
      <div class="page">
        <div class="navbar">
          <div class="navbar-bg"></div>
          <div class="navbar-inner">
            <div class="title">Messages</div>
          </div>
        </div>
        <div class="toolbar messagebar">
          <div class="toolbar-inner">
            <a class="link toggle-sheet" href="#">
              <i class="icon f7-icons if-not-md">camera_fill</i>
              <i class="icon material-icons md-only">camera_alt</i>
            </a>
            <div class="messagebar-area">
              <textarea placeholder="Message"></textarea>
            </div>
            <a class="link" href="#">Send</a>
          </div>
          <div class="messagebar-sheet"></div>
        </div>
        <div class="page-content messages-content">
          <div class="messages">
            <div class="messages-title"><b>Sunday, Feb 9,</b> 12:58</div>
            <div class="message message-sent">
              <div class="message-content">
                <div class="message-bubble">
                  <div class="message-text">Hi, Kate</div>
                </div>
              </div>
            </div>
            <div class="message message-sent">
              <div class="message-content">
                <div class="message-bubble">
                  <div class="message-text">How are you?</div>
                </div>
              </div>
            </div>
            <div class="message message-received">
              <div class="message-avatar"
                style="background-image:url(https://cdn.framework7.io/placeholder/people-100x100-9.jpg)"></div>
              <div class="message-content">
                <div class="message-name">Kate</div>
                <div class="message-bubble">
                  <div class="message-text">Hi, I am good!</div>
                </div>
              </div>
            </div>
            <div class="message message-received">
              <div class="message-avatar"
                style="background-image:url(https://cdn.framework7.io/placeholder/people-100x100-7.jpg)"></div>
              <div class="message-content">
                <div class="message-name">Blue Ninja</div>
                <div class="message-bubble">
                  <div class="message-text">Hi there, I am also fine, thanks! And how are you?</div>
                </div>
              </div>
            </div>
            <div class="message message-sent">
              <div class="message-content">
                <div class="message-bubble">
                  <div class="message-text">Hey, Blue Ninja! Glad to see you ;)</div>
                </div>
              </div>
            </div>
            <div class="message message-sent">
              <div class="message-content">
                <div class="message-bubble">
                  <div class="message-text">Hey, look, cutest kitten ever!</div>
                </div>
              </div>
            </div>
            <div class="message message-sent">
              <div class="message-content">
                <div class="message-bubble">
                  <div class="message-image">
                    <img src="https://cdn.framework7.io/placeholder/cats-200x260-4.jpg"
                      style="width:200px; height: 260px" />
                  </div>
                </div>
              </div>
            </div>
            <div class="message message-received">
              <div class="message-avatar"
                style="background-image:url(https://cdn.framework7.io/placeholder/people-100x100-9.jpg)"></div>
              <div class="message-content">
                <div class="message-name">Kate</div>
                <div class="message-bubble">
                  <div class="message-text">Nice!</div>
                </div>
              </div>
            </div>
            <div class="message message-received">
              <div class="message-avatar"
                style="background-image:url(https://cdn.framework7.io/placeholder/people-100x100-9.jpg)"></div>
              <div class="message-content">
                <div class="message-name">Kate</div>
                <div class="message-bubble">
                  <div class="message-text">Like it very much!</div>
                </div>
              </div>
            </div>
            <div class="message message-received">
              <div class="message-avatar"
                style="background-image:url(https://cdn.framework7.io/placeholder/people-100x100-7.jpg)"></div>
              <div class="message-content">
                <div class="message-name">Blue Ninja</div>
                <div class="message-bubble">
                  <div class="message-text">Awesome!</div>
                </div>
              </div>
            </div>
          </div>
        </div>
      </div>
    </template>
    <script>
      export default (props, { $, $f7, $on }) => {
        let messages;
        let messagebar;
    
        $on('pageInit', () => {
          messages = $f7.messages.create({
            el: '.messages',
            firstMessageRule: function (message, previousMessage, nextMessage) {
              if (message.isTitle) return false;
              if (!previousMessage || previousMessage.type !== message.type || previousMessage.name !== message.name) return true;
              return false;
            },
            lastMessageRule: function (message, previousMessage, nextMessage) {
              if (message.isTitle) return false;
              if (!nextMessage || nextMessage.type !== message.type || nextMessage.name !== message.name) return true;
              return false;
            },
            tailMessageRule: function (message, previousMessage, nextMessage) {
              if (message.isTitle) return false;
              if (!nextMessage || nextMessage.type !== message.type || nextMessage.name !== message.name) return true;
              return false;
            }
          });
    
          // Init messagebar
          messagebar = $f7.messagebar.create({
            el: '.messagebar',
            attachments: []
          });
    
          // Available Images
          var images = [
            'https://cdn.framework7.io/placeholder/cats-300x300-1.jpg',
            'https://cdn.framework7.io/placeholder/cats-200x300-2.jpg',
            'https://cdn.framework7.io/placeholder/cats-400x300-3.jpg',
            'https://cdn.framework7.io/placeholder/cats-300x150-4.jpg',
            'https://cdn.framework7.io/placeholder/cats-150x300-5.jpg',
            'https://cdn.framework7.io/placeholder/cats-300x300-6.jpg',
            'https://cdn.framework7.io/placeholder/cats-300x300-7.jpg',
            'https://cdn.framework7.io/placeholder/cats-200x300-8.jpg',
            'https://cdn.framework7.io/placeholder/cats-400x300-9.jpg',
            'https://cdn.framework7.io/placeholder/cats-300x150-10.jpg'
          ]
          // Create sheet items
          var sheetHtml = '';
          images.forEach(function (image) {
            sheetHtml += `
              <label class="checkbox messagebar-sheet-image" style="background-image:url(${image})">
                <input type="checkbox">
                <i class="icon icon-checkbox"></i>
              </label>
            `;
          });
    
          $('.messagebar-sheet').html(sheetHtml);
    
          /*========================
            Handle Attachments
            ========================*/
          function checkAttachments() {
            if (messagebar.attachments.length > 0) {
              messagebar.attachmentsShow();
              messagebar.setPlaceholder('Add comment or Send');
            } else {
              messagebar.attachmentsHide();
              messagebar.setPlaceholder('Message');
            }
          }
    
          $('.messagebar-sheet-image input').on('change', function (e) {
            var index = $(e.target).parents('.messagebar-sheet-image').index();
            var image = images[index];
            if (e.target.checked) {
              // Add to attachments
              messagebar.attachments.unshift(image)
            } else {
              // Remove from attachments
              messagebar.attachments.splice(messagebar.attachments.indexOf(image), 1);
            }
            messagebar.renderAttachments();
            checkAttachments();
          });
    
          messagebar.on('attachmentDelete', function (messagebar, attachmentEl, attachmentIndex) {
            var image = messagebar.attachments.splice(attachmentIndex, 1)[0];
            messagebar.renderAttachments();
            checkAttachments();
            // Uncheck in sheet
            var imageIndex = images.indexOf(image);
            messagebar.$el.find('.messagebar-sheet .checkbox').eq(imageIndex).find('input').prop('checked', false);
          });
    
          /*========================
            Toggle Sheet
            ========================*/
          $('a.toggle-sheet').on('click', function () {
            messagebar.sheetToggle();
          });
        })
    
        return $render;
      }
    
    
    </script>