JSはアニメーションのレイアウト変換を実装します

JSはアニメーションのレイアウト変換を実装します

JS でアニメーションを記述する場合、移動前に相対位置を絶対位置に変換してからアニメーション機能を実行する、レイアウト変換がよく使用されます。ネイティブ JS で実装されたレイアウト変換のデモです。効果は次のとおりです。

以下はコード実装です。どなたでもコピー、貼り付け、コメントしていただけます。

<!DOCTYPE html>
<html>
 
<ヘッド>
    <meta http-equiv="コンテンツタイプ" コンテンツ="text/html; charset=utf-8" />
    <title>ネイティブ JS がアニメーションのレイアウト変換を実装</title>
    <スタイル>
        * {
            マージン: 0;
            パディング: 0;
        }
 
        #ul1 {
            幅: 366ピクセル;
            マージン: 0 自動;
            位置: 相対的;
        }
 
        #ul1 li {
            リストスタイル: なし;
            幅: 100ピクセル;
            高さ: 100px;
            背景: #CCC;
            境界線: 1px 黒一色;
            フロート: 左;
            マージン: 10px;
            zインデックス: 1;
        }
    </スタイル>
    <!-- モーションフレーム -->
    <スクリプト>
        // 指定されたスタイルの値を取得する function getStyle(obj, attr) {
            (obj.currentStyle)の場合{
                obj.currentStyle[attr]を返します。
            } それ以外 {
                getComputedStyle(obj, false)[attr]を返します。
            }
        };
        //モーション関数 function startMove(obj, json, fn) {
            タイマー間隔をクリアします。
            obj.timer = setInterval(関数() {
                var bStop = true;
                for (var attr in json) {
                    var iCur = 0;
                    属性 == '不透明度' の場合 {
                        iCur = parseInt(parseFloat(getStyle(obj, attr)) * 100);
                    } それ以外 {
                        iCur = parseInt(getStyle(obj, attr));
                    }
                    var iSpeed ​​= (json[attr] - iCur) / 8;
                    iSpeed ​​= iSpeed ​​> 0 ? Math.ceil(iSpeed) : Math.floor(iSpeed);
                    iCur != json[attr] の場合 {
                        bStop = false;
                    }
                    属性 == '不透明度' の場合 {
                        obj.style.filter = 'alpha(不透明度:' + (iCur + iSpeed) + ')';
                        obj.style.opacity = (iCur + iSpeed) / 100;
                    } それ以外 {
                        obj.style[attr] = iCur + iSpeed ​​+ 'px';
                    }
                }
 
                if (bStop) {
                    タイマー間隔をクリアします。
                    もし(関数){
                        関数fn();
                    }
                }
            }, 30)
        }
    </スクリプト>
    <!-- イベントを追加 -->
    <スクリプト>
        window.onload = 関数(){
            var oUl = document.getElementById('ul1');
            var aLi = oUl.getElementsByTagName('li');
            var iMinZindex = 2;
            var i = 0;
 
            // 1. レイアウト変換 for (i = 0; i < aLi.length; i++) {
                //aLi[i].innerHTML='左:'+aLi[i].offsetLeft+'、上:'+aLi[i].offsetTop;
                aLi[i].style.left = aLi[i].offsetLeft + 'px';
                aLi[i].style.top = aLi[i].offsetTop + 'px';
            }
 
            // 2つのループが必要です for (i = 0; i < aLi.length; i++) {
                aLi[i].style.position = '絶対';
                //最初のループでは、オフセット値によって元のマージン値がすでに計算されているため、ここでクリアする必要があります。aLi[i].style.margin = '0';
            }
 
            // 2. イベントを追加します for (i = 0; i < aLi.length; i++) {
 
                aLi[i].onmouseover = 関数 () {
                    // スタックを防ぐために、現在の zIndex が増加し続けるようにします。this.style.zIndex = iMinZindex++;
                    startMove(これ、{
                        幅: 200,
                        高さ: 200,
                        左余白: -50,
                        マージン上: -50
                    });
                };
 
                aLi[i].onmouseout = 関数 () {
                    startMove(これ、{
                        幅: 100,
                        高さ: 100,
                        左余白: 0,
                        マージン上: 0
                    });
                };
            }
        };
    </スクリプト>
 
</head>
 
<本文>
    <ul id="ul1">
        <li></li>
        <li></li>
        <li></li>
        <li></li>
        <li></li>
        <li></li>
        <li></li>
        <li></li>
        <li></li>
    </ul>
</本文>
 
</html>

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • Vue.jsはグリッドリストレイアウト変換メソッドを実装します

<<:  Windows (コミュニティ エディション) に MySQL 8.0.18 をインストールするためのチュートリアル

>>:  Linuxファイルの基本属性の知識ポイントのまとめ

推薦する

Dockerプライベートウェアハウスの構築とインターフェース管理の詳細な説明

1. レジストリについて公式 Docker ハブは、パブリックイメージを管理するのに適した場所です。...

Vue要素のバックグラウンド認証プロセスの分析

序文:最近、プロジェクトで管理システムに遭遇しました。権限設定が非常に興味深いと思いました。自分の学...

SpringBoot のパッケージ化と Docker へのアップロード、およびマルチインスタンス デプロイメントの実装に関する簡単な分析 (IDEA バージョン)

最近友人からDockerを触ったことがあるかと聞かれました。あまり自信がなかったので答えられませんで...

IE6のバグと修正は予防戦略です

元記事:究極の IE6 チートシート: 25 以上の Internet Explorer 6 のバグ...

Vueカスタムカプセル化ボタンコンポーネント

Vueボタンコンポーネントのカスタムカプセル化コードは参考用です。具体的な内容は次のとおりです。ボタ...

Vue における nextTick の役割といくつかの簡単な使用シナリオ

目的nextTickの役割といくつかの簡単な使用シナリオを理解する文章その機能は何ですか?遅延コール...

ウェブサイト制作におけるオンライン広告の新しいインタラクティブ体験(グラフィックチュートリアル)

インターネット時代が成熟するにつれて、オンライン広告の発展も加速しています。圧倒的な広告収入と完璧な...

HTML の小さなタグの使用に関するヒント

<em></em> などのフレーズ要素を使用すると、意図した視覚スタイルを維...

CentOS7.5 MySQLのインストールチュートリアル

1. まずシステムにmysqlがインストールされているかどうかを確認します rpm -qa | gr...

Ubuntu で VIM を C++ 開発エディタとして設定する

1. 設定ファイルをユーザー環境にコピーし、新しい.vimフォルダを作成し、バンドルサブフォルダを作...

sqlとmysqlの違いは何ですか?

SQL とは何ですか? SQL はデータベースを操作するために使用される言語です。 SQL はすべ...

React はモバイル端末を構築するために antd-mobile+postcss を導入しました

antd-mobileをインストールするグローバル輸入 npm をインストール antd-mobil...

Windows Server 2016 リモート デスクトップ サービスを展開するためのクイック スタート ガイド

現在、2016サーバーは、win2008や2012よりも優れたマルチサイトhttpsサービスをサポー...

iOS WeChat H5ページのゴム反発効果の落とし穴記録

ビジネス要件最近開発したプロジェクトの一つに、WeChat公式アカウントに関連したH5ページがありま...

フォーム内の無効なフォームフィールドの値を送信する方法 サンプルコード

フォーム内のフォーム フィールドが無効に設定されている場合、フォーム フィールドの値は送信されません...