I udarbejdelsen af min portfølge og andre webudviklingsrelaterede projekter, har jeg samlet en række noter. Disse noter dækker HTML, CSS, JavaScript og lidt itsikkerheds begræber. Jeg har delt det op i
termer, forklaring og så eksempler der så vidt muligt er ud fra min portfølje. Jeg har valgt at oprette dem som tabeller, men for en god ordensskyld er de også vedhæftet som billeder i bunden af stykket her.
| Term |
Forklaring |
Kode eksempel |
| addEventListener() |
Knytter en event-listener til et DOM-element når en bestemt hændelse opstår. “Når det her sker, på det her element, så kør denne funktion”. |
btn.addEventListener(‘click’, fn); |
| Arrow function () => {} |
Kort syntax for en funktion. Hurtig måde at skrive en funktion, uden “function”. |
const sum = (a, b) => a + b; |
| async / await |
Gør asynkrone Promises lettere at læse som synkron kode. “Vent lige” i koden, indtil resultatet er klar. |
const data = await fetch (‘/api’).then(r => r.json()); |
| class |
Skabelon til objekter; syntaktisk sukker over prototype-arv. Opskrift til at lave mange ens objekter. |
class Car { start() {...} } |
| console.log() |
Skriver debugging-info til konsollen. |
console.log(user); |
| const / let / var |
Deklarerer variabler. Gemmer værdier i hukommelsen - const kan ikke gen-tildeles, let kan. |
let count = 0; const btn = document.getElementById(button) |
| document.querySelector(All) |
Finder første/alle matchende elementer via CSS-selector. Giv mig det/de element(er) der matcher denne selector. |
const nav = document.querySelector(‘nav’); |
| DOMContentLoaded |
Event der fyres når HTML er parset, før billeder osv. DOM skal være klar før manipulation. |
document.addEventListener(‘DOMContentLoaded’, init); |
| event.preventDefault() |
Stopper elementets standard handling. Forhindrer normal adfærd. |
form.addEventListener(‘submit’, e => e.preventDefault()); |
| Fetch API fetch () |
HTTP-kald der returnerer en Promise med Response. Henter data fra en server. |
const json = await fetch(‘/users’).then(r => r.json()); |
| for...of / for...in |
Løkker. for...of: Gå gennem hvert element. for...in: gå gennem hver egenskab. |
for (const el of arr) {...} |
| JSON.parse()/stringify() |
Konverterer mellem objekter og tekst. Oversætter JavaScript-objekter til tekst. Så de kan gemmes eller sendes. |
localStorage.setItem(‘u’, JSON.stringify(user)); |
| localStorage / sessionStorage |
Nøgle-værdi-lager i browseren. Gem små stykker data i browseren så de huskes næste gang. |
localStorage.setItem(‘theme’, ‘dark’); |
| map()/filter()/reduce() |
Array-metoder. Map: lav alle elementer om. Filter: fjern dem der ikke matcher. Reduce: opsumer til en værdi. |
const names = users.map(u => u.name); |
| Modules import / export |
Opdeler kode i filer med klare afhængigheder. Gør det umuligt at importere funktioner fra andre filer der ikke bliver importeret. |
import { login } from ‘./auth.js2’; |
| this |
Refererer til den aktuelle kontekst. Det objekt funktionen hører til lige nu. |
btn.onclick = function () { console.log(this); }; |
| setTimeout() |
Kører en funktion en gang efter en forsinkelse. Vent X millisekunder (1000), gør så dette. |
setTimeout(closeModal, 2000); |
| setInterval() |
Gentager en funktion hver X millisekunder (1000). Gør dette igen og igen med et fast interval. |
setInterval(tick, 1000); |
| try...catch |
Fanger fejl i kode og håndterer dem. Prøv dette, hvis det fejler, så gør noget andet i stedet for at crashe. |
try { risky() } catch (e) { alert(e) } |
| document.getElementById() / document.getElementByClass() |
Henter id / klasse elementet fra din index.html fil, så den kan bruges i din script.js fil. |
const clickBtn = document.getElementById(‘button’) |
| Term |
Forklaring |
Kode eksempel |
| position: fixed/relative/absolute |
Bruges til at placere elementer fast, relativt eller frit på siden. Relative beholder plads i dokument-flow’et. Absolute flyttter ud af flow’et og måler fra nærmest positionerede forælder. Fixed måler fra viewport og følger ikke med, når siden scrolles. |
nav {position: fixed, top: 0; left: 0; width: 100%;} |
| top, left, right, bottom |
Bruges sammen med position til at angive præcis placering / forskyde elementet |
.arrow {right: -5rem; bottom: 2.5rem;} |
| margin, padding |
Margin er luft udenfor elementet, padding er luft inden i. |
.btn {margin: 1rem; padding: 1rem; } |
| box-sizing: border-box |
Gør at width/height inkluderer både padding og border, så elementet ikke “vokser” uventet. |
::before, ::after {box-sizing: border-box} |
| display: flex / grid / block / inline / inline-block |
Vælger layout-model: flex (en dimension), grid (Opdeling, 2 dimensioner), block (Bloks under hinanden), Inline (Efter hinanden), Inline-block (Efter hinanden, blok format) |
.menu-links { display: flex;} |
| flex-direction, flex-wrap: wrap, justify-content, align-items, gap |
Styrer rækkefølge, om indhold må bryde linjen, hoved-/tvær-aksernes justering og den indbyrdes afstand i en flex container. |
nav-links {display: flex; gap: 2rem; flex-wrap: wrap;justify-content: center; } |
| grid-template-columns |
Definerer kolonne strukturen i et CSS-grid (antal og størrelse) |
.product-grid {display: grid; grid-template-columns: repeat(3,1fr);} |
| width, height, min-/max-height |
Sætter faste eller begrænsede dimensioner; min-max/-* forhindrer, at elementet bliver mindre/større end grænsen. |
.logo {max-width: 200px; } |
| overflow-x, overflow |
Bestemmer, hvad der sker, når indholdet er større end elementets boks - f.eks. scroll, skjul eller vise. |
body {overflow-x: hidden; } |
| z-index |
Angiver stablings-rækkefølgen for positionerede elementer; højere tal lægger sig “forrest”. |
#desktop-nav {z-index: 1000M} |
| background, background-color, background-position / size |
Lægger farve/billede bag elementet, justerer billedets udgangspunkt og skalering. |
body{background: #fafafa } |
| color |
Farve på tekst. |
a:hover {color: #666;} |
| border, border-radius |
Tegner kant omkring elementet; radius runder hjørnerne. |
.card {border: 1px solid #ddd;border-radius: 2rem; } |
| box-shadow |
Tilføjer skygge for dybde-effekt; parametre = x-offset, y-offset, blur, spread, farve. |
.card {box-shadow:0 4px 6px rgba(0,0,0,.1);} |
| font-family, font-size, font-weight, line-height |
Styrer skrifttype, skriftstørrelse, vægt (tykkelse) og lodret afstand mellem tekstlinjer. |
body {font-family: “Poppins”, sans-serif; font-size: 1rem; line-height: 1.5;} |
| text-align, text-decoration |
Horisontal justering af inline-indhold + pynt som understregning. |
h2{text-align: center;text-decoration: underline; } |
| cursor: pointer / default / not-allowed |
Ændrer muse-markøren, fx til hånd-ikon når noget er klikbart (pointer), default eller slet ikke tilladt. |
button{cursor: pointer;} |
| transition |
Giver en glidende animation mellem to værdier. |
.btn {transition: background 200ms ease; } |
| transform: translateY(...) / scale(...) / rotate(...) |
Manipulerer elementets koordinatsystem (flyt, skaler, drej ) uden at påvirke dokument-flow’et. |
.logo:hover{transform: scale(1.05) rotate (-2deg);} |
| opacity |
Gør elementet gennemsigtigt 0 - 1 (0 - 100% vist) |
.disabled{opacity: .5; } |
| animation, @keyframes |
Fuld tidslinje-styret animation, keyframes beskriver mellem-stadier, animation binder den til elementet. |
@keyframes pulse {0%{transform:scale(1);} 50%{transform:scale(1.1);} 100%{transform:scale(1);} .cta{animation:pulse 1.5s infinite;}} |
| @media (max-width: ...) |
Bryder til alternative regler, når viewport-bredden er lig med eller mindre end et bestemt bredde. Bruges til mobilvisning. |
@media (max-width: 768px){.nav-links{flex-direction: column; }} |
| object-fit, object-position |
Bestemmer, hvordan img/video skal udfylde sin boks, og hvilken del af motivet der skal centreres. |
.about-pic {object-fit: cover; object-position: center top;} |
| scroll-behavior: smooth |
Giver blød rulning til interne ankre (sektioner) |
html {scroll-behavior: smooth;} |
| Term |
Forklaring |
Kode eksempel |
| nav |
Navigationsbar. Primær navigation. (Links, menuer, logoer søgebar) |
nav id="desktop-nav" class="nav-links">
a href="#home">Hjem
a href="#about">Om
|
| header/footer |
Hoved- og bund-sektion, kan være overordnet info, logoer, kontakt, politikker osv. |
footer
© 2025 Min Portefølje
/footer
|
| section |
Afsnit af siden, hjælper med opdeling af siden. Hjælper skærmlæsere (Softwareprogram, der hjælper blinde og svagsynede med at læse tekst) |
section id ="about" |
| div |
Et div-tag er til at definere et stykke eller en form for sektion i et HTML dokument.
Det bruges til at gruppere indhold og anvende CSS-styling eller JavaScript-funktionalitet på det. |
div class ="wrapper" /div |
| ul/ol/li |
Liste elementer. Unordered-list, Ordered liste eller bare en liste. |
ul li item1 |
| a href = "..." |
A tag består af en href, som er et link til en side, anker eller en fil. |
a href ="#contact">Kontakt< a |
| img src="..." alt="..." |
Bruges til at indsætte et billede. Angiv at det er et billede
med src, som er linket til billedet. Alt er en beskrivelse af billedet, til tekstalternativer for SEO/tilgængelighed. |
img src="selvportræt.png" alt="Profilbillede" |
| button |
Button definere en knap, som er et interaktivt kontrol-element. Det kan udløse en JavaScript metode eller en formular submit |
button class="btnClose">Luk< |
| input type ="text/password/email |
Input definere et input-felt, som kan være tekst, password eller email. Det bruges til at indsamle data fra brugeren. |
input type ="email" id="signupEmail" |
| label for="..." |
Klikbart navn, der forbinder sig til et input felt. |
label for="signupPwd">Adgangskode< |
| Globale attributter: Class, id, style |
Id bruges til at identificere et unikt element på siden, class bruges til at gruppere elementer og style bruges til at tilføje inline CSS-styling. |
div id="button" class="closeButton" |
| href, src, alt, type, placeholder, disabled, aria-* |
Disse er alle attributter, der bruges til at definere elementer. href er linket til en side, src er linket til et billede, alt er en beskrivelse af billedet, type er typen af input-feltet, placeholder er en tekst der vises i input-feltet, disabled gør et element inaktivt og aria-* bruges til at forbedre tilgængeligheden for skærmlæsere. |
a href="https://example.com" target="_blank">Link til eksempel<.
img src="billede.jpg" alt="Beskrivelse af billede".
input type="text" placeholder="Indtast tekst her" disabled.
input type="email" aria-label="Email adresse".
|
| script type="module" src="..." |
Script tag bruges til at inkludere JavaScript på siden. Type="module" angiver, at det er et modul, og src er linket til JavaScript-filen. |
script type="module" src="script.js"< |
| code |
Code tag bruges til at vise kode på siden. Det er en semantisk måde at vise kode på, og det hjælper med at formatere koden korrekt. |
>console.log('Hello World');
|
| html lang="da" |
HTML tag bruges til at definere et HTML-dokument. Lang attributten angiver sproget for dokumentet, i dette tilfælde dansk. |
html lang="da"
|
| link |
Link tag bruges til at inkludere eksterne ressourcer som CSS-filer. Det hjælper med at adskille stil og indhold. |
link rel="stylesheet" href="styles.css"
|
| small |
Small tag bruges til at vise mindre tekst, som f.eks. copyright eller fodnoter. Det hjælper med at adskille mindre vigtig information fra hovedindholdet. |
small © 2025 Min Portefølje< /small
|
| Span |
Span tag bruges til at gruppere inline-elementer og anvende CSS-styling på dem. Det er en semantisk måde at gruppere elementer på, uden at ændre deres layout. |
span class="highlight">Dette er fremhævet tekst span>
|
| Table |
Tables bruges til at oprette tabeller i HTML. Med et td(table data cell) og tr(table row), laver jeg simple tabeller som denne. |
|
| Term |
Forklaring |
Kode eksempel |
| Hashing med Argon2 |
En ensrettet funktion til at gemme adgangskoder sikker. Argon2 beskytter mod brute-force bl.a. |
await argon2.hash(password, opts); |
| JWT (JSON Web Token) |
Token der indeholder brugerinfo og bruges til session-håndtering uden server-side sessions. Underskrives med hemmelig nøgle. |
jwt.sign({ uid }, secret, { expiresIn: ‘15m’ }); |
| CSRF-beskyttelse |
Stopper angribere fra at udnytte brugerens aktive session til at sende skadelige forespørgsler. |
app.use(csurf({ cookie: cookieCfg })); res.json({ csrfToken : req.csrfToken () } ); |
| Rate Limiting |
Begrænser antallet af forespørgsler fra en IP for at beskytte mod brute-force. |
max: 20, windowMs: 15 * 60 * 1000 |
| Brute-force forsvar / lockout |
Midlertidig kontolås ved for mange forkerte loginforsøg. |
if (fails >= 5) lock = dayjs().add(15, ‘minute’) |
| Refresh-token hashing |
Refresh-tokens hashes i databasen for at beskytte mod token stjæling. |
crypto.createHash(‘sha256’).update(token).digest(‘hex’); |
| HTTPOnly cookie |
Forhindrer JavaScript i at få adgang til cookies og dermed reducerer XSS-risiko. |
res.cookie(‘refresh’, token, { httpOnly: true }) |
| Secure / SamSite cookies |
secure kræver HTTPS. SameSite beskytter mod CSRF ved at begrænse cross-site requests. |
samSite: ‘lax’, secure: true |
| Helmet (sikkerhedsheaders) |
Tilføjer headers som HSTS, CSP, X-Frame-Options for at beskytte mod XSS, clickjacking m. m. |
app.use(helmet()); |
| Content Security Policy (CSP) |
Kun scripts fra godkendte kilder må køres - begrænser XSS. |
scriptSrc: [“’self’”] |
| SQL Injection |
En angrebsteknik hvor angriberen injicerer SQL i inputfelter. Beskyttes mod med prepared statements. |
db.prepare(“SELECT * FROM users WHERE id = ?”).get(id); |
| XSS (Cross-Site Scripting) |
Når angriberen injicerer skadelig JavaScript i DOM’en. Sanitering forhindrer dette. |
out.textContent = input.replace(/
|
| TryHackMe (forløbet) |
En platform hvor jeg lærer om XSS, SQLi, brute-force, netværk og forsvar. Windows Fundamentals, Linux Basics osv. |
Læringsmæssigt baggrundsarbejde |
| Base64 hashing (min demo) |
Bruges til at illustrere koncepter i din frontend-demo, f.eks. hvordan simple hash kan manipuleres. |
btoa(‘hemmelig’); |
| Sanitering af input (mod XSS) |
Uskadeliggør skadelige tegn som < og > i inputfelter. |
input.replace(//g, ‘>’) |
| Token rotation |
Refresh-token ændres og verificeres server-side ved hver login eller fornyelse |
refresh_hash valideres og overskrives i databasen |
| HSTS |
Tvinger browseren til kun at kommunikere over HTTPS. |
app.use(helmet.hsts()); |
| Password salting |
En tilfældig streng tilføjes til brugerens kodeord før hashing for at undgå rainbow table-angreb. |
Argon2 bruger automatisk saltning. |
| Timing attack |
En angriber måler svartid for at afsløre korrekt input (fx passwords) |
Argon2 beskytter mod dette. |
| Token hijacking |
Når en angriber stjæler en gyldig token, fx via XSS. |
Modvirker det med httpOnly cookies og short JWT-levetid. |
| Session fixation |
En angriber tvinger brugeren til at bruge en kendt session-id. |
Refresh-token rotation beskytter mod dette. |
| CSP |
CSP kan også kontrollere hvor objekter/iframes må loades fra. |
Bruger basic CSP hos mig. |
| Clickjacking |
Brugeren narrer til at klikke på noget andet via iframe/lag |
helmet.framequard({ action: ‘deny’ }) |
| Open Redirect |
Bruges i phishing - redirect uden kontrol over destination |
Ikke i mit projekt. |
| IDOR (Insecure Direct Object Reference) |
Når bruger direkte får adgang til fx andres data via ID i URL. |
Sårbarhed, bliver beskyttet med token-validering. |