diff --git a/web-animations-js/web-animations-js-tests.ts b/web-animations-js/web-animations-js-tests.ts index 977bc403ac..3072c936a0 100644 --- a/web-animations-js/web-animations-js-tests.ts +++ b/web-animations-js/web-animations-js-tests.ts @@ -1,7 +1,7 @@ // From the documentation function test_doc() { - var elem = document.createElement('div'); - var animation = elem.animate({ + const elem = document.createElement('div'); + const animation = elem.animate({ opacity: [0.5, 1], transform: ['scale(0.5)', 'scale(1)'] }, { @@ -13,8 +13,8 @@ function test_doc() { // From https://io2015codelabs.appspot.com/codelabs/web-animations-transitions-playbackcontrol // To test KeyframeEffect, SequenceEffect and GroupEffect function test_AnimationsApiNext() { - function buildFadeIn(target : HTMLElement) { - var steps = [ + function buildFadeIn(target: HTMLElement) { + const steps = [ { opacity: 0, transform: 'translate(0, 20em)' }, { opacity: 1, transform: 'translate(0)' } ]; @@ -26,12 +26,12 @@ function test_AnimationsApiNext() { }); } function buildFadeOut(target: HTMLElement) { - var angle = Math.pow((Math.random() * 16) - 6, 3); - var offset = (Math.random() * 20) - 10; - var transform = 'translate(' + offset + 'em, 20em) ' + + const angle = Math.pow((Math.random() * 16) - 6, 3); + const offset = (Math.random() * 20) - 10; + const transform = 'translate(' + offset + 'em, 20em) ' + 'rotate(' + angle + 'deg) ' + 'scale(0)'; - var steps = [ + const steps = [ { visibility: 'visible', opacity: 1, transform: 'none' }, { visibility: 'visible', opacity: 0, transform: transform } ]; @@ -40,21 +40,54 @@ function test_AnimationsApiNext() { easing: 'ease-in' }); } - var effectNode = document.createElement('div'); + const effectNode = document.createElement('div'); effectNode.className = 'circleEffect'; - var bounds = document.documentElement.getBoundingClientRect(); + const bounds = document.documentElement.getBoundingClientRect(); effectNode.style.left = bounds.left + bounds.width / 2 + 'px'; effectNode.style.top = bounds.top + bounds.height / 2 + 'px'; - var header = document.querySelector('header'); + const header = document.querySelector('header'); header.appendChild(effectNode); - var newColor = 'hsl(' + Math.round(Math.random() * 255) + ', 46%, 42%)'; + const newColor = 'hsl(' + Math.round(Math.random() * 255) + ', 46%, 42%)'; effectNode.style.background = newColor; - var scaleSteps = [{ transform: 'scale(0)' }, { transform: 'scale(1)' }]; - var timing = { duration: 2500, easing: 'ease-in-out' }; - var scaleEffect = new KeyframeEffect(effectNode, scaleSteps, timing); - var fadeEffect = new SequenceEffect([buildFadeOut(effectNode), buildFadeIn(effectNode)]); - var allEffects = [scaleEffect, fadeEffect]; + const scaleSteps = [{ transform: 'scale(0)' }, { transform: 'scale(1)' }]; + const timing: AnimationEffectTiming = { duration: 2500, easing: 'ease-in-out', fill: "backwards" }; + const scaleEffect = new KeyframeEffect(effectNode, scaleSteps, timing); + const fadeEffect = new SequenceEffect([buildFadeOut(effectNode), buildFadeIn(effectNode)]); + const allEffects = [scaleEffect, fadeEffect]; // Play all animations within this group. - var groupEffect = new GroupEffect(allEffects); - var anim = document.timeline.play(groupEffect); + const groupEffect = new GroupEffect(allEffects); + const anim = document.timeline.play(groupEffect); +} + +// https://developer.mozilla.org/en-US/docs/Web/API/Animation/Animation +// http://codepen.io/rachelnabors/pen/eJyWzm/?editors=0010 +function test_whiteRabbit() { + var whiteRabbit = document.getElementById("rabbit"); + + var rabbitDownKeyframes = new KeyframeEffect( + whiteRabbit, + [ + { transform: 'translateY(0%)' }, + { transform: 'translateY(100%)' } + ], + { duration: 3000, fill: 'forwards' } + ); + + var rabbitDownAnimation = new Animation(rabbitDownKeyframes, document.timeline); + + // On tap or click, + whiteRabbit.addEventListener("mousedown", downHeGoes, false); + whiteRabbit.addEventListener("touchstart", downHeGoes, false); + + // Trigger a single-fire animation + function downHeGoes(event: Event) { + + // Remove those event listeners + whiteRabbit.removeEventListener("mousedown", downHeGoes, false); + whiteRabbit.removeEventListener("touchstart", downHeGoes, false); + + // Play rabbit animation + rabbitDownAnimation.play(); + + } } diff --git a/web-animations-js/web-animations-js.d.ts b/web-animations-js/web-animations-js.d.ts index 80c98a555a..f570e423ba 100644 --- a/web-animations-js/web-animations-js.d.ts +++ b/web-animations-js/web-animations-js.d.ts @@ -3,8 +3,8 @@ // Definitions by: Kristian Moerch // Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped -declare type FillMode = "none" | "forwards" | "backwards" | "both" | "auto"; -declare type PlaybackDirection = "normal" | "reverse" | "alternate" | "alternate-reverse"; +declare type AnimationEffectTimingFillMode = "none" | "forwards" | "backwards" | "both" | "auto"; +declare type AnimationEffectTimingPlaybackDirection = "normal" | "reverse" | "alternate" | "alternate-reverse"; declare type AnimationPlayState = "idle" | "pending" | "running" | "paused" | "finished"; interface AnimationPlaybackEvent extends Event { @@ -15,21 +15,21 @@ interface AnimationPlaybackEvent extends Event { interface AnimationKeyFrame { easing?: string; offset?: number; - [key: string]: string | number | number[] | string[]; + [key: string]: string | string[] | number | number[]; } interface AnimationTimeline { currentTime: number; - getAnimations(): any; - play(a: any): any; + getAnimations(): Animation[]; + play(effect: KeyframeEffect): Animation; } interface AnimationEffectTiming { delay?: number; - direction?: PlaybackDirection; + direction?: AnimationEffectTimingPlaybackDirection; duration?: number; easing?: string; endDelay?: number; - fill?: FillMode |  string; + fill?: AnimationEffectTimingFillMode; iterationStart?: number; iterations?: number; playbackRate?: number; @@ -44,25 +44,8 @@ declare class KeyframeEffect { getFrames(): AnimationKeyFrame[]; } -interface Animation extends Element { - currentTime: number; - id: string; - oncancel: EventListener; - onfinish: EventListener; - readonly playState: AnimationPlayState; - playbackRate: number; - startTime: number; - cancel(): void; - finish(): void; - pause(): void; - play(): void; - reverse(): void; - effect: KeyframeEffect; - readonly finished: Promise; - readonly ready: Promise; - timeline: AnimationTimeline; -} declare class Animation extends Element { + constructor(effect: KeyframeEffect, timeline?: AnimationTimeline); currentTime: number; id: string; oncancel: EventListener;