• Jump To … +
    ./demo/canvas-001.js ./demo/canvas-002.js ./demo/canvas-003.js ./demo/canvas-004.js ./demo/canvas-005.js ./demo/canvas-006.js ./demo/canvas-007.js ./demo/canvas-008.js ./demo/canvas-009.js ./demo/canvas-010.js ./demo/canvas-011.js ./demo/canvas-012.js ./demo/canvas-013.js ./demo/canvas-014.js ./demo/canvas-015.js ./demo/canvas-015a.js ./demo/canvas-016.js ./demo/canvas-017.js ./demo/canvas-018.js ./demo/canvas-019.js ./demo/canvas-019a.js ./demo/canvas-020.js ./demo/canvas-021.js ./demo/canvas-022.js ./demo/canvas-023.js ./demo/canvas-024.js ./demo/canvas-025.js ./demo/canvas-026.js ./demo/canvas-027.js ./demo/canvas-028.js ./demo/canvas-029.js ./demo/canvas-030.js ./demo/canvas-031.js ./demo/canvas-032.js ./demo/canvas-033.js ./demo/canvas-034.js ./demo/canvas-035.js ./demo/canvas-036.js ./demo/canvas-037.js ./demo/canvas-038.js ./demo/canvas-039.js ./demo/canvas-040.js ./demo/canvas-041.js ./demo/canvas-042.js ./demo/canvas-043.js ./demo/canvas-044.js ./demo/canvas-045.js ./demo/canvas-046.js ./demo/canvas-047.js ./demo/canvas-048.js ./demo/canvas-049.js ./demo/canvas-050.js ./demo/canvas-051.js ./demo/canvas-052.js ./demo/canvas-053.js ./demo/canvas-054.js ./demo/canvas-055.js ./demo/canvas-056.js ./demo/canvas-057.js ./demo/canvas-058.js ./demo/canvas-059.js ./demo/canvas-060.js ./demo/canvas-061.js ./demo/canvas-062.js ./demo/canvas-063.js ./demo/canvas-064.js ./demo/core-001.js ./demo/delaunator-001.js ./demo/delaunator-002.js ./demo/dom-001.js ./demo/dom-002.js ./demo/dom-003.js ./demo/dom-004.js ./demo/dom-005.js ./demo/dom-006.js ./demo/dom-007.js ./demo/dom-008.js ./demo/dom-009.js ./demo/dom-010.js ./demo/dom-011.js ./demo/dom-012.js ./demo/dom-013.js ./demo/dom-015.js ./demo/dom-016.js ./demo/filters-001.js ./demo/filters-002.js ./demo/filters-002a.js ./demo/filters-003.js ./demo/filters-004.js ./demo/filters-005.js ./demo/filters-006.js ./demo/filters-007.js ./demo/filters-008.js ./demo/filters-009.js ./demo/filters-010.js ./demo/filters-011.js ./demo/filters-012.js ./demo/filters-013.js ./demo/filters-014.js ./demo/filters-015.js ./demo/filters-016.js ./demo/filters-017.js ./demo/filters-018.js ./demo/filters-019.js ./demo/filters-020.js ./demo/filters-021.js ./demo/filters-022.js ./demo/filters-023.js ./demo/filters-024.js ./demo/filters-025.js ./demo/filters-026.js ./demo/filters-027.js ./demo/filters-101.js ./demo/filters-102.js ./demo/filters-103.js ./demo/filters-104.js ./demo/filters-105.js ./demo/filters-501.js ./demo/filters-502.js ./demo/filters-503.js ./demo/filters-504.js ./demo/filters-505.js ./demo/mediapipe-001.js ./demo/mediapipe-002.js ./demo/mediapipe-003.js ./demo/modules-001.js ./demo/modules-002.js ./demo/modules-003.js ./demo/modules-004.js ./demo/modules-005.js ./demo/packets-001.js ./demo/packets-002.js ./demo/particles-001.js ./demo/particles-002.js ./demo/particles-003.js ./demo/particles-004.js ./demo/particles-005.js ./demo/particles-006.js ./demo/particles-007.js ./demo/particles-008.js ./demo/particles-009.js ./demo/particles-010.js ./demo/particles-011.js ./demo/particles-012.js ./demo/particles-013.js ./demo/particles-014.js ./demo/particles-015.js ./demo/particles-016.js ./demo/rapier-001.js ./demo/snippets-001.js ./demo/snippets-002.js ./demo/snippets-003.js ./demo/snippets-004.js ./demo/snippets-005.js ./demo/snippets-006.js ./demo/temp-000.js ./demo/temp-001.js ./demo/temp-001a.js ./demo/temp-002.js ./demo/temp-003.js ./demo/temp-004.js ./demo/temp-005.js ./demo/temp-006.js ./demo/temp-007.js ./demo/temp-008.js ./demo/temp-009.js ./demo/temp-010.js ./demo/temp-011.js ./demo/temp-012.js ./demo/temp-013.js ./demo/temp-014.js ./demo/temp-015.js ./demo/temp-016.js ./demo/temp-017.js ./demo/temp-018.js ./demo/temp-018a.js ./demo/temp-019.js ./demo/temp-020.js ./demo/temp-021.js ./demo/temp-022.js ./demo/temp-023.js ./demo/temp-024.js ./demo/temp-025.js ./demo/temp-026.js ./demo/temp-027.js ./demo/temp-028.js ./demo/temp-029.js ./demo/temp-030.js ./demo/temp-031.js ./demo/temp-032.js ./demo/temp-033.js ./demo/temp-034.js ./demo/temp-035.js ./demo/temp-036.js ./demo/temp-037.js ./demo/temp-100.js ./demo/temp-101.js ./demo/temp-102.js ./demo/temp-103.js ./demo/temp-104.js ./demo/temp-200.js ./demo/temp-201.js ./demo/temp-301.js ./demo/temp-inkscapeSvgFilters.js ./demo/temp-lottie.js ./demo/tensorflow-001.js ./demo/tensorflow-002.js ./demo/utilities.js
  • §

    Demo DOM 007

    Animate a DOM element using the delta attribute object; dynamically change classes on a DOM element

  • §

    Run code

    import * as scrawl from '../source/scrawl.js'
    
    import { reportSpeed } from './utilities.js';
  • §

    Scene setup

    let artefact = scrawl.library.artefact,
        stack = artefact.mystack,
        flower = artefact.flower,
        currentClass = '';
  • §

    Create a new Group for the box elements, against which we will be checking for hits

    • the box elements have been imported already and assigned to the Stack’s default group, but we can move them to the new Group using .set()
    let hitgroup = scrawl.makeGroup({
        name: 'hitareas',
        host: 'mystack',
    });
  • §

    Update the Stack

    stack.set({
        width: 600,
        height: 400,
  • §

    This gets the browser to add a drag icon to the stack element’s lower right corner, which in turn allows the user to drag-resize the element in real time.

        css: {
            overflow: 'hidden',
            resize: 'both'
        },
  • §

    Switch on automated element resize capture and processing

        checkForResize: true,
    });
  • §

    Update the boxes

    artefact.rightbox.set({
        group: 'hitareas',
    
        startX: '55%',
        startY: '15%',
        roll: 10,
    
        css: { backgroundColor: 'red' },
    });
    
    artefact.leftbox.set({
        group: hitgroup.name,
    
        startX: '10%',
        startY: '35%',
    
        css: { backgroundColor: 'blue' },
    });
  • §

    Batch-update the box artefacts using their shared Group

    hitgroup.setArtefacts({
        width: '25%',
        height: '50%',
    
        css: { opacity: '0.4' },
    });
  • §

    Update the flower wheel

    flower.set({
        width: 200,
        height: 200,
        startX: '50%',
        startY: '50%',
        handleX: 'center',
        handleY: 'center',
        classes: 'make_round',
        delta: {
            startX: '0.4%',
            startY: '-0.3%',
            roll: 0.5,
        },
  • §

    We will check for boundary collisions using Scrawl-canvas delta checking functionality

    • We supply an array for each delta attribute we want to check in the deltaConstraints Object
    • The Array holds three items: [minimum-value, maximum-value, action-to-take]
    • When the attribute updated by the delta value falls outside our boundaries, Scrawl-canvas takes the appropriate action
    • The reverse action will reverse the numerical sign of the affected delta object attribute value
    • The loop action will loop the artefact’s attribute value from the maximum to the minimum value, or vice-versa as appropriate
        deltaConstraints: {
            startX: ['10%', '90%', 'reverse'],
            startY: ['10%', '90%', 'reverse'],
        },
        checkDeltaConstraints: true,
    });
  • §

    Scene animation

  • §

    Updating the flower’s DOM element’s class attribute

    let checkForFlowerClassUpdates = function () {
  • §

    @ts-expect-error

        let current = hitgroup.getArtefactAt([flower.get('start')]).artefact;
    
        if (current && !currentClass) {
    
            currentClass = (current.name === 'leftbox') ? 'make_blue' : 'make_red';
            flower.addClasses(currentClass);
        }
        else if (!current && currentClass) {
    
            flower.removeClasses(currentClass);
            currentClass = '';
        }
    };
  • §

    Function to display frames-per-second data, and other information relevant to the demo

    const report = reportSpeed('#reportmessage', function () {
    
        return `    Current classes: "${flower.get('classes')}"`;
    });
  • §

    Create the Display cycle animation

    scrawl.makeRender({
    
        name: 'demo-animation',
        commence: checkForFlowerClassUpdates,
        target: stack,
        afterShow: report,
  • §

    We need to finalize the stack’s display after the first Display cycle completes

    • Tweaking the stack’s height attribute should cascade through to its constituent elements, so that they can finalize their own dimensions and positioning (which in this case are both set relative to the stack’s dimensions).
        afterCreated: () => stack.set({height: 400}),
    });