# Frame (HTML)

Een frame in de terminologie van HTML is een optioneel onderdeel van een webpagina. De meest gangbare Nederlandse vertaling is deelpagina.
Een webpagina kan opgebouwd zijn uit meerdere afzonderlijke documenten, die ondergebracht zijn in een hoofddocument. In het hoofddocument kan met een frame de url, de positie en afmetingen van een ander HTML-document worden aangegeven. Het hoofddocument bevat in dat geval de frameset: het raamwerk van deelpagina's.
Door het gebruik van frames is het mogelijk om een webpagina slechts gedeeltelijk te vervangen met een andere pagina. Dit heeft zekere voordelen, omdat dan bijvoorbeeld het onderdeel van het document dat bedoeld is voor navigatie kan blijven staan, terwijl in een ander deel van het document een andere inhoud kan worden getoond als respons op een klik in het navigatiegedeelte.
Het gebruik van frames heeft echter ook een aantal belangrijke nadelen, zie verderop in dit artikel.

## Geschiedenis

Ondersteuning voor frames werd door Netscape ingevoerd met de webbrowser Netscape Navigator 2.0. Vrijwel alle moderne browsers ondersteunen frames. De W3C heeft frames opgenomen in de standaard voor HTML (4.0) en XHTML (1.0), maar beveelt de toepassing van frames niet aan.
Een variant van de frames werd als inline frame (iframe) door Microsoft geïntroduceerd met Internet Explorer versie 3.0.

## Technisch

Bij het gebruik van frames wordt het hoofddocument in zijn geheel opgesplitst in afzonderlijke documenten met een eigen URL. Tekst, plaatjes en andere informatie uit het hoofddocument wordt niet getoond, tenzij de browser geen frames ondersteunt - maar dan worden de aangegeven onderliggende documenten niet getoond.
Als een browser ondersteuning biedt voor frames, dan worden de frames behandeld als aparte vensters met een eigen geschiedenis en eventueel een eigen naam. In een hyperlink kan worden aangegeven in welk venster het nieuwe document verschijnt (met het target attribuut). Frames vertonen - indien nodig - ieder een eigen scrollbar.
Frames kunnen ook met behulp van HTML-scripting worden aangestuurd. Hierdoor is het bijvoorbeeld mogelijk om de inhoud van meerdere frames aan te passen in reactie op één muisklik.

### Onzichtbaar frame

Onzichtbare frames (hidden frame in het Engels) kunnen worden gebruikt om buiten het zicht van de gebruiker informatie te verwerken. Een onzichtbaar frame kan namelijk wel informatie bevatten die met een script kan worden verwerkt tot zichtbare informatie. De opkomst van AJAX-technologie heeft het gebruik van onzichtbare frames voor een mix van client-side en server-side toepassingen enigszins verdrongen. In de discussie over hoe vernieuwend de AJAX-technologie is, wordt er echter wel verwezen naar onzichtbare frames als argument om aan te tonen dat AJAX niet wezenlijk vernieuwend is.

### Geneste frames

Frames kunnen in principe oneindig worden genest. De frames in een document worden gedefinieerd in een frameset, waarbij het zichtbare vlak van het document in de browser wordt onderverdeeld in kleinere rechthoeken. Ieder van deze rechthoeken kan echter ook weer uit frames bestaan.
Het nesten van frames kan zowel direct in het hoofddocument zelf gebeuren (een frameset plaatsen in een frame) als in het afzonderlijke document (het document dat in een frame wordt geplaatst bestaat zelf ook uit een frameset).

### Frame busting

Met frame busting wordt een techniek bedoeld die ervoor zorgt dat een webpagina niet in een frame kan worden gezet. Beter gezegd: zodra een pagina in een frame wordt gezet, zorgt een script ervoor dat de pagina uit het frame breekt.
Deze techniek wordt gebruikt omdat met behulp van frames ook pagina's van een andere website kunnen worden getoond alsof het een eigen pagina is. In sommige websites wordt op deze manier geprobeerd om inhoud van andere websites te gebruiken voor eigen doeleinden. Frame busting is bedoeld om dit tegen te gaan.

## Bezwaren

Er worden diverse bezwaren aangevoerd tegen het gebruik van frames, en in veel websites worden frames inmiddels niet meer gebruikt. Het is echter niet zo dat frames volledig uit de gratie zijn, ook bedrijven als Microsoft en Google maken op delen van hun websites nog gebruik van frames.
Bezwaren die tegen het gebruik van frames worden ingebracht zijn onder andere:
* Zoekmachines kunnen niet goed met frames omgaan. Gevonden zoekresultaten verwijzen naar het document met de betreffende inhoud, ongeacht of dat document bedoeld is als onderdeel van een frameset.
* Het gevolg is dat bezoekers bijvoorbeeld de navigatie niet zien, die bij het betreffende document zou moeten horen.
* Bookmarks werken niet goed. Het is wel mogelijk om een subdocument afzonderlijk te bookmarken, maar als de pagina dan weer geopend wordt, is de context van het hoofddocument afwezig.
* Problemen met het printen van webpagina's met frames.
* Uitklapmenu's (en 'layers' in het algemeen) zijn gevangen in hun eigen frame, hetgeen impliceert dat de subitems van een (gewoon) navigatiemenu niet op de hoofdpagina verschijnen.
Aan deze bezwaren kan redelijk goed tegemoet worden gekomen door toepassing van een eenvoudig JavaScript dat de betreffende pagina alsnog in de juiste frameset toont en van een techniek waarmee een (dynamische) frameset getoond wordt via een iframe dat de gehele pagina beslaat. Nadelen van deze technieken zijn dat de gebruiker (uiteraard) JavaScript ingeschakeld moet hebben, en dat er veelal een gekunsteld adres in de adresbalk van de browser komt te staan.