<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="4.4.1">Jekyll</generator><link href="https://www.motionsplan.dk/feed.xml" rel="self" type="application/atom+xml" /><link href="https://www.motionsplan.dk/" rel="alternate" type="text/html" /><updated>2026-09-22T18:29:35+00:00</updated><id>https://www.motionsplan.dk/feed.xml</id><title type="html">Motionsplan</title><subtitle>Alt om test og træning til styrketræning, konditionstræning, cardio, yoga, løb og træning - med de videnskabelige briller. Samt et væld af træningsøvelser og træningsprogrammer.</subtitle><author><name>Motionsplan</name></author><entry><title type="html">Ekblom-Bak Cykeltest – Submaksimal testen med lav fejlmargin</title><link href="https://www.motionsplan.dk/ekblom-bak-test/" rel="alternate" type="text/html" title="Ekblom-Bak Cykeltest – Submaksimal testen med lav fejlmargin" /><published>2026-09-13T00:00:00+00:00</published><updated>2026-09-13T20:00:00+00:00</updated><id>https://www.motionsplan.dk/ekblom-bak</id><content type="html" xml:base="https://www.motionsplan.dk/ekblom-bak-test/"><![CDATA[<p>Vil du kende dit <a href="/kondital/">kondital</a> med høj præcision, men uden at skulle presse din puls helt op til sit maksimale? <strong>Ekblom-Bak cykeltesten</strong> er en af de mest anerkendte og moderne submaksimale konditionstests. Den blev udviklet i Sverige i 2012 og opdateret i 2016 som et videnskabeligt opgør med de gamle klassiske cykeltests.</p>

<p>Testen tager præcis <strong>8 minutter</strong> på en ergometercykel og kræver hverken kendskab til din reelle maxpuls eller risikabel all-out belastning.</p>

<p><a href="#calculator" class="btn btn--success btn--jump"><i class="fas fa-calculator"></i> Hop direkte til beregneren</a></p>

<h2 id="hvorfor-er-ekblom-bak-testen-mere-præcis">Hvorfor er Ekblom-Bak testen mere præcis?</h2>

<p>De fleste traditionelle submaksimale cykeltests (som f.eks. Åstrands et-punktstest) estimerer konditallet ved at ekstrapolere din puls op til en beregnet maxpuls ($220 - \text{alder}$). Da maxpulsen kan variere med $\pm 10\text{–}12\text{ slag/minut}$ fra gennemsnittet, introducerer det en betydelig fejlmargin.</p>

<p>Ekblom-Bak testen løser dette problem ved at kigge på <strong>pulstigningen ($\Delta\text{HR}$)</strong> mellem to belastninger i stedet for din absolutte puls:</p>

<ol>
  <li><strong>Eliminerer maxpuls-gæt:</strong> Testens regressionsligning anvender alders- og kønsspecifikke koefficienter i stedet for direkte ekstrapolation til maxpuls.</li>
  <li><strong>Korrigerer for dagsform og støj:</strong> Ved at måle forskellen mellem en lav baseline og en højere arbejdsbelastning neutraliseres støj som dagsform, kaffe, nervøsitet og rumtemperatur.</li>
  <li><strong>Lav standardafvigelse:</strong> Testen har en estimeret standardfejl ($\text{SEE}$) på kun ca. $\pm 4{,}5\text{ ml/kg/min}$, hvilket gør den mærkbart mere præcis end den klassiske 1-punkts Åstrand-test.</li>
</ol>

<h2 id="sådan-udfører-du-ekblom-bak-testen-step-by-step">Sådan udfører du Ekblom-Bak testen (Step-by-step)</h2>

<p>Testen kræver en ergometercykel med wattvisning samt en pulsmåler. Kadencen skal holdes stabilt på <strong>60 omdrejninger i minuttet (RPM)</strong> under hele testen.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>┌────────────────────────────────────────────────────────────────────────┐
│                        EKBLOM-BAK PROTOKOL (8 MIN)                     │
├───────────────────────────────┬────────────────────────────────────────┤
│ Min 0:00 – 4:00 (Trin 1)      │ Fast 32 Watt (0.5 kp v. 60 RPM)        │
│                               │ ⚡ Aflæs HR1 i minut 4:00              │
├───────────────────────────────┼────────────────────────────────────────┤
│ Min 4:00 – 8:00 (Trin 2)      │ Højere watt (fx 100, 150 eller 200 W)  │
│                               │ ⚡ Aflæs HR2 i minut 8:00              │
└───────────────────────────────┴────────────────────────────────────────┘
</code></pre></div></div>

<h3 id="1-trin-1-baseline-minut-0-til-4">1. Trin 1: Baseline (Minut 0 til 4)</h3>

<ul>
  <li><strong>Belastning:</strong> Præcis <strong>32 Watt</strong> (eller $0{,}5\text{ kp}$ ved 60 RPM).</li>
  <li><strong>Varighed:</strong> 4 minutter.</li>
  <li><strong>Formål:</strong> Etablerer kroppens tomgangs-puls under ren bevægelse.</li>
  <li><strong>Måling:</strong> Aflæs din puls ($HR_1$) nøjagtigt ved slutningen af det 4. minut.</li>
</ul>

<h3 id="2-trin-2-arbejdsbelastning-minut-4-til-8">2. Trin 2: Arbejdsbelastning (Minut 4 til 8)</h3>

<ul>
  <li><strong>Belastning:</strong> Øg straks modstanden til en højere belastning ($PO_2$). Vælg et watt-niveau ud fra dit træningsniveau:
    <ul>
      <li><em>Utrænede / ældre:</em> 50 – 100 Watt</li>
      <li><em>Moderat trænede:</em> 100 – 150 Watt</li>
      <li><em>Veltrænede:</em> 150 – 200 Watt+</li>
    </ul>
  </li>
  <li><strong>Krav:</strong> Belastningen skal vælges således, at din puls når over <strong>120 slag/minut</strong>, og du føler en oplevet anstrengelse ($\text{RPE}$) på over 14 (“Noget hårdt”) på Borg-skalaen.</li>
  <li><strong>Måling:</strong> Aflæs din puls ($HR_2$) nøjagtigt ved slutningen af det 8. minut.</li>
</ul>

<h2 id="calculator">Beregner til Ekblom-Bak cykeltesten</h2>

<p>Indtast din alder, vægt og testværdier herunder. Du kan enten benytte den indbyggede 8-minutters timer under testen eller indtaste dine pulstal direkte efterfølgende.</p>

<script src="https://cdnjs.cloudflare.com/ajax/libs/html2canvas/1.4.1/html2canvas.min.js"></script>

<div class="mp-calc-card" data-calculator="ekblom-bak" style="max-width: 700px; margin: 0 auto; position: relative; background: #ffffff; border: 1px solid #e2e8f0; border-radius: 12px; padding: 1.25rem; box-shadow: 0 4px 6px -1px rgba(0,0,0,0.05);">

  <!-- Header & Introduktion -->
  <div class="mp-calc-header" style="margin-bottom: 0.35rem; display: flex; justify-content: space-between; align-items: center;">
    <div class="mp-calc-title" style="margin-bottom: 0; font-size: 1.25rem; font-weight: 800; color: #0f172a;">Ekblom-Bak Cykeltest</div>
    <div data-html2canvas-ignore="true">
      <img src="/assets/images/logo-40x40.png" alt="Motionsplan.dk" style="width: 32px; height: 32px; object-fit: contain; border-radius: 6px;" />
    </div>
  </div>
  
  <p class="mp-calc-description" style="margin-top: 0.25rem; margin-bottom: 1rem; font-size: 0.78rem; color: #64748b; line-height: 1.4;">
    Beregn dit kondital (VO₂max) ud fra en submaksimal ergometercykeltest med lav fejlmargin.
  </p>

  <hr style="border: none; border-top: 1px solid #e2e8f0; margin: 0 0 1.25rem 0;" />

  <!-- 1. Demografi -->
  <div style="display: flex; flex-wrap: wrap; gap: 0.5rem; margin-bottom: 1.25rem; align-items: flex-start;">
    
    <!-- Alder -->
    <div class="mp-form-group" style="flex: 0 0 85px;">
      <label style="font-size: 0.8rem; font-weight: 700;">Alder <span style="font-size: 0.7rem; color: #64748b; font-weight: normal;">(år)</span></label>
      <input type="number" name="eb_age" class="mp-form-control js-eb-input" min="10" max="100" placeholder="40" style="padding: 0.4rem; text-align: center;" />
    </div>
    
    <!-- Vægt -->
    <div class="mp-form-group" style="flex: 0 0 85px;">
      <label style="font-size: 0.8rem; font-weight: 700;">Vægt <span style="font-size: 0.7rem; color: #64748b; font-weight: normal;">(kg)</span></label>
      <input type="number" name="eb_weight" class="mp-form-control js-eb-input" min="30" max="200" placeholder="80" style="padding: 0.4rem; text-align: center;" />
    </div>
    
    <!-- Køn -->
    <div class="mp-form-group" style="flex: 1; min-width: 140px;">
      <label style="font-size: 0.8rem; font-weight: 700;">Køn</label>
      <div class="mp-toggle-group" style="height: 38px;">
        <label style="flex: 1; margin: 0; position: relative;">
          <input type="radio" name="eb_gender" value="male" class="js-eb-input" checked="" />
          <div class="mp-toggle-btn" style="padding: 0 0.4rem; font-size: 0.85rem;">Mand</div>
        </label>
        <label style="flex: 1; margin: 0; position: relative;">
          <input type="radio" name="eb_gender" value="female" class="js-eb-input" />
          <div class="mp-toggle-btn" style="padding: 0 0.4rem; font-size: 0.85rem;">Kvinde</div>
        </label>
      </div>
    </div>

  </div>

  <!-- DISKRET VALGFRI TEST-TIMER -->
  <div class="js-eb-timer-card" data-html2canvas-ignore="true" style="background: #f8fafc; border: 1.5px solid #cbd5e1; border-radius: 10px; padding: 0.65rem 0.85rem; margin-bottom: 1.25rem; display: flex; flex-direction: column; gap: 0.4rem;">
    <div style="display: flex; justify-content: space-between; align-items: center;">
      <div style="display: flex; align-items: center; gap: 0.5rem;">
        <button type="button" class="js-eb-timer-btn" style="background: #2563eb; color: #ffffff; border: none; border-radius: 6px; padding: 0.35rem 0.75rem; font-size: 0.8rem; font-weight: 800; cursor: pointer; display: flex; align-items: center; gap: 4px; transition: background 0.15s;">
          🚀 Start Timer (Valgfri)
        </button>
        <span class="js-eb-timer-guide" style="font-size: 0.78rem; font-weight: 800; color: #334155;">
          Klar til opstart (8 min i alt)
        </span>
      </div>
      <div style="font-size: 1.1rem; font-weight: 900; color: #0f172a; font-variant-numeric: tabular-nums;">
        <span class="js-eb-timer-display">00:00</span>
      </div>
    </div>

    <div style="width: 100%; height: 5px; background: #e2e8f0; border-radius: 3px; overflow: hidden;">
      <div class="js-eb-timer-bar" style="width: 0%; height: 100%; background: #2563eb; transition: width 0.25s linear;"></div>
    </div>
  </div>

  <!-- 2. Belastningsdata -->
  <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); gap: 0.75rem; margin-bottom: 1.25rem;">
    
    <!-- Fieldset 1: Baseline -->
    <fieldset class="js-eb-fieldset-1" style="border: 1px solid #e2e8f0; border-radius: 8px; padding: 0.5rem 0.75rem 0.6rem; margin: 0; background: #f8fafc; min-width: 0; box-sizing: border-box; transition: all 0.3s ease;">
      <legend style="padding: 0 0.3rem; font-weight: 700; font-size: 0.8rem; color: #1e293b;">1. Baseline (Min 0-4)</legend>
      
      <div style="display: flex; gap: 0.5rem; margin-bottom: 0.35rem;">
        <div class="mp-form-group" style="flex: 1; margin: 0; min-width: 0;">
          <label style="font-size: 0.75rem; font-weight: 700;">Belastning <span style="font-weight: normal; color: #64748b;">(watt)</span></label>
          <input type="number" name="eb_work1" class="mp-form-control js-eb-input" value="32" min="10" max="100" style="width: 100%; box-sizing: border-box; text-align: center; font-weight: 700; background: #f1f5f9;" />
        </div>
        <div class="mp-form-group" style="flex: 1; margin: 0; min-width: 0;">
          <label style="font-size: 0.75rem; font-weight: 700;">Puls <span style="font-weight: normal; color: #64748b;">(min 4)</span></label>
          <input type="number" name="eb_hr1" class="mp-form-control js-eb-input" min="50" max="200" placeholder="fx 95" style="width: 100%; box-sizing: border-box; text-align: center;" />
        </div>
      </div>
      
      <div style="font-size: 0.68rem; color: #64748b; line-height: 1.35; padding-top: 0.1rem;">
        💡 Fast baseline på <strong>32 Watt</strong> (0,5 kp v. 60 rpm). Aflæs puls i min 4.
      </div>
    </fieldset>

    <!-- Fieldset 2: Arbejdsbelastning -->
    <fieldset class="js-eb-fieldset-2" style="border: 1px solid #e2e8f0; border-radius: 8px; padding: 0.5rem 0.75rem 0.6rem; margin: 0; background: #f8fafc; min-width: 0; box-sizing: border-box; transition: all 0.3s ease;">
      <legend style="padding: 0 0.3rem; font-weight: 700; font-size: 0.8rem; color: #1e293b;">2. Arbejdsbelastning (Min 4-8)</legend>
      
      <div style="display: flex; gap: 0.5rem; margin-bottom: 0.35rem;">
        <div class="mp-form-group" style="flex: 1; margin: 0; min-width: 0;">
          <label style="font-size: 0.75rem; font-weight: 700;">Belastning <span style="font-weight: normal; color: #64748b;">(watt)</span></label>
          <input type="number" name="eb_work2" class="mp-form-control js-eb-input" min="50" max="400" placeholder="fx 150" style="width: 100%; box-sizing: border-box; text-align: center;" />
        </div>
        <div class="mp-form-group" style="flex: 1; margin: 0; min-width: 0;">
          <label style="font-size: 0.75rem; font-weight: 700;">Puls <span style="font-weight: normal; color: #64748b;">(min 8)</span></label>
          <input type="number" name="eb_hr2" class="mp-form-control js-eb-input" min="80" max="220" placeholder="fx 145" style="width: 100%; box-sizing: border-box; text-align: center;" />
        </div>
      </div>

      <div style="font-size: 0.68rem; color: #64748b; line-height: 1.35; padding-top: 0.1rem;">
  💡     Modstand skal føles <strong>13–14 ("Lidt hårdt")</strong> og pulsen ramme <strong>&gt;120 bpm</strong> (gerne 130–150 bpm). Aflæs i min 8.
      </div>
    </fieldset>

  </div>

  <!-- 3. Resultater -->
  <div style="margin-bottom: 1.5rem; position: relative !important;">
    
    <div style="display: flex; flex-wrap: wrap; gap: 0.75rem; align-items: stretch;">
      
      <!-- Venstre: Kondital & Slider -->
      <div style="flex: 1.2; min-width: 220px; display: flex; flex-direction: column;">
        <div style="display: flex; flex-direction: column; align-items: center; justify-content: justify-between; padding: 0.85rem 1rem; text-align: center; background: #f8fafc; border: 1px solid #cbd5e1; border-radius: 10px; flex: 1; box-sizing: border-box;">
          <div style="text-transform: uppercase; letter-spacing: 0.05em; font-size: 0.75rem; color: #1e40af; font-weight: 700; line-height: 1.1;">
            Beregnet Kondital
          </div>
          
          <div class="js-eb-fitness" style="font-size: 3.2rem; font-weight: 900; color: #1e3a8a; line-height: 1; margin: 0.15rem 0;">-</div>
          <div style="font-size: 0.9rem; font-weight: 800; color: #3b82f6; line-height: 1;">ml/kg/min</div>
          <div style="font-size: 0.7rem; font-weight: 600; color: #64748b; margin-top: 0.2rem;">± 4.5 ml/kg/min</div>

          <!-- Slider -->
          <div style="width: 100%; margin-top: 0.4rem; margin-bottom: 0.6rem;">
            <div style="position: relative; height: 8px; border-radius: 4px; overflow: hidden; background: #e2e8f0;">
              <div style="display: flex; height: 100%; width: 100%;">
                <div style="flex: 1; background: #ef4444;"></div>
                <div style="flex: 1; background: #f97316;"></div>
                <div style="flex: 1; background: #eab308;"></div>
                <div style="flex: 1; background: #22c55e;"></div>
                <div style="flex: 1; background: #3b82f6;"></div>
              </div>
              <div class="js-eb-continuum-marker" style="position: absolute; top: 0; bottom: 0; width: 4px; background: #0f172a; display: none; transform: translateX(-50%);"></div>
            </div>
            <div style="display: flex; justify-content: space-between; font-size: 0.65rem; color: #64748b; font-weight: 700; margin-top: 3px; text-transform: uppercase;">
              <span>Lav</span>
              <span>Høj</span>
            </div>
          </div>

        </div>
      </div>

      <!-- Højre: Sekundære bokse -->
      <div style="flex: 1; min-width: 180px; display: flex; flex-direction: column; gap: 0.5rem;">
        
        <!-- Vurdering Badge + Knap -->
        <div style="flex: 1; padding: 0.65rem 1rem; border: 1px solid #e2e8f0; border-radius: 10px; background: #ffffff; display: flex; justify-content: space-between; align-items: center; box-sizing: border-box;">
          <div>
            <div class="js-eb-eval-badge" style="font-size: 0.85rem; font-weight: 800; padding: 0.35rem 0.75rem; border-radius: 6px; background: #e2e8f0; color: #64748b; white-space: nowrap; display: inline-block;">
              -
            </div>
          </div>
          <div>
            <button type="button" class="js-eb-table-btn" style="display: flex; flex-direction: column; align-items: center; justify-content: center; background: none; border: none; padding: 0; cursor: pointer;">
              <span style="font-size: 1.2rem; line-height: 1; margin-bottom: 2px;">📊</span>
              <span style="font-size: 0.65rem; color: #64748b; font-weight: 700;">Se tabel</span>
            </button>
          </div>
        </div>
        
        <!-- VO2max i L/min -->
        <div style="flex: 1; padding: 0.65rem 1rem; border: 1px solid #e2e8f0; border-radius: 10px; background: #ffffff; display: flex; justify-content: space-between; align-items: center; box-sizing: border-box;">
          <div>
            <div style="font-weight: 800; font-size: 0.85rem; color: #475569; line-height: 1.2;">Maksimal<br />iltoptagelse</div>
          </div>
          <div style="text-align: right; line-height: 1;">
            <div class="js-eb-vo2max" style="font-weight: 900; font-size: 1.4rem; color: #0f172a;">-</div>
            <div style="font-size: 0.65rem; color: #64748b; font-weight: 700; margin-top: 2px;">L/min</div>
          </div>
        </div>

        <!-- Delta Respons (ΔHR & ΔPO) -->
        <div style="flex: 1; padding: 0.65rem 1rem; border: 1px solid #e2e8f0; border-radius: 10px; background: #ffffff; display: flex; justify-content: space-between; align-items: center; box-sizing: border-box;">
          <div>
            <div style="font-weight: 800; font-size: 0.85rem; color: #475569; line-height: 1.2;">Pulsstigning<br /><span style="font-size: 0.7rem; font-weight: 600; color: #64748b;">(ΔHR / ΔPO)</span></div>
          </div>
          <div style="text-align: right; line-height: 1;">
            <div class="js-eb-deltahr" style="font-weight: 900; font-size: 1.1rem; color: #0f172a;">-</div>
            <div class="js-eb-deltapo" style="font-size: 0.68rem; color: #2563eb; font-weight: 700; margin-top: 2px;">-</div>
          </div>
        </div>

      </div>
    </div>

    <!-- Popup-tabel -->
    <div class="js-eb-popup" style="display: none; position: absolute !important; top: 0; bottom: 0; left: 0; right: 0; background: #ffffff; z-index: 30; padding: 1rem 1.25rem; box-sizing: border-box; border-radius: 10px; border: 1px solid #cbd5e1; flex-direction: column; align-items: stretch; justify-content: flex-start; overflow-y: auto; box-shadow: 0 10px 25px -5px rgba(0,0,0,0.15);">
      
      <div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 0.6rem; border-bottom: 1.5px solid #e2e8f0; padding-bottom: 0.4rem; flex-shrink: 0;">
        <div style="margin: 0; color: #0f172a; font-size: 0.95rem; font-weight: 800;">Kondital for din alder</div>
        <button type="button" class="js-eb-popup-close" style="background: none; border: none; font-size: 1.6rem; line-height: 1; cursor: pointer; color: #64748b; padding: 0;">&times;</button>
      </div>

      <div style="flex: 1; overflow-y: auto;">
        <table style="width: 100%; display: table; text-align: left; border-collapse: collapse; background: #ffffff;">
          <tbody class="js-eb-table-body">
            <!-- Udfyldes af JS -->
          </tbody>
        </table>
      </div>

    </div>

  </div>

  <!-- Action knapper -->
  <div class="mp-action-group" style="display: flex; gap: 8px; margin-bottom: 1rem;" data-html2canvas-ignore="true">
    <button type="button" class="js-eb-save-btn mp-btn-action-wide" style="flex: 1.5; padding: 0.6rem; border: none; border-radius: 6px; background: #2563eb; color: #ffffff; font-weight: 700; font-size: 0.85rem; cursor: pointer; transition: all 0.2s ease;">
      💾 Gem resultat
    </button>
    <button type="button" class="js-download-btn" style="flex: 1; padding: 0.6rem; border: 1px solid #cbd5e1; border-radius: 6px; background: #ffffff; color: #334155; font-weight: 700; font-size: 0.85rem; cursor: pointer;">
      📸 Tag billede
    </button>
    <button type="button" class="js-reset-btn" style="width: 42px; padding: 0; border: 1px solid #cbd5e1; border-radius: 6px; background: #f8fafc; font-size: 1rem; cursor: pointer;" title="Ryd felter">
      🗑️
    </button>
  </div>
  
  <div style="text-align: center; font-size: 0.7rem; color: #94a3b8; font-weight: 600;">&copy; motionsplan.dk</div>

</div>

<script type="module">
  import { initEkblomBak } from '/assets/js/ui/ekblom-bak-ui.js';
  
  document.addEventListener('DOMContentLoaded', () => {
    const container = document.querySelector('[data-calculator="ekblom-bak"]');
    if (container) initEkblomBak(container);
  });
</script>

<h2 id="matematikken-bag-ekblom-bak-formlen">Matematikken bag Ekblom-Bak formlen</h2>

<p>Konditallet ($VO_2\max$ i $\text{ml/kg/min}$) beregnes ved først at finde den absolutte iltoptagelse ($VO_2\max$ i $\text{L/min}$) ud fra Ekblom-Bak et al. (2016) regressionsmodellerne:</p>

<p>For mænd:</p>

\[VO_2\max (\text{L/min}) = 2{,}446 - (0{,}0215 \times \text{alder}) + (0{,}00769 \times \Delta PO) - (0{,}00977 \times \Delta HR) - (0{,}00490 \times HR_2)\]

<p>For kvinder:</p>

\[VO_2\max (\text{L/min}) = 1{,}836 - (0{,}0190 \times \text{alder}) + (0{,}00885 \times \Delta PO) - (0{,}00984 \times \Delta HR) - (0{,}00397 \times HR_2)\]

<p>Hvor:</p>
<ul>
  <li>$\Delta PO = PO_2 - 32\text{ W}$ (Ændringen i Watt)</li>
  <li>$\Delta HR = HR_2 - HR_1$ (Ændringen i puls)</li>
  <li>$HR_2$ = Pulsen ved slutningen af minut 8.</li>
</ul>

<p>Det relative kondital findes herefter ved:</p>

\[\text{Kondital (ml/kg/min)} = \frac{VO_2\max (\text{L/min}) \times 1000}{\text{Vægt (kg)}}\]

<p>Resultatet vurderes automatisk mod <a href="/kondital/">alders- og kønsspecifikke normtabeller for kondital</a>.</p>

<details class="references">
  <summary><h2 id="references">Referencer</h2></summary>

  <ul>
    <li>Ekblom-Bak, E., Björkman, F., Hellenius, M. L., &amp; Ekblom, B. (2014). “A new submaximal cycle ergometer test for prediction of VO2max.” <em>Scandinavian Journal of Medicine &amp; Science in Sports</em>, 24(2), 319–326.</li>
    <li>Björkman, F., Ekblom-Bak, E., Ekblom, Ö., &amp; Ekblom, B. (2016). “Validity of the revised Ekblom-Bak cycle ergometer test in adults.” <em>European Journal of Applied Physiology</em>, 116(9), 1643–1652.</li>
  </ul>
</details>]]></content><author><name>Lars Olesen</name></author><category term="Kondition" /><category term="Konditionstests" /><category term="test" /><category term="konditionstest" /><category term="submaksimal test" /><category term="indirekte test" /><category term="cykeltest" /><category term="ekblom bak" /><category term="testberegner" /><summary type="html"><![CDATA[Beregn dit kondital (VO2max) præcist med Ekblom-Bak cykeltesten. Submaksimal test på 8 minutter med lav fejlmargin og uden krav om maxpuls.]]></summary></entry><entry><title type="html">Hånd-øje-koordination: Mål og træn din visuelt-motoriske præcision</title><link href="https://www.motionsplan.dk/haand-oeje-koordination/" rel="alternate" type="text/html" title="Hånd-øje-koordination: Mål og træn din visuelt-motoriske præcision" /><published>2026-09-02T00:00:00+00:00</published><updated>2026-09-02T00:00:00+00:00</updated><id>https://www.motionsplan.dk/haand-oeje-koordination</id><content type="html" xml:base="https://www.motionsplan.dk/haand-oeje-koordination/"><![CDATA[<p>Hånd-øje-koordination (<em>visuomotorisk integration</em>) er det afgørende bindeled mellem dit visuelle system og din kropslige eksekvering. Det nytter ikke noget, at dine øjne sporer en bold perfekt, hvis signalvejen fra hjernens visuelle cortex til armens muskler tøver med blot få millisekunder.</p>

<p>I boldsport, kampsport og ketsjersport definerer denne evne din gribepræcision, din timing i afleveringer og din evne til at reagere på uforudsigelige ripostere.</p>

<hr />

<h2 id="-alternate-wall-toss-test-interaktiv-test--beregner">🧪 Alternate Wall Toss Test (Interaktiv Test &amp; Beregner)</h2>

<p>Alternate Wall Toss Testen er den internationale guldstandard inden for lavteknologiske felttests af visuelt-motorisk rytme og gribepræcision.</p>

<p>Brug widgetten herunder enten som <strong>live 30-sekunders timer</strong> under testen, eller indtast dit resultat direkte for at få din score vurderet i forhold til alders- og idrætsnormer.</p>

<!-- Alternate Wall Toss Test Widget -->
<div class="walltoss-widget-container" id="walltoss-widget">
  <div class="walltoss-header">
    <h3>🎾 Alternate Wall Toss Test</h3>
    <p>Stå 2 meter fra en væg. Kast med højre, grib med venstre — kast med venstre, grib med højre i 30 sekunder.</p>
  </div>

  <div class="walltoss-mode-tabs">
    <button type="button" id="tab-live" class="walltoss-tab active">⏱️ Live Timer &amp; Tæller</button>
    <button type="button" id="tab-manual" class="walltoss-tab">✏️ Indtast Resultat</button>
  </div>

  <!-- Mode 1: Live Interactive Test -->
  <div class="walltoss-body" id="mode-live-body">
    <div class="walltoss-timer-display">
      <span class="timer-label">Tid tilbage</span>
      <div class="timer-val" id="wt-timer-val">30s</div>
    </div>

    <div class="walltoss-counter-display">
      <span class="counter-label">Grebne kast</span>
      <div class="counter-val" id="wt-count-val">0</div>
    </div>

    <div class="walltoss-btn-grid">
      <button type="button" id="btn-wt-start" class="btn-wt-primary">Start 30s Test</button>
      <button type="button" id="btn-wt-count" class="btn-wt-success" disabled="">+1 Grebet! (Eller Mellemrum)</button>
    </div>
  </div>

  <!-- Mode 2: Manual Input -->
  <div class="walltoss-body" id="mode-manual-body" style="display: none;">
    <div class="walltoss-manual-group">
      <label for="manual-catches-input">Antal gribninger på 30 sekunder:</label>
      <input type="number" id="manual-catches-input" min="0" max="80" placeholder="fx 28" />
      <button type="button" id="btn-manual-calc" class="btn-wt-primary">Vurder Score</button>
    </div>
  </div>

  <!-- Result Output -->
  <div class="walltoss-result-card" id="walltoss-result-card" style="display: none;">
    <div class="res-score-title">Resultat: <span id="res-score-num">0</span> gribninger</div>
    <div class="res-rating-badge" id="res-rating-badge">--</div>
    <button type="button" id="btn-wt-reset" class="btn-wt-reset">🔄 Prøv igen / Nulstil</button>
  </div>
</div>

<style>
.walltoss-widget-container {
  background: #ffffff;
  border: 2px solid #e2e8f0;
  border-radius: 16px;
  padding: 1.25rem;
  max-width: 540px;
  margin: 2rem auto;
  font-family: system-ui, -apple-system, sans-serif;
  box-shadow: 0 10px 25px rgba(0,0,0,0.05);
  box-sizing: border-box;
}

.walltoss-header h3 {
  margin: 0 0 0.3rem 0 !important;
  color: #0f172a;
  font-size: 1.25rem;
}

.walltoss-header p {
  margin: 0 0 1rem 0 !important;
  font-size: 0.85rem;
  color: #64748b;
  line-height: 1.4;
}

.walltoss-mode-tabs {
  display: flex;
  gap: 8px;
  margin-bottom: 1rem;
  background: #f1f5f9;
  padding: 4px;
  border-radius: 10px;
}

.walltoss-tab {
  flex: 1;
  padding: 8px;
  border: none;
  background: transparent;
  color: #64748b;
  font-weight: 700;
  font-size: 0.8rem;
  border-radius: 7px;
  cursor: pointer;
  transition: all 0.15s ease;
}

.walltoss-tab.active {
  background: #ffffff;
  color: #0f172a;
  box-shadow: 0 2px 6px rgba(0,0,0,0.08);
}

.walltoss-body {
  background: #f8fafc;
  border: 1px solid #e2e8f0;
  border-radius: 12px;
  padding: 1.25rem;
  margin-bottom: 1rem;
}

.walltoss-timer-display, .walltoss-counter-display {
  text-align: center;
  margin-bottom: 0.8rem;
}

.timer-label, .counter-label {
  display: block;
  font-size: 0.7rem;
  font-weight: 800;
  color: #64748b;
  text-transform: uppercase;
  letter-spacing: 0.05em;
}

.timer-val {
  font-size: 1.8rem;
  font-weight: 900;
  color: #2563eb;
}

.counter-val {
  font-size: 2.5rem;
  font-weight: 900;
  color: #0f172a;
}

.walltoss-btn-grid {
  display: flex;
  flex-direction: column;
  gap: 8px;
}

.btn-wt-primary {
  height: 44px;
  background: #2563eb;
  color: #ffffff;
  border: none;
  border-radius: 8px;
  font-weight: 700;
  font-size: 0.9rem;
  cursor: pointer;
  transition: background 0.15s ease;
  width: 100%;
}
.btn-wt-primary:hover { background: #1d4ed8; }

.btn-wt-success {
  height: 52px;
  background: #16a34a;
  color: #ffffff;
  border: none;
  border-radius: 8px;
  font-weight: 800;
  font-size: 1rem;
  cursor: pointer;
  transition: all 0.1s ease;
  width: 100%;
}
.btn-wt-success:hover:not(:disabled) { background: #15803d; transform: scale(1.01); }
.btn-wt-success:disabled { background: #cbd5e1; cursor: not-allowed; }

.walltoss-manual-group label {
  display: block;
  font-size: 0.8rem;
  font-weight: 700;
  color: #334155;
  margin-bottom: 6px;
}

.walltoss-manual-group input {
  width: 100%;
  height: 42px;
  padding: 0 12px;
  border: 1.5px solid #cbd5e1;
  border-radius: 8px;
  font-size: 1rem;
  font-weight: 700;
  margin-bottom: 10px;
  box-sizing: border-box;
}

.walltoss-result-card {
  background: #0f172a;
  color: #ffffff;
  border-radius: 12px;
  padding: 1.25rem;
  text-align: center;
}

.res-score-title {
  font-size: 1.1rem;
  font-weight: 800;
  margin-bottom: 8px;
}

.res-rating-badge {
  padding: 8px 12px;
  border-radius: 8px;
  font-weight: 800;
  font-size: 0.88rem;
  margin-bottom: 12px;
}

.rating-excellent { background: #15803d; color: #ffffff; }
.rating-good { background: #0284c7; color: #ffffff; }
.rating-average { background: #d97706; color: #ffffff; }
.rating-below { background: #dc2626; color: #ffffff; }

.btn-wt-reset {
  background: transparent;
  border: 1px solid #475569;
  color: #cbd5e1;
  padding: 6px 14px;
  border-radius: 6px;
  font-size: 0.8rem;
  font-weight: 700;
  cursor: pointer;
}
.btn-wt-reset:hover { background: #334155; color: #ffffff; }
</style>

<script>
document.addEventListener('DOMContentLoaded', function() {
  const tabLive = document.getElementById('tab-live');
  const tabManual = document.getElementById('tab-manual');
  const modeLive = document.getElementById('mode-live-body');
  const modeManual = document.getElementById('mode-manual-body');
  
  const timerVal = document.getElementById('wt-timer-val');
  const countVal = document.getElementById('wt-count-val');
  const btnStart = document.getElementById('btn-wt-start');
  const btnCount = document.getElementById('btn-wt-count');
  
  const manualInput = document.getElementById('manual-catches-input');
  const btnManualCalc = document.getElementById('btn-manual-calc');
  
  const resultCard = document.getElementById('walltoss-result-card');
  const resScoreNum = document.getElementById('res-score-num');
  const resRatingBadge = document.getElementById('res-rating-badge');
  const btnReset = document.getElementById('btn-wt-reset');

  let timeLeft = 30;
  let count = 0;
  let timerId = null;
  let isRunning = false;

  // Tab Switching
  tabLive.addEventListener('click', function() {
    tabLive.classList.add('active');
    tabManual.classList.remove('active');
    modeLive.style.display = 'block';
    modeManual.style.display = 'none';
  });

  tabManual.addEventListener('click', function() {
    tabManual.classList.add('active');
    tabLive.classList.remove('active');
    modeManual.style.display = 'block';
    modeLive.style.display = 'none';
  });

  function evaluateScore(score) {
    resScoreNum.textContent = score;
    resRatingBadge.className = 'res-rating-badge ';

    if (score >= 35) {
      resRatingBadge.classList.add('rating-excellent');
      resRatingBadge.textContent = '🌟 Fremragende / Elite (> 35 gribninger)';
    } else if (score >= 30) {
      resRatingBadge.classList.add('rating-good');
      resRatingBadge.textContent = '⚡ Over Gennemsnit (30–34 gribninger)';
    } else if (score >= 20) {
      resRatingBadge.classList.add('rating-average');
      resRatingBadge.textContent = '👍 Gennemsnitlig (20–29 gribninger)';
    } else {
      resRatingBadge.classList.add('rating-below');
      resRatingBadge.textContent = '⚠️ Under Gennemsnit (< 20 gribninger)';
    }

    resultCard.style.display = 'block';
  }

  function startTest() {
    count = 0;
    timeLeft = 30;
    isRunning = true;
    
    countVal.textContent = '0';
    timerVal.textContent = '30s';
    
    btnStart.disabled = true;
    btnCount.disabled = false;
    btnCount.focus();
    resultCard.style.display = 'none';

    timerId = setInterval(function() {
      timeLeft--;
      timerVal.textContent = timeLeft + 's';

      if (timeLeft <= 0) {
        clearInterval(timerId);
        isRunning = false;
        btnStart.disabled = false;
        btnCount.disabled = true;
        evaluateScore(count);
      }
    }, 1000);
  }

  btnStart.addEventListener('click', startTest);

  btnCount.addEventListener('click', function() {
    if (isRunning) {
      count++;
      countVal.textContent = count;
    }
  });

  // Spacebar to count catches
  document.addEventListener('keydown', function(e) {
    if (isRunning && e.code === 'Space') {
      e.preventDefault();
      count++;
      countVal.textContent = count;
    }
  });

  btnManualCalc.addEventListener('click', function() {
    const score = parseInt(manualInput.value, 10);
    if (!isNaN(score) && score >= 0) {
      evaluateScore(score);
    }
  });

  btnReset.addEventListener('click', function() {
    clearInterval(timerId);
    isRunning = false;
    count = 0;
    timeLeft = 30;
    
    countVal.textContent = '0';
    timerVal.textContent = '30s';
    manualInput.value = '';
    
    btnStart.disabled = false;
    btnCount.disabled = true;
    resultCard.style.display = 'none';
  });
});
</script>

<hr />

<h3 id="normskema-for-alternate-wall-toss-test-30-sekunder">Normskema for Alternate Wall Toss Test (30 sekunder)</h3>

<p>Testen er valideret på tværs af aldersgrupper og idrætsgrene. Tabellen herunder viser standardværdierne for voksne atleter ved en afstand på <strong>2,0 meter</strong> fra væggen:</p>

<table>
  <thead>
    <tr>
      <th>Kategori</th>
      <th>Antal grebne kast (30 sek)</th>
      <th>Visuelt-motorisk niveau</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><strong>Elite / Fremragende</strong></td>
      <td>$\ge 35$</td>
      <td>Ekstrem visuel sporing, rytme og lynpræcis håndkorrektion.</td>
    </tr>
    <tr>
      <td><strong>Over Gennemsnittet</strong></td>
      <td>$30 - 34$</td>
      <td>Stærk koordination, velegnet til boldsport og ketsjersport.</td>
    </tr>
    <tr>
      <td><strong>Gennemsnitlig</strong></td>
      <td>$20 - 29$</td>
      <td>Normal funktionel hånd-øje-koordination.</td>
    </tr>
    <tr>
      <td><strong>Under Gennemsnittet</strong></td>
      <td>$15 - 19$</td>
      <td>Begrænset rytme eller langsom perifer reaktion.</td>
    </tr>
    <tr>
      <td><strong>Svag / Træthed</strong></td>
      <td>$&lt; 15$</td>
      <td>Tegn på manglende koordinativ træning eller CNS-træthed.</td>
    </tr>
  </tbody>
</table>

<hr />

<h3 id="protokol-sådan-udføres-testen-korrekt">Protokol: Sådan udføres testen korrekt</h3>

<p>For at opnå et gyldigt testresultat skal du følge denne faste opstilling:</p>

<ol>
  <li><strong>Udstyr:</strong> En standard tennisbold, et stopur og en glat væg uden forhindringer.</li>
  <li><strong>Opstilling:</strong> Mål <strong>2,0 meter</strong> op fra væggen og marker linjen på gulvet med tape. Du må ikke træde over linjen under testen.</li>
  <li><strong>Udførelse:</strong>
    <ul>
      <li>Kast bolden underhånds mod væggen med <strong>højre hånd</strong>, og grib den med <strong>venstre hånd</strong>.</li>
      <li>Kast derefter bolden underhånds med <strong>venstre hånd</strong>, og grib den med <strong>højre hånd</strong>.</li>
      <li>Fortsæt dette skiftevis mønster så hurtigt som muligt i 30 sekunder.</li>
    </ul>
  </li>
  <li><strong>Tabt bold:</strong> Hvis du taber bolden, tæller det missede kast ikke. Saml lynhurtigt bolden op, stil dig bag 2-meter linjen og fortsæt tællingen.</li>
</ol>

<hr />

<hr />

<h2 id="-digital-sigte-test-spatial-target-tapper-fitts-lov">🎯 Digital Sigte-test: Spatial Target Tapper (Fitts’ Lov)</h2>

<p>Hvor kaste- og gribeøvelser træner din kropslige rytme, måler denne digitale test din <strong>visuelt-motoriske sigtepræcision</strong>. Testen bygger på den klassiske neuro-biomekaniske lov, <strong>Fitts’ Lov</strong>, som beviser at din bevægelseshastighed falder i takt med, at målets størrelse bliver mindre eller afstanden øges (<em>Speed-Accuracy Trade-off</em>).</p>

<p>Brug testen herunder til at måle din sigtehastighed (ms) og din træfprocent (%):</p>

<!-- Spatial Target Tapper Widget (Aim & Precision) -->
<div class="aim-widget-container" id="aim-container">
  <!-- Fullscreen Top-Højre Ikon -->
  <button id="btn-aim-fullscreen" class="aim-icon-btn" type="button" title="Fuld skærm" aria-label="Fuld skærm">
    <i class="fas fa-expand"></i>
  </button>

  <div class="aim-header">
    <h3>Digital Aim &amp; Precision Trainer <i class="fas fa-crosshair" style="margin-left:8px; color:#3b82f6;"></i></h3>
    <p>Ram målene så hurtigt og præcist som muligt. Måler din visuelt-motoriske sigteevne og reaktionstid.</p>
  </div>

  <div class="aim-controls">
    <div class="control-group">
      <label for="aim-mode">Test-type:</label>
      <select id="aim-mode" class="aim-select">
        <option value="20" selected="">20 Mål (Standard)</option>
        <option value="30">30 Sekunder (Sprint)</option>
      </select>
    </div>

    <div class="control-group">
      <label for="aim-size">Målstørrelse:</label>
      <select id="aim-size" class="aim-select">
        <option value="variable" selected="">Variabel / Fitts' Lov (Skiftende)</option>
        <option value="small">Lille (20 px - Elite)</option>
        <option value="medium">Mellem (38 px - Standard)</option>
        <option value="large">Stor (56 px - Begynder)</option>
      </select>
    </div>

    <div class="control-group btn-group">
      <button id="btn-aim-start" class="btn-aim-start" type="button">Start Sigte-test</button>
    </div>
  </div>

  <div class="aim-arena" id="aim-arena">
    <!-- Overlay Start Screen -->
    <div class="aim-overlay" id="aim-overlay">
      <div class="aim-overlay-content">
        <i class="fas fa-bullseye aim-big-icon"></i>
        <p>Tryk på <strong>Start Sigte-test</strong> for at begynde.</p>
      </div>
    </div>

    <!-- Live Stat Badges -->
    <div class="aim-stats-bar">
      <div class="aim-stat">Hits: <span id="stat-hits">0</span></div>
      <div class="aim-stat">Misses: <span id="stat-misses">0</span></div>
      <div class="aim-stat">Gns. Tid: <span id="stat-avg-time">0 ms</span></div>
    </div>

    <!-- Target Layer -->
    <div id="aim-target-layer"></div>
  </div>

  <!-- Results Card -->
  <div class="aim-result-card" id="aim-result-card" style="display: none;">
    <h4>Test Resultat</h4>
    <div class="aim-results-grid">
      <div class="aim-res-box">
        <span class="aim-res-label">Gns. Sigtetid</span>
        <div class="aim-res-value" id="res-time">-- ms</div>
      </div>
      <div class="aim-res-box">
        <span class="aim-res-label">Præcision</span>
        <div class="aim-res-value" id="res-accuracy">-- %</div>
      </div>
    </div>
    <div class="aim-rating-badge" id="aim-rating-badge">--</div>
    <button type="button" id="btn-aim-reset" class="btn-aim-reset">🔄 Prøv igen</button>
  </div>
</div>

<style>
.aim-widget-container {
  position: relative;
  background: #ffffff;
  border: 1px solid #e2e8f0;
  border-radius: 12px;
  padding: 1.5rem;
  max-width: 640px;
  margin: 2rem auto;
  font-family: system-ui, -apple-system, sans-serif;
  box-shadow: 0 10px 25px rgba(0,0,0,0.05);
  box-sizing: border-box;
  user-select: none;
}

.aim-icon-btn {
  position: absolute;
  top: 1.25rem;
  right: 1.25rem;
  background: transparent;
  border: 1px solid #e2e8f0;
  color: #718096;
  width: 36px;
  height: 36px;
  border-radius: 8px;
  display: flex;
  align-items: center;
  justify-content: center;
  cursor: pointer;
  font-size: 1rem;
  transition: all 0.2s ease;
  z-index: 10;
}
.aim-icon-btn:hover { background: #edf2f7; color: #2d3748; }

.aim-header h3 {
  margin: 0 0 0.4rem 0 !important;
  color: #1a202c;
  font-size: 1.3rem;
  display: flex;
  align-items: center;
}
.aim-header p {
  font-size: 0.9rem;
  color: #4a5568;
  margin: 0 0 1.2rem 0 !important;
}

.aim-controls {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));
  gap: 0.85rem;
  align-items: end;
  margin-bottom: 1.2rem;
  background: #f7fafc;
  padding: 1rem;
  border-radius: 8px;
  border: 1px solid #edf2f7;
}

.control-group {
  display: flex;
  flex-direction: column;
  gap: 4px;
}

.control-group label {
  font-size: 0.75rem;
  font-weight: 700;
  color: #718096;
  text-transform: uppercase;
}

.aim-select {
  height: 40px;
  padding: 0 10px;
  border: 1px solid #cbd5e0;
  border-radius: 6px;
  background: #fff;
  font-size: 0.85rem;
  color: #2d3748;
  cursor: pointer;
}

.btn-aim-start {
  height: 40px;
  width: 100%;
  background: #2563eb;
  color: white;
  border: none;
  border-radius: 6px;
  font-weight: 700;
  font-size: 0.9rem;
  cursor: pointer;
  transition: all 0.2s ease;
}
.btn-aim-start:hover { background: #1d4ed8; }

.btn-aim-start.is-running {
  background: #ef4444;
}
.btn-aim-start.is-running:hover {
  background: #dc2626;
}

.aim-arena {
  position: relative;
  width: 100%;
  height: 340px;
  background: #0f172a;
  border-radius: 8px;
  overflow: hidden;
  cursor: crosshair;
}

.aim-overlay {
  position: absolute;
  inset: 0;
  background: rgba(15, 23, 42, 0.85);
  display: flex;
  align-items: center;
  justify-content: center;
  z-index: 5;
  color: #f8fafc;
  text-align: center;
}

.aim-big-icon {
  font-size: 3rem;
  color: #3b82f6;
  margin-bottom: 0.5rem;
}

.aim-stats-bar {
  position: absolute;
  top: 10px;
  left: 10px;
  right: 10px;
  display: flex;
  justify-content: space-between;
  pointer-events: none;
  z-index: 4;
}

.aim-stat {
  background: rgba(30, 41, 59, 0.85);
  color: #cbd5e1;
  padding: 4px 10px;
  border-radius: 6px;
  font-size: 0.75rem;
  font-weight: 700;
  font-mono: monospace;
}

.aim-target {
  position: absolute;
  border-radius: 50%;
  background: radial-gradient(circle, #ef4444 0%, #dc2626 60%, #991b1b 100%);
  border: 2px solid #ffffff;
  box-shadow: 0 0 12px rgba(239, 68, 68, 0.6);
  transform: translate(-50%, -50%);
  cursor: pointer;
  z-index: 3;
}

.aim-target::after {
  content: '';
  position: absolute;
  top: 50%;
  left: 50%;
  width: 30%;
  height: 30%;
  background: #ffffff;
  border-radius: 50%;
  transform: translate(-50%, -50%);
}

.aim-result-card {
  margin-top: 1rem;
  background: #1e293b;
  border-radius: 8px;
  padding: 1.25rem;
  color: #ffffff;
  text-align: center;
}

.aim-result-card h4 {
  margin: 0 0 0.8rem 0;
  color: #f8fafc;
}

.aim-results-grid {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 10px;
  margin-bottom: 12px;
}

.aim-res-box {
  background: #0f172a;
  padding: 10px;
  border-radius: 6px;
  border: 1px solid #334155;
}

.aim-res-label {
  display: block;
  font-size: 0.7rem;
  color: #94a3b8;
  text-transform: uppercase;
  font-weight: 700;
}

.aim-res-value {
  font-size: 1.3rem;
  font-weight: 900;
  color: #38bdf8;
}

.aim-rating-badge {
  padding: 8px;
  border-radius: 6px;
  font-weight: 800;
  font-size: 0.85rem;
  margin-bottom: 12px;
}

.rating-pro { background: #15803d; color: #fff; }
.rating-good { background: #0284c7; color: #fff; }
.rating-avg { background: #d97706; color: #fff; }
.rating-slow { background: #b91c1c; color: #fff; }

.btn-aim-reset {
  background: transparent;
  border: 1px solid #475569;
  color: #cbd5e1;
  padding: 6px 14px;
  border-radius: 6px;
  font-size: 0.8rem;
  font-weight: 700;
  cursor: pointer;
}
.btn-aim-reset:hover { background: #334155; color: #fff; }

/* Fullscreen Styling */
.aim-widget-container:fullscreen {
  background: #0f172a;
  max-width: 100vw;
  width: 100vw;
  height: 100vh;
  padding: 1.5rem;
  display: flex;
  flex-direction: column;
  border-radius: 0;
  border: none;
  margin: 0;
  box-sizing: border-box;
}

.aim-widget-container:fullscreen .aim-header h3,
.aim-widget-container:fullscreen .aim-header p {
  color: #f8fafc !important;
}

.aim-widget-container:fullscreen .aim-controls {
  background: #1e293b;
  border-color: #334155;
  margin-bottom: 1rem;
}

.aim-widget-container:fullscreen .aim-arena {
  flex: 1;
  height: auto;
  border-radius: 12px;
  border: 1px solid #334155;
}

.aim-widget-container:fullscreen .aim-icon-btn {
  background: #1e293b;
  border-color: #475569;
  color: #cbd5e1;
}
.aim-widget-container:fullscreen .aim-icon-btn:hover {
  background: #334155;
  color: #ffffff;
}
</style>

<script>
document.addEventListener('DOMContentLoaded', function() {
  const container = document.getElementById('aim-container');
  const arena = document.getElementById('aim-arena');
  const targetLayer = document.getElementById('aim-target-layer');
  const overlay = document.getElementById('aim-overlay');
  
  const btnStart = document.getElementById('btn-aim-start');
  const btnFullscreen = document.getElementById('btn-aim-fullscreen');
  const modeSelect = document.getElementById('aim-mode');
  const sizeSelect = document.getElementById('aim-size');
  
  const statHits = document.getElementById('stat-hits');
  const statMisses = document.getElementById('stat-misses');
  const statAvgTime = document.getElementById('stat-avg-time');
  
  const resultCard = document.getElementById('aim-result-card');
  const resTime = document.getElementById('res-time');
  const resAccuracy = document.getElementById('res-accuracy');
  const ratingBadge = document.getElementById('aim-rating-badge');
  const btnReset = document.getElementById('btn-aim-reset');

  let isRunning = false;
  let hits = 0;
  let misses = 0;
  let targetTimes = [];
  let lastTargetSpawn = 0;
  let timerId = null;

  function getTargetSize() {
    const mode = sizeSelect.value;
    if (mode === 'large') return 56;
    if (mode === 'medium') return 38;
    if (mode === 'small') return 20;
    if (mode === 'variable') {
      // Markant spænd fra 18 px til 60 px for tydelig variation
      return Math.floor(Math.random() * (60 - 18 + 1)) + 18;
    }
    return 38;
  }

  function spawnTarget() {
    targetLayer.innerHTML = '';
    
    const rect = arena.getBoundingClientRect();
    const size = getTargetSize();
    const padding = size;

    const maxX = rect.width - padding;
    const minX = padding;
    const maxY = rect.height - padding;
    const minY = padding + 25; // Undgå overlap med stats bar

    const x = Math.floor(Math.random() * (maxX - minX + 1)) + minX;
    const y = Math.floor(Math.random() * (maxY - minY + 1)) + minY;

    const target = document.createElement('div');
    target.className = 'aim-target';
    target.style.width = size + 'px';
    target.style.height = size + 'px';
    target.style.left = x + 'px';
    target.style.top = y + 'px';

    target.addEventListener('pointerdown', function(e) {
      e.stopPropagation();
      if (!isRunning) return;

      const hitTime = performance.now() - lastTargetSpawn;
      targetTimes.push(hitTime);
      hits++;
      statHits.textContent = hits;
      
      updateAvgTime();
      checkGameStatus();
    });

    targetLayer.appendChild(target);
    lastTargetSpawn = performance.now();
  }

  function updateAvgTime() {
    if (targetTimes.length === 0) return;
    const sum = targetTimes.reduce((a, b) => a + b, 0);
    const avg = Math.round(sum / targetTimes.length);
    statAvgTime.textContent = avg + ' ms';
  }

  arena.addEventListener('pointerdown', function(e) {
    if (!isRunning) return;
    if (e.target.classList.contains('aim-target')) return;
    
    misses++;
    statMisses.textContent = misses;
  });

  function checkGameStatus() {
    const mode = modeSelect.value;
    if (mode !== '30' && hits >= parseInt(mode, 10)) {
      endGame();
    } else {
      spawnTarget();
    }
  }

  function startGame() {
    isRunning = true;
    hits = 0;
    misses = 0;
    targetTimes = [];
    
    statHits.textContent = '0';
    statMisses.textContent = '0';
    statAvgTime.textContent = '0 ms';
    
    overlay.style.display = 'none';
    resultCard.style.display = 'none';
    
    modeSelect.disabled = true;
    sizeSelect.disabled = true;

    btnStart.textContent = 'Stop Test';
    btnStart.classList.add('is-running');

    spawnTarget();

    const mode = modeSelect.value;
    if (mode === '30') {
      timerId = setTimeout(endGame, 30000);
    }
  }

  function endGame() {
    isRunning = false;
    if (timerId) clearTimeout(timerId);
    targetLayer.innerHTML = '';
    
    modeSelect.disabled = false;
    sizeSelect.disabled = false;

    btnStart.textContent = 'Start Sigte-test';
    btnStart.classList.remove('is-running');

    const totalAttempts = hits + misses;
    const accuracy = totalAttempts > 0 ? Math.round((hits / totalAttempts) * 100) : 0;
    const sumTime = targetTimes.reduce((a, b) => a + b, 0);
    const avgTime = targetTimes.length > 0 ? Math.round(sumTime / targetTimes.length) : 0;

    resTime.textContent = avgTime + ' ms';
    resAccuracy.textContent = accuracy + '%';

    ratingBadge.className = 'aim-rating-badge ';
    if (avgTime > 0 && avgTime < 380 && accuracy >= 90) {
      ratingBadge.classList.add('rating-pro');
      ratingBadge.textContent = '🚀 Elite Præcision & Lynhurtigt Sigte!';
    } else if (avgTime < 480 && accuracy >= 80) {
      ratingBadge.classList.add('rating-good');
      ratingBadge.textContent = '⚡ Over Gennemsnitlig Hånd-Øje Reaktion';
    } else if (accuracy >= 70) {
      ratingBadge.classList.add('rating-avg');
      ratingBadge.textContent = '👍 Godkendt Grund-præcision';
    } else {
      ratingBadge.classList.add('rating-slow');
      ratingBadge.textContent = '⚠️ Mange forbiere eller langsom reaktion';
    }

    resultCard.style.display = 'block';
    overlay.style.display = 'flex';
  }

  btnStart.addEventListener('click', function() {
    if (isRunning) endGame();
    else startGame();
  });

  btnReset.addEventListener('click', startGame);

  btnFullscreen.addEventListener('click', function() {
    if (!document.fullscreenElement) {
      if (container.requestFullscreen) {
        container.requestFullscreen();
      } else if (container.webkitRequestFullscreen) {
        container.webkitRequestFullscreen();
      }
    } else {
      if (document.exitFullscreen) {
        document.exitFullscreen();
      }
    }
  });

  document.addEventListener('fullscreenchange', function() {
    const icon = btnFullscreen.querySelector('i');
    if (document.fullscreenElement) {
      icon.className = 'fas fa-compress';
      btnFullscreen.title = 'Luk fuld skærm';
    } else {
      icon.className = 'fas fa-expand';
      btnFullscreen.title = 'Fuld skærm';
    }
  });
});
</script>

<hr />

<h3 id="fysiologien-bag-sigtepræcision-fitts-lov">Fysiologien bag sigtepræcision: Fitts’ Lov</h3>
<p>Når du skal flytte din finger eller en mus mod et mål på skærmen (eller ramme en fri medspiller på banen), opdeler hjernen bevægelsen i to faser:</p>

<ol>
  <li><strong>Ballistisk fase (Grov-bevægelsen):</strong> Et hurtigt motorisk stød, hvor armen eller fingeren sendes i retning af målet.</li>
  <li><strong>Visuel korrektionsfase (Fin-justeringen):</strong> Sidste del af bevægelsen, hvor øjnene lynhurtigt måler afstanden til målet og sender mikro-korrektioner til musklerne for ikke at ramme ved siden af.</li>
</ol>

<p>Jo hurtigere du prøver at udføre bevægelsen, desto kortere tid har hjernen til den visuelle korrektionsfase — hvilket øger risikoen for forbiere. Målet med din hånd-øje-træning er at flytte denne grænse, så du kan fastholde maksimal præcision ved højest mulige hastighed.</p>

<hr />

<h2 id="flere-felttests-til-overkropskoordination">Flere felttests til overkropskoordination</h2>

<p>Ud over Alternate Wall Toss findes der andre tilgængelige felttests til vurdering af arm- og håndkoordination:</p>

<ul>
  <li><strong><a href="/eurofit-testbatteri/">Plate Tapping Test (Eurofit)</a>:</strong> Måler ren overkropshastighed og håndfrekvens ved at flytte den dominante hånd frem og tilbage mellemสอง skiver 50 gange på tid.</li>
  <li><strong><a href="/kognitive-tests/">Ruler Drop Test</a>:</strong> Måler din rene visuelt-motoriske gribereaktion uden skærm-latens.</li>
</ul>

<hr />

<h2 id="ofte-stillede-spørgsmål">Ofte stillede spørgsmål</h2>

<details class="faq">
<summary><h3>Hvad er hånd-øje-koordination (visuomotorisk integration)?</h3></summary>
<p>Hånd-øje-koordination er hjernens evne til at bearbejde visuelle informationer fra øjnene og lynhurtigt omsætte dem til præcise motoriske bevaegelser i arm, hånd og fingre.</p>

</details>

<details class="faq">
<summary><h3>Hvordan måler man hånd-øje-koordination i felten?</h3></summary>
<p>Den mest anerkendte felttest er Alternate Wall Toss Testen, hvor man kaster en tennisbold mod en væg med én hånd og griber den med den modsatte på 30 sekunder fra 2 meters afstand.</p>

</details>

<details class="faq">
<summary><h3>Kan man forbedre sin hånd-øje-koordination som voksen?</h3></summary>
<p>Ja. Gennem målrettet visuel-motorisk træning med reaktionsbolde, variable afstande, syns-okklusion og uforudsigelige kasteøvelser kan hjernens motoriske cortex opbygge hurtigere signalveje.</p>

</details>

<script type="application/ld+json">
    {
        "@context":"https://schema.org",
        "@type":"FAQPage",
        "mainEntity":
            [{"@type":"Question","name":"Hvad er hånd-øje-koordination (visuomotorisk integration)?","acceptedAnswer":{"@type":"Answer","text":"Hånd-øje-koordination er hjernens evne til at bearbejde visuelle informationer fra øjnene og lynhurtigt omsætte dem til præcise motoriske bevaegelser i arm, hånd og fingre.\n"}},{"@type":"Question","name":"Hvordan måler man hånd-øje-koordination i felten?","acceptedAnswer":{"@type":"Answer","text":"Den mest anerkendte felttest er Alternate Wall Toss Testen, hvor man kaster en tennisbold mod en væg med én hånd og griber den med den modsatte på 30 sekunder fra 2 meters afstand.\n"}},{"@type":"Question","name":"Kan man forbedre sin hånd-øje-koordination som voksen?","acceptedAnswer":{"@type":"Answer","text":"Ja. Gennem målrettet visuel-motorisk træning med reaktionsbolde, variable afstande, syns-okklusion og uforudsigelige kasteøvelser kan hjernens motoriske cortex opbygge hurtigere signalveje.\n"}}]
    }
</script>

<hr />

<details class="references">
  <summary><h2 id="references">Referencer</h2></summary>

  <ul>
    <li><strong>Faber, I. R., et al. (2014).</strong> <em>Can perceptual-motor skills assess racquet sport talent in children? A validity study of the Tennis Wall Toss Test.</em> Journal of Sports Sciences, 32(19), 1782-1791.</li>
    <li><strong>Laby, D. M., &amp; Kirschen, D. G. (2018).</strong> <em>Visual Performance Assessment of Athletes: An Integrated Approach.</em> Eye and Brain, 10, 55-67.</li>
    <li><strong>Wood, J. M., &amp; Abernethy, B. (1997).</strong> <em>An assessment of the efficacy of sports vision training programs.</em> Australian Journal of Optometry, 80(3), 88-101.</li>
  </ul>

</details>]]></content><author><name>Lars Olesen</name></author><category term="Træning" /><category term="Sportsvision" /><category term="test" /><category term="koordination" /><category term="reaktionstid" /><category term="sportsvision" /><summary type="html"><![CDATA[Mål din visuelt-motoriske integration med den klassiske Alternate Wall Toss Test. Få normskemaer, testprotokoller og konkrete øvelser til banen.]]></summary></entry><entry><title type="html">Perifert syn: Udvid dit synsfelt og opdag medspillere i øjenkrogen</title><link href="https://www.motionsplan.dk/perifert-syn-synstraening/" rel="alternate" type="text/html" title="Perifert syn: Udvid dit synsfelt og opdag medspillere i øjenkrogen" /><published>2026-09-01T00:00:00+00:00</published><updated>2026-09-01T00:00:00+00:00</updated><id>https://www.motionsplan.dk/perifert-syn-synstraening</id><content type="html" xml:base="https://www.motionsplan.dk/perifert-syn-synstraening/"><![CDATA[<p>I boldsport som fodbold, håndbold og basketball er det en fordel at have et godt periferisyn, så man kan orientere sig rundet på banen - og fornemme bevægelserne ud af øjenkrogen. Det handler ikke om at kunne se skarpt, men i at bruge det <strong>perifere syn</strong>.</p>

<p>Det perifere syn reagerer ekstremt hurtigt på bevægelse og ændringer i udkanten af dit synsfelt. Det er det syn, der lader dig “fornemme” en modstander, der kommer glidende fra siden, eller opfange en medspiller, der tager et dybdeløb i øjenkrogen.</p>

<p>I denne guide ser vi på, hvordan du opbygger et bredt orienteringssyn uden at miste fokus på bolden.</p>

<h2 id="centralt-fokus-vs-perifer-opmærksomhed">Centralt fokus vs. Perifer opmærksomhed</h2>

<p>Når du træner dit perifere syn, arbejder du med en opdeling af din opmærksomhed:</p>
<ul>
  <li><strong>Fikseringspunktet (Det centrale syn):</strong> Det, du kigger direkte på (fx bolden på dine fødder eller modstanderen foran dig).</li>
  <li><strong>Periferien (Det indirekte syn):</strong> Alt det, der sker ud mod skærmens eller banens kanter.</li>
</ul>

<p>Hvis du tvinges til at kaste blikket helt over på medspilleren for at se ham, afslører du dine hensigter over for forsvaret. Med et stærkt perifert syn kan du fastholde kropsstillingen fremad, mens du afleverer til siden (“no-look pass”).</p>

<hr />

<div class="notice--warning">
  <p><strong>💡 Sådan får du det bedste udbytte af synstestene:</strong></p>

  <ul>
    <li><strong>Brug computer/laptop (Anbefalet):</strong> En stor skærm giver den nødvendige synsvinkel (grader i synsfeltet), så dine øjne reelt tvinges til store fokusskift og bred perifer opmærksomhed.</li>
    <li><strong>Kør i Fullscreen:</strong> Klik på <strong>“Fuld skærm”</strong> på værktøjet for at fjerne visuel støj fra browseren.</li>
    <li><strong>Hvis du bruger smartphone:</strong>
      <ol>
        <li><strong>Vend telefonen vandret (Landscape):</strong> Det giver maksimal bredde til synsfeltet.</li>
        <li><strong>Stil telefonen fast:</strong> Stil den op ad en kop eller en bog på bordet — hvis du holder den i hånden, bevæger du ubevidst skærmen.</li>
        <li><strong>Hold armslængdes afstand (40–50 cm):</strong> Sidder telefonen for tæt på ansigtet, overbelaster du øjets indaddrejning.</li>
      </ol>
    </li>
  </ul>
</div>

<hr />

<h2 id="widget">Træn dit periferisyn og synsfelt</h2>

<p>Brug værktøjet herunder til at udvide din perifere opmærksomhed.</p>

<p><strong>Sådan gør du:</strong></p>
<ol>
  <li>Placér dig tæt på skærmen (ca. 30–40 cm), så skærmens kanter fylder godt ud i dit synsfelt.</li>
  <li><strong>KIG KUN PÅ KRUDSET I MIDTEN (+):</strong> Du må under <em>ingen</em> omstændigheder flytte blikket væk fra midterkrydset.</li>
  <li>Tryk <strong>“Start Træning”</strong>. Der vil kortvarigt blinke tal ute i skærmens fire hjørner.</li>
  <li>Prøv at registrere og oplæse tallet i øjenkrogen, mens du beholder blikket fastlåst på midterkrydset.</li>
</ol>

<!-- Digital Peripheral Vision Trainer Widget -->
<div class="periph-widget-container" id="periph-container">
  <!-- Fullscreen Top-Højre Ikon -->
  <button id="btn-periph-fullscreen" class="periph-icon-btn" type="button" title="Fuld skærm" aria-label="Fuld skærm">
    <i class="fas fa-expand"></i>
  </button>

  <div class="periph-header">
    <h3>Digital Periferi-Træner <i class="fas fa-expand-alt" style="margin-left:8px; color:#4fd1c5;"></i></h3>
    <p>Fiksér på midten. Reager på <strong>GRØNNE glimt (⬅️ ⬆️ ➡️ ⬇️)</strong>. Undgå <strong>RØDE støjglimt!</strong></p>
  </div>

  <div class="periph-controls">
    <div class="control-group">
      <label for="periph-mode">Sværhedsgrad:</label>
      <select id="periph-mode" class="periph-select">
        <option value="standard">Standard (Kun Grønne)</option>
        <option value="distractor" selected="">Go / No-Go (Grøn vs Rød)</option>
        <option value="expert">Ekspert (Korte Glimt + Rød)</option>
      </select>
    </div>

    <div class="control-group">
      <label for="periph-span">Synsfelt (Vinkel):</label>
      <select id="periph-span" class="periph-select">
        <option value="narrow">Moderat</option>
        <option value="wide" selected="">Bred (Standard)</option>
        <option value="extreme">Ekstrem (Maksimal)</option>
      </select>
    </div>

    <div class="control-group">
      <label for="periph-duration">Tid (Sæt):</label>
      <select id="periph-duration" class="periph-select">
        <option value="30">30 sekunder</option>
        <option value="60" selected="">60 sek. (Anbefalet)</option>
        <option value="90">90 sekunder</option>
      </select>
    </div>

    <div class="control-group btn-group">
      <button id="btn-periph-toggle" class="btn-periph-start" type="button">Start Træning</button>
    </div>
  </div>

  <div class="periph-arena" id="periph-arena" tabindex="0">
    <!-- Live Badges -->
    <div class="periph-timer-badge" id="periph-timer-badge">60s</div>
    <div class="periph-score-badge" id="periph-score-badge">Gns: 0 ms | Fejl: 0</div>

    <!-- Midterkryds / Kognitiv Skifter -->
    <div class="periph-center-cross" id="periph-center">+</div>

    <!-- Perifere Mål (Venstre, Top, Højre, Bund) -->
    <div class="periph-target" id="pt-left"><i class="fas fa-arrow-left"></i></div>
    <div class="periph-target" id="pt-up"><i class="fas fa-arrow-up"></i></div>
    <div class="periph-target" id="pt-right"><i class="fas fa-arrow-right"></i></div>
    <div class="periph-target" id="pt-down"><i class="fas fa-arrow-down"></i></div>
  </div>
</div>

<style>
.periph-widget-container {
  position: relative;
  background: #ffffff;
  border: 1px solid #e2e8f0;
  border-radius: 12px;
  padding: 1.5rem;
  max-width: 640px;
  margin: 2rem auto;
  font-family: system-ui, -apple-system, sans-serif;
  box-shadow: 0 10px 25px rgba(0,0,0,0.05);
  box-sizing: border-box;
}

.periph-icon-btn {
  position: absolute;
  top: 1.25rem;
  right: 1.25rem;
  background: transparent;
  border: 1px solid #e2e8f0;
  color: #718096;
  width: 36px;
  height: 36px;
  border-radius: 8px;
  display: flex;
  align-items: center;
  justify-content: center;
  cursor: pointer;
  font-size: 1rem;
  transition: all 0.2s ease;
  z-index: 10;
}

.periph-icon-btn:hover {
  background: #edf2f7;
  color: #2d3748;
  border-color: #cbd5e0;
}

.periph-header {
  padding-right: 2.5rem;
}

.periph-header h3 {
  margin: 0 0 0.4rem 0 !important;
  color: #1a202c;
  font-size: 1.3rem;
  display: flex;
  align-items: center;
}

.periph-header p {
  font-size: 0.9rem;
  color: #4a5568;
  margin: 0 0 1.2rem 0 !important;
}

.periph-controls {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(130px, 1fr));
  gap: 0.85rem;
  align-items: end;
  margin-bottom: 1.2rem;
  background: #f7fafc;
  padding: 1rem;
  border-radius: 8px;
  border: 1px solid #edf2f7;
}

.control-group {
  display: flex;
  flex-direction: column;
  gap: 4px;
}

.control-group.btn-group {
  grid-column: span 1;
}

.control-group label {
  font-size: 0.75rem;
  font-weight: 700;
  color: #718096;
  text-transform: uppercase;
  letter-spacing: 0.05em;
}

.periph-select {
  height: 40px;
  padding: 0 10px;
  border: 1px solid #cbd5e0;
  border-radius: 6px;
  background: #fff;
  font-size: 0.9rem;
  color: #2d3748;
  cursor: pointer;
  box-sizing: border-box;
  width: 100%;
}

.btn-periph-start {
  height: 40px;
  width: 100%;
  background: #3182ce;
  color: white;
  border: none;
  border-radius: 6px;
  font-weight: 700;
  font-size: 0.9rem;
  cursor: pointer;
  transition: all 0.2s ease;
  box-sizing: border-box;
  display: flex;
  align-items: center;
  justify-content: center;
}

.btn-periph-start:hover {
  background: #2b6cb0;
}

.btn-periph-start.is-running {
  background: #e53e3e;
}

.periph-arena {
  position: relative;
  width: 100%;
  height: 300px;
  background: #1a202c;
  border-radius: 8px;
  overflow: hidden;
  box-shadow: inset 0 4px 12px rgba(0,0,0,0.5);
  display: flex;
  justify-content: center;
  align-items: center;
  outline: none;
}

.periph-timer-badge, .periph-score-badge {
  position: absolute;
  top: 12px;
  background: rgba(255, 255, 255, 0.1);
  color: rgba(255, 255, 255, 0.8);
  padding: 4px 10px;
  border-radius: 20px;
  font-size: 0.8rem;
  font-weight: 700;
  font-mono: monospace;
  pointer-events: none;
  z-index: 5;
}
.periph-timer-badge { right: 12px; }
.periph-score-badge { left: 12px; }

.periph-center-cross {
  font-size: 2.5rem;
  font-weight: 900;
  color: #e53e3e;
  user-select: none;
  text-shadow: 0 0 12px rgba(229, 62, 62, 0.8);
  z-index: 10;
}

.periph-target {
  position: absolute;
  width: 52px;
  height: 52px;
  border-radius: 50%;
  background: #4fd1c5; /* Standard Grøn GO */
  color: #1a202c;
  font-size: 1.5rem;
  display: flex;
  align-items: center;
  justify-content: center;
  opacity: 0;
  transform: scale(0.5);
  transition: opacity 0.05s ease, transform 0.05s ease, background 0.1s ease;
  user-select: none;
  box-shadow: 0 0 20px rgba(79, 209, 197, 0.9);
}

.periph-target.is-nogo {
  background: #f56565 !important; /* Rød NO-GO Distraktør */
  color: #ffffff !important;
  box-shadow: 0 0 20px rgba(245, 101, 101, 0.9) !important;
}

.periph-target.is-active {
  opacity: 1;
  transform: scale(1);
}

/* Native Fullscreen Override */
.periph-widget-container:fullscreen {
  background: #0f172a;
  max-width: 100vw;
  width: 100vw;
  height: 100vh;
  padding: 2rem;
  display: flex;
  flex-direction: column;
  justify-content: center;
  border-radius: 0;
  border: none;
}

.periph-widget-container:fullscreen .periph-target {
  width: 64px;
  height: 64px;
  font-size: 1.8rem;
}

.periph-widget-container:fullscreen .periph-arena {
  flex: 1;
  height: auto;
}
</style>

<script>
document.addEventListener('DOMContentLoaded', function() {
  const container = document.getElementById('periph-container');
  const arena = document.getElementById('periph-arena');
  const btnToggle = document.getElementById('btn-periph-toggle');
  const btnFullscreen = document.getElementById('btn-periph-fullscreen');
  const modeSelect = document.getElementById('periph-mode');
  const spanSelect = document.getElementById('periph-span');
  const durationSelect = document.getElementById('periph-duration');
  const timerBadge = document.getElementById('periph-timer-badge');
  const scoreBadge = document.getElementById('periph-score-badge');
  const centerCross = document.getElementById('periph-center');
  
  const targetMap = {
    'ArrowLeft': document.getElementById('pt-left'),
    'ArrowUp': document.getElementById('pt-up'),
    'ArrowRight': document.getElementById('pt-right'),
    'ArrowDown': document.getElementById('pt-down')
  };

  const keys = ['ArrowLeft', 'ArrowUp', 'ArrowRight', 'ArrowDown'];

  let isRunning = false;
  let currentKey = null;
  let isNoGo = false;
  let startTime = 0;
  let reactionTimes = [];
  let errorCount = 0;
  let flashTimerId = null;
  let nogoTimeoutId = null;
  let countdownId = null;
  let secondsRemaining = 60;

  function updateTargetPositions() {
    const span = spanSelect.value;
    const isFS = !!document.fullscreenElement;
    
    let offset = isFS ? '18%' : '10%';
    if (span === 'narrow') offset = isFS ? '28%' : '20%';
    if (span === 'wide') offset = isFS ? '16%' : '10%';
    if (span === 'extreme') offset = isFS ? '8%' : '4%';

    targetMap['ArrowLeft'].style.left = offset;
    targetMap['ArrowLeft'].style.top = '50%';

    targetMap['ArrowUp'].style.top = offset;
    targetMap['ArrowUp'].style.left = '50%';

    targetMap['ArrowRight'].style.right = offset;
    targetMap['ArrowRight'].style.top = '50%';

    targetMap['ArrowDown'].style.bottom = offset;
    targetMap['ArrowDown'].style.left = '50%';
  }

  function clearTargets() {
    Object.values(targetMap).forEach(t => {
      t.classList.remove('is-active', 'is-nogo');
    });
  }

  function updateScoreDisplay() {
    const avg = reactionTimes.length > 0 
      ? Math.round(reactionTimes.reduce((a, b) => a + b, 0) / reactionTimes.length) 
      : 0;
    scoreBadge.textContent = 'Gns: ' + avg + ' ms | Fejl: ' + errorCount;
  }

  function triggerNextSignal() {
    clearTargets();
    if (!isRunning) return;

    const mode = modeSelect.value;
    const minPause = (mode === 'expert') ? 800 : 1100;
    const pause = Math.floor(Math.random() * 1000) + minPause;
    
    flashTimerId = setTimeout(function() {
      if (!isRunning) return;
      
      currentKey = keys[Math.floor(Math.random() * keys.length)];
      const targetEl = targetMap[currentKey];

      // Afgør om det er en No-Go distraktør (ca 30% chance i distractor/expert mode)
      isNoGo = (mode !== 'standard') && (Math.random() < 0.35);

      if (isNoGo) {
        targetEl.classList.add('is-nogo');
      }

      targetEl.classList.add('is-active');
      startTime = performance.now();
      updateTargetPositions();

      // Hvis det var en No-Go, forsvinder den automatisk efter et stykke tid uden fejl
      if (isNoGo) {
        nogoTimeoutId = setTimeout(function() {
          if (isRunning && isNoGo) {
            clearTargets();
            currentKey = null;
            isNoGo = false;
            triggerNextSignal();
          }
        }, 1200);
      }
    }, pause);
  }

  function handleKeyPress(e) {
    if (!isRunning || !currentKey) return;

    if (keys.includes(e.key)) {
      e.preventDefault();
      
      if (isNoGo) {
        // STRAF: Trykkede på en RØD No-Go!
        errorCount++;
        updateScoreDisplay();
        clearTimeout(nogoTimeoutId);
        clearTargets();
        currentKey = null;
        isNoGo = false;
        triggerNextSignal();
      } else if (e.key === currentKey) {
        // KORREKT: Trykkede på den rigtige grønne pil!
        const rt = Math.round(performance.now() - startTime);
        reactionTimes.push(rt);
        updateScoreDisplay();

        clearTargets();
        currentKey = null;
        triggerNextSignal();
      } else {
        // KORREKT FARVE, MEN FORKERT RETNING
        errorCount++;
        updateScoreDisplay();
      }
    }
  }

  function updateTimerDisplay() {
    const duration = parseInt(durationSelect.value, 10);
    timerBadge.textContent = secondsRemaining + 's';
  }

  function start() {
    const duration = parseInt(durationSelect.value, 10);

    isRunning = true;
    reactionTimes = [];
    errorCount = 0;
    updateScoreDisplay();
    btnToggle.textContent = 'Stop';
    btnToggle.classList.add('is-running');

    modeSelect.disabled = true;
    spanSelect.disabled = true;
    durationSelect.disabled = true;

    secondsRemaining = duration;
    updateTimerDisplay();

    arena.focus();
    triggerNextSignal();

    if (duration > 0) {
      countdownId = setInterval(function() {
        secondsRemaining--;
        updateTimerDisplay();

        if (secondsRemaining <= 0) {
          stop();
          timerBadge.textContent = 'Færdig! 👏';
        }
      }, 1000);
    }
  }

  function stop() {
    isRunning = false;
    currentKey = null;
    isNoGo = false;
    btnToggle.textContent = 'Start Træning';
    btnToggle.classList.remove('is-running');

    modeSelect.disabled = false;
    spanSelect.disabled = false;
    durationSelect.disabled = false;

    clearTimeout(flashTimerId);
    clearTimeout(nogoTimeoutId);
    clearInterval(countdownId);
    clearTargets();

    const duration = parseInt(durationSelect.value, 10);
    secondsRemaining = duration;
    updateTimerDisplay();
  }

  btnToggle.addEventListener('click', function() {
    if (isRunning) stop();
    else start();
  });

  window.addEventListener('keydown', handleKeyPress);

  btnFullscreen.addEventListener('click', function() {
    if (!document.fullscreenElement) {
      if (container.requestFullscreen) container.requestFullscreen();
      else if (container.webkitRequestFullscreen) container.webkitRequestFullscreen();
    } else {
      if (document.exitFullscreen) document.exitFullscreen();
    }
  });

  document.addEventListener('fullscreenchange', function() {
    updateTargetPositions();
  });

  spanSelect.addEventListener('change', updateTargetPositions);
  updateTargetPositions();
  updateTimerDisplay();
});
</script>

<h3 id="progression-og-sværhedsgrader">Progression og sværhedsgrader</h3>
<ul>
  <li><strong>Indsnævret til Bred (Span):</strong> Start med tætte hjørner og skift til “Bred”, når du bliver bedre til at opfange glimt helt ude i kanten.</li>
  <li><strong>Blink-tid (Eksponering):</strong> Sænk eksponeringstiden fra 600 ms til 200 ms for at tvinge hjernen til at opfange ultrakorte visuelle stimuli.</li>
</ul>

<hr />

<h2 id="praktiske-baneøvelser-til-split-vision-uden-skærm">Praktiske baneøvelser til Split Vision (Uden skærm)</h2>

<p>Når du har trænet din reaktive opmærksomhed på skærmen, kan du overføre færdighederne til banen med disse tre klassiske øvelser:</p>

<h3 id="ninja-træning-talkort--mærker">Ninja-træning (Talkort + Mærker)</h3>
<ul>
  <li><strong>Formål:</strong> At isolere det perifere synsfelt, mens du udfører uafhængige hånd-øje-bevægelser.</li>
  <li><strong>Udførsel:</strong> Hæng et talkort op i øjenhøjde, og placer 20 klemmer eller mærker i en cirkel helt ude i kanten af dit synsfelt. Fiksér på midten af talkortet. En makker kalder et mærke, og du skal ramme det med en pegepind udelukkende ved brug af dit perifere syn, mens du uafbrudt læser tallene på kortet op i en fast rytme.</li>
</ul>

<p><a href="/assets/pdf/trainyoureyes-ninja.pdf"><img src="/assets/images/tye/trainyoureyes-ninja.png" alt="" /></a></p>

<hr />

<h2 id="ofte-stillede-spørgsmål-om-perifert-syn">Ofte stillede spørgsmål om perifert syn</h2>

<details class="faq">
<summary><h3>Hvad er forskellen på centralt og perifert syn?</h3></summary>
<p>Det centrale syn (foveale syn) står for skarpsyn, detaljer og farver i midten af synsfeltet. Det perifere syn dækker kanten af synsfeltet og er specialiseret i at opfange bevægelse, kontraster og lysglimt lynhurtigt.</p>

</details>

<details class="faq">
<summary><h3>Kan man udvide sit perifere synstrænede areal?</h3></summary>
<p>Selve nethindens anatomiske størrelse ændres ikke, men du kan træne hjernens evne til bevidst at bearbejde de visuelle indtryk, der kommer fra kanten af synsfeltet, uden at skulle flytte blikket.</p>

</details>

<details class="faq">
<summary><h3>Hvordan hjælper perifert syn mod 'tunnelsyn' i pressede situationer?</h3></summary>
<p>Når pulsen og stressniveauet stiger under kamp, udskiller kroppen adrenalin, hvilket naturligt snævrer synsfeltet ind (tunnelsyn). Målrettet træning gør dig i stand til at fastholde det vide overblik under kognitivt pres.</p>

</details>

<script type="application/ld+json">
    {
        "@context":"https://schema.org",
        "@type":"FAQPage",
        "mainEntity":
            [{"@type":"Question","name":"Hvad er forskellen på centralt og perifert syn?","acceptedAnswer":{"@type":"Answer","text":"Det centrale syn (foveale syn) står for skarpsyn, detaljer og farver i midten af synsfeltet. Det perifere syn dækker kanten af synsfeltet og er specialiseret i at opfange bevægelse, kontraster og lysglimt lynhurtigt.\n"}},{"@type":"Question","name":"Kan man udvide sit perifere synstrænede areal?","acceptedAnswer":{"@type":"Answer","text":"Selve nethindens anatomiske størrelse ændres ikke, men du kan træne hjernens evne til bevidst at bearbejde de visuelle indtryk, der kommer fra kanten af synsfeltet, uden at skulle flytte blikket.\n"}},{"@type":"Question","name":"Hvordan hjælper perifert syn mod 'tunnelsyn' i pressede situationer?","acceptedAnswer":{"@type":"Answer","text":"Når pulsen og stressniveauet stiger under kamp, udskiller kroppen adrenalin, hvilket naturligt snævrer synsfeltet ind (tunnelsyn). Målrettet træning gør dig i stand til at fastholde det vide overblik under kognitivt pres.\n"}}]
    }
</script>

<hr />

<details class="references">
  <summary><h2 id="references">Referencer</h2></summary>

  <ul>
    <li><strong>Strasburger, H., Rentschler, I., &amp; Jüttner, M. (2011).</strong> <em>Peripheral vision and pattern recognition: A review.</em> Journal of Vision, 11(5), 13-13.</li>
    <li><strong>Erickson, G. B. (2007).</strong> <em>Sports Vision: Vision Care for the Enhancement of Sports Performance.</em> Butterworth-Heinemann.</li>
    <li><strong>Vater, C., Williams, A. M., &amp; Hossner, E. J. (2020).</strong> <em>Assessment of peripheral vision in sport: A systematic review.</em> Sports Medicine, 50(6), 1133-1148.</li>
  </ul>

</details>]]></content><author><name>Lars Olesen</name></author><category term="Træning" /><category term="Sportsvision" /><category term="synstræning" /><category term="reaktionstid" /><category term="sportsvision" /><summary type="html"><![CDATA[Lær at træne dit perifere syn til sport. Se hvordan du opfanger modstandere og frie zoner i øjenkrogen uden at dreje hovedet.]]></summary></entry><entry><title type="html">Sakkader og synstræning: Få hurtigere øjne til sport</title><link href="https://www.motionsplan.dk/sakkader-synstraening/" rel="alternate" type="text/html" title="Sakkader og synstræning: Få hurtigere øjne til sport" /><published>2026-09-01T00:00:00+00:00</published><updated>2026-09-01T00:00:00+00:00</updated><id>https://www.motionsplan.dk/sakkader-og-synstraening</id><content type="html" xml:base="https://www.motionsplan.dk/sakkader-synstraening/"><![CDATA[<p>I stort set al sport er synet den primære kilde til information. Det er synet, der fortæller hjernen, hvor bolden er, hvor modstanderen løber hen, og hvornår du skal reagere. En af de allervigtigste funktioner i dit visuelle system er <strong>sakkader</strong>.</p>

<p>Sakkader er de lynhurtige, springende bevægelser, dine øjne foretager, når du skifter fokus fra ét punkt til et andet. Uanset om du scanner forsvaret på en håndboldbane, eller kigger fra bold til ketsjer i tennis, afhænger din reaktionstid af, hvor præcist og hurtigt dine sakkader fungerer.</p>

<p>I denne artikel dykker vi ned i, hvorfor sakkader er afgørende for <a href="/sportsvision/">dit sportsvision</a> og din præstation — og hvordan du kan træne dem direkte her på siden.</p>

<h2 id="hvorfor-er-sakkader-vigtige-i-sport">Hvorfor er sakkader vigtige i sport?</h2>

<p>Når øjet foretager en sakkade, er synet faktisk “slukket” i de få millisekunder, bevægelsen varer (dette kaldes <em>saccadic suppression</em>). Hvis dine øjenmuskler er langsomme, eller hvis du har svært ved at “fange” det nye mål præcist i første forsøg, bruger din hjerne unødigt lang tid i blinde.</p>

<p>Gode sakkader giver dig:</p>

<ol>
  <li><strong>Hurtigere overblik:</strong> Du kan scanne banen, medspillere og modstandere på kortere tid.</li>
  <li><strong>Kortere reaktionstid:</strong> Hjernen modtager et skarpt billede hurtigere, hvilket betyder, at de motoriske signaler (fx at flytte foden eller gribe en bold) sættes i gang tidligere.</li>
  <li><strong>Mindre mental træthed:</strong> Upræcise sakkader tvinger hjernen til konstant at korrigere øjets position, hvilket dræner dig for kognitiv energi over en lang kamp.</li>
</ol>

<h2 id="hart-charts-den-klassiske-analoge-metode">Hart Charts: Den klassiske analoge metode</h2>

<p>Inden for <strong>Sports Vision</strong> har man i årtier brugt en øvelse, der hedder <em>Hart Charts</em>.</p>

<p>Et Hart Chart består typisk af et gitter med bogstaver (fx 10x10 rækker). Du hænger ét stort skema op på væggen et par meter væk, og holder et lille skema i hånden. Træningen går ud på at læse første bogstav på væggen, derefter første bogstav på kortet i hånden, osv., så hurtigt som muligt.</p>

<p>Udover at træne øjets linse (akkommodation), træner det i høj grad de horisontale og vertikale sakkader, fordi du systematisk tvinger øjnene til at hoppe i bestemte mønstre uden at bevæge hovedet.</p>

<p>Men du behøver ikke printe lister ud for at træne dine øjne i dag.</p>

<figure class="">
  <img src="https://res.cloudinary.com/nipuzl73/image/fetch/f_auto,q_auto:eco,w_800/https://www.visus.de/media/image/5b/87/63/80109-hart-chart_600x600.png" srcset="https://res.cloudinary.com/nipuzl73/image/fetch/f_auto,q_auto:eco,w_800/https://www.visus.de/media/image/5b/87/63/80109-hart-chart_600x600.png 800w, https://res.cloudinary.com/nipuzl73/image/fetch/f_auto,q_auto:eco,w_1600/https://www.visus.de/media/image/5b/87/63/80109-hart-chart_600x600.png 1600w" sizes="(max-width: 800px) 100vw, 800px" alt="" loading="lazy" decoding="async" /><figcaption>
      Hart Chart - træner både sakkader og akkomodation at kigge langt fra og tæt på.

    </figcaption></figure>

<h2 id="sakkade-pyramider-fra-finger-styring-til-ren-visuel-kontrollering">Sakkade-pyramider: Fra “finger-styring” til ren visuel kontrollering</h2>

<p>Når du læser eller scanner en bane, kombinerer hjernen lynhurtige sakkader med mindre, glidende bevægelser. Mange mennesker — både børn, kognitivt trætte atleter og folk under genoptræning — oplever, at øjnene “hopper af sporet” eller mister linjen.</p>

<p>For at kompensere bruger man ofte en finger under teksten. I fysiologien kaldes dette for <strong>proprioception</strong> (kroppens sans for egne bevægelser), hvor du lader hånden guide øjets fiksationspunkt.</p>

<p>For at opbygge reel styrke og præcision i øjets muskler skal du fjerne dette “støttehjul”. Det er her <strong>Sakkade-pyramider</strong> kommer ind i billedet.</p>

<h3 id="hvad-er-en-sakkade-pyramide">Hvad er en Sakkade-pyramide?</h3>
<p>En Sakkade-pyramide er et print-selv ark eller digitalt skema, hvor bogstaver eller tal står opstillet i en pyramideform, der bliver bredere og bredere nedad.</p>

<figure class="">
  <img src="https://res.cloudinary.com/nipuzl73/image/fetch/f_auto,q_auto:eco,w_800/https://www.motionsplan.dk/assets/images/blog/saccade.jpeg" srcset="https://res.cloudinary.com/nipuzl73/image/fetch/f_auto,q_auto:eco,w_800/https://www.motionsplan.dk/assets/images/blog/saccade.jpeg 800w, https://res.cloudinary.com/nipuzl73/image/fetch/f_auto,q_auto:eco,w_1600/https://www.motionsplan.dk/assets/images/blog/saccade.jpeg 1600w" sizes="(max-width: 800px) 100vw, 800px" alt="" loading="lazy" decoding="async" /><figcaption>
      Sakkade pyramiden

    </figcaption></figure>

<h3 id="sådan-udføres-øvelsen">Sådan udføres øvelsen:</h3>
<ol>
  <li><strong>Fikser hovedet:</strong> Hold hovedet 100 % stille — kun øjnene må bevæge sig.</li>
  <li><strong>Hop fra side til side:</strong> Læs øverste par (fx 1 ➔ 2), hop derefter ned til næste linje (A ➔ B), og fortsæt ned til bunden, hvor afstanden er størst.</li>
  <li><strong>INGEN fingre:</strong> Hold hænderne på ryggen eller i skødet. Du må ikke pege på næste tegn.</li>
  <li><strong>Progression:</strong> Start med pyramider, der har støttelinjer trukket mellem tegnene. Når du kan køre dem lynhurtigt uden at miste orienteringen, skifter du til Avancerede Pyramider uden linjer.</li>
</ol>

<h2 id="sakkade-penne-partnertræning-af-præcision-og-hæmningskontrol">Sakkade-penne: Partnertræning af præcision og hæmningskontrol</h2>

<p>Sakkade-penne (<em>Saccade Pens</em>) er en effektiv, analog partnerøvelse, der styrker øjnenes præcision og koordination. Hvor digitale øvelser primært træner dine reaktive evner, træner denne øvelse både dine reaktive fiksationer og din evne til bevidst at undertrykke synsreflekser (hæmningskontrol / anti-sakkader).</p>

<figure class="">
  <img src="https://res.cloudinary.com/nipuzl73/image/fetch/f_auto,q_auto:eco,w_800/https://cdn.prod.website-files.com/655d3a8af50e9270145a6c46/657f9eeb7367791cbd938bd8_saccade-2-pens.jpeg" srcset="https://res.cloudinary.com/nipuzl73/image/fetch/f_auto,q_auto:eco,w_800/https://cdn.prod.website-files.com/655d3a8af50e9270145a6c46/657f9eeb7367791cbd938bd8_saccade-2-pens.jpeg 800w, https://res.cloudinary.com/nipuzl73/image/fetch/f_auto,q_auto:eco,w_1600/https://cdn.prod.website-files.com/655d3a8af50e9270145a6c46/657f9eeb7367791cbd938bd8_saccade-2-pens.jpeg 1600w" sizes="(max-width: 800px) 100vw, 800px" alt="" loading="lazy" decoding="async" /><figcaption>
      Sakkade blyanterne

    </figcaption></figure>

<h3 id="det-skal-du-bruge">Det skal du bruge</h3>
<ul>
  <li>En makker (træner, holdkammerat eller forælder)</li>
  <li>2 kuglepenne</li>
</ul>

<h3 id="grundopstilling">Grundopstilling</h3>
<ol>
  <li>Din makker sidder direkte over for dig med ca. 1 meters afstand.</li>
  <li>Makkeren holder de to penne vandret i øjenhøjde med ca. 50 cm afstand imellem dem.</li>
  <li>Du starter med at fiksere blikket direkte på din makkers næse.</li>
  <li><strong>VIGTIGT:</strong> Hold hovedet 100 % stille under hele øvelsen — det er kun øjnene, der må bevæge sig.</li>
</ol>

<h3 id="niveau-1-reaktive-sakkader-næse--pen--næse">Niveau 1: Reaktive Sakkader (Næse ➔ Pen ➔ Næse)</h3>
<ul>
  <li>Makkeren ryster forsigtigt den ene pen.</li>
  <li>Så snart du opfanger bevægelsen i dit perifere syn, flytter du lynhurtigt blikket over på den rystende pen og stiller skarpt.</li>
  <li>Kast derefter straks blikket tilbage på makkerens næse.</li>
  <li>Makkeren varierer tilfældigt, hvilken pen der rystes, i <strong>1 minut</strong>.</li>
  <li>Hold 30 sekunders pause.</li>
</ul>

<h3 id="niveau-2-hæmningskontrol--anti-sakkader">Niveau 2: Hæmningskontrol / Anti-sakkader</h3>
<ul>
  <li>I denne runde sker det modsatte: Når makkeren ryster den ene pen, må du <strong>IKKE</strong> kigge på den!</li>
  <li>Du skal i stedet tvinge øjnene til lynhurtigt at kigge over på den <strong>stillestående pen</strong>.</li>
  <li>Dette træner din hjerne i aktivt at undertrykke automatiske reflekser og i stedet vælge det rigtige fiksationspunkt — en afgørende evne på banen, når du skal lade være med at falde for modstanderens finte.</li>
  <li>Kør i <strong>1 minut</strong> efterfulgt af 30 sekunders pause.</li>
</ul>

<h3 id="variation-og-progression">Variation og progression</h3>
<ul>
  <li><strong>Vinkel og retning:</strong> Skift stilling på pennene mellem hver runde, så de står lodret (op/ned) eller diagonalt.</li>
  <li><strong>Bredere synsfelt:</strong> Øg afstanden mellem de to penne, så øjnene tvinges ud i større vinkler.</li>
  <li><strong>Dosering:</strong> Gennemfør 5 runder af 1 minuts varighed 1-3 gange om ugen.</li>
</ul>

<hr />

<h2 id="retningsbestemte-sakkader-og-deres-funktion-i-sport">Retningsbestemte sakkader og deres funktion i sport</h2>

<p>Dine øjenmuskler arbejder i tre primære planer. For at opnå en komplet synstræning bør du variere bevægelsesmønsteret:</p>

<ul>
  <li><strong>Vandrette (Horisontale) Sakkader:</strong> Træner lynhurtig scanning fra side til side. Essentielt for at overskue spillet på tværs af banen i boldsport og forbedre læsehastighed.</li>
  <li><strong>Lodrette (Vertikale) Sakkader:</strong> Træner øjets evne til at skifte linje i højdeplanet. Afgørende når du skal bedømme høje bolde i ketsjersport, spring i basketball eller trappeløb.</li>
  <li><strong>Diagonale Sakkader:</strong> Den mest komplekse bevægelse, hvor både de lige og de skrå øjenmuskler (<em>musculi obliqui</em>) skal fyre synkront.</li>
  <li><strong>Tilfældige (Reaktive) Sakkader:</strong> Tvinger hjernen til at reager uforudsigeligt på visuelle stimuli frem for at køre i en fast rytme.</li>
</ul>

<hr />

<h2 id="kliniske-forbehold-og-hjernerystelse-mtbi">Kliniske forbehold og hjernerystelse (mTBI)</h2>

<p>Selvom sakkadetræning har vist store resultater i nyere forskning inden for både sportsperformance og hjjernerystelses-rehabilitering (<em>mild Traumatic Brain Injury</em>), er det vigtigt at skelne mellem synstræning og balancetræning:</p>

<div class="notice--info">
  <p><strong>🩺 Klinisk retningslinje (APTA 2022 Guidelines):</strong>
Sakkadetræning <em>uden</em> hovedbevægelse isolerer de ekstraokulære øjenmuskler ideelt til sport. Dog anbefaler <em>Academy of Neurologic Physical Therapy</em>, at personer med vestibulære balanceforstyrrelser (uægtet svimmelhed) ikke laver isolerede øjenøvelser uden samtidig hovedbevægelse, da syn og balanceapparat her skal genoptrænes i samspil.</p>
</div>

<hr />

<h2 id="widget">Træn dine sakkader online</h2>

<p>Brug værktøjet herunder til at træne dine reaktive sakkader.</p>

<p><strong>Sådan gør du:</strong></p>
<ol>
  <li>Sæt dig komfortabelt med skærmen i ca. 40-50 cm afstand.</li>
  <li><strong>VIGTIGT:</strong> Hold hovedet <em>helt</em> stille. Det er KUN øjnene, der må bevæge sig.</li>
  <li>Vælg et tempo og tryk “Start”.</li>
  <li>Flyt blikket lynhurtigt til den blå prik, hver gang den dukker op et nyt sted på den mørke skærm. Fokuser skarpt på den, før du flytter blikket videre.</li>
  <li>Kør øvelsen i 1-2 minutter.</li>
</ol>

<!-- Digital Saccade Pacer Widget -->
<div class="saccade-widget-container" id="saccade-container">
  <!-- Fullscreen Ikon (Top Højre) -->
  <button id="btn-saccade-fullscreen" class="saccade-icon-btn" type="button" title="Fuld skærm" aria-label="Fuld skærm">
    <i class="fas fa-expand"></i>
  </button>

  <div class="saccade-header">
    <h3>Digital Sakkade-Pacer <i class="fas fa-eye" style="margin-left:8px; color:#4fd1c5;"></i></h3>
    <p>Træn dine hurtige fokusskift. <strong>Regel nr. 1: Hold hovedet helt stille!</strong></p>
  </div>

  <div class="saccade-controls">
    <div class="control-group">
      <label for="saccade-speed">Tempo:</label>
      <select id="saccade-speed" class="saccade-select">
        <option value="1200">Langsom (1.2s)</option>
        <option value="750" selected="">Mellem (0.75s)</option>
        <option value="450">Hurtig (0.45s)</option>
        <option value="250">Ekstrem (0.25s)</option>
      </select>
    </div>
    
    <div class="control-group">
      <label for="saccade-mode">Mønster:</label>
      <select id="saccade-mode" class="saccade-select">
        <option value="random" selected="">Tilfældig (Reaktiv)</option>
        <option value="horizontal">Vandret (Højre/Venstre)</option>
        <option value="vertical">Lodret (Op/Ned)</option>
        <option value="diagonal">Diagonalt (Hjørner)</option>
      </select>
    </div>

    <div class="control-group">
      <label for="saccade-sound">Audio Cue:</label>
      <select id="saccade-sound" class="saccade-select">
        <option value="off">🔇 Lydløs</option>
        <option value="on" selected="">🔊 Metronom Lyd</option>
      </select>
    </div>

    <div class="control-group">
      <label for="saccade-duration">Tid (Sæt):</label>
      <select id="saccade-duration" class="saccade-select">
        <option value="30">30 sekunder</option>
        <option value="60" selected="">60 sek. (Anbefalet)</option>
        <option value="90">90 sekunder</option>
        <option value="0">Uden tidsgrænse</option>
      </select>
    </div>

    <div class="control-group btn-group">
      <button id="btn-saccade-toggle" class="btn-saccade-start" type="button">Start Træning</button>
    </div>
  </div>

  <div class="saccade-arena" id="saccade-arena">
    <!-- Live Timer Badge -->
    <div class="saccade-timer-badge" id="saccade-timer-badge">60s</div>

    <!-- Midterkryds Anchor -->
    <div class="saccade-center-cross">+</div>

    <!-- Prikker (Kors + Hjørner) -->
    <div class="saccade-target" id="s-target-left" style="top: 50%; left: 10%;"></div>
    <div class="saccade-target" id="s-target-top" style="top: 15%; left: 50%;"></div>
    <div class="saccade-target" id="s-target-right" style="top: 50%; left: 90%;"></div>
    <div class="saccade-target" id="s-target-bottom" style="top: 85%; left: 50%;"></div>

    <!-- Diagonale Hjørner -->
    <div class="saccade-target" id="s-target-topleft" style="top: 15%; left: 10%;"></div>
    <div class="saccade-target" id="s-target-topright" style="top: 15%; left: 90%;"></div>
    <div class="saccade-target" id="s-target-bottomleft" style="top: 85%; left: 10%;"></div>
    <div class="saccade-target" id="s-target-bottomright" style="top: 85%; left: 90%;"></div>
  </div>
</div>

<style>
.saccade-widget-container {
  position: relative;
  background: #ffffff;
  border: 1px solid #e2e8f0;
  border-radius: 12px;
  padding: 1.5rem;
  max-width: 640px;
  margin: 2rem auto;
  font-family: system-ui, -apple-system, sans-serif;
  box-shadow: 0 10px 25px rgba(0,0,0,0.05);
  box-sizing: border-box;
}

.saccade-icon-btn {
  position: absolute;
  top: 1.25rem;
  right: 1.25rem;
  background: transparent;
  border: 1px solid #e2e8f0;
  color: #718096;
  width: 36px;
  height: 36px;
  border-radius: 8px;
  display: flex;
  align-items: center;
  justify-content: center;
  cursor: pointer;
  font-size: 1rem;
  transition: all 0.2s ease;
  z-index: 10;
}

.saccade-icon-btn:hover {
  background: #edf2f7;
  color: #2d3748;
  border-color: #cbd5e0;
}

.saccade-header {
  padding-right: 2.5rem;
}

.saccade-header h3 {
  margin: 0 0 0.4rem 0 !important;
  color: #1a202c;
  font-size: 1.3rem;
  display: flex;
  align-items: center;
}

.saccade-header p {
  font-size: 0.9rem;
  color: #4a5568;
  margin: 0 0 1.2rem 0 !important;
}

.saccade-controls {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(120px, 1fr));
  gap: 0.85rem;
  align-items: end;
  margin-bottom: 1.2rem;
  background: #f7fafc;
  padding: 1rem;
  border-radius: 8px;
  border: 1px solid #edf2f7;
}

.control-group {
  display: flex;
  flex-direction: column;
  gap: 4px;
}

.control-group.btn-group {
  grid-column: span 1;
}

.control-group label {
  font-size: 0.75rem;
  font-weight: 700;
  color: #718096;
  text-transform: uppercase;
  letter-spacing: 0.05em;
}

.saccade-select {
  height: 40px;
  padding: 0 8px;
  border: 1px solid #cbd5e0;
  border-radius: 6px;
  background: #fff;
  font-size: 0.85rem;
  color: #2d3748;
  cursor: pointer;
  box-sizing: border-box;
  width: 100%;
}

.saccade-select:focus {
  outline: none;
  border-color: #3182ce;
  box-shadow: 0 0 0 2px rgba(49, 130, 206, 0.2);
}

.btn-saccade-start {
  height: 40px;
  width: 100%;
  background: #3182ce;
  color: white;
  border: none;
  border-radius: 6px;
  font-weight: 700;
  font-size: 0.9rem;
  cursor: pointer;
  transition: all 0.2s ease;
  box-sizing: border-box;
  display: flex;
  align-items: center;
  justify-content: center;
}

.btn-saccade-start:hover {
  background: #2b6cb0;
}

.btn-saccade-start.is-running {
  background: #e53e3e;
}
.btn-saccade-start.is-running:hover {
  background: #c53030;
}

.saccade-arena {
  position: relative;
  width: 100%;
  height: 300px;
  background: #1a202c;
  border-radius: 8px;
  overflow: hidden;
  box-shadow: inset 0 4px 12px rgba(0,0,0,0.5);
  display: flex;
  align-items: center;
  justify-content: center;
}

.saccade-center-cross {
  font-size: 2rem;
  font-weight: 300;
  color: rgba(255, 255, 255, 0.15);
  user-select: none;
  pointer-events: none;
}

.saccade-timer-badge {
  position: absolute;
  top: 12px;
  right: 12px;
  background: rgba(255, 255, 255, 0.1);
  color: rgba(255, 255, 255, 0.7);
  padding: 4px 10px;
  border-radius: 20px;
  font-size: 0.8rem;
  font-weight: 700;
  font-mono: monospace;
  letter-spacing: 0.05em;
  pointer-events: none;
}

.saccade-target {
  position: absolute;
  width: 30px;
  height: 30px;
  background: #4fd1c5;
  border-radius: 50%;
  transform: translate(-50%, -50%) scale(0);
  opacity: 0;
  transition: opacity 0.05s ease, transform 0.1s cubic-bezier(0.175, 0.885, 0.32, 1.275);
  box-shadow: 0 0 18px rgba(79, 209, 197, 0.8);
}

.saccade-target.is-active {
  transform: translate(-50%, -50%) scale(1);
  opacity: 1;
}

.saccade-widget-container:fullscreen {
  background: #0f172a;
  max-width: 100vw;
  width: 100vw;
  height: 100vh;
  padding: 2rem;
  display: flex;
  flex-direction: column;
  justify-content: center;
  border-radius: 0;
  border: none;
}

.saccade-widget-container:fullscreen .saccade-header h3 { color: #f7fafc; }
.saccade-widget-container:fullscreen .saccade-header p { color: #a0aec0; }
.saccade-widget-container:fullscreen .saccade-controls { background: #1e293b; border-color: #334155; }
.saccade-widget-container:fullscreen .control-group label { color: #94a3b8; }
.saccade-widget-container:fullscreen .saccade-select { background: #0f172a; color: #f1f5f9; border-color: #475569; }
.saccade-widget-container:fullscreen .saccade-icon-btn { background: #1e293b; border-color: #475569; color: #cbd5e1; }
.saccade-widget-container:fullscreen .saccade-arena { flex: 1; height: auto; min-height: 300px; }
</style>

<script>
document.addEventListener('DOMContentLoaded', function() {
  const container = document.getElementById('saccade-container');
  const btnToggle = document.getElementById('btn-saccade-toggle');
  const btnFullscreen = document.getElementById('btn-saccade-fullscreen');
  const speedSelect = document.getElementById('saccade-speed');
  const modeSelect = document.getElementById('saccade-mode');
  const soundSelect = document.getElementById('saccade-sound');
  const durationSelect = document.getElementById('saccade-duration');
  const timerBadge = document.getElementById('saccade-timer-badge');
  
  const allTargets = {
    left: document.getElementById('s-target-left'),
    top: document.getElementById('s-target-top'),
    right: document.getElementById('s-target-right'),
    bottom: document.getElementById('s-target-bottom'),
    topleft: document.getElementById('s-target-topleft'),
    topright: document.getElementById('s-target-topright'),
    bottomleft: document.getElementById('s-target-bottomleft'),
    bottomright: document.getElementById('s-target-bottomright')
  };

  let isRunning = false;
  let intervalId = null;
  let countdownId = null;
  let currentKey = '';
  let secondsRemaining = 60;
  let audioCtx = null;

  function playBeep() {
    if (soundSelect.value === 'off') return;
    try {
      if (!audioCtx) audioCtx = new (window.AudioContext || window.webkitAudioContext)();
      if (audioCtx.state === 'suspended') audioCtx.resume();
      
      const osc = audioCtx.createOscillator();
      const gain = audioCtx.createGain();
      osc.connect(gain);
      gain.connect(audioCtx.destination);
      
      const now = audioCtx.currentTime;
      osc.frequency.value = 800;
      gain.gain.setValueAtTime(0.15, now);
      gain.gain.exponentialRampToValueAtTime(0.001, now + 0.08);
      osc.start(now);
      osc.stop(now + 0.08);
    } catch(e) {}
  }

  function clearTargets() {
    Object.values(allTargets).forEach(t => t.classList.remove('is-active'));
  }

  function pickNextTarget() {
    clearTargets();
    const mode = modeSelect.value;
    let pool = [];

    if (mode === 'horizontal') {
      pool = ['left', 'right'];
    } else if (mode === 'vertical') {
      pool = ['top', 'bottom'];
    } else if (mode === 'diagonal') {
      pool = ['topleft', 'bottomright', 'topright', 'bottomleft'];
    } else {
      pool = Object.keys(allTargets);
    }

    let nextKey = currentKey;
    while (nextKey === currentKey) {
      nextKey = pool[Math.floor(Math.random() * pool.length)];
    }

    currentKey = nextKey;
    allTargets[currentKey].classList.add('is-active');
    playBeep();
  }

  function updateTimerDisplay() {
    const duration = parseInt(durationSelect.value, 10);
    if (duration === 0) {
      timerBadge.textContent = '∞';
    } else {
      timerBadge.textContent = secondsRemaining + 's';
    }
  }

  function start() {
    const speed = parseInt(speedSelect.value, 10);
    const duration = parseInt(durationSelect.value, 10);

    isRunning = true;
    btnToggle.textContent = 'Stop';
    btnToggle.classList.add('is-running');
    
    speedSelect.disabled = true;
    modeSelect.disabled = true;
    soundSelect.disabled = true;
    durationSelect.disabled = true;

    secondsRemaining = duration;
    updateTimerDisplay();

    pickNextTarget();
    intervalId = setInterval(pickNextTarget, speed);

    if (duration > 0) {
      countdownId = setInterval(function() {
        secondsRemaining--;
        updateTimerDisplay();

        if (secondsRemaining <= 0) {
          stop();
          timerBadge.textContent = 'Færdig! 👏';
        }
      }, 1000);
    }
  }

  function stop() {
    isRunning = false;
    btnToggle.textContent = 'Start Træning';
    btnToggle.classList.remove('is-running');
    
    speedSelect.disabled = false;
    modeSelect.disabled = false;
    soundSelect.disabled = false;
    durationSelect.disabled = false;

    clearInterval(intervalId);
    clearInterval(countdownId);
    clearTargets();
    currentKey = '';
    
    const duration = parseInt(durationSelect.value, 10);
    secondsRemaining = duration;
    updateTimerDisplay();
  }

  btnToggle.addEventListener('click', function() {
    if (isRunning) stop();
    else start();
  });

  durationSelect.addEventListener('change', function() {
    secondsRemaining = parseInt(this.value, 10);
    updateTimerDisplay();
  });

  btnFullscreen.addEventListener('click', function() {
    if (!document.fullscreenElement) {
      if (container.requestFullscreen) container.requestFullscreen();
      else if (container.webkitRequestFullscreen) container.webkitRequestFullscreen();
    } else {
      if (document.exitFullscreen) document.exitFullscreen();
    }
  });

  document.addEventListener('fullscreenchange', function() {
    const icon = btnFullscreen.querySelector('i');
    if (document.fullscreenElement) {
      icon.className = 'fas fa-compress';
      btnFullscreen.title = 'Luk fuld skærm';
    } else {
      icon.className = 'fas fa-expand';
      btnFullscreen.title = 'Fuld skærm';
    }
  });

  updateTimerDisplay();
});
</script>

<div class="notice--warning">
  <p><strong>💡 Sådan får du det bedste udbytte af synstestene:</strong></p>

  <ul>
    <li><strong>Brug computer/laptop (Anbefalet):</strong> En stor skærm giver den nødvendige synsvinkel (grader i synsfeltet), så dine øjne reelt tvinges til store fokusskift og bred perifer opmærksomhed.</li>
    <li><strong>Kør i Fullscreen:</strong> Klik på <strong>“Fuld skærm”</strong> på værktøjet for at fjerne visuel støj fra browseren.</li>
    <li><strong>Hvis du bruger smartphone:</strong>
      <ol>
        <li><strong>Vend telefonen vandret (Landscape):</strong> Det giver maksimal bredde til synsfeltet.</li>
        <li><strong>Stil telefonen fast:</strong> Stil den op ad en kop eller en bog på bordet — hvis du holder den i hånden, bevæger du ubevidst skærmen.</li>
        <li><strong>Hold armslængdes afstand (40–50 cm):</strong> Sidder telefonen for tæt på ansigtet, overbelaster du øjets indaddrejning.</li>
      </ol>
    </li>
  </ul>
</div>

<h3 id="progression-i-din-synstræning">Progression i din synstræning</h3>
<p>Start på “Langsom” eller “Mellem” for at sikre, at du rammer plet med øjnene hver gang uden at over- eller underskyde målet. Når bevægelsen føles ubesværet, kan du skrue op for tempoet. På det højeste tempo bliver øvelsen ikke bare en synstest, men en intens kognitiv stress-test for din opmærksomhed.</p>

<hr />

<h2 id="ofte-stillede-spørgsmål-om-synstræning">Ofte stillede spørgsmål om synstræning</h2>

<details class="faq">
<summary><h3>Hvad er forskellen på sakkader og smooth pursuit?</h3></summary>
<p>Sakkader er lynhurtige, springende øjenbevægelser fra ét fikseringspunkt til et andet (fx at flytte blikket fra bolden til en medspiller). ‘Smooth pursuit’ (glidende forfølgelse) er øjets evne til jævnt at følge et objekt i bevægelse (fx at følge en bold i luften uden at flytte hovedet).</p>

</details>

<details class="faq">
<summary><h3>Hvor ofte skal man træne synet for at se en effekt?</h3></summary>
<p>Ligesom med al anden muskel- og nervetræning kræver synstræning kontinuitet. 2-3 minutters fokuseret træning med en Sakkade-Pacer eller en Hart Chart 3-4 gange om ugen er nok til at skabe fysiologiske tilpasninger i din visuelle reaktionstid.</p>

</details>

<details class="faq">
<summary><h3>Hvorfor skal jeg holde hovedet stille under træningen?</h3></summary>
<p>Når du bevæger hovedet for at se til siden, aflaster du de små muskler (ekstraokulære muskler), der styrer selve øjeæblet. For at isolere og træne øjets muskler og den neurologiske signalvej, skal hovedet være helt fikseret.</p>

</details>

<script type="application/ld+json">
    {
        "@context":"https://schema.org",
        "@type":"FAQPage",
        "mainEntity":
            [{"@type":"Question","name":"Hvad er forskellen på sakkader og smooth pursuit?","acceptedAnswer":{"@type":"Answer","text":"Sakkader er lynhurtige, springende øjenbevægelser fra ét fikseringspunkt til et andet (fx at flytte blikket fra bolden til en medspiller). ‘Smooth pursuit’ (glidende forfølgelse) er øjets evne til jævnt at følge et objekt i bevægelse (fx at følge en bold i luften uden at flytte hovedet).\n"}},{"@type":"Question","name":"Hvor ofte skal man træne synet for at se en effekt?","acceptedAnswer":{"@type":"Answer","text":"Ligesom med al anden muskel- og nervetræning kræver synstræning kontinuitet. 2-3 minutters fokuseret træning med en Sakkade-Pacer eller en Hart Chart 3-4 gange om ugen er nok til at skabe fysiologiske tilpasninger i din visuelle reaktionstid.\n"}},{"@type":"Question","name":"Hvorfor skal jeg holde hovedet stille under træningen?","acceptedAnswer":{"@type":"Answer","text":"Når du bevæger hovedet for at se til siden, aflaster du de små muskler (ekstraokulære muskler), der styrer selve øjeæblet. For at isolere og træne øjets muskler og den neurologiske signalvej, skal hovedet være helt fikseret.\n"}}]
    }
</script>

<hr />

<details class="references">
  <summary><h2 id="references">Referencer</h2></summary>

  <ul>
    <li><strong>Erickson, G. B. (2007).</strong> <em>Sports Vision: Vision Care for the Enhancement of Sports Performance.</em> Butterworth-Heinemann.</li>
    <li><strong>Appelbaum, L. G., &amp; Erickson, G. (2018).</strong> <em>Sports vision training: A review of state-of-the-art in digital performance enhancement.</em> Neuroscience &amp; Biobehavioral Reviews, 84, 154-171.</li>
    <li><strong>Vickers, J. N. (2007).</strong> <em>Perception, Cognition, and Decision Training: The Quiet Eye in Action.</em> Human Kinetics.</li>
  </ul>

</details>]]></content><author><name>Lars Olesen</name></author><category term="Træning" /><category term="Sportsvision" /><category term="synstræning" /><category term="reaktionstid" /><category term="sportsvision" /><summary type="html"><![CDATA[Lær at træne dine sakkader (fokusskift) med klassiske Hart Charts og vores digitale Sakkade-Pacer. Forbedr dit visuelle overblik i sport.]]></summary></entry><entry><title type="html">Samsyn og dybdesyn: Bedøm afstande og time dine handlinger</title><link href="https://www.motionsplan.dk/samsyn-dybdesyn-synstraening/" rel="alternate" type="text/html" title="Samsyn og dybdesyn: Bedøm afstande og time dine handlinger" /><published>2026-09-01T00:00:00+00:00</published><updated>2026-09-01T00:00:00+00:00</updated><id>https://www.motionsplan.dk/samsyn-dybdesyn-synstraening</id><content type="html" xml:base="https://www.motionsplan.dk/samsyn-dybdesyn-synstraening/"><![CDATA[<p>Uden et velfungerende <strong>samsyn</strong> (binokulært syn) er det umuligt at bedømme afstande, hastighed og dybde præcist i tre dimensioner.</p>

<p>Når du skal gribe en bold i flugten, time et hop i en duel eller placere en aflevering i et åbent rum, afhænger din præcision af, at begge øjne fikserer på <em>præcis</em> det samme punkt på millisekunden.</p>

<p>I denne guide gennemgår vi fysiologien bag samsyn, akkommodation og konvergens — og giver dig konkrete papir- og baneøvelser til at optræne den måde øjnene virker sammen.</p>

<h2 id="hvorfor-samsyn-er-afgørende-i-sport">Hvorfor samsyn er afgørende i sport</h2>

<p>Øjnene fungerer som din krops visuelle sigtekorn. Hvis øjnene ikke samarbejder optimalt, påvirker det dine motoriske handlinger på banen direkte:</p>

<table>
  <thead>
    <tr>
      <th>Visuel udfordring</th>
      <th>Fysiologisk årsag</th>
      <th>Konsekvens på banen</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><strong>Fejlvurderet afstand</strong></td>
      <td>Nedsat dybdesyn (stereopsis).</td>
      <td>Bedømmer du afstanden for kort, stormer du for hurtigt frem og afleverer for blødt. Bedømmer du den for lang, tøver du og afleverer for hårdt.</td>
    </tr>
    <tr>
      <td><strong>Upræcis sigtelinje</strong></td>
      <td>Forskudt fikseringspunkt.</td>
      <td>En spiller, der konsekvent skyder forbi målet til venstre, har ofte et forskudt visuelt sigtekorn — fejlen ligger i øjnenes fiksering, ikke i skudteknikken.</td>
    </tr>
    <tr>
      <td><strong>Usikkerhed ved hovedstød</strong></td>
      <td>Manglende konvergens tæt på ansigtet.</td>
      <td>Når bolden nærmer sig ansigtet, tvinges øjnene til at dreje indad. Kan de ikke det, opstår der ubehag eller dobbeltsyn, hvilket får spilleren til at lukke øjnene.</td>
    </tr>
    <tr>
      <td><strong>Visuel udtrætning</strong></td>
      <td>Lave udholdenhedsreserver.</td>
      <td>Øjenmusklerne udtrættes sidst i kampen. Det fører til svigtende koncentration, sløret syn og dårligere beslutningstagning i afgørende minutter.</td>
    </tr>
  </tbody>
</table>

<blockquote>
  <p><strong>Bonus i hverdagen:</strong> Træning af øjnenes samsyn og visuelle udholdenhed styrker også børns og unges evne til at læse og fastholde koncentrationen i skolen, da læsning kræver de samme præcise mikrobevægelser.</p>
</blockquote>

<hr />

<h2 id="tre-begreber-du-skal-kende">Tre begreber du skal kende</h2>

<ul>
  <li><strong>Konvergens / Divergens:</strong> Øjnenes evne til at dreje indad mod næsen, når et objekt kommer tæt på (konvergens), og dreje udad mod en parallel stilling, når du kigger langt væk (divergens).</li>
  <li><strong>Akkommodation:</strong> Øjets linse, der ændrer form for at stille skarpt på skiftende afstande.</li>
  <li><strong>Stereopsis (3D-dybdesyn):</strong> Den neurologiske proces i hjernebarken, der beregner den nøjagtige afstand til et objekt ud fra vinkelforskellen mellem de to øjne.</li>
</ul>

<hr />

<h2 id="1-pencil-push-ups-grundlæggende-konvergenstræning">1. Pencil Push-ups: Grundlæggende konvergenstræning</h2>

<p>Pencil Push-ups er guldstandarden inden for synstræning til at forbedre øjnenes <strong>konvergens</strong>. Øvelsen genoptræner øjnenes indaddrejende muskler (<em>musculi recti mediales</em>), så du undgår dobbeltsyn og sløring, når bolde eller spilsituationer kommer tæt på ansigtet.</p>

<div class="responsive-video-container">

  <div class="youtube-container">
    <div class="youtube-player" data-id="ghvpt3dSYfk">
      <a href="https://www.youtube.com/watch?v=ghvpt3dSYfk" rel="nofollow noopener">
        <img class="youtube-thumb" src="https://i.ytimg.com/vi/ghvpt3dSYfk/hqdefault.jpg" loading="lazy" alt="Video: Samsyn og dybdesyn: Bedøm afstande og time dine handlinger" />
        <span class="play-button"></span>
      </a>
    </div>
  </div>


</div>

<h3 id="niveau-1-glidende-konvergens-smooth-convergence">Niveau 1: Glidende Konvergens (Smooth Convergence)</h3>
<p>Optræner den fysiologiske grundstyrke og evne til at holde fiksationen tæt på ansigtet.</p>

<ol>
  <li><strong>Startposition:</strong> Hold en blyant eller pen i strakt arm direkte foran dit ansigt. Fokuser skarpt på pennespidsen eller et bogstav på blyanten.</li>
  <li><strong>Bevægelse:</strong> Før blyanten langsomt og jævnt direkte mod næsetippen, mens du fastholder et enkelt og skarpt billede.</li>
  <li><strong>Undgå dobbeltsyn:</strong> Hvis blyanten blir en smule sløret helt tæt på næsen, er det acceptable — så længe du stadig kun ser <strong>én</strong> blyant. Oplever du dobbeltsyn, stopper du op og tvinger øjnene til at samle billedet igen.</li>
  <li><strong>Slutpunkt:</strong> Kan du føre blyanten helt ind til næsetippen uden dobbeltsyn, holder du positionen i 2 sekunder og slapper af. Mister du fiksationen, føres blyanten tilbage til strakt arm, og du starter forfra.</li>
  <li><strong>Dosering:</strong> Kør i 1 minut (ca. 20 gentagelser), og slap derefter af i øjnene ved at kigge ud i horisonten i 1 minut.</li>
</ol>

<h3 id="niveau-2-spring-konvergens-jump-convergence">Niveau 2: Spring-Konvergens (Jump Convergence)</h3>
<p>En mere avanceret variation, der efterligner de lynhurtige dybdejusteringer, dine øjne foretager under kampsituationer på banen.</p>

<ol>
  <li><strong>Startposition:</strong> Hold én blyant i strakt arm og én anden blyant ca. 10 cm fra næsetippen.</li>
  <li><strong>Skift fokus:</strong> Flyt blikket lynhurtigt fra den fjerne blyant til den nære blyant. Tving øjnene til at gøre den nære blyant skarp og enkeltstående (den fjerne blyant vil naturligt fremstå dobbelt i dit perifere syn).</li>
  <li><strong>Hold og skift:</strong> Hold fiksationen i 2 sekunder, og skift derefter lynhurtigt blikket tilbage til den fjerne blyant.</li>
  <li><strong>Progression:</strong> Føles 10 cm for svært, flytter du den nære blyant til 15 cm. Efterhånden som dit samsyn forbedres, flytter du den nære blyant helt ind til 5 cm eller næsetippen.</li>
  <li><strong>Dosering:</strong> Kør 3 sæt af 1 minuts varighed 3 gange om dagen.</li>
</ol>

<hr />

<h2 id="2-brock-string-den-klassiske-metode">2. Brock String: Den klassiske metode</h2>

<p>Inden for <strong>Sports Vision</strong> og optometri er <em>Brock String</em> (opkaldt efter dr. Frederick Brock) den mest anerkendte fysiske øvelse til træning af samsyn og konvergens.</p>

<p>En Brock String er en tre meter lang hvid snor med tre farvede perler placeret på forskellige afstande (fx 15 cm, 50 cm og 200 cm).</p>

<h3 id="sådan-gør-du">Sådan gør du:</h3>

<ol>
  <li>Placér den ene ende af snoren mod næsetippen, og hold den anden ende spændt ud mod en væg.</li>
  <li>Fiksér på den midterste perle.</li>
  <li>Du skal nu opleve et tydeligt “X”: Snoren ser ud til at krydse <em>præcis</em> i midten af perlen, mens du ser två snore komme ind mod perlen og to snore fortsætte bagud.</li>
  <li>Hvis du kun ser én snor, eller hvis krydset ligger foran eller bagved perlen, oplever du en undertrykkelse (<em>suppression</em>) eller en konvergensfejl. Det tvinger hjernen til at overlade arbejdet til det ene øje.</li>
</ol>

<hr />

<h2 id="3-hent-træningsark-til-samsyn-pdf">3. Hent træningsark til samsyn (PDF)</h2>

<p>Da ægte samsynstræning kræver et fysisk 3D-rum frem for en flad 2D-skærm, opnås den bedste træningseffekt med papirbaserede øvelser, hvor arkets kant placeres directly mod næsetippen.</p>

<p>Du kan downloade de to klassiske træningsark herunder, printe dem ud og bruge dem derhjemme eller i omklædningsrummet:</p>

<div class="notice--info">

  <h3 id="priktesten-samsyn--konvergens">📄 Priktesten: Samsyn &amp; konvergens</h3>

  <p>Træner øjnenes evne til at fiksere og samle blikket helt ind til næsen (lynlås-effekten).</p>

  <ul>
    <li><strong>Sådan gør du:</strong> Placér papirets kortside direkte mod næsetippen og se ned ad stregen. Fiksér på prikkerne fra den fjerneste til den nærmeste. Sørg for, at linjerne krydser præcis i den prik, du kigger på.</li>
    <li><strong><a href="/assets/pdf/trainyoureyes-priktest.pdf" class="btn btn--primary">Download Priktesten (PDF)</a></strong></li>
  </ul>
</div>

<p><a href="/assets/pdf/trainyoureyes-priktest.pdf"><img src="/assets/images/tye/trainyoureyes-priktest.png" alt="" /></a></p>

<div class="notice--info">

  <h3 id="bold-i-ml-3d-visuel-udholdenhed">📄 Bold i mål: 3D visuel udholdenhed</h3>

  <p>Træner øjnenes udholdenhedsreserver og binokulære samsyn ved hjælp af 3D-fiksering.</p>

  <ul>
    <li><strong>Sådan gør du:</strong> Hold arket foran dig, og gør dig let skeløjet, indtil de to yderbilleder flettes sammen til et tredje billede i midten. Målet er at holde fokus, så bolden placerer sig direkte inde i målet.</li>
    <li><strong><a href="/assets/pdf/trainyoureyes-maal.pdf" class="btn btn--primary">Download Bold i Mål (PDF)</a></strong></li>
  </ul>
</div>

<p><a href="/assets/pdf/trainyoureyes-maal.pdf"><img src="/assets/images/tye/trainyoureyes-maal.png" alt="" /></a></p>

<hr />

<h2 id="retningslinjer-for-samsynstræning">Retningslinjer for samsynstræning</h2>

<ul>
  <li><strong>Korte intervaller:</strong> Samsynstræning belaster centralnervesystemet markant. Kør højst 2–3 minutter ad gangen.</li>
  <li><strong>Pause ved træthed:</strong> Oplever du dobbeltsyn eller øjenirritation, skal du blinke et par gange eller holde en pause. Det er et tegn på, at øjenmusklerne arbejder til deres grænse.</li>
  <li><strong>Kombiner med bevægelse:</strong> Når du mestrer øvelserne stående, kan du udfordre samsynet ved at lave dem, mens du går på en linje, holder balancen på ét ben eller står på et vippebræt.</li>
</ul>

<hr />

<h2 id="ofte-stillede-spørgsmål-om-samsyn">Ofte stillede spørgsmål om samsyn</h2>

<details class="faq">
<summary><h3>Hvad er samsyn (binokulært syn)?</h3></summary>
<p>Samsyn er hjernens og øjenmusklernes evne til at sammensmelte de to individuelle billeder fra venstre og højre øje til ét tre-dimensionelt (3D) billede med præcis dybdefornemmelse.</p>

</details>

<details class="faq">
<summary><h3>Hvad er undertrykkelse (suppression) i synstræning?</h3></summary>
<p>Hvis det ene øje er svagere, eller øjenmusklerne ikke fikserer præcist på samme punkt, kan hjernen vælge at ‘slukke’ for signalet fra det ene øje for at undgå dobbeltsyn. Dette kaldes suppression og ødelægger dybdesynet.</p>

</details>

<details class="faq">
<summary><h3>Hvordan opdager jeg, om mit samsyn er utrænet?</h3></summary>
<p>Tegn på svagt samsyn i sport er problemer med afstandsbedømmelse (fx ofte at gribe ved siden af en bold), fejltimede taklinger samt træthed eller hovedpine ved intenst visuelt fokus.</p>

</details>

<script type="application/ld+json">
    {
        "@context":"https://schema.org",
        "@type":"FAQPage",
        "mainEntity":
            [{"@type":"Question","name":"Hvad er samsyn (binokulært syn)?","acceptedAnswer":{"@type":"Answer","text":"Samsyn er hjernens og øjenmusklernes evne til at sammensmelte de to individuelle billeder fra venstre og højre øje til ét tre-dimensionelt (3D) billede med præcis dybdefornemmelse.\n"}},{"@type":"Question","name":"Hvad er undertrykkelse (suppression) i synstræning?","acceptedAnswer":{"@type":"Answer","text":"Hvis det ene øje er svagere, eller øjenmusklerne ikke fikserer præcist på samme punkt, kan hjernen vælge at ‘slukke’ for signalet fra det ene øje for at undgå dobbeltsyn. Dette kaldes suppression og ødelægger dybdesynet.\n"}},{"@type":"Question","name":"Hvordan opdager jeg, om mit samsyn er utrænet?","acceptedAnswer":{"@type":"Answer","text":"Tegn på svagt samsyn i sport er problemer med afstandsbedømmelse (fx ofte at gribe ved siden af en bold), fejltimede taklinger samt træthed eller hovedpine ved intenst visuelt fokus.\n"}}]
    }
</script>

<hr />

<details class="references">
  <summary><h2 id="references">Referencer</h2></summary>

  <ul>
    <li><strong>Scheiman, M., &amp; Wick, B. (2014).</strong> <em>Clinical Management of Binocular Vision: Heterophoric, Accommodative, and Eye Movement Disorders.</em> Lippincott Williams &amp; Wilkins.</li>
    <li><strong>Erickson, G. B. (2007).</strong> <em>Sports Vision: Vision Care for the Enhancement of Sports Performance.</em> Butterworth-Heinemann.</li>
    <li><strong>Rawstron, J. A., Burley, C. D., &amp; Elder, M. J. (2005).</strong> <em>A systematic review of the applicability and efficacy of eye exercises.</em> Journal of Pediatric Ophthalmology &amp; Strabismus, 42(2), 82-88.</li>
  </ul>

</details>]]></content><author><name>Lars Olesen</name></author><category term="Træning" /><category term="Sportsvision" /><category term="synstræning" /><category term="reaktionstid" /><category term="sportsvision" /><summary type="html"><![CDATA[Lær at træne dit samsyn, din akkommodation og dit dybdesyn. Se hvordan du bruger Pencil Push-ups, den klassiske Brock String og henter vores træningsark.]]></summary></entry><entry><title type="html">Smooth Pursuit og visuel tracking: Følg bolden skarpt i luften</title><link href="https://www.motionsplan.dk/smooth-pursuit-synstraening/" rel="alternate" type="text/html" title="Smooth Pursuit og visuel tracking: Følg bolden skarpt i luften" /><published>2026-09-01T00:00:00+00:00</published><updated>2026-09-01T00:00:00+00:00</updated><id>https://www.motionsplan.dk/smooth-pursuit</id><content type="html" xml:base="https://www.motionsplan.dk/smooth-pursuit-synstraening/"><![CDATA[<p>Mens <strong><a href="/sakkader-synstraening/">sakkader</a></strong> lader dig hoppe hurtigt fra punkt til punkt, er <strong>smooth pursuit</strong> (glidende forfølgelse) øjets evne til at “låse” sig fast på et objekt i bevægelse og følge det blødt og præcist tværs over synsfeltet.</p>

<p>Hver gang en tennisbold kommer flyvende over nettet, eller en modspiller tager et træk med bolden på banen, er det dine <em>smooth pursuit</em>-bevægelser, der sørger for, at objektet står skarpt på din nethinde (<em>fovea</em>).</p>

<p>I denne guide ser vi på fysiologien bag <strong>visuel tracking</strong> — og giver dig et interaktivt værktøj til at træne dine øjenmuskler direkte på skærmen.</p>

<h2 id="hvorfor-hakker-synet-under-hurtige-bevægelser">Hvorfor “hakker” synet under hurtige bevægelser?</h2>

<p>Når et objekt bevæger sig, skal øjenmusklerne (de ekstraokulære muskler) modtage en kontinuerlig, finjusteret strøm af nervesignaler fra lillehjernen (<em>cerebellum</em>) og hjernebarken.</p>

<p>Hvis dette system er utrænet eller træt, kan øjnene ikke holde trit med objektet. Hjernen kompenserer ved at lave små, uvilkårlige mikro-sakkader. Hver gang det sker, sløres dit syn i et splitsekund. Resultatet er, at du overvurderer eller undervurderer boldens fart og placering i rummet.</p>

<p>Gennem målrettet træning af dine <em>smooth pursuit</em>-bevægelser opnår du:</p>

<ol>
  <li><strong>Skarpt syn på bevægelige objekter:</strong> Du kan aflæse boldens skru og bane meget tidligere.</li>
  <li><strong>Bedre timing og præcision:</strong> Din hjerne får konstant, opdateret visuel feedback til at time dit slag, greb eller takling.</li>
  <li><strong>Stærkere øjen-hjerne koordination:</strong> Du reducerer den visuelle træthed sidst i kampe.</li>
</ol>

<h2 id="marsden-ball-den-klassiske-analoge-metode">Marsden Ball: Den klassiske analoge metode</h2>

<p>Inden for <strong>Sports Vision</strong> bruges ofte en øvelse med en <em>Marsden Ball</em>.</p>

<p>En Marsden Ball er en lille bold med bogstaver eller tallinjer trykt på, som hænger i en snor fra loftet. Træneren sætter bolden i svingninger eller cirkelbevægelser, og atleten skal lade blikket glide med bolden uden at bevæge hovedet, mens bogstaverne læses højt.</p>

<p>Formålet er at isolere øjets sporingsevne og eliminere tendensen til at dreje nakken.</p>

<hr />

<h2 id="widget">Træn din visuelle tracking og smooth pursuit</h2>

<p>Brug værktøjet herunder til at træne dit glidende syn.</p>

<p><strong>Sådan gør du:</strong></p>
<ol>
  <li>Placér dig ca. 40–50 cm fra skærmen i øjenhøjde.</li>
  <li><strong>HOLD HOVEDET HELT STILLE:</strong> Nakken må ikke dreje. KUN øjnene må bevæge sig.</li>
  <li>Vælg et bevægelsesmønster og et tempo.</li>
  <li>Tryk <strong>“Start Tracking”</strong> og hold dit blik naglet fast på midten af den lysende cirkel.</li>
  <li>Sørg for at bevægelsen føles helt blød og glidende for øjnene — hvis synet begynder at “chokke” eller hoppe, skal du sænke tempoet.</li>
</ol>

<!-- Digital Smooth Pursuit Tracker Widget -->
<div class="pursuit-widget-container" id="pursuit-container">
  <!-- Fullscreen Top-Højre Ikon -->
  <button id="btn-pursuit-fullscreen" class="pursuit-icon-btn" type="button" title="Fuld skærm" aria-label="Fuld skærm">
    <i class="fas fa-expand"></i>
  </button>

  <div class="pursuit-header">
    <h3>Digital Smooth Pursuit Tracker <i class="fas fa-bullseye" style="margin-left:8px; color:#4fd1c5;"></i></h3>
    <p>Træn din evne til at følge objekter i bevægelse. <strong>Regel nr. 1: Hold hovedet helt stille!</strong></p>
  </div>

  <div class="pursuit-controls">
    <div class="control-group">
      <label for="pursuit-speed">Hastighed:</label>
      <select id="pursuit-speed" class="pursuit-select">
        <option value="1">Langsom (Kontrol)</option>
        <option value="2" selected="">Mellem (Opvarmning)</option>
        <option value="3">Hurtig (Kampklar)</option>
        <option value="4">Ekstrem (Elite)</option>
      </select>
    </div>
    
    <div class="control-group">
      <label for="pursuit-pattern">Mønster:</label>
      <select id="pursuit-pattern" class="pursuit-select">
        <option value="random" selected="">Kaotisk / Uforudsigelig (Sport)</option>
        <option value="infinity">Uendelighed (∞)</option>
        <option value="diagonal">Diagonalt (X-mønster)</option>
        <option value="box">Firkant &amp; Kryds</option>
        <option value="circle">Cirkel</option>
        <option value="pendulum">Vandret Pendul</option>
        <option value="vertical">Lodret Pendul</option>
      </select>
    </div>

    <div class="control-group">
      <label for="pursuit-duration">Tid (Sæt):</label>
      <select id="pursuit-duration" class="pursuit-select">
        <option value="30">30 sekunder</option>
        <option value="60" selected="">60 sek. (Anbefalet)</option>
        <option value="90">90 sekunder</option>
        <option value="0">Uden tidsgrænse</option>
      </select>
    </div>

    <div class="control-group btn-group">
      <button id="btn-pursuit-toggle" class="btn-pursuit-start" type="button">Start Tracking</button>
    </div>
  </div>

  <div class="pursuit-arena" id="pursuit-arena">
    <!-- Live Timer Badge -->
    <div class="pursuit-timer-badge" id="pursuit-timer-badge">60s</div>

    <!-- Canvas -->
    <canvas id="pursuit-canvas"></canvas>
  </div>
</div>

<style>
.pursuit-widget-container {
  position: relative;
  background: #ffffff;
  border: 1px solid #e2e8f0;
  border-radius: 12px;
  padding: 1.5rem;
  max-width: 640px;
  margin: 2rem auto;
  font-family: system-ui, -apple-system, sans-serif;
  box-shadow: 0 10px 25px rgba(0,0,0,0.05);
  box-sizing: border-box;
}

/* Fullscreen Top-Højre Ikon */
.pursuit-icon-btn {
  position: absolute;
  top: 1.25rem;
  right: 1.25rem;
  background: transparent;
  border: 1px solid #e2e8f0;
  color: #718096;
  width: 36px;
  height: 36px;
  border-radius: 8px;
  display: flex;
  align-items: center;
  justify-content: center;
  cursor: pointer;
  font-size: 1rem;
  transition: all 0.2s ease;
  z-index: 10;
}

.pursuit-icon-btn:hover {
  background: #edf2f7;
  color: #2d3748;
  border-color: #cbd5e0;
}

.pursuit-header {
  padding-right: 2.5rem;
}

.pursuit-header h3 {
  margin: 0 0 0.4rem 0 !important;
  color: #1a202c;
  font-size: 1.3rem;
  display: flex;
  align-items: center;
}

.pursuit-header p {
  font-size: 0.9rem;
  color: #4a5568;
  margin: 0 0 1.2rem 0 !important;
}

/* Grid Alignment */
.pursuit-controls {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(130px, 1fr));
  gap: 0.85rem;
  align-items: end;
  margin-bottom: 1.2rem;
  background: #f7fafc;
  padding: 1rem;
  border-radius: 8px;
  border: 1px solid #edf2f7;
}

.control-group {
  display: flex;
  flex-direction: column;
  gap: 4px;
}

.control-group.btn-group {
  grid-column: span 1;
}

.control-group label {
  font-size: 0.75rem;
  font-weight: 700;
  color: #718096;
  text-transform: uppercase;
  letter-spacing: 0.05em;
}

.pursuit-select {
  height: 40px;
  padding: 0 10px;
  border: 1px solid #cbd5e0;
  border-radius: 6px;
  background: #fff;
  font-size: 0.85rem;
  color: #2d3748;
  cursor: pointer;
  box-sizing: border-box;
  width: 100%;
}

.pursuit-select:focus {
  outline: none;
  border-color: #3182ce;
  box-shadow: 0 0 0 2px rgba(49, 130, 206, 0.2);
}

.btn-pursuit-start {
  height: 40px;
  width: 100%;
  background: #3182ce;
  color: white;
  border: none;
  border-radius: 6px;
  font-weight: 700;
  font-size: 0.9rem;
  cursor: pointer;
  transition: all 0.2s ease;
  box-sizing: border-box;
  display: flex;
  align-items: center;
  justify-content: center;
}

.btn-pursuit-start:hover {
  background: #2b6cb0;
}

.btn-pursuit-start.is-running {
  background: #e53e3e;
}
.btn-pursuit-start.is-running:hover {
  background: #c53030;
}

/* Arena & Canvas */
.pursuit-arena {
  position: relative;
  width: 100%;
  height: 300px;
  background: #1a202c;
  border-radius: 8px;
  overflow: hidden;
  box-shadow: inset 0 4px 12px rgba(0,0,0,0.5);
  display: flex;
  align-items: center;
  justify-content: center;
}

#pursuit-canvas {
  display: block;
  width: 100%;
  height: 100%;
}

.pursuit-timer-badge {
  position: absolute;
  top: 12px;
  right: 12px;
  background: rgba(255, 255, 255, 0.1);
  color: rgba(255, 255, 255, 0.7);
  padding: 4px 10px;
  border-radius: 20px;
  font-size: 0.8rem;
  font-weight: 700;
  font-mono: monospace;
  letter-spacing: 0.05em;
  pointer-events: none;
  z-index: 5;
}

.pursuit-widget-container:fullscreen {
  background: #0f172a;
  max-width: 100vw;
  width: 100vw;
  height: 100vh;
  padding: 2rem;
  display: flex;
  flex-direction: column;
  justify-content: center;
  border-radius: 0;
  border: none;
}

.pursuit-widget-container:fullscreen .pursuit-header h3 { color: #f7fafc; }
.pursuit-widget-container:fullscreen .pursuit-header p { color: #a0aec0; }
.pursuit-widget-container:fullscreen .pursuit-controls { background: #1e293b; border-color: #334155; }
.pursuit-widget-container:fullscreen .control-group label { color: #94a3b8; }
.pursuit-widget-container:fullscreen .pursuit-select { background: #0f172a; color: #f1f5f9; border-color: #475569; }
.pursuit-widget-container:fullscreen .pursuit-icon-btn { background: #1e293b; border-color: #475569; color: #cbd5e1; }
.pursuit-widget-container:fullscreen .pursuit-arena { flex: 1; height: auto; min-height: 300px; }
</style>

<script>
document.addEventListener('DOMContentLoaded', function() {
  const container = document.getElementById('pursuit-container');
  const btnToggle = document.getElementById('btn-pursuit-toggle');
  const btnFullscreen = document.getElementById('btn-pursuit-fullscreen');
  const speedSelect = document.getElementById('pursuit-speed');
  const patternSelect = document.getElementById('pursuit-pattern');
  const durationSelect = document.getElementById('pursuit-duration');
  const timerBadge = document.getElementById('pursuit-timer-badge');
  const canvas = document.getElementById('pursuit-canvas');
  const ctx = canvas.getContext('2d');

  let isRunning = false;
  let animFrameId = null;
  let countdownId = null;
  let time = 0;
  let secondsRemaining = 60;

  function resizeCanvas() {
    const rect = canvas.getBoundingClientRect();
    canvas.width = rect.width;
    canvas.height = rect.height;
  }
  
  window.addEventListener('resize', resizeCanvas);
  resizeCanvas();

  function drawStaticCenter() {
    resizeCanvas();
    ctx.clearRect(0, 0, canvas.width, canvas.height);
    
    ctx.beginPath();
    ctx.arc(canvas.width / 2, canvas.height / 2, 12, 0, Math.PI * 2);
    ctx.fillStyle = 'rgba(79, 209, 197, 0.3)';
    ctx.fill();
  }

  function getPosition(t, pattern, w, h) {
    const cx = w / 2;
    const cy = h / 2;
    const rx = w * 0.42;
    const ry = h * 0.38;

    let x = cx;
    let y = cy;

    if (pattern === 'pendulum') {
      x = cx + rx * Math.sin(t);
      y = cy;
    } else if (pattern === 'vertical') {
      x = cx;
      y = cy + ry * Math.sin(t);
    } else if (pattern === 'diagonal') {
      x = cx + rx * Math.sin(t);
      y = cy + ry * Math.sin(t);
    } else if (pattern === 'circle') {
      x = cx + ry * Math.cos(t);
      y = cy + ry * Math.sin(t);
    } else if (pattern === 'infinity') {
      const scale = rx;
      x = cx + (scale * Math.cos(t)) / (1 + Math.sin(t) * Math.sin(t));
      y = cy + (scale * Math.sin(t) * Math.cos(t)) / (1 + Math.sin(t) * Math.sin(t));
    } else if (pattern === 'random') {
      // Uforudsigelig Lissajous-kurve kombineret med komplekse harmoniske frekvenser
      x = cx + rx * (0.6 * Math.sin(t * 0.9) + 0.4 * Math.cos(t * 1.7));
      y = cy + ry * (0.6 * Math.cos(t * 1.1) + 0.4 * Math.sin(t * 2.3));
    } else if (pattern === 'box') {
      // Firkantet bane med kryds over midten
      const cycle = (t % (Math.PI * 2)) / (Math.PI * 2);
      if (cycle < 0.25) {
        let p = cycle / 0.25;
        x = cx - rx + (2 * rx * p);
        y = cy - ry;
      } else if (cycle < 0.50) {
        let p = (cycle - 0.25) / 0.25;
        x = cx + rx - (2 * rx * p);
        y = cy - ry + (2 * ry * p);
      } else if (cycle < 0.75) {
        let p = (cycle - 0.50) / 0.25;
        x = cx - rx + (2 * rx * p);
        y = cy + ry;
      } else {
        let p = (cycle - 0.75) / 0.25;
        x = cx + rx - (2 * rx * p);
        y = cy + ry - (2 * ry * p);
      }
    }

    return { x, y };
  }

  function loop() {
    if (!isRunning) return;

    const speedMultiplier = parseFloat(speedSelect.value) * 0.015;
    time += speedMultiplier;

    const pattern = patternSelect.value;
    const w = canvas.width;
    const h = canvas.height;

    ctx.clearRect(0, 0, w, h);

    const pos = getPosition(time, pattern, w, h);

    // Ydre glød
    ctx.beginPath();
    ctx.arc(pos.x, pos.y, 18, 0, Math.PI * 2);
    ctx.fillStyle = 'rgba(79, 209, 197, 0.25)';
    ctx.fill();

    // Hovedbold
    ctx.beginPath();
    ctx.arc(pos.x, pos.y, 10, 0, Math.PI * 2);
    ctx.fillStyle = '#4fd1c5';
    ctx.fill();

    // Indre sigtepunkt
    ctx.beginPath();
    ctx.arc(pos.x, pos.y, 3, 0, Math.PI * 2);
    ctx.fillStyle = '#ffffff';
    ctx.fill();

    animFrameId = requestAnimationFrame(loop);
  }

  function updateTimerDisplay() {
    const duration = parseInt(durationSelect.value, 10);
    if (duration === 0) {
      timerBadge.textContent = '∞';
    } else {
      timerBadge.textContent = secondsRemaining + 's';
    }
  }

  function start() {
    const duration = parseInt(durationSelect.value, 10);

    isRunning = true;
    btnToggle.textContent = 'Stop';
    btnToggle.classList.add('is-running');
    
    speedSelect.disabled = true;
    patternSelect.disabled = true;
    durationSelect.disabled = true;

    secondsRemaining = duration;
    updateTimerDisplay();

    time = 0;
    resizeCanvas();
    animFrameId = requestAnimationFrame(loop);

    if (duration > 0) {
      countdownId = setInterval(function() {
        secondsRemaining--;
        updateTimerDisplay();

        if (secondsRemaining <= 0) {
          stop();
          timerBadge.textContent = 'Færdig! 👏';
        }
      }, 1000);
    }
  }

  function stop() {
    isRunning = false;
    btnToggle.textContent = 'Start Tracking';
    btnToggle.classList.remove('is-running');
    
    speedSelect.disabled = false;
    patternSelect.disabled = false;
    durationSelect.disabled = false;

    if (animFrameId) cancelAnimationFrame(animFrameId);
    if (countdownId) clearInterval(countdownId);

    drawStaticCenter();

    const duration = parseInt(durationSelect.value, 10);
    secondsRemaining = duration;
    updateTimerDisplay();
  }

  btnToggle.addEventListener('click', function() {
    if (isRunning) stop();
    else start();
  });

  durationSelect.addEventListener('change', function() {
    secondsRemaining = parseInt(this.value, 10);
    updateTimerDisplay();
  });

  btnFullscreen.addEventListener('click', function() {
    if (!document.fullscreenElement) {
      if (container.requestFullscreen) container.requestFullscreen();
      else if (container.webkitRequestFullscreen) container.webkitRequestFullscreen();
    } else {
      if (document.exitFullscreen) document.exitFullscreen();
    }
  });

  document.addEventListener('fullscreenchange', function() {
    const icon = btnFullscreen.querySelector('i');
    setTimeout(resizeCanvas, 100);

    if (document.fullscreenElement) {
      icon.className = 'fas fa-compress';
      btnFullscreen.title = 'Luk fuld skærm';
    } else {
      icon.className = 'fas fa-expand';
      btnFullscreen.title = 'Fuld skærm';
    }
  });

  drawStaticCenter();
  updateTimerDisplay();
});
</script>

<div class="notice--warning">
  <p><strong>💡 Sådan får du det bedste udbytte af synstestene:</strong></p>

  <ul>
    <li><strong>Brug computer/laptop (Anbefalet):</strong> En stor skærm giver den nødvendige synsvinkel (grader i synsfeltet), så dine øjne reelt tvinges til store fokusskift og bred perifer opmærksomhed.</li>
    <li><strong>Kør i Fullscreen:</strong> Klik på <strong>“Fuld skærm”</strong> på værktøjet for at fjerne visuel støj fra browseren.</li>
    <li><strong>Hvis du bruger smartphone:</strong>
      <ol>
        <li><strong>Vend telefonen vandret (Landscape):</strong> Det giver maksimal bredde til synsfeltet.</li>
        <li><strong>Stil telefonen fast:</strong> Stil den op ad en kop eller en bog på bordet — hvis du holder den i hånden, bevæger du ubevidst skærmen.</li>
        <li><strong>Hold armslængdes afstand (40–50 cm):</strong> Sidder telefonen for tæt på ansigtet, overbelaster du øjets indaddrejning.</li>
      </ol>
    </li>
  </ul>
</div>

<h3 id="træningsråd-og-progression">Træningsråd og progression</h3>
<ul>
  <li><strong>Start med pendul (Vandret):</strong> Dette er den nemmeste øvelse for de fleste, da de horisontale øjenmuskler ofte er stærkest.</li>
  <li><strong>Avancer til uendelighed (∞):</strong> Mønstre med diagonal- og kurvebevægelser tvinger alle seks øjenmuskler til at samarbejde i komplekse mønstre.</li>
  <li><strong>Varighed:</strong> Kør 2–3 sæt af 45–60 sekunders varighed før træning eller som del af din kognitive opvarmning.</li>
</ul>

<hr />

<h2 id="ofte-stillede-spørgsmål-om-visuel-tracking">Ofte stillede spørgsmål om visuel tracking</h2>

<details class="faq">
<summary><h3>Hvad er forskellen på Smooth Pursuit og Sakkader?</h3></summary>
<p>Sakkader er lynhurtige, springende hop mellem fikseringspunkter. Smooth Pursuit (glidende forfølgelse) er en kontinuerlig, blød øjenbevægelse, der lader dig låse blikket fast på et objekt i bevægelse uden at hoppe.</p>

</details>

<details class="faq">
<summary><h3>Hvorfor 'hakker' mit syn, når jeg prøver at følge et objekt?</h3></summary>
<p>Hvis øjets muskler eller de motoriske baner i hjernen er utrænede eller udtrættede, kan øjet ikke holde en glidende bevægelse. Det tvinges i stedet til at lave små mikro-sakkader (saccadic intrusions), hvilket slører billedet og forringer din afstandsbedømmelse.</p>

</details>

<details class="faq">
<summary><h3>Hvilke sportsgrene drager mest nytte af Smooth Pursuit træning?</h3></summary>
<p>Ketsjersport (tennis, badminton, bordtennis), boldsport (fodbold, håndbold, basketball) samt kampsport og motorsport, hvor du konstant skal spore objekter eller modstandere i kontinuerlig bevægelse.</p>

</details>

<script type="application/ld+json">
    {
        "@context":"https://schema.org",
        "@type":"FAQPage",
        "mainEntity":
            [{"@type":"Question","name":"Hvad er forskellen på Smooth Pursuit og Sakkader?","acceptedAnswer":{"@type":"Answer","text":"Sakkader er lynhurtige, springende hop mellem fikseringspunkter. Smooth Pursuit (glidende forfølgelse) er en kontinuerlig, blød øjenbevægelse, der lader dig låse blikket fast på et objekt i bevægelse uden at hoppe.\n"}},{"@type":"Question","name":"Hvorfor 'hakker' mit syn, når jeg prøver at følge et objekt?","acceptedAnswer":{"@type":"Answer","text":"Hvis øjets muskler eller de motoriske baner i hjernen er utrænede eller udtrættede, kan øjet ikke holde en glidende bevægelse. Det tvinges i stedet til at lave små mikro-sakkader (saccadic intrusions), hvilket slører billedet og forringer din afstandsbedømmelse.\n"}},{"@type":"Question","name":"Hvilke sportsgrene drager mest nytte af Smooth Pursuit træning?","acceptedAnswer":{"@type":"Answer","text":"Ketsjersport (tennis, badminton, bordtennis), boldsport (fodbold, håndbold, basketball) samt kampsport og motorsport, hvor du konstant skal spore objekter eller modstandere i kontinuerlig bevægelse.\n"}}]
    }
</script>

<hr />

<details class="references">
  <summary><h2 id="references">Referencer</h2></summary>

  <ul>
    <li><strong>Krauzlis, R. J. (2004).</strong> <em>The control of voluntary eye movements: new perspectives on pursuit and saccades.</em> Current Opinion in Neurobiology, 14(6), 685-691.</li>
    <li><strong>Erickson, G. B. (2007).</strong> <em>Sports Vision: Vision Care for the Enhancement of Sports Performance.</em> Butterworth-Heinemann.</li>
    <li><strong>Lisberger, S. G. (2010).</strong> <em>Visual guidance of smooth pursuit eye movements.</em> Journal of Neurophysiology, 103(3), 1173-1191.</li>
  </ul>

</details>]]></content><author><name>Lars Olesen</name></author><category term="Træning" /><category term="Sportsvision" /><category term="synstræning" /><category term="reaktionstid" /><category term="sportsvision" /><summary type="html"><![CDATA[Lær at træne Smooth Pursuit (glidende forfølgelse) til sport. Se hvordan du sporer bolde og modstandere i bevægelse med vores digitale tracker.]]></summary></entry><entry><title type="html">Sports Vision: Træn dine øjne og reager hurtigere i sport</title><link href="https://www.motionsplan.dk/sportsvision/" rel="alternate" type="text/html" title="Sports Vision: Træn dine øjne og reager hurtigere i sport" /><published>2026-09-01T00:00:00+00:00</published><updated>2026-09-01T00:00:00+00:00</updated><id>https://www.motionsplan.dk/sportsvision</id><content type="html" xml:base="https://www.motionsplan.dk/sportsvision/"><![CDATA[<p>I næsten al sport leverer synet over <strong>80% af alle sanseindtryk</strong> til hjernen. Uanset om du skal ramme en tennisbold, læse et forsvar i håndbold eller time en takling i fodbold, er det dit syn, der tænder for den motoriske handling.</p>

<p><strong>Sports Vision</strong> drejer sig ikke om at smide brillerne, men om at optræne øjnenes seks små styremuskler og hjernens visuelle centrer, så du kan opfange informationer hurtigere og træffe bedre beslutninger på banen.</p>

<hr />

<h2 id="de-4-visuelle-grundpiller-i-sport">De 4 visuelle grundpiller i sport</h2>

<p>For at præstere optimalt skal dit visuelle system beherske fire helt konkrete færdigheder. Hver færdighed har sin egen fysiologiske funktion og sin egen træningsmetode:</p>

<h3 id="1-sakkader-hurtige-fokusskift">1. Sakkader (Hurtige fokusskift)</h3>
<p>Sakkader er de lynhurtige hop, dine øjne foretager, når du flytter blikket fra ét punkt til et andet. Hvis øjenmusklerne tøver eller overskyder målet, mister du dyre millisekunder, hvor synet reelt er “slukket” under bevægelsen.</p>

<p><strong>Typisk problem på banen:</strong> Du er langsom til at skifte blikket fra bolden på fødderne op til en fri medspiller.</p>

<p><strong>Træn det her:</strong> <a href="/sakkader-synstraening/#widget">Træn sakkade &amp; Læs om Hart Charts</a></p>

<h3 id="2-smooth-pursuit-visuel-sporing">2. Smooth Pursuit (Visuel sporing)</h3>
<p>Smooth pursuit er øjets evne til at fange et objekt i bevægelse og følge det i en helt glidende, uafbrudt bevægelse. Hvis systemet er utrænet, vil øjnene “chokke” og hoppe undervejs, hvilket slører billedet af bolden.</p>

<p><strong>Typisk problem på banen:</strong> Du mister boldens præcise skru og bane af syne, når den flyver gennem luften.</p>

<p><strong>Træn det her:</strong> <a href="/smooth-pursuit-synstraening/#widget">Åbn Smooth Pursuit Tracker &amp; Læs om Marsden Ball</a></p>

<h3 id="3-samsyn--dybdesyn-binokulær-kontrol">3. Samsyn &amp; Dybdesyn (Binokulær kontrol)</h3>
<p>Samsyn handler om, at begge øjne fikserer på <em>nøjagtig</em> det samme punkt samtidig. Det er dette samarbejde, der skaber hjernens 3D-dybdesyn og gør dig i stand til at bedømme afstande og fart.</p>

<p><strong>Typisk problem på banen:</strong> Du afleverer konsekvent for blødt eller hårdt, skyder ved siden af målet eller lukker øjnene ved hovedstød.</p>

<p><strong>Træn det her:</strong> <a href="/samsyn-dybdesyn-synstraening/">Hent træningsark til samsyn &amp; læs om Brock String</a></p>

<h3 id="4-perifert-syn-det-vide-overblik">4. Perifert syn (Det vide overblik)</h3>
<p>Det perifere syn reagerer lynhurtigt på bevægelse i udkanten af dit synsfelt. Det giver dig det klassiske “split vision”, hvor du kan fastholde blikket fremad, mens du registrerer alt, der sker til siderne.</p>

<p><strong>Typisk problem på banen:</strong> Du får “tunnelsyn”, når du bliver træt, og bliver overrumplet af modstandere fra siden.</p>

<p><strong>Træn det her:</strong> <a href="/perifert-syn-synstraening/#widget">Træn dit periferisyn</a></p>

<hr />

<h2 id="sammenligning-almindeligt-syn-vs-sportsvision">Sammenligning: Almindeligt syn vs. Sportsvision</h2>

<table>
  <thead>
    <tr>
      <th>Færdighed</th>
      <th>Tradionelt synstjek</th>
      <th>Sportsvision</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><strong>Formål</strong></td>
      <td>Måler statisk skarphed på afstand.</td>
      <td>Måler dynamisk præstation i bevægelse.</td>
    </tr>
    <tr>
      <td><strong>Fokus</strong></td>
      <td>Kan du læse bogstaverne på væggen?</td>
      <td>Hvor hurtigt fikserer dine øjne på en bold i fart?</td>
    </tr>
    <tr>
      <td><strong>Arbejdsrum</strong></td>
      <td>Én øjenstilling i ro.</td>
      <td>Skiftende vinkler, høje pulszoner og fysisk pres.</td>
    </tr>
    <tr>
      <td><strong>Resultat</strong></td>
      <td>Briller eller kontaktlinser.</td>
      <td>Hurtigere reaktionstid og bedre rumlig orientering.</td>
    </tr>
  </tbody>
</table>

<hr />

<h2 id="retningslinjer-for-din-synstræning">Retningslinjer for din synstræning</h2>

<ol>
  <li><strong>Gør det til opvarmning:</strong> 3–5 minutters synstræning før holdtræning eller styrketræning vækker nervesystemet og tænder dit visuelle fokus.</li>
  <li><strong>Hold hovedet helt stille:</strong> Den mest almindelige fejl er at dreje nakken. For at isolere øjets muskler skal hovedet være helt fikseret.</li>
  <li><strong>Korte intervaller:</strong> Øjenmusklerne er små og udtrættes hurtigt. Stop med det samme, hvis du mærker irritation, dobbeltsyn eller let hovedpine.</li>
</ol>

<hr />

<h2 id="test-din-fremgang-med-vores-kognitive-værktøjer">Test din fremgang med vores kognitive værktøjer</h2>

<p>Synstræning hænger tæt sammen med din generelle kognitive reaktionsevne. Suppler din synstræning med vores øvrige måleredskaber:</p>

<ul>
  <li><strong><a href="/reaktionstid-test/">Reaktionstid Test</a>:</strong> Mål din reaktionshastighed på skærmen i millisekunder.</li>
  <li><strong><a href="/visuel-forudsigelse/">Time Wall Test</a>:</strong> Test din evne til at forudsige objekters bevægelse og timing.</li>
  <li><strong><a href="/fokus-test/">Flanker Fokus Test</a>:</strong> Test hvor godt du sorterer udefrakommende visuel støj fra.</li>
</ul>

<hr />

<h2 id="ofte-stillede-spørgsmål-om-synstræning">Ofte stillede spørgsmål om synstræning</h2>

<details class="faq">
<summary><h3>Hvad er Sports Vision?</h3></summary>
<p>Sports Vision handler om at træne det visuelle system — altså øjenmusklerne og hjernens evne til lynhurtigt at bearbejde og reagere på de visuelle inputs du får under træning.</p>

</details>

<details class="faq">
<summary><h3>Hvorfor hjælper det ikke blot at have et godt 20/20-syn?</h3></summary>
<p>Et almindeligt synstjek hos optikeren måler kun, hvor skarpt du ser på en stående bogstavtavle. I sport skal øjnene fange objekter i høj fart, skifte fokus på millisekunder og bedømme afstande under fysisk pres.</p>

</details>

<details class="faq">
<summary><h3>Hvor ofte bør man træne synet?</h3></summary>
<p>Synstræning belaster hjernen hurtigt. Kør 3–5 minutter 3-4 gange om ugen — gerne som en del af opvarmningen inden din primære træning.</p>

</details>

<script type="application/ld+json">
    {
        "@context":"https://schema.org",
        "@type":"FAQPage",
        "mainEntity":
            [{"@type":"Question","name":"Hvad er Sports Vision?","acceptedAnswer":{"@type":"Answer","text":"Sports Vision handler om at træne det visuelle system — altså øjenmusklerne og hjernens evne til lynhurtigt at bearbejde og reagere på de visuelle inputs du får under træning.\n"}},{"@type":"Question","name":"Hvorfor hjælper det ikke blot at have et godt 20/20-syn?","acceptedAnswer":{"@type":"Answer","text":"Et almindeligt synstjek hos optikeren måler kun, hvor skarpt du ser på en stående bogstavtavle. I sport skal øjnene fange objekter i høj fart, skifte fokus på millisekunder og bedømme afstande under fysisk pres.\n"}},{"@type":"Question","name":"Hvor ofte bør man træne synet?","acceptedAnswer":{"@type":"Answer","text":"Synstræning belaster hjernen hurtigt. Kør 3–5 minutter 3-4 gange om ugen — gerne som en del af opvarmningen inden din primære træning.\n"}}]
    }
</script>

<hr />

<details class="references">
  <summary><h2 id="references">Referencer</h2></summary>

  <ul>
    <li><strong>Appelbaum, L. G., &amp; Erickson, G. (2018).</strong> <em>Sports vision training: A review of state-of-the-art in digital performance enhancement.</em> Neuroscience &amp; Biobehavioral Reviews, 84, 154–171.</li>
    <li><strong>Erickson, G. B. (2007).</strong> <em>Sports Vision: Vision Care for the Enhancement of Sports Performance.</em> Butterworth-Heinemann.</li>
    <li><strong>Vickers, J. N. (2007).</strong> <em>Perception, Cognition, and Decision Training: The Quiet Eye in Action.</em> Human Kinetics.</li>
    <li><strong>Vater, C., Williams, A. M., &amp; Hossner, E. J. (2020).</strong> <em>Assessment of peripheral vision in sport: A systematic review.</em> Sports Medicine, 50(6), 1133–1148.</li>
    <li><strong>Buscemi et al (2024).</strong> <em>Role of Sport Vision in Performance: Systematic Review</em></li>
  </ul>
</details>]]></content><author><name>Lars Olesen</name></author><category term="Træning" /><category term="synstræning" /><category term="reaktionstid" /><category term="sportsvision" /><category term="koordination" /><summary type="html"><![CDATA[Træn dit syn til sport. Lær hvordan du forbedrer din reaktionstid, dit dybdesyn og dit overblik med vores interaktive Sports Vision moduler.]]></summary></entry><entry><title type="html">Visuel Arbejdshukommelse: Corsi Block-Tapping Test</title><link href="https://www.motionsplan.dk/arbejdshukommelse-test/" rel="alternate" type="text/html" title="Visuel Arbejdshukommelse: Corsi Block-Tapping Test" /><published>2026-08-31T00:00:00+00:00</published><updated>2026-08-31T23:30:00+00:00</updated><id>https://www.motionsplan.dk/arbejdshukommelse-test</id><content type="html" xml:base="https://www.motionsplan.dk/arbejdshukommelse-test/"><![CDATA[<p>Hvordan kan en fodboldspiller kigge ned på bolden for at drible, og samtidig lægge en millimeterpræcis aflevering til en medspiller 20 meter væk? Hemmeligheden ligger i det, hjerneforskere kalder <strong>den visuospatiale arbejdshukommelse</strong>.</p>

<p><strong>Corsi Block-Tapping Test</strong> er den internationale psykologiske guldstandard til at måle, hvor stort et “visuelt kort” din hjerne kan fastholde i korttidshukommelsen.</p>

<div class="notice--info">

  <p><strong>Kort fortalt: Arbejdshukommelse i sport</strong></p>

  <ul>
    <li><strong>Hvad måler Corsi-testen?</strong> Testen måler din “Corsi-Span” – altså det maksimale antal positioner i rummet, du kan fastholde i hjernen på én gang.</li>
    <li><strong>Den magiske grænse:</strong> De fleste voksne kan fastholde <strong>5 til 6 elementer</strong> (eller blokke) ad gangen. Bliver det mere komplekst, sletter hjernen de første informationer.</li>
    <li><strong>“Taktisk overblik”:</strong> Playmakere i fodbold, håndbold og basketball scorer ofte usædvanligt højt i disse tests, da deres hjerner er trænet i lynhurtigt at “fotografere” med- og modspilleres placeringer på banen.</li>
  </ul>

</div>

<hr />

<h2 id="widget">Test din taktiske arbejdshukommelse</h2>

<p>Test din hjernes kapacitet her. Værktøjet viser en sekvens af felter, der lyser op. Din opgave er at tappe på felterne i <strong>præcis samme rækkefølge</strong>. Når du svarer rigtigt, bliver næste sekvens én blok længere!</p>

<!-- Corsi Block-Tapping Test Component -->
<div class="corsi-wrapper" id="corsi-container">
  
  <!-- START SKÆRM -->
  <div class="corsi-card" id="corsi-start-screen">
    <div class="corsi-icon-badge"><i class="fas fa-th"></i></div>
    <h3>Corsi-test: Taktisk arbejdshukommelse</h3>
    <p>Test din hjernes evne til at "fotografere" og huske visuelle mønstre i rummet.</p>
    
    <div class="corsi-rule-box">
      <strong>⚠️ Opgaven:</strong> Husk rækkefølgen af de felter, der lyser op. Tap bagefter på felterne i <u>PRÆCIS SAMME</u> rækkefølge. Klarer du det, bliver næste sekvens ét felt længere!
    </div>

    <button class="btn btn--primary btn--large" id="start-corsi-btn">Start hukommelsestest</button>
  </div>

  <!-- SPIL SKÆRM -->
  <div class="corsi-card" id="corsi-game-screen" style="display: none;">
    <div class="corsi-top-bar">
      <span class="corsi-level" id="corsi-level-display">Niveau: 3 felter</span>
      <span class="corsi-status" id="corsi-status-msg">Gør dig klar...</span>
    </div>

    <div class="corsi-grid" id="corsi-grid">
      <div class="corsi-cell" data-index="0"></div>
      <div class="corsi-cell" data-index="1"></div>
      <div class="corsi-cell" data-index="2"></div>
      <div class="corsi-cell" data-index="3"></div>
      <div class="corsi-cell" data-index="4"></div>
      <div class="corsi-cell" data-index="5"></div>
      <div class="corsi-cell" data-index="6"></div>
      <div class="corsi-cell" data-index="7"></div>
      <div class="corsi-cell" data-index="8"></div>
    </div>
  </div>

  <!-- RESULTAT SKÆRM -->
  <div class="corsi-card" id="corsi-result-screen" style="display: none;">
    <div class="corsi-icon-badge" id="corsi-res-icon"><i class="fas fa-memory"></i></div>
    <h3>Din Visuelle Hukommelse</h3>
    
    <div class="corsi-results-grid">
      <div class="corsi-res-box">
        <span class="res-label">Corsi-Score:</span>
        <span class="res-value" id="res-corsi-score">0</span>
      </div>
      <div class="corsi-res-box">
        <span class="res-label">Korrekt taps:</span>
        <span class="res-value" id="res-corsi-total-taps">0</span>
      </div>
    </div>

    <div class="corsi-assessment" id="corsi-assessment">
      <!-- Genereres dynamisk -->
    </div>
<div class="result-actions">
      <button class="btn btn--success" id="retry-corsi-btn">Prøv igen</button>
      <a href="/kognitive-tests/#dashboard" class="btn btn--outline">← Kontrolpanel</a>
    </div>
  </div>

</div>

<style>
.corsi-wrapper {
  margin: 2rem 0;
  user-select: none;
  -webkit-user-select: none;
  font-family: system-ui, -apple-system, sans-serif;
}

.corsi-card {
  background: #ffffff;
  border-radius: 16px;
  border: 1px solid #e2e8f0;
  padding: 1.5rem;
  box-shadow: 0 8px 24px rgba(0,0,0,0.08);
  text-align: center;
}

.corsi-icon-badge {
  width: 56px;
  height: 56px;
  background: #e9d8fd;
  color: #805ad5;
  border-radius: 50%;
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: 1.5rem;
  margin: 0 auto 1rem auto;
}

.corsi-card h3 {
  margin: 0 0 0.5rem 0 !important;
  color: #2d3748;
}

.corsi-rule-box {
  background: #faf5ff;
  border-left: 4px solid #805ad5;
  padding: 0.75rem 1rem;
  border-radius: 8px;
  color: #553c9a;
  font-size: 0.95rem;
  margin: 1rem 0 1.5rem 0;
  text-align: left;
}

.corsi-top-bar {
  display: flex;
  justify-content: space-between;
  align-items: center;
  font-weight: 600;
  margin-bottom: 1.5rem;
}

.corsi-level {
  background: #2b6cb0;
  color: #fff;
  padding: 4px 12px;
  border-radius: 20px;
  font-size: 0.85rem;
}

.corsi-status {
  font-size: 0.95rem;
  color: #4a5568;
}

.corsi-status.active-turn { color: #38a169; font-weight: 700; }
.corsi-status.watch-turn { color: #dd6b20; font-weight: 700; }

.corsi-grid {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 12px;
  max-width: 320px;
  margin: 0 auto;
}

.corsi-cell {
  background: #edf2f7;
  border-radius: 12px;
  aspect-ratio: 1 / 1;
  cursor: pointer;
  box-shadow: 0 4px 6px rgba(0,0,0,0.05);
  transition: background-color 0.1s ease, transform 0.1s ease;
  -webkit-tap-highlight-color: transparent;
}

.corsi-cell.highlight {
  background-color: #ecc94b; /* Gul indikator */
  transform: scale(1.05);
  box-shadow: 0 0 15px rgba(236, 201, 75, 0.6);
}

.corsi-cell.correct {
  background-color: #38a169; /* Grøn success */
}

.corsi-cell.wrong {
  background-color: #e53e3e; /* Rød fejl */
}

/* Deaktiver klik, mens systemet viser sekvensen */
.corsi-grid.locked .corsi-cell {
  cursor: not-allowed;
}

.corsi-results-grid {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: 12px;
  margin: 1.2rem 0;
}

.corsi-res-box {
  background: #f7fafc;
  padding: 1rem;
  border-radius: 10px;
  border: 1px solid #edf2f7;
}

.res-label {
  display: block;
  font-size: 0.85rem;
  color: #718096;
}

.res-value {
  font-weight: 800;
  font-size: 1.8rem;
  color: #2d3748;
}

.corsi-assessment {
  background: #edf2f7;
  padding: 1rem;
  border-radius: 10px;
  font-size: 0.95rem;
  color: #2d3748;
  margin-bottom: 1.5rem;
  text-align: left;
}

</style>

<script>
document.addEventListener('DOMContentLoaded', function() {
  let sequence = [];
  let playerStep = 0;
  let currentLevel = 3; // Starter på 3 brikker
  let isLocked = true;
  let totalCorrectTaps = 0;

  const startScreen = document.getElementById('corsi-start-screen');
  const gameScreen = document.getElementById('corsi-game-screen');
  const resultScreen = document.getElementById('corsi-result-screen');
  const gridContainer = document.getElementById('corsi-grid');
  const cells = document.querySelectorAll('.corsi-cell');
  const levelDisplay = document.getElementById('corsi-level-display');
  const statusMsg = document.getElementById('corsi-status-msg');
  const startBtn = document.getElementById('start-corsi-btn');
  const retryBtn = document.getElementById('retry-corsi-btn');

  function vibrate(ms) {
    if (navigator.vibrate) navigator.vibrate(ms);
  }

  function startGame() {
    currentLevel = 3;
    totalCorrectTaps = 0;
    startScreen.style.display = 'none';
    resultScreen.style.display = 'none';
    gameScreen.style.display = 'block';
    nextLevel();
  }

  function nextLevel() {
    sequence = [];
    playerStep = 0;
    isLocked = true;
    gridContainer.classList.add('locked');
    levelDisplay.textContent = 'Niveau: ' + currentLevel + ' felter';
    statusMsg.textContent = 'KIG GODT EFTER...';
    statusMsg.className = 'corsi-status watch-turn';

    // Generer sekvens
    for (let i = 0; i < currentLevel; i++) {
      let nextIndex = Math.floor(Math.random() * 9);
      // Undgå to ens træk i træk for bedre flow
      if (i > 0 && nextIndex === sequence[i-1]) {
        nextIndex = (nextIndex + 1) % 9;
      }
      sequence.push(nextIndex);
    }

    setTimeout(playSequence, 1000);
  }

  function playSequence() {
    let delay = 0;
    sequence.forEach((cellIndex, i) => {
      setTimeout(() => {
        const cell = cells[cellIndex];
        cell.classList.add('highlight');
        setTimeout(() => {
          cell.classList.remove('highlight');
        }, 400); // Tiden den lyser
      }, delay);
      delay += 700; // Tiden mellem hver brik
    });

    setTimeout(() => {
      isLocked = false;
      gridContainer.classList.remove('locked');
      statusMsg.textContent = 'DIN TUR! TAP FELTERNE';
      statusMsg.className = 'corsi-status active-turn';
    }, delay + 100);
  }

  function handleCellClick(e) {
    if (isLocked) return;
    
    const clickedIndex = parseInt(e.target.getAttribute('data-index'));
    const expectedIndex = sequence[playerStep];

    if (clickedIndex === expectedIndex) {
      // Rigtigt tap
      totalCorrectTaps++;
      e.target.classList.add('correct');
      vibrate(20);
      setTimeout(() => e.target.classList.remove('correct'), 200);
      
      playerStep++;
      if (playerStep === sequence.length) {
        // Niveau gennemført
        isLocked = true;
        statusMsg.textContent = 'FLOT! GØR KLAR TIL NÆSTE...';
        statusMsg.className = 'corsi-status';
        currentLevel++;
        setTimeout(nextLevel, 1500);
      }
    } else {
      // Forkert tap - Game Over
      isLocked = true;
      e.target.classList.add('wrong');
      vibrate([50, 50, 50]);
      statusMsg.textContent = 'FORKERT! TEST AFSLUTTET';
      statusMsg.className = 'corsi-status';
      setTimeout(endGame, 1500);
    }
  }

  function endGame() {
    gameScreen.style.display = 'none';
    resultScreen.style.display = 'block';
    
    // Nulstil forkerte celler
    cells.forEach(c => { c.classList.remove('wrong', 'correct', 'highlight'); });
    
    const finalScore = currentLevel - 1; // Den højeste fuldførte længde
    document.getElementById('res-corsi-score').textContent = finalScore;
    document.getElementById('res-corsi-total-taps').textContent = totalCorrectTaps;

    // Gem resultat i localStorage til dashboardet
    try {
      const store = JSON.parse(localStorage.getItem('mp_neuro_results') || '{}');
      store['corsi'] = {
        value: finalScore,
        display: finalScore + ' brikker',
        date: new Date().toLocaleDateString('da-DK')
      };
      localStorage.setItem('mp_neuro_results', JSON.stringify(store));
    } catch (e) {
      console.error('Kunne ikke gemme neuro-resultat:', e);
    }

    const assessmentEl = document.getElementById('corsi-assessment');
    let feedback = '';
    
    if (finalScore >= 7) {
      feedback = '<strong>🟢 Elite-niveau:</strong> En score på 7 eller mere er exceptionelt. Din hjernes "scratchpad" har enorm kapacitet til lynhurtigt at kode rumlige informationer, præcis som elitespillere.';
    } else if (finalScore >= 5) {
      feedback = '<strong>🟡 Solidt gennemsnit:</strong> Den gennemsnitlige voksne kan huske mellem 5 og 6 visuelle elementer. Du har et fint, normalt taktisk overblik.';
    } else {
      feedback = '<strong>🔴 Udfordret arbejdshukommelse:</strong> Din hjerne havde svært ved at holde fast i de rumlige informationer i dag. Det er et klassisk tegn på mental træthed, dårlig søvn eller kognitiv overbelastning.';
    }

    assessmentEl.innerHTML = feedback;
  }

  cells.forEach(cell => {
    cell.addEventListener('click', handleCellClick);
  });

  startBtn.addEventListener('click', startGame);
  retryBtn.addEventListener('click', startGame);
});
</script>

<hr />

<h2 id="hvad-er-visuospatial-arbejdshukommelse">Hvad er visuospatial arbejdshukommelse?</h2>

<p>Arbejdshukommelsen kan betragtes som hjernens “RAM” (den midlertidige tavle, hjernen bruger til at arbejde med information her og nu).</p>

<p>Psykologen Alan Baddeley delte arbejdshukommelsen op i flere komponenter. Den del, vi bruger til sport og bevægelse, kaldes den <strong>Visuospatiale Skitseblok</strong> (<em>Visuospatial Sketchpad</em>):</p>

<ul>
  <li><strong>Visuel del:</strong> Hvordan ting ser ud (farver, former).</li>
  <li><strong>Spatial del (rumlig):</strong> Hvor ting befinder sig i rummet (koordinater).</li>
</ul>

<p>Hver gang du scanner feltet før et hjørnespark, koder din visuospatiale skitseblok lynhurtigt placeringen af forsvarsspillerne. Men denne “tavle” viskes ren i hjernen efter blot få sekunder, medmindre informationen genopfriskes.</p>

<hr />

<h2 id="forskellen-på-amatører-og-eliteatleter">Forskellen på amatører og eliteatleter</h2>

<p>Forskning inden for <em>Perceptual-Cognitive Expertise</em> viser en markant forskel på, hvordan amatører og verdensklasse-atleter udnytter deres visuelle arbejdshukommelse:</p>

<ol>
  <li><strong>Chunking:</strong> Eliteatleter ser ikke 10 isolerede spillere på banen. De ser taktiske “mønstre” eller “trekanter” (kaldet <em>chunking</em>). Ved at koble spillernes positioner sammen til ét samlet mønster, sparer de enormt meget plads i arbejdshukommelsen.</li>
  <li><strong>Kognitiv træthed:</strong> Hvis du tager Corsi-testen umiddelbart efter at have afsluttet en svær matematikeksamen, vil din score højst sandsynligt være lavere. Når pandelappen er udmattet, skrumper kapaciteten på din indre “skitseblok”, hvilket resulterer i dårligere overblik og flere fejlafleveringer på banen.</li>
</ol>

<hr />

<h2 id="udforsk-flere-neuromuskulære-tests">Udforsk flere neuromuskulære tests</h2>

<p>Corsi-testen belyser din hjernes <em>hukommelseskapacitet</em>, men du kan også teste din nervesystems hastighed og evne til at filtrere støj med vores andre værktøjer:</p>

<ul>
  <li><strong><a href="/reaktionstid-test/">Reaktionstid-test</a></strong> – Mål den rene visuelle reaktionshastighed i millisekunder.</li>
  <li><strong><a href="/mental-traethed/">Stroop-test &amp; Mental Træthed</a></strong> – Mål din evne til at filtrere forstyrrende indtryk.</li>
  <li><strong><a href="/impulskontrol-test/">Impulskontrol &amp; Go / No-Go</a></strong> – Test din evne til ikke at lade dig snyde af finter.</li>
  <li><strong><a href="/cns-fatigue/">Finger Tapping Test (CNS Fatigue)</a></strong> – Mål centralnervesystemets træthed og din finmotorik.</li>
</ul>

<hr />

<details class="references">
  <summary><h2 id="references">Referencer</h2></summary>

  <ul>
    <li><strong>Corsi, P. M. (1972).</strong> <em>Human memory and the medial temporal region of the brain.</em> Dissertation Abstracts International, 34(02), 891B.</li>
    <li><strong>Baddeley, A. (2000).</strong> <em>The episodic buffer: a new component of working memory?</em> Trends in Cognitive Sciences, 4(11), 417-423.</li>
    <li><strong>Vestberg, T., et al. (2011).</strong> <em>Executive functions predict the success of top-soccer players.</em> PLoS ONE, 6(4), e19223.</li>
  </ul>

</details>]]></content><author><name>Lars Olesen</name></author><category term="Restitution" /><category term="Psykologi" /><category term="test" /><category term="fysiologi" /><category term="kognition" /><category term="hukommelse" /><summary type="html"><![CDATA[Mål dit taktiske overblik med Corsi Block-Tapping testen. Læs om visuospatial arbejdshukommelse og hvordan det hjælper elitespillere med at læse banen.]]></summary></entry><entry><title type="html">Test træthed i nervesystemet med finger tapping test?</title><link href="https://www.motionsplan.dk/cns-fatigue/" rel="alternate" type="text/html" title="Test træthed i nervesystemet med finger tapping test?" /><published>2026-08-31T00:00:00+00:00</published><updated>2026-03-06T23:14:14+00:00</updated><id>https://www.motionsplan.dk/cns-fatigue</id><content type="html" xml:base="https://www.motionsplan.dk/cns-fatigue/"><![CDATA[<p>Finger Tapping Test er blevet foreslået, som en biomarkør på træthed i centralnervesystemet. I gamle dage brugte man en blyanttest til at teste <abbr title="Central Nervesystemet">CNS</abbr>-fatigue, men det er noget lettere at lave med en smartphone.</p>

<p>Når du laver finger tapping testen, så ser det ud til, at man relativt pålideligt kan genskabe det samme antal taps i efterfølgende forsøg, selvom der er <a href="https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4115982/">variationer i tiden mellem de enkelte <em>taps</em></a>.</p>

<p>Det ser ud til, at et fald i resultaterne skabt i finger tapping testen kan være med til at <a href="https://bmcneurol.biomedcentral.com/articles/10.1186/s12883-017-0829-y">indikere, om der er læsioner, der har skadet myeliniseringen af nervetrådene</a> eller i forbindelse med <a href="https://www.ncbi.nlm.nih.gov/pmc/articles/PMC5992087/">neurodegenerative sygdomme som fx Alzheimers og Parkinsons</a>.</p>

<p>Det er også blevet foreslået, at man kan bruge finger tapping testen i forbindelse med restitution og træningsparathed.</p>

<p>Dan John foreslår, at man bruger en <a href="https://www.t-nation.com/training/tip-take-the-tapping-test-for-cns-health">blyant tapping test til at monitorere træningsparatheden i <abbr title="Central Nervesystemet">CNS</abbr>-systemet</a> og de foreslår også en <a href="https://www.elitefts.com/education/monitoring-training-status-the-finger-tap-test/">finger tapping test hos elitefts.com til at tracke <abbr title="Central Nervesystemet">CNS</abbr>-systemet</a>. Charles Bausman har lavet et <a href="https://mtntactical.com/knowledge/mini-study-predicting-overtraining-cns-tapping-test/">uvidenskabeligt ministudium af at bruge en Finger Tapping Test til at måle træningsparathed</a>.</p>

<p>Brugen af Finger Tapping Test kan måske give mening i forhold til at sige noget om nervesystemets og kroppens parathed til at træne igen.</p>

<p>Det er ikke lykkes mig at finde videnskabelig litteratur, der understøtter brugen af finger tapping tests i forhold til træning.</p>

<p>Det er ret sjovt at lave finger tapping testen og konkurrere i den, men kan vi overhovedet bruge den i forbindelse med træningen.</p>

<p>Lad os forsøge at besvare et grundlæggende spørgsmål først. “Hvad er træthed i nervesystemet (<abbr title="Central Nervesystemet">CNS</abbr>-fatigue)?”</p>

<h2 id="hvad-er-træthed-i-nervesystemet-cns-fatigue">Hvad er træthed i nervesystemet (<abbr title="Central Nervesystemet">CNS</abbr> fatigue)?</h2>

<p>Hele præmissen for at en finger tapping test kan være en biomarkør på, om der indsniger sig træthed i nervesystemet er naturligvis, at der kan komme træthed i nevesystemet.</p>

<p>Så lad os kigge lidt på træthed i <abbr title="Central Nervesystemet">CNS</abbr> som en forklaringsmodel i miljøer, der ikke er drives af <em>bro science</em>. Rigtig mange steder så kan man læse, at træthed i nervesystemet sniger sig ind, hvis du løfter meget tungt og tæt på din <a href="/rm-beregner/">1RM</a> ofte. Men er det egentlig rigtigt?</p>

<p>Det mest sandsynlige er, at træthed i nervesystemet akkumulerer i løbet af træningen. Trætheden ser ud til at blive større ved mindre belastninger over lang tid end ved højere belastninger. Endelig ser det ud til, at selv voldsom træthed i nervesystemet er forbigående, og at nervesystemet kan restituere på 20 minutter eller maksimalt et par timer.</p>

<p>Tjek referencerne for at læse mere om <abbr title="Central Nervesystemet">CNS</abbr>-fatigue.</p>

<h2 id="hvad-kan-jeg-bruge-finger-tapping-testen-til">Hvad kan jeg bruge finger tapping testen til?</h2>

<p>Selvom styrketræning formentlig ikke forårsager længerevarende <abbr title="Central Nervesystemet">CNS</abbr>-fatigue, så kan man stadig forestille sig, at nervesystemet påvirkes af kroppens samlede parathed til at træne.</p>

<p>Man kan også forestille sig, at man kan bruge finger tapping test til at se, om dit opvarmningsprogram formår gøre nervesystemet endnu mere klar til den efterfølgende træning ved at lave en før- og eftertest.</p>

<h2 id="widget">Finger tapping test online</h2>

<div class="ftt-widget">
  
  <!-- Info Modal -->
  <div class="ftt-info-modal" style="display: none;">
    <div class="modal-header">
      <div class="modal-title-group">
        <h4 class="modal-title-text">Om Finger Tapping Testen (FTT)</h4>
        <span class="modal-subtitle-text">Måling af neuromuskulær træthed (KNS)</span>
      </div>
      <button class="modal-close-btn" type="button" aria-label="Luk modal">✖</button>
    </div>
    <div class="modal-body">
      <p style="font-size: 0.85rem; line-height: 1.5; color: #495057;">
        <strong>HVAD MÅLER TESTEN?</strong><br />
        Finger Tapping Testen måler centralnervesystemets (KNS) parathed og motoriske hastighed. Et fald i din normale score eller en markant side-asymmetri (&gt; 10-15% forskel mellem højre og venstre) kan indikere ubalance, udmattelse eller manglende restitution.<br /><br />
        <strong>SÅDAN UDFØRES TESTEN:</strong><br />
        1. Vælg <strong>Højre hånd</strong> eller <strong>Venstre hånd</strong>.<br />
        2. Tryk på <strong>"Start 10s Test"</strong>.<br />
        3. Efter nedtællingen trykker du så hurtigt du overhovedet kan på det store felt (brug pegefinger eller <strong>Mellemrumstast</strong>).<br />
        4. Test derefter den modsatte hånd for at fuldføre din profil og udregne din side-asymmetri.
      </p>
    </div>
  </div>

  <!-- Topbar -->
  <div class="ftt-topbar">
    <div class="ftt-header-card">
      <div class="card-text-group">
        <div class="card-title-row">
          <span class="card-title">Finger Tapping Test (KNS Status)</span>
          <button class="info-icon-btn" type="button" title="Læs om testen">ℹ️</button>
        </div>
        <div class="card-desc">Tryk så hurtigt du kan i 10 sek. Test begge hænder for at opnå fuld dagsform.</div>
      </div>
    </div>

    <!-- Indstillinger (Hånd-valg med status-badges) -->
    <div class="topbar-subrow">
      <div class="setting-item hand-setting-item">
        <span class="setting-label">Test Hånd:</span>
        <div class="btn-toggle-group" id="hand-toggle">
          <button type="button" class="toggle-btn active" data-val="Højre" id="btn-hand-right">
            <span>✋ Højre</span>
            <span class="hand-badge" id="badge-right">Mangler</span>
          </button>
          <button type="button" class="toggle-btn" data-val="Venstre" id="btn-hand-left">
            <span>🤚 Venstre</span>
            <span class="hand-badge" id="badge-left">Mangler</span>
          </button>
        </div>
      </div>
      
      <div class="setting-item">
        <div class="btn-toggle-group" id="sound-toggle">
          <button type="button" class="toggle-btn active" data-val="on" title="Lyd slået til">🔊 Lyd</button>
          <button type="button" class="toggle-btn" data-val="off" title="Lydløs">🔇</button>
        </div>
      </div>
    </div>
  </div>

  <!-- Status & Counters -->
  <div class="ftt-stats-grid">
    <div class="stat-box">
      <span class="stat-label">RESTERENDE TID</span>
      <span class="stat-value time-display">10.0s</span>
    </div>
    <div class="stat-box highlight">
      <span class="stat-label">ANTAL TRYK</span>
      <span class="stat-value tap-display">0</span>
    </div>
    <div class="stat-box">
      <span class="stat-label">FREKVENS (HZ)</span>
      <span class="stat-value hz-display">0.0</span>
    </div>
  </div>

  <!-- Den KÆMPE Tap-Zone -->
  <div class="ftt-action-zone">
    <button class="ftt-tap-area" disabled="">
      <span class="tap-area-main-text">KLAR TIL START</span>
      <span class="tap-area-sub-text">Tryk på 'Start Test' for at begynde</span>
    </button>
  </div>

  <!-- Kontroller -->
  <div class="ftt-controls">
    <button class="btn btn--primary btn-start">Start 10s Test</button>
    <button class="btn btn--warning btn-reset">Nulstil Log</button>
  </div>

  <!-- Resultat Log Tabel & Asymmetri-box -->
  <div class="ftt-log-wrapper" style="display: none;">
    <div id="asymmetry-summary-box" class="asymmetry-box" style="display: none;">
      <!-- Udfyldes dynamisk når begge hænder er testet -->
    </div>

    <h5 class="log-title">Dine Resultater (Session)</h5>
    <table class="ftt-log-table">
      <thead>
        <tr>
          <th>Forsøg</th>
          <th>Hånd</th>
          <th>Antal Tryk</th>
          <th>Frekvens (Hz)</th>
        </tr>
      </thead>
      <tbody class="log-tbody"></tbody>
    </table>
  </div>
</div>

<style>
.ftt-widget {
  background: #ffffff;
  border: 2px solid #e9ecef;
  border-radius: 16px;
  padding: 20px;
  max-width: 600px;
  width: 100%;
  margin: 2rem auto;
  text-align: center;
  font-family: system-ui, -apple-system, sans-serif;
  box-shadow: 0 8px 24px rgba(0,0,0,0.08);
  box-sizing: border-box;
  position: relative;
  overflow: hidden;
}
.ftt-widget * { box-sizing: border-box; }

.ftt-topbar { display: flex; flex-direction: column; gap: 10px; margin-bottom: 16px; text-align: left; }
.ftt-header-card { background: #e7f5ff; border: 1px solid #a5d8ff; border-radius: 12px; padding: 12px 14px; }
.card-title-row { display: flex; align-items: center; justify-content: space-between; gap: 6px; }
.card-title { font-weight: 800; font-size: 0.95rem; color: #1e293b; }
.info-icon-btn { background: transparent; border: none; font-size: 1.1rem; cursor: pointer; padding: 2px 4px; border-radius: 6px; transition: transform 0.1s ease; }
.info-icon-btn:hover { transform: scale(1.15); }
.card-desc { font-size: 0.78rem; color: #475569; margin-top: 4px; line-height: 1.35; }

/* Modal */
.ftt-info-modal { position: absolute; top: 0; left: 0; right: 0; bottom: 0; background: #ffffff; z-index: 20; padding: 20px; display: flex; flex-direction: column; text-align: left; }
.modal-header { display: flex; justify-content: space-between; align-items: flex-start; padding-bottom: 10px; border-bottom: 2px solid #f1f3f5; }
.modal-title-text { font-size: 1rem; font-weight: 800; color: #212529; margin: 0; }
.modal-subtitle-text { font-size: 0.75rem; color: #868e96; }
.modal-close-btn { background: #f1f3f5; border: none; font-size: 1rem; width: 30px; height: 30px; border-radius: 50%; cursor: pointer; }
.modal-body { flex: 1; overflow-y: auto; margin-top: 10px; }

/* Topbar Knapper med dynamiske badges */
.topbar-subrow { display: flex; align-items: center; justify-content: space-between; gap: 8px; margin-top: 4px; flex-wrap: wrap; width: 100%; }
.setting-item { display: flex; align-items: center; gap: 6px; }
.hand-setting-item { flex: 1; min-width: 260px; }
.setting-label { font-size: 0.72rem; font-weight: 800; color: #495057; white-space: nowrap; }

.btn-toggle-group { display: inline-flex; background: #f1f3f5; padding: 3px; border-radius: 10px; border: 1px solid #ced4da; width: 100%; }
.toggle-btn { 
  flex: 1;
  background: transparent; 
  border: none; 
  padding: 6px 8px; 
  font-size: 0.75rem; 
  font-weight: 700; 
  color: #495057; 
  border-radius: 8px; 
  cursor: pointer; 
  transition: all 0.15s ease; 
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 6px;
}
.toggle-btn:hover:not(.active) { color: #212529; background: rgba(0,0,0,0.04); }
.toggle-btn.active { background: #228be6; color: #ffffff; box-shadow: 0 2px 4px rgba(34, 139, 230, 0.3); }

/* Badges inde i knapperne */
.hand-badge { font-size: 0.65rem; padding: 2px 6px; border-radius: 6px; font-weight: 800; background: #e9ecef; color: #6c757d; }
.toggle-btn.active .hand-badge { background: rgba(255, 255, 255, 0.25); color: #ffffff; }
.hand-badge.done { background: #d3f9d8 !important; color: #2b8a3e !important; }
.toggle-btn.active .hand-badge.done { background: #ffffff !important; color: #2b8a3e !important; }

/* Stats Grid */
.ftt-stats-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 8px; margin-bottom: 16px; }
.stat-box { background: #f8f9fa; padding: 12px 6px; border-radius: 12px; border: 1px solid #e9ecef; display: flex; flex-direction: column; align-items: center; }
.stat-box.highlight { background: #fff9db; border-color: #fcc419; }
.stat-box.highlight .stat-value { color: #e67700; }
.stat-value { font-size: 1.8rem; font-weight: 900; color: #212529; font-variant-numeric: tabular-nums; line-height: 1.1; margin-top: 4px; }
.stat-label { font-size: 0.65rem; font-weight: 800; color: #868e96; letter-spacing: 0.05em; }

/* Tap Zone (Optimeret til touch uden lag) */
.ftt-action-zone { margin-bottom: 16px; }
.ftt-tap-area {
  width: 100%;
  height: 200px;
  border-radius: 20px;
  background: #f1f3f5;
  border: 4px dashed #ced4da;
  display: flex;
  flex-direction: column;
  justify-content: center;
  align-items: center;
  cursor: pointer;
  transition: background 0.05s ease, transform 0.05s ease, border-color 0.05s ease;
  
  /* DE KRITISKE CSS-OPTIMERINGER: */
  user-select: none;
  -webkit-user-select: none;
  touch-action: none; /* Slår ALT browser-gestik og lag fra */
  -webkit-tap-highlight-color: transparent;
  outline: none;
}
.ftt-tap-area.state-countdown { background: #fff3bf; border-color: #fcc419; color: #e67700; border-style: solid; }
.ftt-tap-area.state-active { background: #20c997; border-color: #0ca678; color: #ffffff; border-style: solid; box-shadow: 0 8px 30px rgba(32, 201, 151, 0.4); }
.ftt-tap-area.state-active:active, .ftt-tap-area.is-tapped { transform: scale(0.96); background: #12b886; }
.ftt-tap-area.state-finished { background: #e7f5ff; border-color: #74c0fc; color: #1864ab; border-style: solid; }
.ftt-tap-area:disabled { cursor: not-allowed; opacity: 0.8; }

.tap-area-main-text { font-size: 2.2rem; font-weight: 900; letter-spacing: 0.02em; pointer-events: none; }
.tap-area-sub-text { font-size: 0.9rem; font-weight: 700; opacity: 0.8; margin-top: 8px; pointer-events: none; }

/* Controls */
.ftt-controls { display: flex; gap: 8px; margin-bottom: 16px; }
.ftt-controls button { flex: 1; padding: 14px; font-size: 1rem; font-weight: 800; border-radius: 10px; border: none; cursor: pointer; transition: opacity 0.2s; }
.ftt-controls button:active { transform: scale(0.98); }
.btn--primary { background: #228be6; color: white; box-shadow: 0 4px 12px rgba(34, 139, 230, 0.3); }
.btn--primary:disabled { background: #adb5bd; cursor: not-allowed; box-shadow: none; transform: none; }
.btn--warning { background: #f1f3f5; color: #495057; border: 1px solid #ced4da; }

/* Result Log & Asymmetri */
.ftt-log-wrapper { text-align: left; border-top: 1px solid #e9ecef; padding-top: 14px; }
.asymmetry-box { background: #f0fff4; border: 1px solid #b2f2bb; border-radius: 10px; padding: 10px 14px; font-size: 0.85rem; color: #2b8a3e; margin-bottom: 12px; line-height: 1.4; }
.log-title { font-size: 0.9rem; font-weight: 800; margin: 0 0 10px 0; color: #495057; }
.ftt-log-table { width: 100%; border-collapse: collapse; font-size: 0.8rem; }
.ftt-log-table th { background: #f8f9fa; padding: 8px; border-bottom: 2px solid #dee2e6; text-align: left; font-weight: 800; color: #495057; }
.ftt-log-table td { padding: 8px; border-bottom: 1px solid #f1f3f5; color: #212529; font-weight: 600; }
.ftt-log-table tr:hover td { background: #f8f9fa; }

@media (max-width: 480px) {
  .ftt-tap-area { height: 220px; }
  .tap-area-main-text { font-size: 1.8rem; }
}
</style>

<script>
document.addEventListener("DOMContentLoaded", function() {
  const TEST_DURATION = 10.0;
  
  let isTesting = false;
  let isCountingDown = false;
  let tapCount = 0;
  let timeRemaining = TEST_DURATION;
  let startTime = 0;
  let animFrameId = null;
  let audioCtx = null;
  let attemptCount = 0;

  let selectedHand = 'Højre';
  let selectedSound = 'on';

  const widget = document.querySelector(".ftt-widget");
  if (!widget) return;

  const timeDisplay = widget.querySelector(".time-display");
  const tapDisplay = widget.querySelector(".tap-display");
  const hzDisplay = widget.querySelector(".hz-display");
  
  const tapArea = widget.querySelector(".ftt-tap-area");
  const tapAreaMainText = widget.querySelector(".tap-area-main-text");
  const tapAreaSubText = widget.querySelector(".tap-area-sub-text");
  
  const btnStart = widget.querySelector(".btn-start");
  const btnReset = widget.querySelector(".btn-reset");
  
  const logWrapper = widget.querySelector(".ftt-log-wrapper");
  const logTbody = widget.querySelector(".log-tbody");
  const asymmetryBox = widget.querySelector("#asymmetry-summary-box");

  const badgeRight = widget.querySelector("#badge-right");
  const badgeLeft = widget.querySelector("#badge-left");

  const infoModal = widget.querySelector(".ftt-info-modal");
  const infoIconBtn = widget.querySelector(".info-icon-btn");
  const modalCloseBtn = widget.querySelector(".modal-close-btn");

  loadSavedHandScores();

  function setupToggleGroup(groupId, onChange) {
    const group = widget.querySelector(`#${groupId}`);
    if (!group) return;
    const btns = group.querySelectorAll(".toggle-btn");
    btns.forEach(btn => {
      btn.addEventListener("click", () => {
        if (isTesting || isCountingDown) return;
        btns.forEach(b => b.classList.remove("active"));
        btn.classList.add("active");
        onChange(btn.dataset.val);
      });
    });
  }

  setupToggleGroup("hand-toggle", (val) => { selectedHand = val; });
  setupToggleGroup("sound-toggle", (val) => { selectedSound = val; });

  function playBeep(type) {
    if (selectedSound === 'off') return;
    if (!audioCtx) audioCtx = new (window.AudioContext || window.webkitAudioContext)();
    if (audioCtx.state === 'suspended') audioCtx.resume();

    const osc = audioCtx.createOscillator();
    const gain = audioCtx.createGain();
    osc.connect(gain);
    gain.connect(audioCtx.destination);

    const now = audioCtx.currentTime;
    if (type === 'countdown') {
      osc.frequency.value = 600;
      gain.gain.setValueAtTime(0.2, now);
      gain.gain.exponentialRampToValueAtTime(0.001, now + 0.15);
      osc.start(now); osc.stop(now + 0.15);
    } else if (type === 'go') {
      osc.frequency.value = 1200;
      gain.gain.setValueAtTime(0.3, now);
      gain.gain.exponentialRampToValueAtTime(0.001, now + 0.4);
      osc.start(now); osc.stop(now + 0.4);
    } else if (type === 'finish') {
      [800, 1000, 1200].forEach((freq, idx) => {
        const o = audioCtx.createOscillator();
        const g = audioCtx.createGain();
        o.connect(g); g.connect(audioCtx.destination);
        o.frequency.value = freq;
        g.gain.setValueAtTime(0.3, now + (idx * 0.15));
        g.gain.exponentialRampToValueAtTime(0.001, now + (idx * 0.15) + 0.3);
        o.start(now + (idx * 0.15)); o.stop(now + (idx * 0.15) + 0.3);
      });
    }
  }

  function updateTimer() {
    if (!isTesting) return;

    const now = performance.now();
    const elapsed = (now - startTime) / 1000;
    timeRemaining = Math.max(0, TEST_DURATION - elapsed);
    
    timeDisplay.textContent = timeRemaining.toFixed(1) + "s";
    
    if (elapsed > 0.5 && tapCount > 0) {
      hzDisplay.textContent = (tapCount / elapsed).toFixed(1);
    }

    if (timeRemaining <= 0) {
      finishTest();
    } else {
      animFrameId = requestAnimationFrame(updateTimer);
    }
  }

  function startSequence() {
    if (isTesting || isCountingDown) return;
    isCountingDown = true;
    
    btnStart.disabled = true;
    tapCount = 0;
    timeRemaining = TEST_DURATION;
    
    timeDisplay.textContent = "10.0s";
    tapDisplay.textContent = "0";
    hzDisplay.textContent = "0.0";

    tapArea.className = "ftt-tap-area state-countdown";
    tapArea.disabled = true;
    tapAreaSubText.textContent = "Gør dig klar!";

    let count = 3;
    tapAreaMainText.textContent = count;
    playBeep('countdown');

    const countdownInterval = setInterval(() => {
      count--;
      if (count > 0) {
        tapAreaMainText.textContent = count;
        playBeep('countdown');
      } else {
        clearInterval(countdownInterval);
        isCountingDown = false;
        startActiveTest();
      }
    }, 1000);
  }

  function startActiveTest() {
    isTesting = true;
    playBeep('go');
    
    tapArea.disabled = false;
    tapArea.className = "ftt-tap-area state-active";
    tapAreaMainText.textContent = "TAP HURTIGT!";
    tapAreaSubText.textContent = `Testing (${selectedHand} hånd)`;
    
    startTime = performance.now();
    animFrameId = requestAnimationFrame(updateTimer);
    
    tapArea.focus();
  }

  function finishTest() {
    isTesting = false;
    cancelAnimationFrame(animFrameId);
    playBeep('finish');

    tapArea.disabled = true;
    tapArea.className = "ftt-tap-area state-finished";
    tapAreaMainText.textContent = "TEST SLUT!";
    tapAreaSubText.textContent = `Du nåede ${tapCount} tryk (${selectedHand})`;
    
    btnStart.disabled = false;
    btnStart.textContent = "Prøv Igen";
    
    const finalHz = (tapCount / TEST_DURATION).toFixed(1);
    hzDisplay.textContent = finalHz;

    logResult(tapCount, finalHz);
    saveAndRefreshData(tapCount);
  }

  function saveAndRefreshData(currentScore) {
    try {
      const store = JSON.parse(localStorage.getItem('mp_neuro_results') || '{}');
      const today = new Date().toLocaleDateString('da-DK');
      
      let tappingData = store['tapping'] || { right: null, left: null, date: '' };
      
      if (tappingData.date !== today) {
        tappingData = { right: null, left: null, date: today };
      }

      if (selectedHand === 'Højre') tappingData.right = currentScore;
      if (selectedHand === 'Venstre') tappingData.left = currentScore;

      let displayStr = '';
      if (tappingData.right && tappingData.left) {
        displayStr = `H: ${tappingData.right} / V: ${tappingData.left} taps`;
      } else if (tappingData.right) {
        displayStr = `${tappingData.right} taps (Højre)`;
      } else {
        displayStr = `${tappingData.left} taps (Venstre)`;
      }

      const maxValue = Math.max(tappingData.right || 0, tappingData.left || 0);

      store['tapping'] = { right: tappingData.right, left: tappingData.left, value: maxValue, display: displayStr, date: today };
      localStorage.setItem('mp_neuro_results', JSON.stringify(store));
      loadSavedHandScores();
    } catch (e) { console.error('Kunne ikke gemme neuro-resultat:', e); }
  }

  function loadSavedHandScores() {
    try {
      const store = JSON.parse(localStorage.getItem('mp_neuro_results') || '{}');
      const today = new Date().toLocaleDateString('da-DK');
      const data = store['tapping'];

      if (data && data.date === today) {
        if (data.right !== null && data.right !== undefined) {
          badgeRight.textContent = `${data.right} taps`;
          badgeRight.classList.add('done');
        } else {
          badgeRight.textContent = 'Mangler';
          badgeRight.classList.remove('done');
        }

        if (data.left !== null && data.left !== undefined) {
          badgeLeft.textContent = `${data.left} taps`;
          badgeLeft.classList.add('done');
        } else {
          badgeLeft.textContent = 'Mangler';
          badgeLeft.classList.remove('done');
        }

        if (data.right && data.left) {
          const diff = Math.abs(data.right - data.left);
          const max = Math.max(data.right, data.left);
          const asymPct = ((diff / max) * 100).toFixed(1);
          
          let statusText = '';
          if (asymPct <= 10) {
            statusText = `<strong>🟢 God Neuromuskulær Balance:</strong> Højre (${data.right}) vs Venstre (${data.left}). Forskelsgrad: ${asymPct}% (Sund norm er < 10%).`;
          } else {
            statusText = `<strong>🟡 Mærkbar Side-Asymmetri:</strong> Højre (${data.right}) vs Venstre (${data.left}). Forskelsgrad: ${asymPct}%. Indikerer lokal udmattelse eller ubalance i én af siderne.`;
          }

          asymmetryBox.innerHTML = statusText;
          asymmetryBox.style.display = 'block';
          logWrapper.style.display = 'block';
        }
      } else {
        badgeRight.textContent = 'Mangler'; badgeRight.classList.remove('done');
        badgeLeft.textContent = 'Mangler'; badgeLeft.classList.remove('done');
        asymmetryBox.style.display = 'none';
      }
    } catch (e) {}
  }

  function logResult(taps, hz) {
    attemptCount++;
    logWrapper.style.display = "block";
    const tr = document.createElement("tr");
    tr.innerHTML = `<td>#${attemptCount}</td><td>${selectedHand}</td><td><strong>${taps}</strong></td><td>${hz} Hz</td>`;
    logTbody.insertBefore(tr, logTbody.firstChild);
  }

  function resetLog() {
    if (!confirm("Vil du slette alle resultater fra denne session?")) return;
    attemptCount = 0;
    logTbody.innerHTML = "";
    logWrapper.style.display = "none";
    asymmetryBox.style.display = "none";
    
    timeDisplay.textContent = "10.0s";
    tapDisplay.textContent = "0";
    hzDisplay.textContent = "0.0";
    
    tapArea.className = "ftt-tap-area";
    tapAreaMainText.textContent = "KLAR TIL START";
    tapAreaSubText.textContent = "Tryk på 'Start Test' for at begynde";
    btnStart.textContent = "Start 10s Test";

    try {
      const store = JSON.parse(localStorage.getItem('mp_neuro_results') || '{}');
      delete store['tapping'];
      localStorage.setItem('mp_neuro_results', JSON.stringify(store));
      loadSavedHandScores();
    } catch(e) {}
  }

  // OPTIMERET: Pointerdown til touch/mus sikrer absolut instant aktivering (0ms lag)
  tapArea.addEventListener("pointerdown", (e) => {
    if (!isTesting) return;
    
    tapCount++;
    tapDisplay.textContent = tapCount;
    tapArea.classList.add("is-tapped");
  });

  // Fjerner den visuelle effekt det sekund man slipper, ikke via timeout
  tapArea.addEventListener("pointerup", () => tapArea.classList.remove("is-tapped"));
  tapArea.addEventListener("pointercancel", () => tapArea.classList.remove("is-tapped"));
  tapArea.addEventListener("pointerout", () => tapArea.classList.remove("is-tapped"));

  // OPTIMERET: Tastatur-lytter der blokerer OS "hold-nede-snyd"
  document.addEventListener("keydown", (e) => {
    if (!isTesting) return;
    if (e.code === "Space" || e.code === "Enter") {
      e.preventDefault(); 
      // VIGTIGT: Hvis e.repeat er true, holder brugeren knappen nede - ignorér det!
      if (e.repeat) return;
      
      tapCount++;
      tapDisplay.textContent = tapCount;
      tapArea.classList.add("is-tapped");
    }
  });

  document.addEventListener("keyup", (e) => {
    if (e.code === "Space" || e.code === "Enter") {
      tapArea.classList.remove("is-tapped");
    }
  });

  tapArea.addEventListener("contextmenu", e => e.preventDefault());

  btnStart.addEventListener("click", startSequence);
  btnReset.addEventListener("click", resetLog);

  infoIconBtn.addEventListener("click", () => { infoModal.style.display = "flex"; });
  modalCloseBtn.addEventListener("click", () => { infoModal.style.display = "none"; });
});
</script>

<details class="references">
  <summary><h2 id="references">Referencer</h2></summary>

  <ul>
    <li><a href="https://medium.com/@SandCResearch/why-does-central-nervous-system-cns-fatigue-happen-during-strength-training-e0af3f5e4989">Why does Central Nervous System Fatigue happen during strength training</a></li>
    <li><a href="https://barbend.com/cns-fatigue/">https://barbend.com/cns-fatigue/</a></li>
    <li><a href="https://mennohenselmans.com/cns-fatigue/">https://mennohenselmans.com/cns-fatigue/</a></li>
    <li><a href="https://simplifaster.com/articles/central-nervous-system-fatigue-effects-speed-power-athletes/">https://simplifaster.com/articles/central-nervous-system-fatigue-effects-speed-power-athletes/</a></li>
    <li><strong>Jobbágy, A., et al. (2005).</strong> <em>Analysis of finger tapping test for assessment of central nervous system state.</em> IEEE Transactions on Biomedical Engineering, 52(7), 1331-1339.</li>
  </ul>

  <p>&lt;/summary&gt;</p>
</details>]]></content><author><name>Lars Olesen</name></author><category term="Restitution" /><category term="test" /><category term="fysiologi" /><category term="tracking" /><summary type="html"><![CDATA[Finger Tapping Test er blevet foreslået, som en biomarkør på træthed i centralnervesystemet. I gamle dage brugte man en blyanttest til at teste CNS-fatigue, men det er noget lettere at lave med en smartphone.]]></summary></entry><entry><title type="html">Visuel Fokus Test: Eriksen Flanker Task</title><link href="https://www.motionsplan.dk/fokus-test/" rel="alternate" type="text/html" title="Visuel Fokus Test: Eriksen Flanker Task" /><published>2026-08-31T00:00:00+00:00</published><updated>2026-08-31T23:55:00+00:00</updated><id>https://www.motionsplan.dk/flanker-test</id><content type="html" xml:base="https://www.motionsplan.dk/fokus-test/"><![CDATA[<p>Når du skal gribe en bold i et tætpakket felt, fange en aflevering under pres eller køre igennem et felt af cykelryttere, bombarderes dit synscenter med hundredvis af forstyrrende informationer i sekundet.</p>

<p><strong>Eriksen Flanker Task</strong> er den klassiske neuropsykologiske guldstandard til at måle <strong>visuel selektiv opmærksomhed</strong> — altså hvor effektivt din hjerne undertrykker støj i synsfeltet og bevarer det skarpe fokus på det vigtigste datapunkt.</p>

<div class="notice--info">

  <p><strong>Kort fortalt: Flanker-effekt &amp; Fokus</strong></p>

  <ul>
    <li><strong>Opgaven:</strong> En række pile vises på skærmen (fx <code class="language-plaintext highlighter-rouge">‹ ‹ › ‹ ‹</code>). Du skal udelukkende trykke baseret på den <strong>midterste pil</strong> og ignorere flangerne (de omkringliggende pile).</li>
    <li><strong>Flanker-interferens:</strong> Når flangerne peger modsat af midterpilen, bruger hjernen markant længere tid på at reagere. Det fænomen kaldes <em>Flanker-effekten</em>.</li>
    <li><strong>Betydning for atleter:</strong> Elitespillere lader sig ikke snyde af tilskuerstøj eller modstanderes skinnemanøvrer i øjenkrogen, fordi deres prefrontale cortex lynhurtigt filtrerer perifer støj fra.</li>
  </ul>

</div>

<hr />

<h2 id="widget">Test dit visuelle fokus online</h2>

<p>Hold øjnene på midten af boksen. Tryk på knappen <strong>Venstre</strong> eller <strong>Højre</strong> ud fra hvilken vej den <strong>MIDTERSTE PIL</strong> peger!</p>

<div class="flanker-wrapper" id="flanker-container">
  
  <div class="flanker-card" id="flanker-start-screen">
    <div class="flanker-icon-badge"><i class="fas fa-compress-arrows-alt"></i></div>
    <h3>Flanker Test: Visuel Støj &amp; Fokus</h3>
    <p>Test din evne til at filtrere forstyrrelser i synsfeltet under tidspres.</p>
    
    <div class="flanker-rule-box">
      <strong>⚠️ Reglen:</strong> Fokusér <u>KUN</u> på den <strong>MIDTERSTE PIL</strong>!
      <br />Tryk på knappen <strong>Venstre</strong> eller <strong>Højre</strong> baseret udelukkende på den midterste pil — uanset hvad de omkringliggende pile viser.
    </div>

    <button class="btn btn--primary btn--large" id="start-flanker-btn">Start fokus-test (15 runder)</button>
  </div>

  <div class="flanker-card" id="flanker-game-screen" style="display: none;">
    <div class="flanker-top-bar">
      <span id="flanker-progress">Runde 1 af 15</span>
      <span id="flanker-timer">0.0s</span>
    </div>

    <div class="flanker-display-box" id="flanker-display">
      <span id="flanker-arrows">‹ ‹ › ‹ ‹</span>
    </div>

    <div class="flanker-buttons-grid">
      <button class="btn-flanker" id="btn-flanker-left">◄ VENSTRE</button>
      <button class="btn-flanker" id="btn-flanker-right">HØJRE ►</button>
    </div>
  </div>

  <div class="flanker-card" id="flanker-result-screen" style="display: none;">
    <div class="flanker-icon-badge" id="flanker-res-icon"><i class="fas fa-filter"></i></div>
    <h3>Dit Fokus-resultat</h3>
    
    <div class="flanker-results-grid">
      <div class="flanker-res-box">
        <span class="res-label">Præcision:</span>
        <span class="res-value" id="res-flanker-accuracy">0%</span>
      </div>
      <div class="flanker-res-box">
        <span class="res-label">Gns. Responstid:</span>
        <span class="res-value" id="res-flanker-speed">0 ms</span>
      </div>
    </div>

    <div class="flanker-assessment" id="flanker-assessment"></div>

    <div class="result-actions">
      <button class="btn btn--success" id="retry-flanker-btn">Prøv igen</button>
      <a href="/kognitive-tests/#dashboard" class="btn btn--outline">← Kontrolpanel</a>
    </div>
  </div>

</div>

<style>
.flanker-wrapper {
  margin: 2rem 0;
  user-select: none;
  -webkit-user-select: none;
  font-family: system-ui, -apple-system, sans-serif;
}

.flanker-card {
  background: #ffffff;
  border-radius: 16px;
  border: 1px solid #e2e8f0;
  padding: 1.5rem;
  box-shadow: 0 8px 24px rgba(0,0,0,0.08);
  text-align: center;
}

.flanker-icon-badge {
  width: 56px;
  height: 56px;
  background: #edf2f7;
  color: #4a5568;
  border-radius: 50%;
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: 1.5rem;
  margin: 0 auto 1rem auto;
}

.flanker-card h3 {
  margin: 0 0 0.5rem 0 !important;
  color: #2d3748;
}

.flanker-rule-box {
  background: #edf2f7;
  border-left: 4px solid #4a5568;
  padding: 0.75rem 1rem;
  border-radius: 8px;
  color: #2d3748;
  font-size: 0.95rem;
  margin: 1rem 0 1.5rem 0;
  text-align: left;
}

.flanker-top-bar {
  display: flex;
  justify-content: space-between;
  font-weight: 600;
  color: #718096;
  margin-bottom: 1.5rem;
  font-size: 0.95rem;
}

.flanker-display-box {
  background: #1a202c;
  color: #ffffff;
  border-radius: 16px;
  padding: 2.5rem 1rem;
  font-size: 3.2rem;
  font-weight: 900;
  letter-spacing: 12px;
  margin-bottom: 1.5rem;
  box-shadow: inset 0 2px 8px rgba(0,0,0,0.4);
}

.flanker-buttons-grid {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 12px;
}

.btn-flanker {
  background: #2b6cb0;
  color: #ffffff;
  border: none;
  border-radius: 12px;
  padding: 1.2rem 0.5rem;
  font-size: 1.1rem;
  font-weight: 800;
  cursor: pointer;
  box-shadow: 0 4px 12px rgba(43, 108, 176, 0.3);
  transition: transform 0.1s ease, background-color 0.15s ease;
  -webkit-tap-highlight-color: transparent;
}

.btn-flanker:active {
  transform: scale(0.96);
  background-color: #2c5282;
}

.flanker-results-grid {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: 12px;
  margin: 1.2rem 0;
}

.flanker-res-box {
  background: #f7fafc;
  padding: 1rem;
  border-radius: 10px;
  border: 1px solid #edf2f7;
}

.res-label {
  display: block;
  font-size: 0.85rem;
  color: #718096;
}

.res-value {
  font-weight: 800;
  font-size: 1.8rem;
  color: #2d3748;
}

.flanker-assessment {
  background: #edf2f7;
  padding: 1rem;
  border-radius: 10px;
  font-size: 0.95rem;
  color: #2d3748;
  margin-bottom: 1.5rem;
  text-align: left;
}

.result-actions {
  display: flex;
  gap: 10px;
  margin-top: 1.5rem;
}

.result-actions .btn, .result-actions a.btn {
  flex: 1;
  padding: 14px;
  font-size: 1rem;
  font-weight: 800;
  border-radius: 10px;
  text-decoration: none;
  display: flex;
  align-items: center;
  justify-content: center;
}

.btn--outline {
  background: transparent;
  border: 2px solid #cbd5e0;
  color: #4a5568;
}
</style>

<script>
document.addEventListener('DOMContentLoaded', function() {
  const TOTAL_ROUNDS = 15;
  const ARROW_PATTERNS = [
    { text: '‹ ‹ ‹ ‹ ‹', target: 'left' },   // Kongruent
    { text: '› › › › ›', target: 'right' },  // Kongruent
    { text: '‹ ‹ › ‹ ‹', target: 'right' },  // Inkongruent
    { text: '› › ‹ › ›', target: 'left' },   // Inkongruent
    { text: '« « › « «', target: 'right' },  // Inkongruent variant
    { text: '» » ‹ » »', target: 'left' }    // Inkongruent variant
  ];

  let currentRound = 0;
  let correctAnswers = 0;
  let startTime = 0;
  let roundStartTime = 0;
  let responseTimes = [];
  let currentTarget = '';

  const startScreen = document.getElementById('flanker-start-screen');
  const gameScreen = document.getElementById('flanker-game-screen');
  const resultScreen = document.getElementById('flanker-result-screen');

  const arrowDisplay = document.getElementById('flanker-arrows');
  const progressEl = document.getElementById('flanker-progress');
  const timerEl = document.getElementById('flanker-timer');

  const btnLeft = document.getElementById('btn-flanker-left');
  const btnRight = document.getElementById('btn-flanker-right');
  const startBtn = document.getElementById('start-flanker-btn');
  const retryBtn = document.getElementById('retry-flanker-btn');

  function vibrate(ms) {
    if (navigator.vibrate) navigator.vibrate(ms);
  }

  function nextRound() {
    if (currentRound >= TOTAL_ROUNDS) {
      endGame();
      return;
    }

    currentRound++;
    progressEl.textContent = 'Runde ' + currentRound + ' af ' + TOTAL_ROUNDS;

    const pattern = ARROW_PATTERNS[Math.floor(Math.random() * ARROW_PATTERNS.length)];
    currentTarget = pattern.target;
    arrowDisplay.textContent = pattern.text;

    roundStartTime = performance.now();
  }

  function handleChoice(direction) {
    const responseTime = Math.round(performance.now() - roundStartTime);
    responseTimes.push(responseTime);

    if (direction === currentTarget) {
      correctAnswers++;
      vibrate(25);
    } else {
      vibrate([40, 40, 40]);
    }

    nextRound();
  }

  function startGame() {
    currentRound = 0;
    correctAnswers = 0;
    responseTimes = [];

    startScreen.style.display = 'none';
    resultScreen.style.display = 'none';
    gameScreen.style.display = 'block';

    startTime = performance.now();
    nextRound();
  }

  function endGame() {
    gameScreen.style.display = 'none';
    resultScreen.style.display = 'block';

    const accuracyPct = Math.round((correctAnswers / TOTAL_ROUNDS) * 100);
    const avgMs = Math.round(responseTimes.reduce((a, b) => a + b, 0) / responseTimes.length);

    document.getElementById('res-flanker-accuracy').textContent = accuracyPct + '%';
    document.getElementById('res-flanker-speed').textContent = avgMs + ' ms';

    try {
      const store = JSON.parse(localStorage.getItem('mp_neuro_results') || '{}');
      store['flanker'] = {
        value: accuracyPct,
        display: accuracyPct + '% (' + avgMs + ' ms)',
        date: new Date().toLocaleDateString('da-DK')
      };
      localStorage.setItem('mp_neuro_results', JSON.stringify(store));
    } catch (e) {
      console.error('Kunne ikke gemme neuro-resultat:', e);
    }

    const assessmentEl = document.getElementById('flanker-assessment');
    let feedback = '';

    if (accuracyPct >= 90 && avgMs < 500) {
      feedback = '<strong>🟢 Knivskarpt visuelt fokus:</strong> Du filtrerer ubesværet støj fra i synsfeltet og holder blikket låst på målet. Fremragende selektiv opmærksomhed!';
    } else if (accuracyPct >= 75) {
      feedback = '<strong>🟡 God støjfiltrering:</strong> Du har fin kontrol, men de modrettede pile skabte en smule tøven (Flanker-interferens).';
    } else {
      feedback = '<strong>🔴 Høj visuel distraktion:</strong> Mange fejl eller lang responstid. Din hjerne lader sig forstyrre af støj i synsfeltet. Klassisk ved mentalt pres eller træthed.';
    }

    assessmentEl.innerHTML = feedback;
  }

  btnLeft.addEventListener('click', () => handleChoice('left'));
  btnRight.addEventListener('click', () => handleChoice('right'));

  document.addEventListener('keydown', (e) => {
    if (gameScreen.style.display === 'block') {
      if (e.code === 'ArrowLeft') handleChoice('left');
      if (e.code === 'ArrowRight') handleChoice('right');
    }
  });

  startBtn.addEventListener('click', startGame);
  retryBtn.addEventListener('click', startGame);
});
</script>

<hr />

<h2 id="videnskaben-bag-eriksen-flanker-task">Videnskaben bag Eriksen Flanker Task</h2>

<p>Testen blev opfundet af psykologerne Barbara og Charles Eriksen i 1974. Den belyser konflikten mellem det centrale synsfelt (<em>foveal vision</em>) og det perifere synsfelt.</p>

<p>Når alle pile peger samme vej (kongruent tilstand, fx <code class="language-plaintext highlighter-rouge">‹ ‹ ‹ ‹ ‹</code>), behandler hjernen informationen lynhurtigt. Men når de omkringliggende pile peger modsat (inkongruent tilstand, fx <code class="language-plaintext highlighter-rouge">‹ ‹ › ‹ ‹</code>), sker der to modstridende processer i hjernen:</p>

<ol>
  <li><strong>Automatisk synsregistrering:</strong> Dit perifere syn opfanger side-pilenes retning og forbereder et forkert motorsignal.</li>
  <li><strong>Kognitiv kontrol:</strong> Din prefrontal cortex skal gribe ind, annullere den forkerte impuls og isolere midterpilens retning.</li>
</ol>

<p>Denne konflikt koster millisekunder. Jo mere kognitivt udmattet du er, desto større bliver forsinkelsen og fejlraten.</p>

<hr />

<h2 id="udforsk-det-samlede-testbatteri">Udforsk det samlede testbatteri</h2>

<ul>
  <li><strong><a href="/reaktionstid-test/">Reaktionstid-test</a></strong> – Mål din rene visuelle og auditive reaktionshastighed.</li>
  <li><strong><a href="/mental-traethed/">Stroop-test &amp; Mental Træthed</a></strong> – Test din evne til at undertrykke forstyrrende tekstfarver.</li>
  <li><strong><a href="/impulskontrol-test/">Impulskontrol &amp; Go / No-Go</a></strong> – Test din evne til ikke at hoppe på skudfinter.</li>
  <li><strong><a href="/arbejdshukommelse-test/">Corsi Arbejdshukommelse</a></strong> – Test dit taktiske overblik.</li>
  <li><strong><a href="/visuel-forudsigelse/">Visuel Forudsigelse</a></strong> – Mål din visuelle timing.</li>
  <li><strong><a href="/cns-fatigue/">Finger Tapping Test</a></strong> – Mål centralnervesystemets træthed.</li>
</ul>

<hr />

<details class="references">
  <summary><h2 id="references">Referencer</h2></summary>

  <ul>
    <li><strong>Eriksen, B. A., &amp; Eriksen, C. W. (1974).</strong> <em>Effects of noise letters upon the identification of a target letter in a nonsearch task.</em> Perception &amp; Psychophysics, 16(1), 143–149.</li>
    <li><strong>Nieuwenhuis, S., et al. (2006).</strong> <em>Mental fatigue, error processing, and the cortical regulation of cognitive control.</em> Psychophysiology, 43(1), 29–36.</li>
  </ul>

</details>]]></content><author><name>Lars Olesen</name></author><category term="Restitution" /><category term="Psykologi" /><category term="test" /><category term="kognition" /><category term="fokus" /><category term="opmaerksomhed" /><summary type="html"><![CDATA[Mål din selektive opmærksomhed og fokus med Eriksen Flanker Task. Lær hvordan hjernen sorterer forstyrrende indtryk fra i boldsport.]]></summary></entry></feed>