Cassie Evans PRO
Brighton based front-end dev & designer. disOrganiser @GeneratorBtn. Has a particular fondness for web animation.
send me things!
Front-end Developer at Clearleft
<svg viewBox="0 0 100 100">
    <path d="M10 10H90V90H10Z"/>
    <circle cx="50" cy="50" r="40"/>
</svg>👉
.element {
    animation-name: fade;
    animation-duration: 2s;
}
@keyframes fade {
  0% {
    opacity: 1;
  }
  100% {
    opacity: 0;
  }
}.element {
    animation-name: first-animation;
    animation-duration: 2s;
}
.element-two {
    animation-name: second-animation;
    animation-duration: 3s;
    animation-delay: 2s;
}
.element {
    animation-name: first-animation;
    animation-duration: 2s;
}
.element-two {
    animation-name: second-animation;
    animation-duration: 3s;
    animation-delay: 2s;
}
.element {
    animation-name: first-animation;
    animation-duration: 2s;
}
.element-two {
    animation-name: second-animation;
    animation-duration: 3s;
    animation-delay: 2s;
}
.element-three {
    animation-name: second-animation;
    animation-duration: 3s;
}
.element {
    animation-name: first-animation;
    animation-duration: 2s;
}
.element-two {
    animation-name: second-animation;
    animation-duration: 3s;
    animation-delay: 2s;
}
.element-three {
    animation-name: third-animation;
    animation-duration: 3s;
    animation-delay: 5s;
}
.element {
    animation-name: first-animation;
    animation-duration: 2s;
}
.element-two {
    animation-name: second-animation;
    animation-duration: 3s;
    animation-delay: 2s;
}
.element-three {
    animation-name: third-animation;
    animation-duration: 3s;
    animation-delay: 5s;
}
.element-four {
    animation-name: fourth-animation;
    animation-duration: 4s;
    animation-delay: 8s;
}
.element-five {
    animation-name: fifth-animation;
    animation-duration: 12s;
    animation-delay: 2s;
}
.element-six {
    animation-name: sixth-animation;
    animation-duration: 3s;
    animation-delay: 14s;
}
.element {
    animation-name: first-animation;
    animation-duration: 2s;
}
.element-two {
    animation-name: second-animation;
    animation-duration: 3s;
    animation-delay: 2s;
}
.element-three {
    animation-name: third-animation;
    animation-duration: 3s;
    animation-delay: 5s;
}
.element-four {
    animation-name: fourth-animation;
    animation-duration: 4s;
    animation-delay: 8s;
}
.element-five {
    animation-name: fifth-animation;
    animation-duration: 12s;
    animation-delay: 2s;
}
.element-six {
    animation-name: sixth-animation;
    animation-duration: 3s;
    animation-delay: 14s;
}
@supports (transform-box: fill-box) {
    
    /*animation code here*/
}
💜
💜
💜
💜
💜
😔
💜
💜
💜
💜
💜
😔
💜
💜
💜
6kb
9kb - 36kb
15kb
💜
💜
😔
💜
💜
💜
6kb
15kb
.....
💜
💜
😔
💜
💜
💜
MIT
MIT
Mostly Free
6kb
15kb
.....
💜
💜
😔
💜
💜
💜
Docs & codepens
Docs & codepens
Docs, forums & codepens
MIT
MIT
Mostly Free
6kb
15kb
.....
TweenMax.method(element, duration, vars)
TweenMax.to(element, duration, vars)
TweenMax.from(element, duration, vars)
TweenMax.from(".cat", duration, vars)
TweenMax.from(".cat",2, vars)
TweenMax.from(".cat",2,{xPercent: 250})
TweenMax.from(".cat",2,{xPercent: 250})
Timeline.from(".cat",2,{xPercent: 250});
Timeline = new TimelineMax();
Timeline.to(".arm",2,{rotation: -60});
Timeline.from(".mic",2,{yPercent: 30});
Timeline.from(".cat",2,{xPercent: 250})
Timeline = new TimelineMax();
.to(".arm",2,{rotation: -60})
.from(".mic",2,{yPercent: 30})
Timeline.from(".cat",2,{xPercent: 250},1)
Timeline = new TimelineMax();
.to(".arm",2,{rotation: -60},"-=1")
.from(".mic",2,{yPercent: 30},"Label")
Timeline.from(".cat",2,{xPercent: 250},1)
Timeline = new TimelineMax();
.to(".arm",2,{rotation: -60},"-=1")
.from(".mic",2,{yPercent: 30},"Label+=2")
Timeline.timeScale(1.5)
Timeline.play()
Timeline.pause()
Timeline.reverse()
image-rendering: pixelated
chrome://flags/#enable-experimental-web-platform-features
chrome://flags/#enable-experimental-web-platform-features
const findFace = async () => {
    const myWebcamFeed = document.querySelector('.player');
    const faceDetector = new FaceDetector();
    try {
        const faces = await faceDetector.detect(myWebcamFeed);
	
        console.log(faces);
    } catch (error) {
        console.log("oops, something went wrong with face detection")
    };
}chrome://flags/#enable-experimental-web-platform-features
const findFace = async () => {
    const myWebcamFeed = document.querySelector('.player');
    const faceDetector = new FaceDetector();
    try {
        const faces = await faceDetector.detect(myWebcamFeed);
	
        console.log(faces);
    } catch (error) {
        console.log("oops, something went wrong with face detection")
    };
}chrome://flags/#enable-experimental-web-platform-features
const findFace = async () => {
    const myWebcamFeed = document.querySelector('.player');
    const faceDetector = new FaceDetector();
    try {
        const faces = await faceDetector.detect(myWebcamFeed);
	
        console.log(faces);
    } catch (error) {
        console.log("oops, something went wrong with face detection")
    };
}chrome://flags/#enable-experimental-web-platform-features
const findFace = async () => {
    const myWebcamFeed = document.querySelector('.player');
    const faceDetector = new FaceDetector();
    try {
        const faces = await faceDetector.detect(myWebcamFeed);
	
        console.log(faces);
    } catch (error) {
        console.log("oops, something went wrong with face detection")
    };
}{
    boundingBox: {
        x: 545,
        y: 187,
        top: 187,
        left: 545,
        right: 855,
        bottom: 497,
        width: 310,
        height: 310
    },
    landmarks: [
        {
            locations: { x: 627.5, y: 262.5 },
            type: 'eye'
        },
        {
            locations: { x: 763, y: 258 },
            type: 'eye'
        },
        {
            locations: { x: 701, y: 418 },
            type: 'mouth',
        }
    }
}{
    boundingBox: {
        x: 545,
        y: 187,
        top: 187,
        left: 545,
        right: 855,
        bottom: 497,
        width: 310,
        height: 310
    },
    landmarks: [
        {
            locations: { x: 627.5, y: 262.5 },
            type: 'eye'
        },
        {
            locations: { x: 763, y: 258 },
            type: 'eye'
        },
        {
            locations: { x: 701, y: 418 },
            type: 'mouth',
        }
    }
}👀
👀
👄
@cassiecodes - twitter & codepen
By Cassie Evans
Slides to go along with my talk for smashing TV https://www.smashingmagazine.com/smashing-tv/
Brighton based front-end dev & designer. disOrganiser @GeneratorBtn. Has a particular fondness for web animation.