• 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-016.js ./demo/canvas-017.js ./demo/canvas-018.js ./demo/canvas-019.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/component-001.js ./demo/component-002.js ./demo/component-003.js ./demo/component-004.js ./demo/component-005.js ./demo/component-006.js ./demo/component-007.js ./demo/core-001.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-014a.js ./demo/dom-014b.js ./demo/dom-014c.js ./demo/dom-015.js ./demo/dom-016.js ./demo/filters-001.js ./demo/filters-002.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-501.js ./demo/filters-502.js ./demo/filters-503.js ./demo/filters-504.js ./demo/filters-505.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/temp-001.js ./demo/temp-inkscapeSvgFilters.js
  • ¶

    Demo DOM 016

    Determine the displayed shape of the visible stack; react to changes in the displayed shape

  • ¶

    Run code

    import scrawl from '../source/scrawl.js';
    
    const stack = scrawl.library.artefact.mystack,
        mytext = scrawl.library.artefact.myelement;
  • ¶

    Scene setup

    stack.set({
    
        checkForResize: true,
    });
    
    mytext.set({
    
        start: ['center', 'center'],
        handle: ['center', 'center'],
    });
  • ¶

    Scrawl-canvas recognises five shapes, separated by four breakpoints:

    • banner
    • landscape
    • rectangle
    • portrait
    • skyscraper

    The values assigned to the breakpoints are Float numbers for the Stack artefact’s width/height ratio - the value 3 represents the case where the width value is three times more than the height value, while 0.35 represents a width (roughly) 3 times less than the height.

    We can set a Stack artefact’s breakpoints in one go using the dedicated setDisplayShapeBreakpoints() function, as below. Alternatively we can use the regular set() function, supplying the attributes breakToBanner, breakToLandscape, breakToPortrait and breakToSkyscraper as required. The values given here are the default values for Stack artefacts.

    stack.setDisplayShapeBreakpoints({
        breakToBanner: 3,
        breakToLandscape: 1.5,
        breakToPortrait: 0.65,
        breakToSkyscraper: 0.35,
    });
  • ¶

    Each display shape has an associated hook function (by default a function that does nothing) which Scrawl-canvas will run each time it detects that the Stack display shape has changed to that shape. We can replace these null-functions with our own; this allows us to configure the scene/animation to accommodate different display shapes, thus making the code reusable in a range of different web page environments.

    We can set/update these functions at any time using the normal set() function:

    stack.set({
    
        actionBannerShape: () => {
            mytext.set({
                roll: 0,
            });
            mytext.domElement.textContent = `Stack display shape: ${stack.get('displayShape')}`;
        },
    
        actionRectangleShape: () => {
            mytext.set({
                roll: -45,
            });
            mytext.domElement.textContent = `Stack display shape: ${stack.get('displayShape')}`;
        },
    
        actionSkyscraperShape: () => {
            mytext.set({
                roll: -90,
            });
            mytext.domElement.textContent = `Stack display shape: ${stack.get('displayShape')}`;
        },
    });
  • ¶

    We can also set/update the functions using dedicated setAction???Shape() functions:

    stack.setActionPortraitShape(() => {
        mytext.set({
            roll: -67.5,
        });
        mytext.domElement.textContent = `Stack display shape: ${stack.get('displayShape')}`;
    });
    
    stack.setActionLandscapeShape(() => {
        mytext.set({
            roll: -22.5,
        });
        mytext.domElement.textContent = `Stack display shape: ${stack.get('displayShape')}`;
    });
  • ¶

    Scene animation

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

    let report = function () {
    
        let testTicker = Date.now(),
            testTime, testNow,
            testMessage = document.querySelector('#reportmessage');
    
        return function () {
    
            testNow = Date.now();
            testTime = testNow - testTicker;
            testTicker = testNow;
    
            testMessage.textContent = `Screen refresh: ${Math.ceil(testTime)}ms; fps: ${Math.floor(1000 / testTime)}`;
        };
    }();
  • ¶

    Create the Display cycle animation

    const demoAnimation = scrawl.makeRender({
    
        name: "demo-animation",
        target: stack,
        afterShow: report,
  • ¶

    We manually trigger the display shape functionality after the first render cycle completes. This allows all artefacts to settle into a state where we can then update the Element artefact with text and roll values appropriate to the Stack element’s initial shape

        afterCreated: () => stack.updateDisplayShape(),
    });
  • ¶

    Development and testing

    console.log(scrawl.library);