mirror of https://github.com/sveltejs/svelte
parent
37480a9331
commit
3e7eafe9de
@ -0,0 +1,27 @@
|
|||||||
|
<script>
|
||||||
|
import RedThing from './RedThing.svelte';
|
||||||
|
import GreenThing from './GreenThing.svelte';
|
||||||
|
import BlueThing from './BlueThing.svelte';
|
||||||
|
|
||||||
|
const options = [
|
||||||
|
{ color: 'red', component: RedThing },
|
||||||
|
{ color: 'green', component: GreenThing },
|
||||||
|
{ color: 'blue', component: BlueThing },
|
||||||
|
];
|
||||||
|
|
||||||
|
let selected = options[0];
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<select bind:value={selected}>
|
||||||
|
{#each options as option}
|
||||||
|
<option value={option}>{option.color}</option>
|
||||||
|
{/each}
|
||||||
|
</select>
|
||||||
|
|
||||||
|
{#if selected.color === 'red'}
|
||||||
|
<RedThing/>
|
||||||
|
{:else if selected.color === 'green'}
|
||||||
|
<GreenThing/>
|
||||||
|
{:else if selected.color === 'blue'}
|
||||||
|
<BlueThing/>
|
||||||
|
{/if}
|
@ -0,0 +1,5 @@
|
|||||||
|
<style>
|
||||||
|
strong { color: blue; }
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<strong>blue thing</strong>
|
@ -0,0 +1,5 @@
|
|||||||
|
<style>
|
||||||
|
strong { color: green; }
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<strong>green thing</strong>
|
@ -0,0 +1,5 @@
|
|||||||
|
<style>
|
||||||
|
strong { color: red; }
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<strong>red thing</strong>
|
@ -0,0 +1,21 @@
|
|||||||
|
<script>
|
||||||
|
import RedThing from './RedThing.svelte';
|
||||||
|
import GreenThing from './GreenThing.svelte';
|
||||||
|
import BlueThing from './BlueThing.svelte';
|
||||||
|
|
||||||
|
const options = [
|
||||||
|
{ color: 'red', component: RedThing },
|
||||||
|
{ color: 'green', component: GreenThing },
|
||||||
|
{ color: 'blue', component: BlueThing },
|
||||||
|
];
|
||||||
|
|
||||||
|
let selected = options[0];
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<select bind:value={selected}>
|
||||||
|
{#each options as option}
|
||||||
|
<option value={option}>{option.color}</option>
|
||||||
|
{/each}
|
||||||
|
</select>
|
||||||
|
|
||||||
|
<svelte:component this={selected.component}/>
|
@ -0,0 +1,5 @@
|
|||||||
|
<style>
|
||||||
|
strong { color: blue; }
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<strong>blue thing</strong>
|
@ -0,0 +1,5 @@
|
|||||||
|
<style>
|
||||||
|
strong { color: green; }
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<strong>green thing</strong>
|
@ -0,0 +1,5 @@
|
|||||||
|
<style>
|
||||||
|
strong { color: red; }
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<strong>red thing</strong>
|
@ -0,0 +1,23 @@
|
|||||||
|
---
|
||||||
|
title: <svelte:component>
|
||||||
|
---
|
||||||
|
|
||||||
|
A component can change its category altogether with `<svelte:component>`. Instead of a sequence of `if` blocks...
|
||||||
|
|
||||||
|
```html
|
||||||
|
{#if selected.color === 'red'}
|
||||||
|
<RedThing/>
|
||||||
|
{:else if selected.color === 'green'}
|
||||||
|
<GreenThing/>
|
||||||
|
{:else if selected.color === 'blue'}
|
||||||
|
<BlueThing/>
|
||||||
|
{/if}
|
||||||
|
```
|
||||||
|
|
||||||
|
...we can have a single dynamic component:
|
||||||
|
|
||||||
|
```html
|
||||||
|
<svelte:component this={selected.component}/>
|
||||||
|
```
|
||||||
|
|
||||||
|
The `this` value can be any component constructor, or a falsy value — if it's falsy, no component is rendered.
|
@ -0,0 +1,42 @@
|
|||||||
|
<script>
|
||||||
|
let key;
|
||||||
|
let keyCode;
|
||||||
|
|
||||||
|
function handleKeydown(event) {
|
||||||
|
key = event.key;
|
||||||
|
keyCode = event.keyCode;
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
div {
|
||||||
|
display: flex;
|
||||||
|
height: 100%;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
flex-direction: column;
|
||||||
|
}
|
||||||
|
|
||||||
|
kbd {
|
||||||
|
background-color: #eee;
|
||||||
|
border-radius: 4px;
|
||||||
|
font-size: 6em;
|
||||||
|
padding: 0.2em 0.5em;
|
||||||
|
border-top: 5px solid rgba(255,255,255,0.5);
|
||||||
|
border-left: 5px solid rgba(255,255,255,0.5);
|
||||||
|
border-right: 5px solid rgba(0,0,0,0.2);
|
||||||
|
border-bottom: 5px solid rgba(0,0,0,0.2);
|
||||||
|
color: #555;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<svelte:window/>
|
||||||
|
|
||||||
|
<div style="text-align: center">
|
||||||
|
{#if key}
|
||||||
|
<kbd>{key === ' ' ? 'Space' : key}</kbd>
|
||||||
|
<p>{keyCode}</p>
|
||||||
|
{:else}
|
||||||
|
<p>Focus this window and press any key</p>
|
||||||
|
{/if}
|
||||||
|
</div>
|
@ -0,0 +1,42 @@
|
|||||||
|
<script>
|
||||||
|
let key;
|
||||||
|
let keyCode;
|
||||||
|
|
||||||
|
function handleKeydown(event) {
|
||||||
|
key = event.key;
|
||||||
|
keyCode = event.keyCode;
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
div {
|
||||||
|
display: flex;
|
||||||
|
height: 100%;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
flex-direction: column;
|
||||||
|
}
|
||||||
|
|
||||||
|
kbd {
|
||||||
|
background-color: #eee;
|
||||||
|
border-radius: 4px;
|
||||||
|
font-size: 6em;
|
||||||
|
padding: 0.2em 0.5em;
|
||||||
|
border-top: 5px solid rgba(255,255,255,0.5);
|
||||||
|
border-left: 5px solid rgba(255,255,255,0.5);
|
||||||
|
border-right: 5px solid rgba(0,0,0,0.2);
|
||||||
|
border-bottom: 5px solid rgba(0,0,0,0.2);
|
||||||
|
color: #555;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<svelte:window on:keydown={handleKeydown}/>
|
||||||
|
|
||||||
|
<div style="text-align: center">
|
||||||
|
{#if key}
|
||||||
|
<kbd>{key === ' ' ? 'Space' : key}</kbd>
|
||||||
|
<p>{keyCode}</p>
|
||||||
|
{:else}
|
||||||
|
<p>Focus this window and press any key</p>
|
||||||
|
{/if}
|
||||||
|
</div>
|
@ -0,0 +1,11 @@
|
|||||||
|
---
|
||||||
|
title: <svelte:window>
|
||||||
|
---
|
||||||
|
|
||||||
|
Just as you can add event listeners to any DOM element, you can add event listeners to the `window` object with `<svelte:window>`.
|
||||||
|
|
||||||
|
On line 33, add the `keydown` listener:
|
||||||
|
|
||||||
|
```html
|
||||||
|
<svelte:window on:keydown={handleKeydown}/>
|
||||||
|
```
|
@ -0,0 +1,84 @@
|
|||||||
|
<script>
|
||||||
|
const layers = [0, 1, 2, 3, 4, 5, 6, 7, 8];
|
||||||
|
|
||||||
|
let y;
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<svelte:window/>
|
||||||
|
|
||||||
|
<a class="parallax-container" href="https://www.firewatchgame.com">
|
||||||
|
{#each [0, 1, 2, 3, 4, 5, 6, 7, 8] as layer}
|
||||||
|
<img
|
||||||
|
style="transform: translate(0,{-y * layer / (layers.length - 1)}px)"
|
||||||
|
src="https://www.firewatchgame.com/images/parallax/parallax{layer}.png"
|
||||||
|
alt="parallax layer {layer}"
|
||||||
|
>
|
||||||
|
{/each}
|
||||||
|
</a>
|
||||||
|
|
||||||
|
<div class="text">
|
||||||
|
<span style="opacity: {1 - Math.max(0, y / 40)}">
|
||||||
|
scroll down
|
||||||
|
</span>
|
||||||
|
|
||||||
|
<div class="foreground">
|
||||||
|
You have scrolled {y} pixels
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
.parallax-container {
|
||||||
|
position: fixed;
|
||||||
|
width: 2400px;
|
||||||
|
height: 712px;
|
||||||
|
left: 50%;
|
||||||
|
transform: translate(-50%,0);
|
||||||
|
}
|
||||||
|
|
||||||
|
.parallax-container img {
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
width: 100%;
|
||||||
|
will-change: transform;
|
||||||
|
}
|
||||||
|
|
||||||
|
.parallax-container img:last-child::after {
|
||||||
|
content: '';
|
||||||
|
position: absolute;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
background: rgb(45,10,13);
|
||||||
|
}
|
||||||
|
|
||||||
|
.text {
|
||||||
|
position: relative;
|
||||||
|
width: 100%;
|
||||||
|
height: 300vh;
|
||||||
|
color: rgb(220,113,43);
|
||||||
|
text-align: center;
|
||||||
|
padding: 4em 0.5em 0.5em 0.5em;
|
||||||
|
box-sizing: border-box;
|
||||||
|
pointer-events: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
span {
|
||||||
|
display: block;
|
||||||
|
font-size: 1em;
|
||||||
|
text-transform: uppercase;
|
||||||
|
will-change: transform, opacity;
|
||||||
|
}
|
||||||
|
|
||||||
|
.foreground {
|
||||||
|
position: absolute;
|
||||||
|
top: 711px;
|
||||||
|
left: 0;
|
||||||
|
width: 100%;
|
||||||
|
height: calc(100% - 712px);
|
||||||
|
background-color: rgb(32,0,1);
|
||||||
|
color: white;
|
||||||
|
padding: 50vh 0 0 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
:global(body) { margin: 0; padding: 0; }
|
||||||
|
</style>
|
@ -0,0 +1,84 @@
|
|||||||
|
<script>
|
||||||
|
const layers = [0, 1, 2, 3, 4, 5, 6, 7, 8];
|
||||||
|
|
||||||
|
let y;
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<svelte:window bind:scrollY={y}/>
|
||||||
|
|
||||||
|
<a class="parallax-container" href="https://www.firewatchgame.com">
|
||||||
|
{#each [0, 1, 2, 3, 4, 5, 6, 7, 8] as layer}
|
||||||
|
<img
|
||||||
|
style="transform: translate(0,{-y * layer / (layers.length - 1)}px)"
|
||||||
|
src="https://www.firewatchgame.com/images/parallax/parallax{layer}.png"
|
||||||
|
alt="parallax layer {layer}"
|
||||||
|
>
|
||||||
|
{/each}
|
||||||
|
</a>
|
||||||
|
|
||||||
|
<div class="text">
|
||||||
|
<span style="opacity: {1 - Math.max(0, y / 40)}">
|
||||||
|
scroll down
|
||||||
|
</span>
|
||||||
|
|
||||||
|
<div class="foreground">
|
||||||
|
You have scrolled {y} pixels
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
.parallax-container {
|
||||||
|
position: fixed;
|
||||||
|
width: 2400px;
|
||||||
|
height: 712px;
|
||||||
|
left: 50%;
|
||||||
|
transform: translate(-50%,0);
|
||||||
|
}
|
||||||
|
|
||||||
|
.parallax-container img {
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
width: 100%;
|
||||||
|
will-change: transform;
|
||||||
|
}
|
||||||
|
|
||||||
|
.parallax-container img:last-child::after {
|
||||||
|
content: '';
|
||||||
|
position: absolute;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
background: rgb(45,10,13);
|
||||||
|
}
|
||||||
|
|
||||||
|
.text {
|
||||||
|
position: relative;
|
||||||
|
width: 100%;
|
||||||
|
height: 300vh;
|
||||||
|
color: rgb(220,113,43);
|
||||||
|
text-align: center;
|
||||||
|
padding: 4em 0.5em 0.5em 0.5em;
|
||||||
|
box-sizing: border-box;
|
||||||
|
pointer-events: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
span {
|
||||||
|
display: block;
|
||||||
|
font-size: 1em;
|
||||||
|
text-transform: uppercase;
|
||||||
|
will-change: transform, opacity;
|
||||||
|
}
|
||||||
|
|
||||||
|
.foreground {
|
||||||
|
position: absolute;
|
||||||
|
top: 711px;
|
||||||
|
left: 0;
|
||||||
|
width: 100%;
|
||||||
|
height: calc(100% - 712px);
|
||||||
|
background-color: rgb(32,0,1);
|
||||||
|
color: white;
|
||||||
|
padding: 50vh 0 0 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
:global(body) { margin: 0; padding: 0; }
|
||||||
|
</style>
|
@ -0,0 +1,21 @@
|
|||||||
|
---
|
||||||
|
title: <svelte:window> bindings
|
||||||
|
---
|
||||||
|
|
||||||
|
We can also bind to certain properties of `window`, such as `scrollY`. Update line 7:
|
||||||
|
|
||||||
|
```html
|
||||||
|
<svelte:window bind:scrollY={y}/>
|
||||||
|
```
|
||||||
|
|
||||||
|
The list of properties you can bind to is as follows:
|
||||||
|
|
||||||
|
* `innerWidth`
|
||||||
|
* `innerHeight`
|
||||||
|
* `outerWidth`
|
||||||
|
* `outerHeight`
|
||||||
|
* `scrollX`
|
||||||
|
* `scrollY`
|
||||||
|
* `online` — an alias for `window.navigator.onLine`
|
||||||
|
|
||||||
|
All except `scrollX` and `scrollY` are readonly.
|
Loading…
Reference in new issue