スポンサー
Support Framework7

スケルトン

    Framework7には、スケルトンエレメントライブラリ(UIスケルトン、スケルトンスクリーン、ゴーストエレメント)が搭載されています。

    スケルトンエレメントライブラリは、すでにFramework7に統合されているので、別途インストールする必要はありません。APIの完全なドキュメントやその他の例については、公式のSkeleton Elements documentationをご覧ください。

    スケルトンブロック

    スケルトンブロックは、グレーの背景色を持つ通常のブロック要素で、必要な大きさにすることができます。

    スケルトンブロック要素を作成するには、skeleton-blockクラスを持つdiv要素を、固定幅で作成するだけです。

    ...
    <div class="list">
      <ul>
        <li class="item-content">
          <div class="item-inner">
            <div class="item-title">
              <!-- スケルトンブロックをリストアイテムのタイトルの代わりに使う -->
              <div class="skeleton-block" style="width: 100px"></div>
            </div>
          </div>
        </li>
      </ul>
    </div>
    ...
    

    スケルトンテキスト

    スケルトンテキストはさらに興味深いものです。Framework7には特別なスケルトンフォントが組み込まれていて、すべての文字が小さな灰色の四角形として表示されます。skeleton-textクラスを任意の要素に適用すると、テキストがグレーのブロックやラインに変換されます。skeleton-blockに比べて優れているのは、このような「スケルトンテキスト」は完全なレスポンシブ対応が可能で、そのサイズは実際のテキストサイズを反映します。

    スケルトンテキストフォントは、以下の文字セットに対応しています(「スペース」を含む)。

    0 1 2 3 4 5 6 7 8 9 a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z _ -   . , : ; / ! / * & ' " | ( ) { } [ ]
    ...
    <div class="list media-list">
      <ul>
        <!-- リストアイテムに "skeleton-text "クラスを追加するだけで、そのテキストはグレーのボックスとしてレンダリングされます。 -->
        <li class="item-content skeleton-text">
          <div class="item-inner">
            <div class="item-title-row">
              <div class="item-title">Item Title</div>
            </div>
            <div class="item-subtitle">Item Subtitle</div>
            <div class="item-text">Item text goes here, and it will be rendered as gray box too.</div>
          </div>
        </li>
        <!-- 次の項目では、実際のテキストの代わりに「_」文字を使用しています。 -->
        <li class="item-content skeleton-text">
          <div class="item-inner">
            <div class="item-title-row">
              <div class="item-title">____ _____</div>
            </div>
            <div class="item-subtitle">____ _______</div>
            <div class="item-text">____ ____ ____ _____ ___ __ ____ __ ________ __ ____ ___ ____</div>
          </div>
        </li>
      </ul>
    </div>
    ...
    

    スケルトンの効果

    スケルトン要素は、3つのアニメーション効果をサポートしています。フェード、ウェーブ、パルスです。

    特別なスケルトンのアニメーション効果を有効にするには、スケルトン要素、またはスケルトン要素を含む親要素に、以下のクラスのいずれかを追加する必要があります。

    • skeleton-effect-fade - フェード効果を追加します。
    • skeleton-effect-wave - ウェーブ効果を追加します。
    • skeleton-effect-pulse - パルス効果を追加します。

    CSS Variables

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

    :root {
      --skeleton-color: #ccc;
      --skeleton-icon-color: rgba(0, 0, 0, 0.25);
    }
    .theme-dark {
      --skeleton-color: #515151;
      --skeleton-icon-color: rgba(255, 255, 255, 0.25);
    }
    

    Examples

    <template>
      <div class="page">
        <div class="navbar">
          <div class="navbar-bg"></div>
          <div class="navbar-inner">
            <div class="title">Skeleton Elements</div>
          </div>
        </div>
        <div class="page-content">
          <div class="block-title">Skeleton List</div>
          <div class="list media-list skeleton-text">
            <ul>
              <li class="item-content">
                <div class="item-media">
                  <div class="skeleton-block" style="width: 40px; height: 40px; border-radius: 50%"></div>
                </div>
                <div class="item-inner">
                  <div class="item-title-row">
                    <div class="item-title">Title</div>
                  </div>
                  <div class="item-subtitle">Subtitle</div>
                  <div class="item-text">
                    Placeholder text line 1<br />
                    Text line 2
                  </div>
                </div>
              </li>
              <li class="item-content">
                <div class="item-media">
                  <div class="skeleton-block" style="width: 40px; height: 40px; border-radius: 50%"></div>
                </div>
                <div class="item-inner">
                  <div class="item-title-row">
                    <div class="item-title">Title</div>
                  </div>
                  <div class="item-subtitle">Subtitle</div>
                  <div class="item-text">
                    Placeholder text line 1<br />
                    Text line 2
                  </div>
                </div>
              </li>
            </ul>
          </div>
    
          <div class="block-title">Skeleton Card</div>
          <div class="card skeleton-text">
            <div class="card-header">Card Header</div>
            <div class="card-content card-content-padding">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi
              lobortis et massa ac interdum. Cras consequat felis at consequat hendrerit.</div>
            <div class="card-footer">Card Footer</div>
          </div>
    
          <div class="block-title">Loading Effects</div>
          <div class="block block-strong">
            <p>It supports few loading effects:</p>
            <p class="row">
              <a href="#" class="col button button-fill button-small button-round" @click=${()=> load('fade')}>Fade</a>
              <a href="#" class="col button button-fill button-small button-round" @click=${()=> load('wave')}>Wave</a>
              <a href="#" class="col button button-fill button-small button-round" @click=${()=> load('pulse')}>Pulse</a>
            </p>
          </div>
          <div class="list media-list">
            <ul>
              ${loading ? $h`
              <li class="item-content skeleton-text skeleton-effect-${effect}">
                <div class="item-media">
                  <div class="skeleton-block" style="width: 40px; height: 40px; border-radius: 50%"></div>
                </div>
                <div class="item-inner">
                  <div class="item-title-row">
                    <div class="item-title">Full Name</div>
                  </div>
                  <div class="item-subtitle">Position</div>
                  <div class="item-text">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi lobortis et massa ac
                    interdum. Cras consequat felis at consequat hendrerit. Aliquam vestibulum vitae lorem ac iaculis.
                    Praesent nec pharetra massa, at blandit lectus. Sed tincidunt, lectus eu convallis elementum, nibh nisi
                    aliquet urna, nec imperdiet felis sapien at enim.</div>
                </div>
              </li>
              <li class="item-content skeleton-text skeleton-effect-${effect}">
                <div class="item-media">
                  <div class="skeleton-block" style="width: 40px; height: 40px; border-radius: 50%"></div>
                </div>
                <div class="item-inner">
                  <div class="item-title-row">
                    <div class="item-title">Full Name</div>
                  </div>
                  <div class="item-subtitle">Position</div>
                  <div class="item-text">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi lobortis et massa ac
                    interdum. Cras consequat felis at consequat hendrerit. Aliquam vestibulum vitae lorem ac iaculis.
                    Praesent nec pharetra massa, at blandit lectus. Sed tincidunt, lectus eu convallis elementum, nibh nisi
                    aliquet urna, nec imperdiet felis sapien at enim.</div>
                </div>
              </li>
              <li class="item-content skeleton-text skeleton-effect-${effect}">
                <div class="item-media">
                  <div class="skeleton-block" style="width: 40px; height: 40px; border-radius: 50%"></div>
                </div>
                <div class="item-inner">
                  <div class="item-title-row">
                    <div class="item-title">Full Name</div>
                  </div>
                  <div class="item-subtitle">Position</div>
                  <div class="item-text">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi lobortis et massa ac
                    interdum. Cras consequat felis at consequat hendrerit. Aliquam vestibulum vitae lorem ac iaculis.
                    Praesent nec pharetra massa, at blandit lectus. Sed tincidunt, lectus eu convallis elementum, nibh nisi
                    aliquet urna, nec imperdiet felis sapien at enim.</div>
                </div>
              </li>
              ` : $h`
              <li class="item-content">
                <div class="item-media">
                  <img src="https://placeimg.com/80/80/people/1" style="width: 40px; height: 40px; border-radius: 50%" />
                </div>
                <div class="item-inner">
                  <div class="item-title-row">
                    <div class="item-title">John Doe</div>
                  </div>
                  <div class="item-subtitle">CEO</div>
                  <div class="item-text">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi lobortis et massa ac
                    interdum. Cras consequat felis at consequat hendrerit. Aliquam vestibulum vitae lorem ac iaculis.
                    Praesent nec pharetra massa, at blandit lectus. Sed tincidunt, lectus eu convallis elementum, nibh nisi
                    aliquet urna, nec imperdiet felis sapien at enim.</div>
                </div>
              </li>
              <li class="item-content">
                <div class="item-media">
                  <img src="https://placeimg.com/80/80/people/2" style="width: 40px; height: 40px; border-radius: 50%" />
                </div>
                <div class="item-inner">
                  <div class="item-title-row">
                    <div class="item-title">Jane Doe</div>
                  </div>
                  <div class="item-subtitle">Marketing</div>
                  <div class="item-text">Cras consequat felis at consequat hendrerit. Aliquam vestibulum vitae lorem ac
                    iaculis. Praesent nec pharetra massa, at blandit lectus. Sed tincidunt, lectus eu convallis elementum,
                    nibh nisi aliquet urna, nec imperdiet felis sapien at enim.</div>
                </div>
              </li>
              <li class="item-content">
                <div class="item-media">
                  <img src="https://placeimg.com/80/80/people/3" style="width: 40px; height: 40px; border-radius: 50%" />
                </div>
                <div class="item-inner">
                  <div class="item-title-row">
                    <div class="item-title">Kate Johnson</div>
                  </div>
                  <div class="item-subtitle">Admin</div>
                  <div class="item-text">Sed tincidunt, lectus eu convallis elementum, nibh nisi aliquet urna, nec imperdiet
                    felis sapien at enim.</div>
                </div>
              </li>
              `}
    
            </ul>
          </div>
        </div>
      </div>
    </template>
    <script>
      export default (props, { $update }) => {
        let loading = false;
        let effect = null;
    
        const load = (newEffect) => {
          if (loading) return;
          effect = newEffect;
          loading = true;
          $update();
          setTimeout(function () {
            loading = false;
            $update();
          }, 3000);
        }
        return $render;
      }
    </script>