Creative Visual Effects

Deep-sea starfield traversal effect

A starfield travel effect completed in a deep-sea setting: includes realistic content, interactive controls, clear status feedback, and responsive layouts across sizes.

Creative Visual EffectsStarfield traversal effectHTMLCanvasJavaScript
With JavaScript enabled, you can edit, run, and save this example. The fixed source is as follows:
<!doctype html>
<html lang="en" dir="ltr">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>Deep-sea starfield traversal effect</title>
  <style>
    :root { --ink:#24213a; --paper:#f6f1e8; --accent:#e6a23c; --secondary:#a8a1d8; --line:color-mix(in srgb, var(--ink) 18%, transparent); --shadow:0 24px 60px color-mix(in srgb, var(--ink) 16%, transparent); color-scheme:light; }
    * { box-sizing:border-box; }
    html { min-width:320px; background:var(--paper); }
    body { min-height:100vh; margin:0; overflow-x:hidden; color:var(--ink); font-family:"DIN Alternate","Arial Narrow",sans-serif; background:repeating-linear-gradient(135deg,color-mix(in srgb,var(--ink) 5%,transparent) 0 1px,transparent 1px 18px),var(--paper); }
    button,input,select,textarea { color:inherit; font:inherit; }
    button,[role="button"],input,select,textarea { accent-color:var(--accent); }
    button { cursor:pointer; }
    button:focus-visible,input:focus-visible,select:focus-visible,textarea:focus-visible,[tabindex]:focus-visible { outline:3px solid var(--accent); outline-offset:3px; }
    [hidden] { display:none !important; }
    @media (max-width:700px) { .mast h1 { line-height:1.08 !important; letter-spacing:-.035em !important; overflow-wrap:anywhere; } }
    @media (prefers-reduced-motion:reduce) { *,*::before,*::after { scroll-behavior:auto !important; animation-duration:.01ms !important; animation-iteration-count:1 !important; transition-duration:.01ms !important; } }
    .mast{display:flex;justify-content:space-between;border-bottom:6px solid var(--ink);padding-bottom:18px;gap:20px;align-items:flex-end;margin:0 0 22px}.page{width:min(1240px,calc(100% - 28px));margin:auto;padding:34px 0 70px}.scenario{padding:8px 12px;border:2px solid var(--ink);font:900 12px/1 ui-monospace,monospace}.mast h1{font-family:"DIN Condensed","Arial Narrow",sans-serif;font-weight:900;text-transform:uppercase;font-size:clamp(44px,10vw,104px);letter-spacing:-.02em;max-width:1000px;margin:0;line-height:.82}.intro{max-width:720px;font-family:"Arial Narrow",sans-serif;line-height:1.5}.eyebrow{display:inline-block;padding:6px 9px;color:var(--paper);background:var(--accent);font:900 10px/1 ui-monospace,monospace;letter-spacing:.12em}.demo{border-radius:3px;box-shadow:10px 10px 0 var(--accent);position:relative;min-height:400px;overflow:hidden;padding:32px;background:var(--paper)}@media(max-width:700px){.mast{display:grid;grid-template-columns:1fr}.page{width:calc(100% - 16px);padding-top:16px}.demo{padding:14px}}
    .panel{padding:30px;border:0;border-radius:42px 12px;background:color-mix(in srgb,var(--secondary) 18%,var(--paper))}.row{display:flex;flex-wrap:wrap;gap:14px;align-items:center}.stack{display:flex;flex-direction:column;gap:20px}.action{min-height:48px;padding:12px 22px;border:0;border-radius:50% 50% 18px 18px;background:color-mix(in srgb,var(--secondary) 42%,transparent);font-weight:800}.action.primary,.action.is-active{color:var(--paper);background:var(--accent)}.muted{color:color-mix(in srgb,var(--ink) 64%,transparent);line-height:1.7}.status{min-height:25px;margin-top:16px;color:var(--accent)}.metric{font-size:clamp(32px,7vw,66px);font-weight:800}.meter{height:11px;border-radius:50%;background:color-mix(in srgb,var(--ink) 10%,transparent)}.meter>i{display:block;height:100%;border-radius:inherit;background:var(--accent)}.chip{padding:8px 12px;border-radius:50%;background:var(--paper)}
    .composition-split{display:grid;grid-template-columns:150px minmax(0,1fr);gap:18px;align-items:start}.split-note{position:sticky;top:20px;display:grid;gap:14px;padding:18px 12px;border-block:3px double var(--accent);font-size:13px;line-height:1.65}.split-note b{font:900 12px/1 ui-monospace,monospace;letter-spacing:.12em}.split-note span{writing-mode:vertical-rl;min-height:120px;color:color-mix(in srgb,var(--ink) 60%,transparent)}.composition-split .demo{min-width:0}@media(max-width:900px){.composition-split{grid-template-columns:1fr}.split-note{position:static;grid-template-columns:auto 1fr}.split-note span{writing-mode:horizontal-tb;min-height:0}}
    .starfield-lab{display:grid;grid-template-columns:minmax(0,1.4fr) minmax(220px,.6fr);gap:16px}.starfield-lab canvas{width:100%;height:460px;border:1px solid var(--line);border-radius:24px;background:#02040a}.star-controls{display:grid;align-content:center;gap:17px}.star-controls label{display:grid;grid-template-columns:1fr auto;gap:8px;font-weight:800}.star-controls input{grid-column:1/-1}@media(max-width:740px){.starfield-lab{grid-template-columns:1fr}.starfield-lab canvas{height:330px}}.workflow-dispatch{display:grid;grid-template-columns:minmax(210px,.48fr) minmax(0,1.52fr);gap:18px}.dispatch-console{display:grid;align-content:start;gap:16px;padding:22px;border:1px solid var(--line);border-radius:18px;background:color-mix(in srgb,var(--secondary) 12%,var(--paper))}.dispatch-console h2{margin:.2em 0}.dispatch-console form,.dispatch-console label{display:grid;gap:7px}.dispatch-console input,.dispatch-console select{min-width:0;width:100%;padding:10px;border:1px solid var(--line);border-radius:8px;background:var(--paper)}.dispatch-console fieldset{display:flex;gap:12px;border:1px solid var(--line);border-radius:10px}.dispatch-console fieldset label{display:flex;align-items:center}.dispatch-workbench{--dispatch-load:.22;min-width:0;padding:14px;border-left:8px solid color-mix(in srgb,var(--accent) calc(var(--dispatch-load)*100%),var(--line));background:linear-gradient(90deg,color-mix(in srgb,var(--accent) 8%,transparent),transparent 28%)}.dispatch-workbench[data-dispatch-priority="urgent"]{box-shadow:inset 0 0 0 2px var(--accent)}@media(max-width:900px){.workflow-dispatch{grid-template-columns:1fr}.dispatch-console{order:2}}
  </style>
</head>
<body data-aesthetic="industrial" data-composition="split-note">
  <main class="page">
    <header class="mast"><div><span class="eyebrow">industrial / Starfield traversal effect / INTERMEDIATE</span><h1>Deep-sea starfield traversal effect</h1><p class="intro">A starfield travel effect completed in a deep-sea setting: includes realistic content, interactive controls, clear status feedback, and responsive layouts across sizes.</p></div><span class="scenario">Deep Sea</span></header>
    <div class="composition-split"><aside class="split-note"><b>CASE 02</b><span>Master the semantic structure, responsive arrangement, keyboard operation, and state synchronization of the starfield travel effect.</span></aside><section class="demo" aria-label="Deep-sea starfield traversal interaction area"><div class="workflow-dispatch"><aside class="dispatch-console"><span class="eyebrow">Deep Sea DISPATCH</span><h2>Submarine mission control</h2><form id="workflowDispatchForm"><label>Task Type<select id="workflowDispatchKind"><option>Sonar Scan</option><option>Hot Spring Sampling</option><option>Return Beacon</option></select></label><label>Subsea Depth<input id="workflowDispatchAmount" type="number" min="1" max="9999" value="33"><span>m</span></label><fieldset><legend>Processing priority</legend><label><input type="radio" name="workflowPriority" value="normal" checked>Regular</label><label><input type="radio" name="workflowPriority" value="urgent">Urgent</label></fieldset><button class="action primary" type="submit">Dive in</button></form><label>Current task<select id="workflowDispatchActive" aria-label="Switch current task"><option value="1">Sonar Scan</option><option value="2">Hot Spring Sampling</option></select></label><output id="workflowDispatchSummary">Waiting for Dispatch</output></aside><section id="workflowCore" class="workflow-core dispatch-workbench" data-dispatch-priority="normal"><!-- 11DZ_CORE_START:creative-effects-starfield --><div class="starfield-lab"><canvas id="starCanvas" width="960" height="480" aria-label="Deep-Sea Starfield Traversal Animation" aria-describedby="starHelp">Your browser does not support Canvas.</canvas><aside class="star-controls panel"><span class="eyebrow">STARFIELD</span><h2>Starfield traversal effect</h2><p id="starHelp" class="muted">The stars move outward from the center of the screen, with size and brightness conveying depth and distance.</p><label>shuttle speed <input id="starSpeed" type="range" min="1" max="12" value="5" data-core-bridge="creative-effects-starfield"><output id="starSpeedValue">5</output></label><label>Star Count <input id="starAmount" type="range" min="40" max="180" value="110"><output id="starAmountValue">110</output></label><div class="row"><button id="starReset" class="action primary" type="button">Reset course</button><button id="starPause" class="action" type="button" aria-pressed="false">Pause</button></div></aside></div><!-- 11DZ_CORE_END --></section></div><p id="status" class="status" role="status" aria-live="polite"></p></section></div>
  </main>
  <script>
    'use strict';
    const statusOutput = document.querySelector('#status');
    const announce = message => { statusOutput.textContent = message; };
    /* 11DZ_CORE_SCRIPT_START:creative-effects-starfield */
const starCanvas=document.querySelector('#starCanvas');const starContext=starCanvas.getContext('2d');const starSpeed=document.querySelector('#starSpeed');const starAmount=document.querySelector('#starAmount');const starReduced=matchMedia('(prefers-reduced-motion: reduce)').matches;let stars=[];let starPaused=starReduced;let starFrame=0;function sizeStarCanvas(){const rect=starCanvas.getBoundingClientRect();const ratio=Math.min(2,devicePixelRatio||1);starCanvas.width=Math.max(320,Math.round(rect.width*ratio));starCanvas.height=Math.max(260,Math.round(rect.height*ratio));starContext.setTransform(ratio,0,0,ratio,0,0);}function createStars(){cancelAnimationFrame(starFrame);const rect=starCanvas.getBoundingClientRect();stars=Array.from({length:Number(starAmount.value)},(_,index)=>({x:((index*73)%997)/997*rect.width-rect.width/2,y:((index*151)%991)/991*rect.height-rect.height/2,z:40+(index*61)%900,pz:900}));document.querySelector('#starAmountValue').textContent=starAmount.value;announce('Starfield generated '+stars.length+' stars');}function drawStars(){const rect=starCanvas.getBoundingClientRect();const centerX=rect.width/2;const centerY=rect.height/2;starContext.fillStyle='#02040a';starContext.fillRect(0,0,rect.width,rect.height);stars.forEach((star,index)=>{star.pz=star.z;if(!starPaused)star.z-=Number(starSpeed.value);if(star.z<8){star.z=900;star.pz=900;}const x=centerX+star.x/star.z*280;const y=centerY+star.y/star.z*280;const previousX=centerX+star.x/star.pz*280;const previousY=centerY+star.y/star.pz*280;const radius=Math.max(.5,(1-star.z/900)*3.4);starContext.beginPath();starContext.strokeStyle=index%5?'rgba(255,255,255,.84)':'rgba(125,211,252,.94)';starContext.lineWidth=radius;starContext.moveTo(previousX,previousY);starContext.lineTo(x,y);starContext.stroke();});if(!starPaused)starFrame=requestAnimationFrame(drawStars);}starSpeed.addEventListener('input',()=>{document.querySelector('#starSpeedValue').textContent=starSpeed.value;announce('shuttle speed '+starSpeed.value);});starAmount.addEventListener('input',()=>{createStars();drawStars();});document.querySelector('#starReset').addEventListener('click',()=>{createStars();drawStars();});document.querySelector('#starPause').addEventListener('click',event=>{starPaused=!starPaused;event.currentTarget.textContent=starPaused?'Continue':'Pause';event.currentTarget.setAttribute('aria-pressed',String(starPaused));cancelAnimationFrame(starFrame);drawStars();announce(starPaused?'Starfield traversal paused':'Continue Starfield Journey');});addEventListener('resize',()=>{sizeStarCanvas();createStars();drawStars();},{passive:true});sizeStarCanvas();createStars();drawStars();
/* 11DZ_CORE_SCRIPT_END */
const workflowBridgeSpec={"name":"creative-effects-starfield","selector":"[data-core-bridge=\"creative-effects-starfield\"]","mode":"range","key":"ArrowRight"};const workflowBridgeCore=document.querySelector('#workflowCore');const workflowBridgeControl=workflowBridgeCore.querySelector(workflowBridgeSpec.selector);if(!workflowBridgeControl)throw new Error('Missing core bridge: '+workflowBridgeSpec.name);const workflowBridgeControlledId=workflowBridgeControl.getAttribute('aria-controls');const workflowBridgeControlled=workflowBridgeControlledId?document.getElementById(workflowBridgeControlledId):null;workflowBridgeCore.dataset.workflowBridge=workflowBridgeSpec.name;workflowBridgeCore.dataset.workflowVersion='0';function workflowBridgeSerialize(){const visualNode=workflowBridgeCore.firstElementChild||workflowBridgeCore;const visual=getComputedStyle(visualNode);const outputs=[...workflowBridgeCore.querySelectorAll('output,[role="status"],[aria-live],meter,progress')].map(node=>node.textContent.trim()+'|'+node.getAttribute('aria-valuenow')+'|'+node.getAttribute('value'));const canvas=[...workflowBridgeCore.querySelectorAll('canvas')].map(node=>{try{return node.toDataURL().slice(-160);}catch{return 'canvas-unavailable';}});return JSON.stringify({html:workflowBridgeCore.innerHTML,status:statusOutput.textContent,outputs,canvas,visual:[visual.display,visual.visibility,visual.opacity,visual.transform,visual.filter,visual.backgroundColor,visual.width,visual.height],scroll:workflowBridgeSpec.mode==='scroll'?workflowBridgeControl.scrollTop:null});}let workflowBridgeLastEffect=workflowBridgeSerialize();function workflowBridgeSummary(){const label=(workflowBridgeControl.getAttribute('aria-label')||workflowBridgeControl.textContent||workflowBridgeControl.value||workflowBridgeSpec.name).trim().replace(/\s+/g,' ').slice(0,72);return label+' · Core Version '+workflowBridgeCore.dataset.workflowVersion;}function workflowBridgeCommit(){const effect=workflowBridgeSerialize();if(effect===workflowBridgeLastEffect)return {changed:false,summary:workflowBridgeSummary()};workflowBridgeLastEffect=effect;workflowBridgeCore.dataset.workflowVersion=String(Number(workflowBridgeCore.dataset.workflowVersion||0)+1);return {changed:true,summary:workflowBridgeSummary()};}function workflowBridgeScheduleCommit(){queueMicrotask(workflowBridgeCommit);setTimeout(workflowBridgeCommit,0);}workflowBridgeControl.addEventListener("input",workflowBridgeScheduleCommit);workflowBridgeControl.addEventListener('change',workflowBridgeScheduleCommit);const workflowBridgeStateTargets=new Set(workflowBridgeCore.querySelectorAll('dialog'));if(workflowBridgeControlled&&workflowBridgeCore.contains(workflowBridgeControlled))workflowBridgeStateTargets.add(workflowBridgeControlled);workflowBridgeStateTargets.forEach(target=>['close','cancel','toggle'].forEach(eventName=>target.addEventListener(eventName,workflowBridgeScheduleCommit)));function workflowBridgeActivate(){workflowBridgeControl.focus();const step=Number(workflowBridgeControl.step)||1;const min=workflowBridgeControl.min===''?-Infinity:Number(workflowBridgeControl.min);const max=workflowBridgeControl.max===''?Infinity:Number(workflowBridgeControl.max);let next=Math.min(max,Math.max(min,(Number(workflowBridgeControl.value)||0)+step));if(next===Number(workflowBridgeControl.value))next=Math.max(min,Number(workflowBridgeControl.value)-step);workflowBridgeControl.value=String(next);workflowBridgeControl.dispatchEvent(new Event('input',{bubbles:true}));workflowBridgeControl.dispatchEvent(new Event('change',{bubbles:true}));const result=workflowBridgeCommit();setTimeout(workflowBridgeCommit,0);return result;}function workflowBridgeReset(){workflowBridgeCore.dataset.workflowVersion='0';workflowBridgeLastEffect=workflowBridgeSerialize();}
const workflowDispatchCore=document.querySelector('#workflowCore');const workflowDispatchForm=document.querySelector('#workflowDispatchForm');const workflowDispatchSelect=document.querySelector('#workflowDispatchActive');const workflowDispatchJobs=new Map([["1",{"label":"Sonar Scan","amount":12,"priority":"normal","touches":0}],["2",{"label":"Hot Spring Sampling","amount":21,"priority":"urgent","touches":0}]]);let workflowDispatchSerial=workflowDispatchJobs.size;function workflowDispatchDrive(job,activate=false){workflowDispatchCore.dataset.dispatchPriority=job.priority;workflowDispatchCore.style.setProperty('--dispatch-load',Math.min(.95,.16+job.amount/120));const bridge=activate?workflowBridgeActivate():{changed:false,summary:workflowBridgeSummary()};document.querySelector('#workflowDispatchSummary').textContent=job.label+' · '+job.amount+' m · '+bridge.summary;announce('Dive mission current task:'+job.label);}function workflowDispatchRender(activeId,activate=false){workflowDispatchSelect.replaceChildren(...[...workflowDispatchJobs].map(([id,job])=>{const option=document.createElement('option');option.value=id;option.textContent=job.label+(job.priority==='urgent'?' · Urgent':'');return option;}));workflowDispatchSelect.value=activeId;workflowDispatchDrive(workflowDispatchJobs.get(activeId),activate);}workflowDispatchForm.addEventListener('submit',event=>{event.preventDefault();const data=new FormData(workflowDispatchForm);const id=String(++workflowDispatchSerial);workflowDispatchJobs.set(id,{label:document.querySelector('#workflowDispatchKind').value,amount:Math.max(1,Number(document.querySelector('#workflowDispatchAmount').value)||1),priority:data.get('workflowPriority'),touches:0});workflowDispatchRender(id,true);});workflowDispatchSelect.addEventListener('change',()=>workflowDispatchDrive(workflowDispatchJobs.get(workflowDispatchSelect.value),true));workflowDispatchCore.addEventListener('focusin',()=>{const job=workflowDispatchJobs.get(workflowDispatchSelect.value);if(!job)return;job.touches+=1;document.querySelector('#workflowDispatchSummary').textContent=job.label+' · '+job.amount+' m · '+workflowBridgeSummary();});workflowDispatchRender('1',false);
workflowBridgeReset();
  </script>
</body>
</html>
Page feedbackFound an issue or have suggestions for improvement?
Feedback features need to be used in the online version

Please enable JavaScript in the online version before submitting; local features of the current tool or example are not affected.

Go to the online version for feedback