- 由 wyn_writer创建, 最后修改于六月 07, 2022
基于上一节示例二:集成时自定义组件的外观样式,这一节我们继续为组件添加自定义动画。
1. 添加动画CSS
使用以下内容替换 app.css。我们为元素添加了一些过渡效果,以使组件元素呈现出动画。
app.css
html, body { margin: 0; padding: 0; height: 100%; } #demo { overflow: hidden; height: 100%; position: relative; } .center-container { width: 1200px; height: 400px; border: 0; position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); } .center { width: 400px; height: 400px; margin: 0 auto; } .center-scenario { width: 300px; position: absolute; transform: translateX(0); opacity: 1; transition: opacity ease 1s, transform ease 1s; } .center-left-scenario-before { transform: translateX(-170px); opacity: 0; } .center-right-scenario-before { transform: translateX(170px); opacity: 0; } #scenario-0 { right: 110px; top: 0; height: 120px; } #scenario-1 { right: 110px; top: 130px; height: 140px; } #scenario-2 { right: 110px; bottom: 0; height: 120px; } #scenario-3 { left: 120px; top: 0; height: 160px; } #scenario-4 { left: 120px; bottom: 0; height: 160px; } .left-panel { position: absolute; left: 0; top: 250px; bottom: 0; width: 300px; transition: transform ease 1s; transform: translateX(0); } .left-panel.hide { transform: translateX(-300px); } .left-scenario { height: 200px; } #header { position: absolute; top: 0; left: 0; right: 0; height: 50px; }
在执行动画之前初始化 html 元素的样式。
<main id="demo"> <header id="header"></header> <div class="center-container"> <div class="center" id="center"></div> <div class="center-scenario center-right-scenario-before" id="scenario-0"></div> <div class="center-scenario center-right-scenario-before" id="scenario-1"></div> <div class="center-scenario center-right-scenario-before" id="scenario-2"></div> <div class="center-scenario center-left-scenario-before" id="scenario-3"></div> <div class="center-scenario center-left-scenario-before" id="scenario-4"></div> </div> <div class="left-panel hide" id="left-panel"> <div class="left-scenario" id="scenario-5"></div> <div class="left-scenario" id="scenario-6"></div> <div class="left-scenario" id="scenario-7"></div> </div> </main>
在载入仪表板之后开始动画。
app.js
... scenario5.connect(scenarioDom5); scenario6.connect(scenarioDom6); scenario7.connect(scenarioDom7); const leftPanel = document.querySelector('#left-panel'); dash.on('mounted', () => { scenarioDom0.classList.remove('center-right-scenario-before'); scenarioDom1.classList.remove('center-right-scenario-before'); scenarioDom2.classList.remove('center-right-scenario-before'); scenarioDom3.classList.remove('center-left-scenario-before'); scenarioDom4.classList.remove('center-left-scenario-before'); leftPanel.classList.remove('hide'); }); // make dashboard render dash.refresh();
2. 增强动画
我们已经制作除了简单的动画效果。现在,我们可以每0.3秒显示出一个组件。
接下来,添加这些实用的程序功能。
app.js
function makeDelay(interval) { return new Promise((resolve) => { setTimeout(() => { resolve(); }, interval); }); } function makeRunner(n, cb) { let count = 0; return () => { count++; if (count === n) { cb(); } }; }
用下面的代码块替换之前的代码。
app.js
... scenario5.connect(scenarioDom5); scenario6.connect(scenarioDom6); scenario7.connect(scenarioDom7); const leftPanel = document.querySelector('#left-panel'); const done = makeRunner(9, () => { dash.resume(); const DELAY = 300; makeDelay(DELAY).then(() => { scenarioDom0.classList.remove('center-right-scenario-before'); return makeDelay(DELAY); }).then(() => { scenarioDom1.classList.remove('center-right-scenario-before'); return makeDelay(DELAY); }).then(() => { scenarioDom2.classList.remove('center-right-scenario-before'); return makeDelay(DELAY); }).then(() => { scenarioDom3.classList.remove('center-left-scenario-before'); return makeDelay(DELAY); }).then(() => { scenarioDom4.classList.remove('center-left-scenario-before'); return makeDelay(DELAY); }).then(() => { leftPanel.classList.remove('hide'); }); }); center.on('update', done); header.on('update', done); scenario0.on('update', done); scenario1.on('update', done); scenario2.on('update', done); scenario3.on('update', done); scenario4.on('update', done); scenario5.on('update', done); scenario6.on('update', done); dash.suspend(); // make dashboard render dash.refresh();
Update事件总是在组件渲染之前被触发。
因此,我们暂停了仪表板(这样就不会渲染组件,但是update事件仍然有效)。然后将事件侦听器添加到每个组件。
当所有组件都可以渲染时运行动画,这样您将获得更好的动画效果。
下面是示例源代码。
- 无标签