需要背景:ミニプログラムページに GIF ダイナミック画像を挿入しますが、GIF 画像は通常サイズが大きいです。代わりに、自動ビデオ再生モードを使用して GIF 画像の効果をシミュレートし、ページの表示を豊かにします。ビデオを自動的に再生します。コントロール バーやサウンドはなく、自動的にループします。 技術的な問題: WeChat ミニプログラムは同じページにあるため、複数のビデオがある場合 (ビデオは 3 つ以下にすることをお勧めします)、遅延が発生したり、クラッシュしたりすることがあります。 プラン:ミニプログラムコミュニティの議論計画を参照してください。ビデオが画面の表示領域に表示されない場合は、画像を使用して場所を占め、画面に表示され、画像をビデオに置き換えて自動的に再生します。 コードノート:ビデオ タグは wx:if によって制御され、イメージ タグは可視性スタイルによって占有されます。 <view class="container" style="width: {{videoWidth}}rpx;height: {{videoHeight}}rpx"> <image class="image" style="visibility: {{play ? 'hidden' : 'visible'}};" id="image_{{videoId}}" src="{{poster}}" /> <video class="video" wx:if="{{play}}" id="video_{{videoId}}" controls="{{controls}}" object-fit='contain' show-center-play-btn="{{showCenterPlayBtn}}" enable-progress-gesture="{{enableProgressGesture}}" direction="{{direction}}" enable-play-gesture="{{enablePlayGesture}}" muted="{{muted}}" loop="{{loop}}" src="{{videoUrl}}" /> </ビュー> 。容器 { 位置: 相対的; 幅: 100%; 高さ: 100%; } 。画像 { 位置: 絶対; 上: 0; 左: 0; 右: 0; 下部: 0; zインデックス: 10; 幅: 100%; 高さ: 100%; } 。ビデオ { 幅: 100%; 高さ: 100%; } 成分({ プロパティ: // ビデオの幅 videoWidth: { タイプ: 数値、 値: 0, }, // ビデオの高さ videoHeight: { タイプ: 数値、 値: 0, }, // ビデオポスター/カバーポスター: { タイプ: 文字列、 価値: ''、 }, // ビデオリンク videoUrl: { タイプ: 文字列、 価値: ''、 }, // 再生進行状況バーコントロールを表示するかどうか: { タイプ: ブール値、 値: false、 }, // 中央の再生ボタンを表示するかどうか showCenterPlayBtn: { タイプ: ブール値、 値: false、 }, // ミュートされていますか: { タイプ: ブール値、 値: true、 }, // ミュートボタンを表示するかどうか showMuteBtn: { タイプ: ブール値、 値: true、 }, // ジェスチャーコントロールの進行を有効にするかどうか enableProgressGesture: { タイプ: ブール値、 値: false、 }, // ジェスチャーコントロールの再生を有効にするかどうか enablePlayGesture: { タイプ: ブール値、 値: false、 }, // 方向: { タイプ: 数値、 値: 0, }, //再生開始時間を秒単位で指定します showPlayTime: { タイプ: 数値、 値: 0, }, // ビデオ ID (一意の識別子) ビデオID: { タイプ: 文字列、 価値: ''、 }, // 再生するかどうか play: { タイプ: ブール値、 値: false、 }, //再生をループするかどうか loop: { タイプ: ブール値、 値: true、 }, }, データ: { paly: false, // 再生するかどうか context: null, // 作成されたビデオインスタンスオブジェクト}, 生涯: 添付() { this.videObserve(); }, }, メソッド: { // ビデオコンポーネントが可視領域に入るかどうかを監視する videObserve() { this._observer = this.createIntersectionObserver({ すべて観察: true、 }); this._observer.relativeToViewport().observe(`#image_${this.data.videoId}`, (res) => { //res.intersectionRatio === 0 は交差がないことを意味しますif (res.intersectionRatio === 0) { this.setData({ 再生: 偽、 }); } それ以外 { const ctx = this.data.context || wx.createVideoContext(`video_${this.data.videoId}`, this); (ctx)の場合{ この.setData( { コンテキスト: ctx, プレイ: 真、 }, () => { // 遅延は wxml ノードが作成されるのを待ち、ノードを取得した後に再生します。そうしないと再生が失敗する可能性があります。setTimeout(() => { ctx.play(); }, 400); } ); } } }); }, }, }); レンダリングビデオは可視領域に入った後にのみ読み込まれ、再生が開始されます。ビデオが可視領域から外れると、play=false が設定され、ビデオタグがクリアされ、つまりビデオがクリアされます。 今後の最適化ポイント現在、ビデオのレンダリングが開始されると、黒い画面が表示されます。後で白に変更できるかどうかを確認します(白は黒よりも受け入れられます)、ミニプログラムビデオのサポートにも依存します。 現在、1 つの画面で同時に再生できるビデオの数に制限はありません。ビデオの幅と高さが比較的小さい場合、1 つの画面に多くのビデオが表示され、遅延やクラッシュが発生する可能性があります。 要約するWeChatミニプログラムを使用してビデオを自動的に再生し、GIFアニメーションを模倣する方法についての記事はこれで終わりです。ビデオを自動的に再生し、GIFアニメーションを模倣するその他の関連ミニプログラムについては、123WORDPRESS.COMで以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後も123WORDPRESS.COMを応援してください。 以下もご興味があるかもしれません:
|
<<: Dockerプライベートウェアハウスの構築とインターフェース管理の詳細な説明
>>: MySQL に大量のデータを挿入する 4 つの方法の例
必要:通常、サイト側は、ウェブサイト上の動画や写真が盗まれるのを防ぎたいと考えています。結局のところ...
目次序文方法1: 高コントラスト方法2: getBoundingClientRect() APIを使...
コンポーネントに背景画像コントロールを追加するには、次の 2 つの手順だけが必要です。 <表示...
ps コマンドを使用できます。プロセスの PID など、現在実行中のプロセスに関する関連情報を表示で...
MySQL データベースのバージョンを 5.6.28 から 8.0.11 にアップグレード中にプロジ...
ここでは、samba (ファイル共有サービス) v4.9.1 + OPENldap (バックエンド ...
目次概要オブジェクトの残り属性オブジェクトの拡張プロパティオブジェクトの浅いコピーを作成するkeyo...
車輪の再発明として、ここでは再パッケージ化を使用して Docker ベースの Hadoop イメージ...
目次フロントエンド上記のアイデアに従って、ページめくり機能を設計して記述します。バックエンド(Jav...
VMware ツールは VMware の使用に非常に便利です。そのため、VMware ツールをインス...
この記事では、ツリーテーブルを実装するためのVueの具体的なコードを例として紹介します。具体的な内容...
目次序文オプションの連鎖ヌル結合呼び出されていない関数のチェック他の序文TypeScript 3.7...
序文私はプログラマーとしてスタートした PHP プログラマーです。これまで、トレーニング コースで勉...
質問: 360ブラウザの互換モードなど、一部のブラウザでは、 <td style="...
目次JS はファイルを読み取る FileReader書類イベントとメソッド基本的な使い方イベント処理...