検索
ホームページウェブフロントエンドhtmlチュートリアルAngular の繰り返しの行操作に動的効果を追加するときに発生する問題の概要 list_html/css_WEB-ITnose

「アニメーション効果」を追加することは、ユーザーにアプリケーションの動作を認識させる効果的な方法です。 「リスト」はアプリケーションで最も一般的に使用されるインターフェイス フォームであり、行の追加、行の削除、行の移動などの操作が頻繁に行われます。追加操作は非常に単純で、削除する場合は大きい値から小さい値に移動し、追加する場合は小さい値から大きい値に移動します。これは、最初に削除してから追加することを意味します。複雑な感じはなく、CSS トランジションを使用して実行する必要があります。しかし、実際には対処すべき問題がたくさんあることがわかりました。一つずつ見ていきましょう。

簡単なテストをしてみましょう

1. 初期バージョン

<div class='list'>    <div class='row-1'>row-1</div>    <div class='row-2'>row-2</div></div>
.list{margin:20px;background:#eee;font-size:18px;color:white;}.row-1{background:green;overflow:hidden;padding:15px;}.row-2{background:blue;padding:15px;}/*demo1*/.demo-1 .remove{-webkit-transition: height 3s linear;}.demo-1 .remove.active{height:0;}
var ele = document.querySelector('.demo-1 .row-1');ele.classList.add('remove');ele.classList.add('active');

アイデアは単純で、「削除」を追加してアニメーションを設定します。 class エフェクトには「active」を追加してcss属性を変更し、アニメーションを有効にします。

結果が期待したものと異なります: 1. アニメーションが実行されません。 2. row-1 が消えません。なぜ?まず、CSS トランジションは auto 属性に作用できません。row-1 には元々高さが設定されていないため、既存の高さから 0 へのアニメーションは生成されません。次に、height=0 はコンテンツ領域を 0 に設定するだけで、パディングは変更されていないため、row-1 は依然として 30 ピクセルのスペースを占有します。

2. 固定の高さを指定し、パディングにアニメーションを追加します

CSS を調整します

/*demo2*/.demo-2 .row-1{height:48px;}.demo-2 .remove{-webkit-transition: height 3s linear, padding-top 3s linear;}.demo-2 .row-1.remove.active{height:0;padding-top:0;padding-bottom:0;}

今回の効果は正しく、row-1 は 48px から 0 になります。それに応じてパディングも変更されます。

3. 他に方法はありますか?高さを指定する必要がありますか?変形はOKですか?

CSSを修正

/*demo3*/.demo-3 .remove{-webkit-transition: -webkit-transform 3s linear,padding 0s linear 3s;}.demo-3 .row-1.remove.active{-webkit-transform-origin:0 0;-webkit-transform:scaleY(0);}

高さを設定しなくても変形によるアニメーションは問題ありません。問題は、行 1 がまだ元の場所にあり、スペースを占有しており、行 2 が上に移動していないことです。これにより、アニメーションの実行後 (高さの設定の 2 番目の例を含む)、行 1 が削除されず、非表示になります。

4. アニメーション実行後の要素クリアの問題を解決する

CSS を変更

.demo-4 .remove{-webkit-transition: height 3s linear, padding 3s linear, opacity 3s linear,color .5s linear;}.demo-4 .row-1.remove.active{padding-top:0;padding-bottom:0;color:rgba(0,0,0,0);opacity:0;}

JS を変更

var ele, l;ele =  document.querySelector('.demo-4 .row-1');l = ele.addEventListener('webkitTransitionEnd', function(evt){    if (evt.propertyName === 'height') {        ele.style.display = 'none';             ele.style.height = '';        ele.removeEventListener('webkitTransitionEnd', l, false);    }}, false);ele.style.height = ele.offsetHeight + 'px';ele.classList.add('remove');$timeout(function(){    ele.classList.add('active');    ele.style.height = '0px';});

今回の効果は良い。注意すべき点がいくつかあります: 1.transitionEnd イベントを登録すると、アニメーションの終了をキャプチャできます。2. 複数のアニメーションを同時に実行できます。transitionEnd イベントはそれぞれの終了時に生成されます。イベントの「propertyName」からどのプロパティであるかを知ることができます。アニメーションは終了です。

5. Velocity.js も使ってみました

CSS は JS コードを設定する必要はありません

var ele =  document.querySelector('.demo-5 .row-1');Velocity(ele, 'slideUp', { duration: 1000 });   

実行過程を見て高さも修正してみましたそしてパディング。ただし、速度は requestAnimationFrame 関数を使用します。比較的単純なアニメーションであれば他のライブラリを導入する必要はなく、直接書いても実行効果はほぼ同じになると思います。

6. 高さはわかったので、幅を変更してみましょう。

CSS を調整

.demo-6 .row-1{width:100%;}.demo-6 .remove{-webkit-transition: width 3s linear;}.demo-6 .row-1.remove.active{width:0%;}

幅自体はパーセンテージで設定できますが、高さが固定されていないという問題は依然として存在します。

7. JSを使用して幅を変更する問題を解決します

CSSを設定します

.demo-7 .row-1{width:100%;height:48px;}.demo-7 .remove{-webkit-transition: width 3s linear, opacity 3s ease;}.demo-7 .row-1.remove.active{width:0%;opacity:0;}

高さを固定すると、アニメーションは正常になります。その他の改善点については、前の例を参照してください。

2. 完全な例

完全な例は angular で実装されています。 Angular の実装における最初の疑問は、動的効果をいつ設定するかということです。 Angular は双方向バインディングであるため、コントローラーでオブジェクトが削除されると、インターフェイスがレンダリングされるときにオブジェクトが失われるため、データ バインディング プロセスが関与する必要があります。 Angular は ngAnimatie アニメーション モジュールを提供しています。試してみると、実際に ngRepeat リスト データ更新のアニメーション効果を完成させることができます。ただし、追加で angular-animation.js を導入する必要があります。大したことではありませんが、それでも必要ではないように感じます。また、すでに作成されているフレームワークのページにアニメーションを追加する場合、新しいモジュールを導入する必要がある場合、フレームワーク ファイルを変更する必要がありますが、これは良くないと思います。アニメーションモジュールを動的にロードしようとしたのですが失敗したので、アニメーションを制御する方法を自分で勉強しました。

angular がアニメーション モジュールをロードしない場合でも、アニメーション コントロールのインターフェイスを提供する $animate が存在します。 JS を見ると、

var fnEnter = $animate.enter,    fnLeave = $animate.leave;$animate.enter = function() {    var defer = $q.defer(),        e = arguments[0],        p = arguments[1],        a = arguments[2],        options = {            addClass: 'ng-enter'        };    fnEnter.call($animate, e, p, a, options).then(function() {        $animate.addClass(e, 'ng-enter-active').then(function(){            var l = e[0].addEventListener('webkitTransitionEnd', function(){                e[0].classList.remove('ng-enter-active');                e[0].classList.remove('ng-enter');                e[0].removeEventListener('webkitTransitionEnd', l, false);                defer.resolve();            }, false);         });    });    return defer.promise;};$animate.leave = function() {    var defer = $q.defer(),        e = arguments[0];    $animate.addClass(e, 'ng-leave').then(function(){        $animate.addClass(e, 'ng-leave-active').then(function(){            var l = e[0].addEventListener('webkitTransitionEnd', function(){                fnLeave.call($animate, e).then(function(){                    defer.resolve();                });            }, false);        });    });    return defer.promise;};

ng-repeat はデータ更新時に $animate サービスの enters、leave、move メソッドを呼び出します。そのため、アニメーションを自分で制御したい場合は、対応するメソッドを書き換える必要があります。 。書き換える場合は$animateを使って追加する必要があります。DOMに直接設定するのは問題があります。 (この段落のAngularのロジックは比較的低レベルなのでよく分かりません。さらなる勉強が必要です。)

また、行の位置を移動する場合は、削除と挿入を行います。 $timeout を介して 2 つのダイジェスト ループに配置する必要があります。そうしないと効果が見られません。

var index = records.indexOf($scope.selected),    r = records.splice(index, 1);$timeout(function(){    records.splice(index + 1, 0, r[0]);},500);

Angularのアニメーションはダイジェストサイクルと密接に関係していますが、angular-animation.jsのコードを見ても理解できなかったので、深く勉強する必要があります。

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
HTMLの役割:Webコンテンツの構造HTMLの役割:Webコンテンツの構造Apr 11, 2025 am 12:12 AM

HTMLの役割は、タグと属性を使用してWebページの構造とコンテンツを定義することです。 1。HTMLは、読みやすく理解しやすいようなタグを介してコンテンツを整理します。 2。アクセシビリティとSEOを強化するには、セマンティックタグなどを使用します。 3. HTMLコードの最適化により、Webページの読み込み速度とユーザーエクスペリエンスが向上する可能性があります。

HTMLとコード:用語を詳しく見るHTMLとコード:用語を詳しく見るApr 10, 2025 am 09:28 AM

htmlisaspecifictypeofcodefocuseduructuringwebcontent

HTML、CSS、およびJavaScript:Web開発者に不可欠なツールHTML、CSS、およびJavaScript:Web開発者に不可欠なツールApr 09, 2025 am 12:12 AM

HTML、CSS、およびJavaScriptは、Web開発の3つの柱です。 1。HTMLは、Webページ構造を定義し、などなどのタグを使用します。2。CSSは、色、フォントサイズなどのセレクターと属性を使用してWebページスタイルを制御します。

HTML、CSS、およびJavaScriptの役割:コアの責任HTML、CSS、およびJavaScriptの役割:コアの責任Apr 08, 2025 pm 07:05 PM

HTMLはWeb構造を定義し、CSSはスタイルとレイアウトを担当し、JavaScriptは動的な相互作用を提供します。 3人はWeb開発で職務を遂行し、共同でカラフルなWebサイトを構築します。

HTMLは初心者のために簡単に学ぶことができますか?HTMLは初心者のために簡単に学ぶことができますか?Apr 07, 2025 am 12:11 AM

HTMLは、簡単に学習しやすく、結果をすばやく見ることができるため、初心者に適しています。 1)HTMLの学習曲線はスムーズで簡単に開始できます。 2)基本タグをマスターして、Webページの作成を開始します。 3)柔軟性が高く、CSSおよびJavaScriptと組み合わせて使用​​できます。 4)豊富な学習リソースと最新のツールは、学習プロセスをサポートしています。

HTMLでの開始タグの例は何ですか?HTMLでの開始タグの例は何ですか?Apr 06, 2025 am 12:04 AM

Anexampleapalofastartingtaginhtmlis、それはaperginsaparagraph.startingtagsaresentionentientiontheyinitiateelements、definetheirtypes、およびarecrucialforurturingwebpagesandcontingthomedomを構築します。

CSSのフレックスボックスレイアウトを使用して、メニューの点線のラインセグメンテーション効果のセンターアラインメントを実現する方法は?CSSのフレックスボックスレイアウトを使用して、メニューの点線のラインセグメンテーション効果のセンターアラインメントを実現する方法は?Apr 05, 2025 pm 01:24 PM

メニューで点線のラインセグメンテーション効果を設計する方法は?メニューを設計するときは、通常、皿の名前と価格の間に左右に合わせることは難しくありませんが、真ん中の点線またはポイントはどうですか...

オンラインコードエディターはコード入力を実装するためにどのようなHTML要素を使用していますか?オンラインコードエディターはコード入力を実装するためにどのようなHTML要素を使用していますか?Apr 05, 2025 pm 01:21 PM

WebコードエディターのHTML要素分析では、多くのオンラインコードエディターを使用すると、ユーザーはHTML、CSS、およびJavaScriptコードを入力できます。最近、誰かが提案した...

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

このプロジェクトは osdn.net/projects/mingw に移行中です。引き続きそこでフォローしていただけます。 MinGW: GNU Compiler Collection (GCC) のネイティブ Windows ポートであり、ネイティブ Windows アプリケーションを構築するための自由に配布可能なインポート ライブラリとヘッダー ファイルであり、C99 機能をサポートする MSVC ランタイムの拡張機能が含まれています。すべての MinGW ソフトウェアは 64 ビット Windows プラットフォームで実行できます。

PhpStorm Mac バージョン

PhpStorm Mac バージョン

最新(2018.2.1)のプロフェッショナル向けPHP統合開発ツール

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

SublimeText3 英語版

SublimeText3 英語版

推奨: Win バージョン、コードプロンプトをサポート!

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境