iwmlib/lib/scatter.html

133 lines
6.0 KiB
HTML

<!DOCTYPE html>
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Scatter Doctest</title>
<link rel="stylesheet" href="./3rdparty/highlight/styles/default.css" />
<link rel="stylesheet" href="../css/doctest.css" />
<script src="./3rdparty/highlight/highlight.pack.js"></script>
<script src="../dist/iwmlib.3rdparty.js"></script>
<script src="../dist/iwmlib.js"></script>
<script>
function drawPolygons() {
debugCanvas.width = main.getBoundingClientRect().width
let context = debugCanvas.getContext('2d')
context.clearRect(0, 0, debugCanvas.width, debugCanvas.height)
let stage = scatterContainer.polygon
stage.draw(context, { stroke: '#0000FF' })
for (let scatter of scatterContainer.scatter.values()) {
let polygon = scatter.polygon
polygon.draw(context, { stroke: '#0000FF' })
}
}
function animatePolygons() {
requestAnimationFrame((dt) => {
drawPolygons()
animatePolygons()
})
}
</script>
</head>
<body onload="Doctest.run()">
<h1><a href="index.html">lib.</a>Scatter</h1>
<p>
Scatter objects are UI elements that can be rotated, scaled or moved around, which typically leads to
"scattered" layouts. Scatters come in two flavours: DOM Scatters are working with arbitrary DOM elements,
wheras PIXI Scatter work with PIXI Containers and DisplayObjects within the PIXI scene graph. Here we
describe the more basic DOM scatter.
</p>
<p>Let's look at an example.</p>
<div id="main" class="grayBorder interactive" style="position: relative; width: 100%; height: 280px">
<!-- Note that we need to set draggable to false to avoid conflicts. The DOM elements
must also be positioned absolutely. -->
<img id="women" draggable="false" style="position: absolute" src="examples/women.jpeg" />
<img id="king" draggable="false" style="position: absolute" src="examples/king.jpeg" />
<canvas
id="debugCanvas"
height="280"
style="z-index: 100000; pointer-events: none; position: absolute; border: 1px solid blue"
>
Canvas not supported.
</canvas>
</div>
<script class="doctest">
let dx = 44
let app = new App()
let scatterContainer = new DOMScatterContainer(main)
let angle = 0 // 15
for (let key of ['women', 'king']) {
let image = document.getElementById(key)
// The DOMScatter needs initial width and height. Therefore we
// define the scatter when the image size is known, i.e. after loading...
image.onload = (e) => {
let scatter = new DOMScatter(image, scatterContainer, {
x: dx,
y: 44,
width: e.target.naturalWidth,
height: e.target.naturalHeight,
rotationDegrees: angle,
throwVisibility: 88,
minScale: 0.5,
maxScale: 1.5
})
dx += 300
angle = -angle
}
}
app.run()
animatePolygons()
</script>
<h1>Interactive Content</h1>
<p>
Scatter objects may contain interactive HTML structures. There is one major flag that allows to simulate
click events by using taps. If the scatter detects a tap it looks for clickable elements under or nearby the
event position and calls the click handler. Thus gestures can be disambiguated as moves, zooms. or taps.
Note that on touch devices you can tap beside the object if you use an object that implements the
ITapDelegate interface. An ITapDelegate allowes a distance that can be configured by allowClickDistance. The
default value is 44px but here we use 88px.
</p>
<div id="contentExample" class="grayBorder interactive" style="position: relative; width: 100%; height: 280px">
<div id="interactiveContent">
<img draggable="false" style="position: absolute" src="examples/women.jpeg" />
<a style="position: absolute; top: 10px; right: 10px; color: white" href="javascript:alert('test link')"
>A Link</a
>
<div onclick="alert('div clicked')" style="position: absolute; top: 30px; right: 10px; color: white">
A Div with click handler
</div>
<svg
onclick="alert('svg clicked')"
style="position: absolute; right: 0px; bottom: 0px; width: 32px; height: 32px"
viewBox="0 0 100 100"
preserveAspectRatio="xMidYMid meet"
>
<circle cx="50" cy="50" r="44" stroke="white" stroke-width="8" fill="gray" />
<circle cx="50" cy="32" r="7" fill="white" />
<line x1="50" y1="46" x2="50" y2="78" stroke="white" stroke-width="12" />
</svg>
</div>
</div>
<script class="doctest">
let contentContainer = new DOMScatterContainer(contentExample)
let tapDelegate = new CardWrapper(interactiveContent, { allowClickDistance: 88 })
new DOMScatter(interactiveContent, contentContainer, {
x: 44,
y: 44,
width: 274,
height: 184,
tapDelegate,
throwVisibility: 88,
minScale: 0.5,
maxScale: 1.5
})
</script>
</body>
</html>