{"id":28,"date":"2026-04-18T09:47:43","date_gmt":"2026-04-18T01:47:43","guid":{"rendered":"https:\/\/www.lianwj.com\/?page_id=28"},"modified":"2026-08-21T11:35:57","modified_gmt":"2026-08-21T03:35:57","slug":"%e9%a6%96%e9%a1%b5","status":"publish","type":"page","link":"https:\/\/www.lianwj.com\/","title":{"rendered":"\u6210\u90fd\u604b\u552f\u5bb6\u5b9a\u5236\u5bb6\u5c45\u6709\u9650\u516c\u53f8\u2014\u2014\u6beb\u5398\u4e0d\u5c06\u5c31\uff0c\u751f\u6d3b\u604b\u552f\u5bb6"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-post\" data-elementor-id=\"28\" class=\"elementor elementor-28\">\n\t\t\t\t<div class=\"elementor-element elementor-element-709cbab e-con-full e-flex e-con e-parent\" data-id=\"709cbab\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-9c92825 elementor-widget elementor-widget-shortcode\" data-id=\"9c92825\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"shortcode.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-shortcode\">\n    <div\n        id=\"apple-master-1\"\n        class=\"amc\"\n        style=\"--amc-ratio: 1.6000;\"\n    >\n\n        <!-- ==================================================\n             Track\n        =================================================== -->\n\n        <div class=\"amc-track\">\n\n            \n                \n                <div\n                    class=\"amc-slide\"\n                    data-type=\"video\"\n                    data-src=\"https:\/\/www.lianwj.com\/wp-content\/uploads\/2026\/05\/\u604b\u552f\u5bb6\u4f01\u4e1a\u5ba3\u4f20\u72471.mp4\"\n                >\n\n                    \n                        <canvas class=\"amc-canvas\"><\/canvas>\n\n                        <div class=\"amc-video-loader\">\n\n                            <div class=\"amc-loader-spinner\"><\/div>\n\n                        <\/div>\n\n                    \n                <\/div>\n\n            \n                \n                <div\n                    class=\"amc-slide\"\n                    data-type=\"image\"\n                    data-src=\"https:\/\/www.lianwj.com\/wp-content\/uploads\/2026\/05\/\u8f6e\u64ad\u56fe-1-3-scaled.jpg\"\n                >\n\n                    \n                        <img class=\"lazyload\"\n                            src=\"https:\/\/www.lianwj.com\/wp-content\/uploads\/2026\/05\/\u8f6e\u64ad\u56fe-1-3-scaled.jpg\"\n                            loading=\"lazy\"\n                            decoding=\"async\"\n                            alt=\"\"\n                        >\n\n                    \n                <\/div>\n\n            \n                \n                <div\n                    class=\"amc-slide\"\n                    data-type=\"image\"\n                    data-src=\"https:\/\/www.lianwj.com\/wp-content\/uploads\/2026\/05\/\u8f6e\u64ad\u56fe-2-3-scaled.jpg\"\n                >\n\n                    \n                        <img class=\"lazyload\"\n                            src=\"https:\/\/www.lianwj.com\/wp-content\/uploads\/2026\/05\/\u8f6e\u64ad\u56fe-2-3-scaled.jpg\"\n                            loading=\"lazy\"\n                            decoding=\"async\"\n                            alt=\"\"\n                        >\n\n                    \n                <\/div>\n\n            \n        <\/div>\n\n\n        <!-- ==================================================\n             Gesture Overlay\n        =================================================== -->\n\n        <div class=\"amc-overlay\"><\/div>\n\n\n        <!-- ==================================================\n             Mute Button\n        =================================================== -->\n\n        <button\n            type=\"button\"\n            class=\"amc-mute-btn\"\n            aria-label=\"\u5207\u6362\u58f0\u97f3\"\n        >\n\n            <!-- \u9759\u97f3 -->\n\n            <svg\n                class=\"amc-icon-muted\"\n                viewBox=\"0 0 24 24\"\n                fill=\"none\"\n                stroke=\"#fff\"\n                stroke-width=\"2\"\n                stroke-linecap=\"round\"\n                stroke-linejoin=\"round\"\n            >\n\n                <polygon\n                    points=\"\n                        11 5\n                        6 9\n                        2 9\n                        2 15\n                        6 15\n                        11 19\n                        11 5\n                    \"\n                \/>\n\n                <line\n                    x1=\"23\"\n                    y1=\"9\"\n                    x2=\"17\"\n                    y2=\"15\"\n                \/>\n\n                <line\n                    x1=\"17\"\n                    y1=\"9\"\n                    x2=\"23\"\n                    y2=\"15\"\n                \/>\n\n            <\/svg>\n\n\n            <!-- \u6709\u58f0\u97f3 -->\n\n            <svg\n                class=\"amc-icon-unmuted\"\n                viewBox=\"0 0 24 24\"\n                fill=\"none\"\n                stroke=\"#fff\"\n                stroke-width=\"2\"\n                stroke-linecap=\"round\"\n                stroke-linejoin=\"round\"\n                style=\"display:none\"\n            >\n\n                <polygon\n                    points=\"\n                        11 5\n                        6 9\n                        2 9\n                        2 15\n                        6 15\n                        11 19\n                        11 5\n                    \"\n                \/>\n\n                <path\n                    d=\"M19.07 4.93a10 10 0 0 1 0 14.14\"\n                \/>\n\n                <path\n                    d=\"M15.54 8.46a5 5 0 0 1 0 7.07\"\n                \/>\n\n            <\/svg>\n\n        <\/button>\n\n\n        <!-- ==================================================\n             Prev\n        =================================================== -->\n\n        <button\n            type=\"button\"\n            class=\"amc-prev\"\n            aria-label=\"\u4e0a\u4e00\u5f20\"\n        >\n\n            <svg\n                viewBox=\"0 0 24 24\"\n                fill=\"none\"\n                stroke=\"#fff\"\n                stroke-width=\"2.5\"\n                stroke-linecap=\"round\"\n                stroke-linejoin=\"round\"\n            >\n\n                <polyline\n                    points=\"\n                        15 18\n                        9 12\n                        15 6\n                    \"\n                \/>\n\n            <\/svg>\n\n        <\/button>\n\n\n        <!-- ==================================================\n             Next\n        =================================================== -->\n\n        <button\n            type=\"button\"\n            class=\"amc-next\"\n            aria-label=\"\u4e0b\u4e00\u5f20\"\n        >\n\n            <svg\n                viewBox=\"0 0 24 24\"\n                fill=\"none\"\n                stroke=\"#fff\"\n                stroke-width=\"2.5\"\n                stroke-linecap=\"round\"\n                stroke-linejoin=\"round\"\n            >\n\n                <polyline\n                    points=\"\n                        9 18\n                        15 12\n                        9 6\n                    \"\n                \/>\n\n            <\/svg>\n\n        <\/button>\n\n    <\/div>\n\n\n    <style>\n\n    \/* =========================================================\n       Root\n    ========================================================= *\/\n\n    #apple-master-1 {\n\n        --amc-ratio: 1.6000;\n\n        --amc-min-height: 260px;\n\n        --amc-max-height: 100dvh;\n\n        --amc-side-gap: 16px;\n\n        --amc-button-size: 48px;\n\n        --amc-bottom-gap: 24px;\n\n\n        position: relative;\n\n        width: 100vw;\n\n\n        \/*\n         * \u6838\u5fc3\u5c3a\u5bf8\uff1a\n         * \u6839\u636e\u5bbd\u5ea6\u81ea\u52a8\u8ba1\u7b97\u9ad8\u5ea6\n         *\/\n        aspect-ratio:\n            var(--amc-ratio);\n\n\n        max-height:\n            var(--amc-max-height);\n\n\n        min-height:\n            var(--amc-min-height);\n\n\n        overflow: hidden;\n\n\n        \/*\n         * \u5168\u5bbd\u7a81\u7834\u4e3b\u9898\u5bb9\u5668\n         *\/\n        margin-left:\n            calc(-50vw + 50%);\n\n\n        background: #000;\n\n\n        user-select: none;\n\n        -webkit-user-select: none;\n\n\n        \/*\n         * \u975e\u5e38\u5173\u952e\uff1a\n         *\n         * \u9ed8\u8ba4\u5141\u8bb8\u9875\u9762\u4e0a\u4e0b\u6eda\u52a8\u3002\n         *\n         * JS \u5224\u65ad\u4e3a\u6a2a\u5411\u540e\uff0c\n         * \u624d\u4f1a\u963b\u6b62\u6d4f\u89c8\u5668\u9ed8\u8ba4\u884c\u4e3a\u3002\n         *\/\n        touch-action: pan-y;\n\n\n        isolation: isolate;\n\n\n        -webkit-tap-highlight-color:\n            transparent;\n\n\n        outline: none;\n\n    }\n\n\n    \/* =========================================================\n       Track\n    ========================================================= *\/\n\n    #apple-master-1 .amc-track {\n\n        display: flex;\n\n        width: 100%;\n\n        height: 100%;\n\n\n        will-change:\n            transform;\n\n\n        transform:\n            translate3d(\n                0,\n                0,\n                0\n            );\n\n\n        backface-visibility:\n            hidden;\n\n\n        -webkit-backface-visibility:\n            hidden;\n\n    }\n\n\n    \/* =========================================================\n       Slide\n    ========================================================= *\/\n\n    #apple-master-1 .amc-slide {\n\n        flex:\n            0 0 100%;\n\n\n        width: 100%;\n\n        height: 100%;\n\n\n        overflow: hidden;\n\n\n        position: relative;\n\n\n        background: #000;\n\n\n        transform-origin:\n            center center;\n\n\n        will-change:\n            transform,\n            filter;\n\n\n        backface-visibility:\n            hidden;\n\n\n        -webkit-backface-visibility:\n            hidden;\n\n    }\n\n\n    \/* =========================================================\n       Image \/ Canvas\n    ========================================================= *\/\n\n    #apple-master-1 .amc-slide img,\n    #apple-master-1 .amc-canvas {\n\n        position: absolute;\n\n        inset: 0;\n\n\n        width: 100%;\n\n        height: 100%;\n\n\n        object-fit: cover;\n\n        object-position:\n            center center;\n\n\n        pointer-events: none;\n\n\n        z-index: 1;\n\n\n        display: block;\n\n    }\n\n\n    \/* =========================================================\n       Gesture Overlay\n    ========================================================= *\/\n\n    #apple-master-1 .amc-overlay {\n\n        position: absolute;\n\n        inset: 0;\n\n\n        width: 100%;\n\n        height: 100%;\n\n\n        z-index: 100;\n\n\n        cursor: grab;\n\n\n        background: transparent;\n\n\n        \/*\n         * \u4fdd\u8bc1\u7eb5\u5411\u9875\u9762\u6eda\u52a8\u6b63\u5e38\n         *\/\n        touch-action: pan-y;\n\n    }\n\n\n    #apple-master-1 .amc-overlay:active {\n\n        cursor: grabbing;\n\n    }\n\n\n    \/* =========================================================\n       Prev \/ Next\n    ========================================================= *\/\n\n    #apple-master-1 .amc-prev,\n    #apple-master-1 .amc-next {\n\n        position: absolute;\n\n\n        top: 50%;\n\n\n        width:\n            var(--amc-button-size);\n\n        height:\n            var(--amc-button-size);\n\n\n        margin-top:\n            calc(\n                var(--amc-button-size) \/ -2\n            );\n\n\n        z-index: 200;\n\n\n        cursor: pointer;\n\n\n        display: flex;\n\n        align-items: center;\n\n        justify-content: center;\n\n\n        padding: 0;\n\n        border: 0;\n\n\n        border-radius: 50%;\n\n\n        background:\n            rgba(\n                0,\n                0,\n                0,\n                .18\n            );\n\n\n        backdrop-filter:\n            blur(8px);\n\n        -webkit-backdrop-filter:\n            blur(8px);\n\n\n        opacity: 0;\n\n\n        transform:\n            scale(.85);\n\n\n        transition:\n            opacity .3s ease,\n            background .3s ease,\n            transform .3s ease;\n\n\n        -webkit-tap-highlight-color:\n            transparent;\n\n    }\n\n\n    #apple-master-1 .amc-prev {\n\n        left:\n            var(--amc-side-gap);\n\n    }\n\n\n    #apple-master-1 .amc-next {\n\n        right:\n            var(--amc-side-gap);\n\n    }\n\n\n    #apple-master-1 .amc-prev svg,\n    #apple-master-1 .amc-next svg {\n\n        width: 28px;\n\n        height: 28px;\n\n\n        pointer-events: none;\n\n    }\n\n\n    \/* =========================================================\n       Desktop Hover\n    ========================================================= *\/\n\n    @media (\n        hover: hover\n    ) and (\n        pointer: fine\n    ) {\n\n        #apple-master-1:hover .amc-prev,\n        #apple-master-1:hover .amc-next {\n\n            opacity: 1;\n\n            transform:\n                scale(1);\n\n        }\n\n\n        #apple-master-1 .amc-prev:hover,\n        #apple-master-1 .amc-next:hover {\n\n            background:\n                rgba(\n                    255,\n                    255,\n                    255,\n                    .15\n                );\n\n\n            transform:\n                scale(1.1);\n\n        }\n\n\n        #apple-master-1 .amc-prev:active,\n        #apple-master-1 .amc-next:active {\n\n            background:\n                rgba(\n                    255,\n                    255,\n                    255,\n                    .25\n                );\n\n\n            transform:\n                scale(.95);\n\n        }\n\n    }\n\n\n    \/* =========================================================\n       Mute\n    ========================================================= *\/\n\n    #apple-master-1 .amc-mute-btn {\n\n        position: absolute;\n\n\n        right:\n            var(--amc-bottom-gap);\n\n\n        bottom:\n            calc(\n                var(--amc-bottom-gap)\n                +\n                env(\n                    safe-area-inset-bottom\n                )\n            );\n\n\n        z-index: 250;\n\n\n        width: 44px;\n\n        height: 44px;\n\n\n        padding: 0;\n\n        border: 0;\n\n\n        cursor: pointer;\n\n\n        display: flex;\n\n        align-items: center;\n\n        justify-content: center;\n\n\n        border-radius: 50%;\n\n\n        background:\n            rgba(\n                0,\n                0,\n                0,\n                .45\n            );\n\n\n        backdrop-filter:\n            blur(10px);\n\n        -webkit-backdrop-filter:\n            blur(10px);\n\n\n        opacity: 0;\n\n\n        transition:\n            opacity .3s ease,\n            background .3s ease,\n            transform .2s ease;\n\n    }\n\n\n    #apple-master-1 .amc-mute-btn svg {\n\n        width: 22px;\n\n        height: 22px;\n\n\n        pointer-events: none;\n\n    }\n\n\n    @media (\n        hover: hover\n    ) and (\n        pointer: fine\n    ) {\n\n        #apple-master-1:hover .amc-mute-btn {\n\n            opacity: 1;\n\n        }\n\n\n        #apple-master-1 .amc-mute-btn:hover {\n\n            background:\n                rgba(\n                    0,\n                    0,\n                    0,\n                    .65\n                );\n\n\n            transform:\n                scale(1.06);\n\n        }\n\n    }\n\n\n    \/* =========================================================\n       Tablet \/ Mobile\n    ========================================================= *\/\n\n    @media (max-width: 768px) {\n\n        #apple-master-1 {\n\n            \/*\n             * \u624b\u673a\u7a0d\u5fae\u63d0\u9ad8\u9ad8\u5ea6\u6bd4\u4f8b\u3002\n             *\/\n            aspect-ratio:\n                1.50 \/ 1;\n\n\n            \/*\n             * \u5373\u4f7f\u624b\u673a\u975e\u5e38\u9ad8\uff0c\n             * Banner \u4e5f\u4e0d\u4f1a\u9738\u5360\u6574\u4e2a\u9875\u9762\u3002\n             *\/\n            max-height:\n                78dvh;\n\n\n            min-height:\n                220px;\n\n\n            --amc-side-gap: 8px;\n\n            --amc-button-size: 40px;\n\n            --amc-bottom-gap: 14px;\n\n        }\n\n\n        \/*\n         * \u624b\u673a\u59cb\u7ec8\u663e\u793a\u6309\u94ae\n         *\/\n        #apple-master-1 .amc-prev,\n        #apple-master-1 .amc-next {\n\n            opacity: .78;\n\n            transform:\n                scale(1);\n\n\n            background:\n                rgba(\n                    0,\n                    0,\n                    0,\n                    .22\n                );\n\n        }\n\n\n        #apple-master-1 .amc-prev svg,\n        #apple-master-1 .amc-next svg {\n\n            width: 23px;\n\n            height: 23px;\n\n        }\n\n\n        #apple-master-1 .amc-mute-btn {\n\n            width: 42px;\n\n            height: 42px;\n\n\n            opacity: .88;\n\n\n            right: 12px;\n\n\n            bottom:\n                calc(\n                    12px\n                    +\n                    env(\n                        safe-area-inset-bottom\n                    )\n                );\n\n        }\n\n\n        #apple-master-1 .amc-mute-btn svg {\n\n            width: 21px;\n\n            height: 21px;\n\n        }\n\n    }\n\n\n    \/* =========================================================\n       Small Mobile\n    ========================================================= *\/\n\n    @media (max-width: 480px) {\n\n        #apple-master-1 {\n\n            aspect-ratio:\n                1.46 \/ 1;\n\n\n            min-height:\n                210px;\n\n        }\n\n\n        #apple-master-1 {\n\n            --amc-button-size: 38px;\n\n        }\n\n\n        #apple-master-1 .amc-prev svg,\n        #apple-master-1 .amc-next svg {\n\n            width: 21px;\n\n            height: 21px;\n\n        }\n\n\n        #apple-master-1 .amc-mute-btn {\n\n            width: 40px;\n\n            height: 40px;\n\n        }\n\n    }\n\n\n    \/* =========================================================\n       Landscape Phone\n    ========================================================= *\/\n\n    @media (\n        max-width: 900px\n    ) and (\n        orientation: landscape\n    ) {\n\n        #apple-master-1 {\n\n            aspect-ratio:\n                1.75 \/ 1;\n\n\n            max-height:\n                90dvh;\n\n\n            min-height:\n                220px;\n\n        }\n\n\n        #apple-master-1 .amc-prev {\n\n            left:\n                calc(\n                    8px\n                    +\n                    env(\n                        safe-area-inset-left\n                    )\n                );\n\n        }\n\n\n        #apple-master-1 .amc-next {\n\n            right:\n                calc(\n                    8px\n                    +\n                    env(\n                        safe-area-inset-right\n                    )\n                );\n\n        }\n\n\n        #apple-master-1 .amc-mute-btn {\n\n            right:\n                calc(\n                    10px\n                    +\n                    env(\n                        safe-area-inset-right\n                    )\n                );\n\n\n            bottom:\n                calc(\n                    10px\n                    +\n                    env(\n                        safe-area-inset-bottom\n                    )\n                );\n\n        }\n\n    }\n\n\n    \/* =========================================================\n       Video Loader\n    ========================================================= *\/\n\n    #apple-master-1 .amc-video-loader {\n\n        position: absolute;\n\n        inset: 0;\n\n\n        width: 100%;\n\n        height: 100%;\n\n\n        display: flex;\n\n        align-items: center;\n\n        justify-content: center;\n\n\n        z-index: 2;\n\n\n        transition:\n            opacity .4s ease;\n\n\n        pointer-events: none;\n\n    }\n\n\n    #apple-master-1 .amc-video-loader.hidden {\n\n        opacity: 0;\n\n    }\n\n\n    #apple-master-1 .amc-loader-spinner {\n\n        width: 40px;\n\n        height: 40px;\n\n\n        border:\n            3px solid\n            rgba(\n                255,\n                255,\n                255,\n                .2\n            );\n\n\n        border-top-color:\n            #fff;\n\n\n        border-radius: 50%;\n\n\n        animation:\n            amc-spin .8s linear infinite;\n\n    }\n\n\n    @keyframes amc-spin {\n\n        to {\n\n            transform:\n                rotate(360deg);\n\n        }\n\n    }\n\n\n    \/* =========================================================\n       Reduced Motion\n    ========================================================= *\/\n\n    @media (\n        prefers-reduced-motion: reduce\n    ) {\n\n        #apple-master-1 .amc-prev,\n        #apple-master-1 .amc-next,\n        #apple-master-1 .amc-mute-btn {\n\n            transition: none;\n\n        }\n\n    }\n\n    <\/style>\n\n\n    <script>\n\n    (function () {\n\n        'use strict';\n\n\n        \/* =====================================================\n           DOM\n        ===================================================== *\/\n\n        var wrap =\n            document.getElementById(\n                'apple-master-1'\n            );\n\n\n        if (!wrap) {\n\n            return;\n\n        }\n\n\n        var track =\n            wrap.querySelector(\n                '.amc-track'\n            );\n\n\n        var overlay =\n            wrap.querySelector(\n                '.amc-overlay'\n            );\n\n\n        var btnPrev =\n            wrap.querySelector(\n                '.amc-prev'\n            );\n\n\n        var btnNext =\n            wrap.querySelector(\n                '.amc-next'\n            );\n\n\n        var muteBtn =\n            wrap.querySelector(\n                '.amc-mute-btn'\n            );\n\n\n        var iconMuted =\n            muteBtn.querySelector(\n                '.amc-icon-muted'\n            );\n\n\n        var iconUnmuted =\n            muteBtn.querySelector(\n                '.amc-icon-unmuted'\n            );\n\n\n        var origSlides =\n            Array.from(\n                wrap.querySelectorAll(\n                    '.amc-slide'\n                )\n            );\n\n\n        var N =\n            origSlides.length;\n\n\n        if (!N) {\n\n            return;\n\n        }\n\n\n        var speed =\n            5000;\n\n\n        \/* =====================================================\n           State\n        ===================================================== *\/\n\n        var globalMuted = true;\n\n        var userHasInteracted = false;\n\n\n        var videoMap = {};\n\n        var audioCtx = null;\n\n        var audioSources = {};\n\n        var timer = null;\n\n\n        \/*\n         * \u5b9e\u9645 slide index\n         *\/\n        var cur =\n            N > 1\n                ? 1\n                : 0;\n\n\n        var anim = false;\n\n\n        \/* =====================================================\n           Gesture State\n        ===================================================== *\/\n\n        \/*\n         * null\n         * horizontal\n         * vertical\n         *\/\n        var gesture = null;\n\n\n        var dragging = false;\n\n        var dragX0 = 0;\n\n        var dragY0 = 0;\n\n        var dragPos0 = 0;\n\n        var dragMoved = false;\n\n        var lastDragX = 0;\n\n        var lastDragY = 0;\n\n        var touchActive = false;\n\n\n        \/*\n         * \u624b\u6307\u81f3\u5c11\u79fb\u52a8\u8fd9\u4e48\u591a\u4ee5\u540e\n         * \u624d\u5224\u65ad\u65b9\u5411\u3002\n         *\/\n        var gestureThreshold = 8;\n\n\n        \/* =====================================================\n           Device\n        ===================================================== *\/\n\n        function isMobile() {\n\n            return window.matchMedia(\n                '(max-width: 768px)'\n            ).matches;\n\n        }\n\n\n        \/* =====================================================\n           User Interaction\n        ===================================================== *\/\n\n        function markInteracted() {\n\n            userHasInteracted = true;\n\n        }\n\n\n        wrap.addEventListener(\n            'click',\n            markInteracted,\n            false\n        );\n\n\n        wrap.addEventListener(\n            'touchstart',\n            markInteracted,\n            {\n                passive: true\n            }\n        );\n\n\n        \/* =====================================================\n           Infinite Loop\n        ===================================================== *\/\n\n        if (N > 1) {\n\n            track.insertBefore(\n                origSlides[N - 1].cloneNode(true),\n                origSlides[0]\n            );\n\n\n            track.appendChild(\n                origSlides[0].cloneNode(true)\n            );\n\n        }\n\n\n        var allSlides =\n            Array.from(\n                track.children\n            );\n\n\n        \/* =====================================================\n           Video\n        ===================================================== *\/\n\n        function initVideoSlide(\n            slideEl,\n            slideIdx\n        ) {\n\n            if (\n                slideEl.dataset.type !==\n                'video'\n            ) {\n\n                return;\n\n            }\n\n\n            var canvas =\n                slideEl.querySelector(\n                    '.amc-canvas'\n                );\n\n\n            var loader =\n                slideEl.querySelector(\n                    '.amc-video-loader'\n                );\n\n\n            if (!canvas || !loader) {\n\n                return;\n\n            }\n\n\n            var srcUrl =\n                slideEl.dataset.src;\n\n\n            var video =\n                document.createElement(\n                    'video'\n                );\n\n\n            video.muted =\n                globalMuted;\n\n\n            video.playsInline = true;\n\n\n            video.setAttribute(\n                'playsinline',\n                ''\n            );\n\n\n            video.setAttribute(\n                'webkit-playsinline',\n                ''\n            );\n\n\n            video.setAttribute(\n                'x-webkit-airplay',\n                'deny'\n            );\n\n\n            video.disableRemotePlayback =\n                true;\n\n\n            video.preload =\n                'auto';\n\n\n            video.crossOrigin =\n                'anonymous';\n\n\n            var ctx =\n                canvas.getContext(\n                    '2d',\n                    {\n                        alpha: false\n                    }\n                );\n\n\n            var raf = null;\n\n            var frameCaptured = false;\n\n            var videoReady = false;\n\n\n            videoMap[slideIdx] = {\n\n                video: video,\n\n                canvas: canvas,\n\n                ctx: ctx,\n\n                loader: loader,\n\n                raf: null,\n\n                frameCaptured: false,\n\n                videoReady: false,\n\n                sizeCanvas: sizeCanvas\n\n            };\n\n\n            \/* -------------------------------------------------\n               Canvas Size\n            ------------------------------------------------- *\/\n\n            function sizeCanvas() {\n\n                var dpr =\n                    Math.min(\n                        window.devicePixelRatio || 1,\n                        isMobile()\n                            ? 2\n                            : 3\n                    );\n\n\n                var width =\n                    wrap.clientWidth;\n\n\n                var height =\n                    wrap.clientHeight;\n\n\n                if (\n                    width <= 0 ||\n                    height <= 0\n                ) {\n\n                    return;\n\n                }\n\n\n                canvas.width =\n                    Math.round(\n                        width * dpr\n                    );\n\n\n                canvas.height =\n                    Math.round(\n                        height * dpr\n                    );\n\n            }\n\n\n            sizeCanvas();\n\n\n            \/* -------------------------------------------------\n               Render Frame\n            ------------------------------------------------- *\/\n\n            function renderFrameToCanvas() {\n\n                var vw =\n                    video.videoWidth ||\n                    canvas.width;\n\n\n                var vh =\n                    video.videoHeight ||\n                    canvas.height;\n\n\n                var cw =\n                    canvas.width;\n\n\n                var ch =\n                    canvas.height;\n\n\n                if (\n                    !vw ||\n                    !vh ||\n                    !cw ||\n                    !ch\n                ) {\n\n                    return;\n\n                }\n\n\n                var scale =\n                    Math.max(\n                        cw \/ vw,\n                        ch \/ vh\n                    );\n\n\n                var sw =\n                    cw \/ scale;\n\n\n                var sh =\n                    ch \/ scale;\n\n\n                var sx =\n                    (vw - sw) \/ 2;\n\n\n                var sy =\n                    (vh - sh) \/ 2;\n\n\n                try {\n\n                    ctx.drawImage(\n                        video,\n                        sx,\n                        sy,\n                        sw,\n                        sh,\n                        0,\n                        0,\n                        cw,\n                        ch\n                    );\n\n                } catch (e) {\n\n                    \/*\n                     * video \u5c1a\u672a\u5b8c\u5168 ready\n                     *\/\n                }\n\n            }\n\n\n            \/* -------------------------------------------------\n               Animation Frame\n            ------------------------------------------------- *\/\n\n            function drawFrame() {\n\n                if (\n                    video.paused ||\n                    video.ended\n                ) {\n\n                    raf = null;\n\n                    videoMap[slideIdx].raf =\n                        null;\n\n                    return;\n\n                }\n\n\n                renderFrameToCanvas();\n\n\n                raf =\n                    requestAnimationFrame(\n                        drawFrame\n                    );\n\n\n                videoMap[slideIdx].raf =\n                    raf;\n\n            }\n\n\n            \/* -------------------------------------------------\n               First Frame\n            ------------------------------------------------- *\/\n\n            function captureFirstFrame() {\n\n                if (frameCaptured) {\n\n                    return;\n\n                }\n\n\n                function capture() {\n\n                    if (frameCaptured) {\n\n                        return;\n\n                    }\n\n\n                    renderFrameToCanvas();\n\n\n                    frameCaptured = true;\n\n\n                    videoMap[slideIdx]\n                        .frameCaptured =\n                        true;\n\n\n                    loader.classList.add(\n                        'hidden'\n                    );\n\n                }\n\n\n                if (\n                    video.readyState >= 2\n                ) {\n\n                    capture();\n\n                } else {\n\n                    video.addEventListener(\n                        'loadeddata',\n                        capture,\n                        {\n                            once: true\n                        }\n                    );\n\n                }\n\n            }\n\n\n            video.addEventListener(\n                'loadedmetadata',\n                function () {\n\n                    videoReady =\n                        true;\n\n\n                    videoMap[slideIdx]\n                        .videoReady =\n                        true;\n\n\n                    captureFirstFrame();\n\n                }\n            );\n\n\n            video.addEventListener(\n                'loadeddata',\n                function () {\n\n                    captureFirstFrame();\n\n                }\n            );\n\n\n            video.addEventListener(\n                'canplay',\n                function () {\n\n                    captureFirstFrame();\n\n                }\n            );\n\n\n            video.addEventListener(\n                'play',\n                function () {\n\n                    if (raf) {\n\n                        cancelAnimationFrame(\n                            raf\n                        );\n\n                    }\n\n\n                    raf =\n                        requestAnimationFrame(\n                            drawFrame\n                        );\n\n\n                    videoMap[slideIdx]\n                        .raf =\n                        raf;\n\n                }\n            );\n\n\n            video.addEventListener(\n                'pause',\n                function () {\n\n                    if (raf) {\n\n                        cancelAnimationFrame(\n                            raf\n                        );\n\n                        raf = null;\n\n                    }\n\n\n                    videoMap[slideIdx]\n                        .raf =\n                        null;\n\n                }\n            );\n\n\n            video.addEventListener(\n                'error',\n                function () {\n\n                    loader.classList.add(\n                        'hidden'\n                    );\n\n                }\n            );\n\n\n            video.src =\n                srcUrl;\n\n\n            video.load();\n\n        }\n\n\n        allSlides.forEach(\n            function (\n                slide,\n                index\n            ) {\n\n                initVideoSlide(\n                    slide,\n                    index\n                );\n\n            }\n        );\n\n\n        \/* =====================================================\n           Audio\n        ===================================================== *\/\n\n        function ensureAudioContext() {\n\n            if (audioCtx) {\n\n                return;\n\n            }\n\n\n            try {\n\n                var AC =\n                    window.AudioContext ||\n                    window.webkitAudioContext;\n\n\n                if (!AC) {\n\n                    return;\n\n                }\n\n\n                audioCtx =\n                    new AC();\n\n            } catch (e) {\n\n                console.warn(\n                    'Web Audio API \u4e0d\u53ef\u7528',\n                    e\n                );\n\n            }\n\n        }\n\n\n        function resumeAudioContext() {\n\n            if (\n                audioCtx &&\n                audioCtx.state ===\n                'suspended'\n            ) {\n\n                audioCtx.resume()\n                    .catch(\n                        function () {}\n                    );\n\n            }\n\n        }\n\n\n        function connectAudio(\n            slideIdx\n        ) {\n\n            if (!audioCtx) {\n\n                return;\n\n            }\n\n\n            if (\n                audioSources[slideIdx]\n            ) {\n\n                return;\n\n            }\n\n\n            var entry =\n                videoMap[slideIdx];\n\n\n            if (!entry) {\n\n                return;\n\n            }\n\n\n            try {\n\n                var source =\n                    audioCtx.createMediaElementSource(\n                        entry.video\n                    );\n\n\n                source.connect(\n                    audioCtx.destination\n                );\n\n\n                audioSources[slideIdx] =\n                    source;\n\n            } catch (e) {\n\n                console.warn(\n                    '\u97f3\u9891\u8fde\u63a5\u5931\u8d25',\n                    e\n                );\n\n            }\n\n        }\n\n\n        function updateMuteUI() {\n\n            iconMuted.style.display =\n                globalMuted\n                    ? 'block'\n                    : 'none';\n\n\n            iconUnmuted.style.display =\n                globalMuted\n                    ? 'none'\n                    : 'block';\n\n        }\n\n\n        function setGlobalMute(\n            muted\n        ) {\n\n            globalMuted =\n                muted;\n\n\n            updateMuteUI();\n\n\n            for (\n                var k in videoMap\n            ) {\n\n                videoMap[k].video.muted =\n                    globalMuted;\n\n            }\n\n        }\n\n\n        \/* =====================================================\n           Width \/ Position\n        ===================================================== *\/\n\n        function W() {\n\n            return (\n                wrap.clientWidth ||\n                1\n            );\n\n        }\n\n\n        function posOf(idx) {\n\n            return -(\n                idx * W()\n            );\n\n        }\n\n\n        \/* =====================================================\n           Set Position\n        ===================================================== *\/\n\n        function setPos(\n            px,\n            transition\n        ) {\n\n            track.style.transition =\n                transition\n                    ? 'transform .45s cubic-bezier(.4,0,.2,1)'\n                    : 'none';\n\n\n            track.style.transform =\n                'translate3d(' +\n                px +\n                'px,0,0)';\n\n\n            \/*\n             * \u624b\u673a\u51cf\u5c11 Blur \/ Scale\n             * \u4ee5\u964d\u4f4e GPU \u538b\u529b\n             *\/\n            var blurMax =\n                isMobile()\n                    ? 3\n                    : 6;\n\n\n            var scaleMax =\n                isMobile()\n                    ? 0.06\n                    : 0.15;\n\n\n            for (\n                var i = 0;\n                i < allSlides.length;\n                i++\n            ) {\n\n                var offset =\n                    i * W() + px;\n\n\n                var absO =\n                    Math.abs(offset);\n\n\n                var sc =\n                    1 -\n                    Math.min(\n                        absO \/\n                        (W() * 3),\n                        scaleMax\n                    );\n\n\n                var bl =\n                    Math.min(\n                        absO \/\n                        (W() * 1.2),\n                        blurMax\n                    );\n\n\n                \/*\n                 * \u8fd9\u91cc\u662f\u4e0a\u4e00\u7248\u51fa\u9519\u7684\u4f4d\u7f6e\uff0c\n                 * \u5df2\u7ecf\u5b8c\u6574\u4fee\u6b63\u3002\n                 *\/\n                allSlides[i].style.transform =\n                    'scale(' +\n                    sc +\n                    ')';\n\n\n                allSlides[i].style.filter =\n                    'blur(' +\n                    bl +\n                    'px)';\n\n            }\n\n        }\n\n\n        \/* =====================================================\n           Jump\n        ===================================================== *\/\n\n        function jumpTo(idx) {\n\n            cur =\n                idx;\n\n\n            setPos(\n                posOf(cur),\n                false\n            );\n\n        }\n\n\n        \/* =====================================================\n           Slide\n        ===================================================== *\/\n\n        function slideTo(idx) {\n\n            if (anim) {\n\n                return;\n\n            }\n\n\n            if (N <= 1) {\n\n                return;\n\n            }\n\n\n            anim =\n                true;\n\n\n            cur =\n                idx;\n\n\n            setPos(\n                posOf(cur),\n                true\n            );\n\n\n            var done =\n                false;\n\n\n            function finish() {\n\n                if (done) {\n\n                    return;\n\n                }\n\n\n                done =\n                    true;\n\n\n                anim =\n                    false;\n\n\n                track.style.transition =\n                    'none';\n\n\n                \/*\n                 * \u65e0\u9650\u5faa\u73af\n                 *\/\n                if (cur <= 0) {\n\n                    cur =\n                        N;\n\n\n                    setPos(\n                        posOf(cur),\n                        false\n                    );\n\n                }\n\n\n                if (cur >= N + 1) {\n\n                    cur =\n                        1;\n\n\n                    setPos(\n                        posOf(cur),\n                        false\n                    );\n\n                }\n\n\n                onSlideReady();\n\n            }\n\n\n            track.addEventListener(\n                'transitionend',\n                finish,\n                {\n                    once: true\n                }\n            );\n\n\n            setTimeout(\n                finish,\n                500\n            );\n\n        }\n\n\n        function next() {\n\n            if (\n                !anim &&\n                N > 1\n            ) {\n\n                slideTo(\n                    cur + 1\n                );\n\n            }\n\n        }\n\n\n        function prev() {\n\n            if (\n                !anim &&\n                N > 1\n            ) {\n\n                slideTo(\n                    cur - 1\n                );\n\n            }\n\n        }\n\n\n        \/* =====================================================\n           Slide Ready\n        ===================================================== *\/\n\n        function onSlideReady() {\n\n            stopAuto();\n\n\n            \/*\n             * \u6682\u505c\u6240\u6709\u89c6\u9891\n             *\/\n            for (\n                var k in videoMap\n            ) {\n\n                var other =\n                    videoMap[k];\n\n\n                if (\n                    other.raf\n                ) {\n\n                    cancelAnimationFrame(\n                        other.raf\n                    );\n\n\n                    other.raf =\n                        null;\n\n                }\n\n\n                other.video.pause();\n\n\n                try {\n\n                    other.video.currentTime =\n                        0;\n\n                } catch (e) {}\n\n            }\n\n\n            var entry =\n                videoMap[cur];\n\n\n            \/*\n             * \u5f53\u524d\u662f\u89c6\u9891\n             *\/\n            if (entry) {\n\n                entry.video.muted =\n                    globalMuted;\n\n\n                if (\n                    !globalMuted &&\n                    userHasInteracted\n                ) {\n\n                    ensureAudioContext();\n\n                    resumeAudioContext();\n\n                    connectAudio(cur);\n\n                }\n\n\n                function tryPlayVideo() {\n\n                    if (\n                        !entry.videoReady\n                    ) {\n\n                        setTimeout(\n                            tryPlayVideo,\n                            100\n                        );\n\n                        return;\n\n                    }\n\n\n                    try {\n\n                        entry.video.currentTime =\n                            0;\n\n                    } catch (e) {}\n\n\n                    entry.video\n                        .play()\n                        .then(\n                            function () {\n\n                                stopAuto();\n\n                            }\n                        )\n                        .catch(\n                            function () {\n\n                                \/*\n                                 * \u81ea\u52a8\u64ad\u653e\u5931\u8d25\uff1a\n                                 * \u9759\u97f3\u518d\u5c1d\u8bd5\n                                 *\/\n                                entry.video.muted =\n                                    true;\n\n\n                                entry.video\n                                    .play()\n                                    .catch(\n                                        function () {\n\n                                            startAuto();\n\n                                        }\n                                    );\n\n                            }\n                        );\n\n\n                    entry.video.onended =\n                        function () {\n\n                            next();\n\n                        };\n\n                }\n\n\n                tryPlayVideo();\n\n\n            } else {\n\n                \/*\n                 * \u56fe\u7247\n                 *\/\n                startAuto();\n\n            }\n\n        }\n\n\n        \/* =====================================================\n           Auto Play\n        ===================================================== *\/\n\n        function startAuto() {\n\n            stopAuto();\n\n\n            if (N <= 1) {\n\n                return;\n\n            }\n\n\n            timer =\n                setInterval(\n                    function () {\n\n                        if (!anim) {\n\n                            next();\n\n                        }\n\n                    },\n                    speed\n                );\n\n        }\n\n\n        function stopAuto() {\n\n            if (timer) {\n\n                clearInterval(\n                    timer\n                );\n\n                timer = null;\n\n            }\n\n        }\n\n\n        \/* =====================================================\n           Video Play \/ Pause\n        ===================================================== *\/\n\n        function toggleVideo() {\n\n            var entry =\n                videoMap[cur];\n\n\n            if (!entry) {\n\n                return;\n\n            }\n\n\n            markInteracted();\n\n\n            if (\n                entry.video.paused\n            ) {\n\n                entry.video\n                    .play()\n                    .catch(\n                        function () {}\n                    );\n\n            } else {\n\n                entry.video.pause();\n\n            }\n\n        }\n\n\n        \/* =====================================================\n           Mute Button\n        ===================================================== *\/\n\n        muteBtn.addEventListener(\n            'mousedown',\n            function (e) {\n\n                e.stopPropagation();\n\n            }\n        );\n\n\n        muteBtn.addEventListener(\n            'touchstart',\n            function (e) {\n\n                e.stopPropagation();\n\n            },\n            {\n                passive: true\n            }\n        );\n\n\n        muteBtn.addEventListener(\n            'click',\n            function (e) {\n\n                e.stopPropagation();\n\n\n                markInteracted();\n\n\n                var newMuted =\n                    !globalMuted;\n\n\n                if (!newMuted) {\n\n                    ensureAudioContext();\n\n                    resumeAudioContext();\n\n\n                    for (\n                        var k in videoMap\n                    ) {\n\n                        connectAudio(\n                            parseInt(\n                                k,\n                                10\n                            )\n                        );\n\n                    }\n\n                }\n\n\n                setGlobalMute(\n                    newMuted\n                );\n\n\n                var entry =\n                    videoMap[cur];\n\n\n                if (\n                    entry &&\n                    !entry.video.paused\n                ) {\n\n                    entry.video.muted =\n                        globalMuted;\n\n                }\n\n            }\n        );\n\n\n        \/* =====================================================\n           Prev \/ Next\n        ===================================================== *\/\n\n        btnPrev.addEventListener(\n            'mousedown',\n            function (e) {\n\n                e.stopPropagation();\n\n            }\n        );\n\n\n        btnNext.addEventListener(\n            'mousedown',\n            function (e) {\n\n                e.stopPropagation();\n\n            }\n        );\n\n\n        btnPrev.addEventListener(\n            'click',\n            function (e) {\n\n                e.stopPropagation();\n\n\n                stopAuto();\n\n\n                prev();\n\n            }\n        );\n\n\n        btnNext.addEventListener(\n            'click',\n            function (e) {\n\n                e.stopPropagation();\n\n\n                stopAuto();\n\n\n                next();\n\n            }\n        );\n\n\n        btnPrev.addEventListener(\n            'touchstart',\n            function (e) {\n\n                e.stopPropagation();\n\n            },\n            {\n                passive: true\n            }\n        );\n\n\n        btnNext.addEventListener(\n            'touchstart',\n            function (e) {\n\n                e.stopPropagation();\n\n            },\n            {\n                passive: true\n            }\n        );\n\n\n        \/* =====================================================\n           Mouse Helpers\n        ===================================================== *\/\n\n        function startMouseDrag(e) {\n\n            if (anim) {\n\n                return;\n\n            }\n\n\n            if (\n                e.button !== 0\n            ) {\n\n                return;\n\n            }\n\n\n            dragging =\n                true;\n\n\n            dragMoved =\n                false;\n\n\n            gesture =\n                'horizontal';\n\n\n            dragX0 =\n                e.clientX;\n\n\n            dragY0 =\n                e.clientY;\n\n\n            lastDragX =\n                e.clientX;\n\n\n            lastDragY =\n                e.clientY;\n\n\n            dragPos0 =\n                posOf(cur);\n\n\n            track.style.transition =\n                'none';\n\n\n            stopAuto();\n\n        }\n\n\n        function moveMouseDrag(e) {\n\n            if (!dragging) {\n\n                return;\n\n            }\n\n\n            var dx =\n                e.clientX -\n                dragX0;\n\n\n            lastDragX =\n                e.clientX;\n\n\n            if (\n                Math.abs(dx) > 5\n            ) {\n\n                dragMoved =\n                    true;\n\n            }\n\n\n            setPos(\n                dragPos0 + dx,\n                false\n            );\n\n\n            e.preventDefault();\n\n        }\n\n\n        function endMouseDrag() {\n\n            if (!dragging) {\n\n                return;\n\n            }\n\n\n            dragging =\n                false;\n\n\n            var totalDrag =\n                lastDragX -\n                dragX0;\n\n\n            var threshold =\n                W() *\n                (\n                    isMobile()\n                        ? 0.12\n                        : 0.15\n                );\n\n\n            var target =\n                cur;\n\n\n            if (\n                Math.abs(totalDrag) >\n                threshold\n            ) {\n\n                target =\n                    totalDrag < 0\n                        ? cur + 1\n                        : cur - 1;\n\n            }\n\n\n            gesture =\n                null;\n\n\n            slideTo(\n                target\n            );\n\n        }\n\n\n        overlay.addEventListener(\n            'mousedown',\n            startMouseDrag\n        );\n\n\n        window.addEventListener(\n            'mousemove',\n            moveMouseDrag\n        );\n\n\n        window.addEventListener(\n            'mouseup',\n            endMouseDrag\n        );\n\n\n        \/* =====================================================\n           Touch Helpers\n        ===================================================== *\/\n\n        function startTouch(e) {\n\n            if (anim) {\n\n                return;\n\n            }\n\n\n            if (\n                !e.touches ||\n                !e.touches.length\n            ) {\n\n                return;\n\n            }\n\n\n            var touch =\n                e.touches[0];\n\n\n            touchActive =\n                true;\n\n\n            \/*\n             * \u7edd\u5bf9\u4e0d\u80fd\u5728\u8fd9\u91cc preventDefault\u3002\n             *\n             * \u6d4f\u89c8\u5668\u9700\u8981\u4fdd\u7559\u7eb5\u5411\u6eda\u52a8\u6743\u3002\n             *\/\n            gesture =\n                null;\n\n\n            dragging =\n                false;\n\n\n            dragMoved =\n                false;\n\n\n            dragX0 =\n                touch.clientX;\n\n\n            dragY0 =\n                touch.clientY;\n\n\n            lastDragX =\n                touch.clientX;\n\n\n            lastDragY =\n                touch.clientY;\n\n\n            dragPos0 =\n                posOf(cur);\n\n\n            stopAuto();\n\n        }\n\n\n        function moveTouch(e) {\n\n            if (!touchActive) {\n\n                return;\n\n            }\n\n\n            if (\n                !e.touches ||\n                !e.touches.length\n            ) {\n\n                return;\n\n            }\n\n\n            var touch =\n                e.touches[0];\n\n\n            var currentX =\n                touch.clientX;\n\n\n            var currentY =\n                touch.clientY;\n\n\n            var dx =\n                currentX -\n                dragX0;\n\n\n            var dy =\n                currentY -\n                dragY0;\n\n\n            lastDragX =\n                currentX;\n\n\n            lastDragY =\n                currentY;\n\n\n            \/* =================================================\n               \u7b2c\u4e00\u6b21\u65b9\u5411\u5224\u65ad\n            ================================================= *\/\n\n            if (\n                gesture === null\n            ) {\n\n                var absX =\n                    Math.abs(dx);\n\n\n                var absY =\n                    Math.abs(dy);\n\n\n                \/*\n                 * \u79fb\u52a8\u592a\u5c0f\uff1a\n                 * \u4e0d\u505a\u4efb\u4f55\u4e8b\n                 *\/\n                if (\n                    absX < gestureThreshold &&\n                    absY < gestureThreshold\n                ) {\n\n                    return;\n\n                }\n\n\n                \/*\n                 * ==============================================\n                 * \u7eb5\u5411\u624b\u52bf\n                 * ==============================================\n                 *\/\n\n                if (\n                    absY > absX\n                ) {\n\n                    gesture =\n                        'vertical';\n\n\n                    dragging =\n                        false;\n\n\n                    dragMoved =\n                        false;\n\n\n                    \/*\n                     * \u5173\u952e\uff1a\n                     *\n                     * \u4e0d\u8c03\u7528 preventDefault\u3002\n                     *\n                     * \u9875\u9762\u6b63\u5e38\u6eda\u52a8\u3002\n                     *\/\n                    return;\n\n                }\n\n\n                \/*\n                 * ==============================================\n                 * \u6a2a\u5411\u624b\u52bf\n                 * ==============================================\n                 *\/\n\n                if (\n                    absX > absY\n                ) {\n\n                    gesture =\n                        'horizontal';\n\n\n                    dragging =\n                        true;\n\n\n                    dragMoved =\n                        false;\n\n\n                    track.style.transition =\n                        'none';\n\n                }\n\n            }\n\n\n            \/* =================================================\n               \u7eb5\u5411\n            ================================================= *\/\n\n            if (\n                gesture ===\n                'vertical'\n            ) {\n\n                \/*\n                 * \u6c38\u8fdc\u4e0d\u8981 preventDefault\u3002\n                 *\/\n                return;\n\n            }\n\n\n            \/* =================================================\n               \u6a2a\u5411\n            ================================================= *\/\n\n            if (\n                gesture ===\n                'horizontal'\n            ) {\n\n                if (\n                    Math.abs(dx) > 5\n                ) {\n\n                    dragMoved =\n                        true;\n\n                }\n\n\n                \/*\n                 * \u5df2\u7ecf\u786e\u5b9a\u662f\u6a2a\u5411\u3002\n                 *\n                 * \u6b64\u65f6\u624d\u5141\u8bb8\u963b\u6b62\u9ed8\u8ba4\u3002\n                 *\/\n                if (\n                    e.cancelable\n                ) {\n\n                    e.preventDefault();\n\n                }\n\n\n                setPos(\n                    dragPos0 + dx,\n                    false\n                );\n\n            }\n\n        }\n\n\n        function endTouch() {\n\n            if (!touchActive) {\n\n                return;\n\n            }\n\n\n            touchActive =\n                false;\n\n\n            \/*\n             * ==============================================\n             * \u7eb5\u5411\u624b\u52bf\n             * ==============================================\n             *\n             * \u5b8c\u5168\u4ea4\u7ed9\u7f51\u9875\u3002\n             *\/\n\n            if (\n                gesture ===\n                'vertical'\n            ) {\n\n                gesture =\n                    null;\n\n\n                dragging =\n                    false;\n\n\n                dragMoved =\n                    false;\n\n\n                \/*\n                 * \u4e0d\u6062\u590d\u4f4d\u7f6e\u3002\n                 *\n                 * \u56e0\u4e3a\u6211\u4eec\u672c\u6765\u5c31\u6ca1\u6709\u6539\u53d8\u8f6e\u64ad\u4f4d\u7f6e\u3002\n                 *\/\n\n                return;\n\n            }\n\n\n            \/*\n             * \u6ca1\u6709\u5efa\u7acb\u6a2a\u5411\u624b\u52bf\n             *\/\n            if (\n                gesture !==\n                'horizontal'\n            ) {\n\n                gesture =\n                    null;\n\n\n                dragging =\n                    false;\n\n\n                dragMoved =\n                    false;\n\n\n                return;\n\n            }\n\n\n            dragging =\n                false;\n\n\n            var totalDrag =\n                lastDragX -\n                dragX0;\n\n\n            var threshold =\n                W() *\n                0.12;\n\n\n            var target =\n                cur;\n\n\n            if (\n                Math.abs(totalDrag) >\n                threshold\n            ) {\n\n                target =\n                    totalDrag < 0\n                        ? cur + 1\n                        : cur - 1;\n\n            }\n\n\n            gesture =\n                null;\n\n\n            slideTo(\n                target\n            );\n\n        }\n\n\n        function cancelTouch() {\n\n            touchActive =\n                false;\n\n\n            gesture =\n                null;\n\n\n            dragging =\n                false;\n\n\n            dragMoved =\n                false;\n\n\n            \/*\n             * \u56de\u5230\u5f53\u524d\u4f4d\u7f6e\n             *\/\n            jumpTo(cur);\n\n        }\n\n\n        overlay.addEventListener(\n            'touchstart',\n            startTouch,\n            {\n                passive: true\n            }\n        );\n\n\n        overlay.addEventListener(\n            'touchmove',\n            moveTouch,\n            {\n                passive: false\n            }\n        );\n\n\n        overlay.addEventListener(\n            'touchend',\n            endTouch,\n            {\n                passive: true\n            }\n        );\n\n\n        overlay.addEventListener(\n            'touchcancel',\n            cancelTouch,\n            {\n                passive: true\n            }\n        );\n\n\n        \/* =====================================================\n           Click\n        ===================================================== *\/\n\n        overlay.addEventListener(\n            'click',\n            function () {\n\n                \/*\n                 * \u6a2a\u5411\u62d6\u52a8\u7ed3\u675f\u540e\u7684 click\n                 * \u4e0d\u89e6\u53d1\u89c6\u9891\u64ad\u653e\u3002\n                 *\/\n                if (dragMoved) {\n\n                    dragMoved =\n                        false;\n\n\n                    return;\n\n                }\n\n\n                toggleVideo();\n\n            }\n        );\n\n\n        \/* =====================================================\n           Hover\n        ===================================================== *\/\n\n        wrap.addEventListener(\n            'mouseenter',\n            function () {\n\n                if (\n                    !videoMap[cur]\n                ) {\n\n                    stopAuto();\n\n                }\n\n            }\n        );\n\n\n        wrap.addEventListener(\n            'mouseleave',\n            function () {\n\n                if (\n                    !videoMap[cur]\n                ) {\n\n                    startAuto();\n\n                }\n\n            }\n        );\n\n\n        \/* =====================================================\n           Resize\n        ===================================================== *\/\n\n        var resizeTimer =\n            null;\n\n\n        function refreshLayout() {\n\n            clearTimeout(\n                resizeTimer\n            );\n\n\n            resizeTimer =\n                setTimeout(\n                    function () {\n\n                        \/*\n                         * aspect-ratio \u5df2\u7ecf\u7531 CSS\n                         * \u81ea\u52a8\u5b8c\u6210\u5c3a\u5bf8\u8c03\u6574\u3002\n                         *\n                         * JS \u53ea\u9700\u8981\u91cd\u65b0\u5b9a\u4f4d\u3002\n                         *\/\n                        jumpTo(cur);\n\n\n                        \/*\n                         * Canvas \u8ddf\u968f\u65b0\u5c3a\u5bf8\u3002\n                         *\/\n                        for (\n                            var k in videoMap\n                        ) {\n\n                            videoMap[k]\n                                .sizeCanvas();\n\n                        }\n\n                    },\n                    100\n                );\n\n        }\n\n\n        window.addEventListener(\n            'resize',\n            refreshLayout,\n            {\n                passive: true\n            }\n        );\n\n\n        window.addEventListener(\n            'orientationchange',\n            function () {\n\n                setTimeout(\n                    refreshLayout,\n                    200\n                );\n\n            },\n            {\n                passive: true\n            }\n        );\n\n\n        \/* =====================================================\n           Visibility\n        ===================================================== *\/\n\n        document.addEventListener(\n            'visibilitychange',\n            function () {\n\n                if (\n                    document.hidden\n                ) {\n\n                    for (\n                        var k in videoMap\n                    ) {\n\n                        videoMap[k]\n                            .video\n                            .pause();\n\n                    }\n\n\n                    stopAuto();\n\n\n                } else {\n\n                    onSlideReady();\n\n                }\n\n            }\n        );\n\n\n        \/* =====================================================\n           Init\n        ===================================================== *\/\n\n        updateMuteUI();\n\n\n        jumpTo(cur);\n\n\n        requestAnimationFrame(\n            function () {\n\n                \/*\n                 * \u7b49\u5f85 aspect-ratio\n                 * \u5b8c\u6210\u5e03\u5c40\n                 *\/\n                for (\n                    var k in videoMap\n                ) {\n\n                    videoMap[k]\n                        .sizeCanvas();\n\n                }\n\n\n                onSlideReady();\n\n            }\n        );\n\n\n    })();\n\n    <\/script>\n\n    <\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-f224b25 e-con-full e-flex e-con e-parent\" data-id=\"f224b25\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t<a class=\"elementor-element elementor-element-7a91143 e-con-full e-flex e-con e-child\" data-id=\"7a91143\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\" href=\"https:\/\/www.lianwj.com\/?page_id=175\">\n\t\t\t\t<\/a>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-75ac715 e-con-full e-flex e-con e-parent\" data-id=\"75ac715\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t<a class=\"elementor-element elementor-element-ac2ec48 e-con-full e-flex e-con e-child\" data-id=\"ac2ec48\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\" href=\"https:\/\/www.lianwj.com\/?page_id=167\">\n\t\t\t\t<\/a>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-2d2dc1f e-con-full e-flex e-con e-parent\" data-id=\"2d2dc1f\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t<a class=\"elementor-element elementor-element-14c4dd3 e-con-full e-flex e-con e-child\" data-id=\"14c4dd3\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\" href=\"https:\/\/www.lianwj.com\/?page_id=163\">\n\t\t\t\t<\/a>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"site-sidebar-layout":"no-sidebar","site-content-layout":"","ast-site-content-layout":"full-width-container","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"disabled","ast-breadcrumbs-content":"","ast-featured-img":"disabled","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"class_list":["post-28","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.lianwj.com\/index.php?rest_route=\/wp\/v2\/pages\/28","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.lianwj.com\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.lianwj.com\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.lianwj.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.lianwj.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=28"}],"version-history":[{"count":205,"href":"https:\/\/www.lianwj.com\/index.php?rest_route=\/wp\/v2\/pages\/28\/revisions"}],"predecessor-version":[{"id":1566,"href":"https:\/\/www.lianwj.com\/index.php?rest_route=\/wp\/v2\/pages\/28\/revisions\/1566"}],"wp:attachment":[{"href":"https:\/\/www.lianwj.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=28"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}