Code optimalisatie

Status
Niet open voor verdere reacties.

5blabla5

Gebruiker
Lid geworden
27 apr 2009
Berichten
485
Ik ben bezig met het bouwen van een website waarin vrij veel positionering voorkomt. Aangezien ik niet zo'n geweldige CSS schrijver ben, vraag ik me af of deze css code wel goed is. Ik heb vooral veel geprobeerd. Ik zit nog wel met één ding: onder de header (logo en menu dus) moet het content komen. Als ik een div toevoeg zal die onder het menu verschijnen, i.p.v. over de hele breedte. Eigenlijk wil ik dat het menu en het logo allebei in de #header div vallen, maar het menu steekt er uit, en de #header div weigert zich daar aan aan te passen.

Kortom: hebben jullie tips, problemen, toevoegingen, enz. voor deze html en css code?

HTML:
HTML:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html>
	<head>
		<title>Testpagina</title>
		<link rel="stylesheet" type="text/css" href="style.css" />
	</head>

	<body>
		<div id="container">
			<div id="header">
				<div id="logo" />
				<div id="menu">
					<div id="menuitem"></div>
					<div id="menuitem"></div>
					<div id="menuitem"></div>
					<div id="menuitem"></div>
					<div id="menuitem"></div>
					<div class="clear" />
				</div>
			</div>
		</div>
	</body>
</html>

CSS:
HTML:
body,html {
	background-image: url('images/background.png');
	background-size: 100%;
	margin: 0;
	padding: 0;
	height: 100%;
}

#container {
	margin: auto;
	padding: 0;
	border: 5px solid black;
	width: 900px;
	height: 100%;
}

#header {
	margin: auto;
	width: 900px;
	position: absolute;
	border: 3px solid black;
}

#logo {
	background-image: url('images/logo.png');
	background-size: 100%;
	width: 400px;
	height: 100px;
}

#menu {
	position: absolute;
	width: 500px;
	margin-left: 400px;
	margin-top: 80px;
	border: 3px solid black;
}

.clear {
	clear: both;
}

#menuitem {
	background-image: url('images/menu/new/home_white.png');
	background-size: 100%;
	width: 80px;
	height: 48px;
	margin-left: 10px;
	float: left;
}

#menuitem:hover {
	background-image: url('images/menu/new/home_purple.png');
}
 
Tips
  • Eerst eens wat theorie leren voordat je gaat proberen.
  • In 1 pagina mag een ID 1 keer voorkomen, een ID hoort uniek te zijn
  • Een menu bouw je niet op uit verschillende divs, maar met een <ul> en meerdere <li>'s
  • Je hebt de menu-div een vaste breedte, een vaste linker margin en een absolute positie meegegeven, en dan ben je nog verwonderd dat hij buiten de header-div valt. Vaste breedte, vaste margin en position alledrie overboord gooien en daarvoor in de plaats een div plaatsen met float=right.
  • Ook bij de header-div de absolute positie overboord gooien.
 
Ik ken al wel iets theorie, maar positioneren is niet echt mijn sterkste kant :P
Ik ga eventjes kijken naar de dingen die je hebt opgenoemd, alvast bedankt!
 
Er is één belangrijk principe dat je altijd in de gaten moet houden:
een website is geen (op papier) gedrukt product.

Het zogenaamde pixel-perfect ontwerpen kun je bij een website wel proberen,
maar het heeft geen nut en het heeft meestal ook niet het gewenste effect.

Lees eens wat over "fluid design" en over de voor- en nadelen van positioning.

Positioning is erg lastig toe te passen en vaak overbodig.
 
  • Eerst eens wat theorie leren voordat je gaat proberen.
  • In 1 pagina mag een ID 1 keer voorkomen, een ID hoort uniek te zijn
  • Een menu bouw je niet op uit verschillende divs, maar met een <ul> en meerdere <li>'s
  • Je hebt de menu-div een vaste breedte, een vaste linker margin en een absolute positie meegegeven, en dan ben je nog verwonderd dat hij buiten de header-div valt. Vaste breedte, vaste margin en position alledrie overboord gooien en daarvoor in de plaats een div plaatsen met float=right.
  • Ook bij de header-div de absolute positie overboord gooien.

Ik sluit me volledige aan bij de meneer hier.

Nog even wat verdere toelichting op de puntjes die hij noemde:

  • Meerdere ID's met de zelfde naam kunnen de meeste browsers voortaan wel herkennen dat ze die toch moeten printen. Maar het is fout en langzamer terwijl een ID normaal gesproken sneller is als je hem maar 1x gebruikt.
  • Een menu opgebouwd met <ul> en <li> geeft in bijna geen enkel browser problemen, werkt snel is volledige html & css, dus word ook in elk browser weergegeven. Het eerste browser wat er moeilijk mee gaat doen is volgens mij IE 5 of 6 en daar zijn kant en klare hacks voor geschreven, als je dat zelf niet kan.
  • Mijn tip bij positionen van div's is, zet eerst de float(na de afmetingen en background natuurlijk). Kijk of het goed weergeeft(als dat niet is heb je ergens een fout gemaakt). Zet daarna de margins. Zeker als je een beginner bent met css is dat een goede manier.
  • Als je de layout aan het maken bent is het ook altijd slim om even een background color neer te zetten. Ook als die er later niet komt, op die manier zie je heel makkelijk of hij goed geplaatst is. Later kan je dat wel weer weglaten aangezien je het dan vaak automatisch goed doet.
 
Laatst bewerkt:
Ik heb gekeken naar het lijstje, en de volgende dingen toegepast:
- De menuitems zijn nu afbeeldingen, ze moesten immers klikbaar worden, en uit divs opbouwen bleek dus niet zo verstandig. Ze hebben nu allemaal een verschillend ID, en worden nu aangesproken door een andere selector.
- Alle position dingen zijn weggehaald, en het werkt ook zonder.
- Het logo is ook vervangen door een afbeelding.
- Het logo en de header hebben allebei een float. Allebei worden ze nog iets gecorrigeerd met margin opties.

Nu zit ik met 3 vragen:
1. Ik heb na het logo en het menu een div met clear:both geplaatst, omdat ze anders buiten de header vallen (als ik de lijnen moet geloven). Is dit een correcte manier?
2. Ik zit nog steeds met het content: als ik nu content onder de header div plaats, wordt het binnen de lijnen van de header weergegeven. Hoe kan ik dit oplossen?
3. De achtergrond is een grote afbeelding, die mijn scherm niet helemaal vult. Ik heb dit opgelost met de css3 functie background-size. Is dit een goede oplossing? Het is de bedoeling dat de afbeelding de hele pagina vult.

HTML:
HTML:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
	<head>
		<title>Test</title>
		<link rel="stylesheet" type="text/css" href="style.css" />
		<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
	</head>

	<body>
		<div id="container">
			<div id="header">
				<img id="logo" src="images/logo.png" alt="Test" />
				<div id="menu">
					<a onmouseover="document.menu_home.src='images/menu/home_purple.png'" onmouseout="document.menu_home.src='images/menu/home_white.png'">
						<img id="menu_home" name="menu_home" src="images/menu/home_white.png" alt="Home" />
					</a>
					<a onmouseover="document.menu_bio.src='images/menu/bio_purple.png'" onmouseout="document.menu_bio.src='images/menu/bio_white.png'">
						<img id="menu_bio" name="menu_bio" src="images/menu/bio_white.png" alt="Bio" />
					</a>
					<a onmouseover="document.menu_music.src='images/menu/music_purple.png'" onmouseout="document.menu_music.src='images/menu/music_white.png'">
						<img id="menu_music" name="menu_music" src="images/menu/music_white.png" alt="Music" />
					</a>
					<a onmouseover="document.menu_gigs.src='images/menu/gigs_purple.png'" onmouseout="document.menu_gigs.src='images/menu/gigs_white.png'">
						<img id="menu_gigs" name="menu_gigs" src="images/menu/gigs_white.png" alt="Gigs" />
					</a>
					<a onmouseover="document.menu_contact.src='images/menu/contact_purple.png'" onmouseout="document.menu_contact.src='images/menu/contact_white.png'">
						<img id="menu_contact" name="menu_contact" src="images/menu/contact_white.png" alt="Contact" />
					</a>
				</div>
				<div class="clear" />
			</div>
			<div class="clear" />
			<div id="content">
				Hey there!
			</div>
		</div>
	</body>
</html>

CSS:
HTML:
body,html {
	background-image: url('images/background.png');
	background-size: 100%;
	margin: 0;
	padding: 0;
	height: 100%;
}

#container {
	margin: auto;
	padding: 0;
	border-left: 5px solid black;
	border-right: 5px solid black;
	width: 900px;
	height: 100%;
}

#header {
	width: 900px;
	border: 3px solid black;
}

#logo {
	width: 400px;
	height: 128px;
	float: left;
	margin-left: 20px;
}

#menu {
	width: 450px;
	float: right;
	padding: 0px;
	margin-top: 70px;
	margin-right: 20px;
}

.clear {
	clear: both;
}

div#menu img {
	width: 80px;
	height: 48px;
	margin-left: 5px;
}
 
Laatst bewerkt:
Ik raad je aan om je header even op height:auto; te zetten wel zo netjes, kan je bij je menu ook doen. En ik zou bij je menu toch gebruik maken van de ul li manier. Even snel een voorbeeldje:

Code:
<ul>
    <li>Hoofdlink 1
        <ul>
            <li>Sublink 1</li>
            <li>Sublink 2</li>
            <li>Sublink 3</li>
		</ul>
	</li>     
    <li>Hoofdlink 2
        <ul>
            <li>Sublink 1</li>
            <li>Sublink 2</li>
            <li>Sublink 3</li>
		</ul>
	</li>
    <li>Hoofdlink 3</li>           
</ul>

Je zal alleen dan wel de css nog moeten doen. Dat is niet zo moeilijk, kan je mee frotten, maar ook even googlen of op youtube kijken staan genoeg tutorials zag ik net.
 
Er wordt op deze site geen gebruik gemaakt van een menu met tekst, maar met plaatjes. 5 plaatjes aan de bovenkant, naast het logo, die ook naast elkaar staan. Volgens mij is de ul li methode daar niet zo geschikt voor.
 
Net zo geschikt:

CSS:
Code:
ul li {
background-image: url(...);
(background-repeat:repeat-x)/*Eventueel een repeat*/
}

ul li ul li { /*Als het dropdown gedeeld anders gestyled moet zijn */
background-image: url(...);
}
Ik heb bij de 2e de repeat weggelaten. Zo kan je toch plaatjes gebruiken, doe ik altijd zelfs;).
 
Plaatjes zijn niet zo geschikt voor een menu.
Dat heeft alles te maken met accessability.
Daarom is het juist beter om een menu op te bouwen met een lijst-element (ul + li's)
en daar eventueel images als achtergrond te gebruiken of images in de plaats van de bullet-points.

Wat betreft de content:
dat moet goed gaan als je de "clear=both" niet in de header-div plaatst maar er direct na.

HTML:
<body>
<div id="container">
<div id="header"><p>dit is de header</p>
      <div id="logo"><p>hier komt het logo</p></div>
       <div id="menu"><ul><li>menu-item</li><li>menu-item</li></ul></div>
</div>
<div class="clear"></div>
<div id="content">
<p>content</p>
</div>
</div>
</body>
 
Het gaat hier om een menu waarin gebruik wordt gemaakt van een niet bestaand lettertype, dus het kan echt niet anders dan met plaatjes. Ik maak wel gebruik van alt's, dus dat komt uiteindelijk wel goed met accessability. Ik ga dat met het content nog even proberen!

EDIT:
Als ik de div met de clear class op die plek zet, zorgt dat er voor dat het logo en het menu niet binnen de lijnen van de header vallen. De header doet dan alsof er niets in hem staat.
 
Laatst bewerkt:
Auch. Zet de Javascript wel in een los bestand, niet als onmouseover in de HTML!


Daarnaast, dit:
Code:
div#menu img {
kan gewoon zo:
Code:
#menu img {
immers, er is maar 1 element met het ID menu. Of dit nou een div is of niet.
 
Laatst bewerkt:
onmouseover moet zich toch altijd in het element bevinden? Ik kan er eventueel nog wel een functie van maken in een apart js bestandje, maar de trigger is toch onmouseover?
 
Well, Javascript events in de HTML zetten is echt 1997. Tegenwoordig (*kuch*) kan het veel beter via event listeners.

Het idee is dat je een los JS bestand hebt dat de Javascript doet, net zoals de CSS in een los CSS bestand staat. Stuk makkelijker te onderhouden, en het is veel netter. Dit is het idee:

[js]function addEvent(elem, event, what)
{
if(elem.addEventListener)
{
elem.addEventListener(event, what, false);
}else{
// dit is alleen voor IE < 9, dus feel free to remove this
elem.attachEvent('on' + event, what);
}
}


addEvent(document.getElementById('menu_home'), 'mouseover', function(e)
{
this.src = 'images/menu/home_purple.png';
});

addEvent(document.getElementById('menu_home'), 'mouseout', function(e)
{
this.src = 'images/menu/home_white.png';
});


// etc.
[/js]
 
Dat ga ik even uitwerken!

EDIT:
De code werkt helaas niet, in het webinfovenster van safari krijg ik de melding: menu.js:3TypeError: 'null' is not an object (evaluating 'elem.addEventListener')

[JS]function addEvent(elem, event, what)
{
if(elem.addEventListener)
{
elem.addEventListener(event, what, false);
}else{
// dit is alleen voor IE < 9, dus feel free to remove this
elem.attachEvent('on' + event, what);
}
}

// Home button
addEvent(document.getElementById('menu_home'), 'mouseover', function(e)
{
this.src = 'images/menu/home_purple.png';
});

addEvent(document.getElementById('menu_home'), 'mouseout', function(e)
{
this.src = 'images/menu/home_white.png';
});

// Bio button
addEvent(document.getElementById('menu_bio'), 'mouseover', function(e)
{
this.src = 'images/menu/bio_purple.png';
});

addEvent(document.getElementById('menu_bio'), 'mouseout', function(e)
{
this.src = 'images/menu/bio_white.png';
});

// Music button
addEvent(document.getElementById('menu_music'), 'mouseover', function(e)
{
this.src = 'images/menu/music_purple.png';
});

addEvent(document.getElementById('menu_music'), 'mouseout', function(e)
{
this.src = 'images/menu/music_white.png';
});

// Gigs button
addEvent(document.getElementById('menu_gigs'), 'mouseover', function(e)
{
this.src = 'images/menu/gigs_purple.png';
});

addEvent(document.getElementById('menu_gigs'), 'mouseout', function(e)
{
this.src = 'images/menu/gigs_white.png';
});

// Contact button
addEvent(document.getElementById('menu_contact'), 'mouseover', function(e)
{
this.src = 'images/menu/contact_purple.png';
});

addEvent(document.getElementById('menu_contact'), 'mouseout', function(e)
{
this.src = 'images/menu/contact_white.png';
});[/JS]
 
Laatst bewerkt:
Staat de <script> toevallig in de head? Het beste is om 'm net voor de </body> te zetten.
 
Great, dat werkt wel!

Ik zit nu alleen nog met het content onder de header. Als ik de div met clear class buiten de de header div zet, is het content niet meer binnen de lijnen van de header, maar de lijnen van de header sluiten het logo en het menu niet in (het lijkt alsof er niets staat in de header). Hoort dit, of is dit een foutje?
 
Ach-ach-ach-ach- ach!
smiley-st.gif


Een mouse-over met javascript??? dat hoort verleden tijd te zijn! :D
  • Daar zijn dus 5 images voor nodig + 5 hover-images = 10 te downloaden images, en dus 10 pagina-vertragende http-requests...
  • Zonder extra preload-functie worden de hover-images pas opgehaald op het moment van hoveren...
  • Met disabled javascript werken ze niet...
  • Er zou voor de toegankelijkheid ook nog onfocus en onblur ingebouwd moeten worden bij elk item...
  • Het is pure html-vervuiling...
Terwijl het toch allemaal niet nodig is. Sinds eind vorige eeuw is er de css :hover en de css :focus eigenschap, waarmee je o.a. de positie van background-images kunt regelen.

Wat doe je?
1. Image maken
Je bakt 1 image, waar alle gewone en alle hover-toestanden van alle items in zitten, een zg. css-sprite:

opti-sprite.png

Dat img wordt meteen bij het laden van de pagina 1x opgehaald, en is bij hovers acuut beschikbaar. Met de overhead mee is dit img veel kleiner dan de optelsom van 10 losse (bovenstaand img is 5kB, één losse is 0,9kB, dus voor 10 stuks: 9kB). Bij meer kleuren en grotere bestandsgrootte wordt het verschil alleen maar groter!

2. Simpele html
HTML:
<body>
	<div id="header">
		<img src="images/logodepogo400x128.png" alt="" />
		<h1 class="hidden">MijnSite.nl: Home</h1>
		<p class="hidden"><a href="#content">Sla menu over</a></p>
		<ul id="menu">
			<li><a id="hme" href="#testHome"><span>Home</span></a></li>
			<li><a id="bio" href="#testBio"><span>Bio</span></a></li>
			<li><a id="mus" href="#testMusic"><span>Music</span></a></li>
			<li><a id="gig" href="#testGigs"><span>Gigs</span></a></li>
			<li><a id="ctc" href="#testContact"><span>Contact</span></a></li>
		</ul>
		<div class="clear"><!-- ! --></div>
	</div>
	<div id="content">
		Hey there!
	</div>
</body>
That's all! :)

3. Overzichtelijke css
Code:
html {
	height: 100%;
	padding-bottom: 1px;
	background: url(http://developerscorner.nl/images/fdc-bg.gif);
	}
body {
	width: 900px;
	margin: 0 auto;
	min-height: 100%;
	border-left: 5px solid black;
	border-right: 5px solid black;
	}
#header {
	border-top: 3px solid black;
	border-bottom: 3px solid black;
	padding-left: 20px;
	}
#header img {
	float: left;
	width: 400px;
	height: 128px;
	}
#menu {
	width: 425px;
	float: right;
	margin: 70px 20px 0 0;
	padding: 0;
	list-style: none;
	}
#menu li {
	float: left;
	width: 80px;
	margin: 0 0 0 5px;
	padding: 0;
	position: relative;
	z-index: 2;
	}
#menu a {
	width: 80px;
	height: 48px;
	display: block;
	background: url(images/opti-sprite.png);
	}
a#hme { background-position: 0 0 }
a#bio { background-position: -80px 0 }
a#mus { background-position: -160px 0 }
a#gig { background-position: -240px 0 }
a#ctc { background-position: -320px 0 }

a#hme:hover, a#hme:focus { background-position: 0 -48px }
a#bio:hover, a#bio:focus { background-position: -80px -48px }
a#mus:hover, a#mus:focus { background-position: -160px -48px }
a#gig:hover, a#gig:focus { background-position: -240px -48px }
a#ctc:hover, a#ctc:focus { background-position: -320px -48px }

.hidden { /* Voor de toegankelijkheid en google */
	position: absolute;
	left: 0;
	margin-left: -9999px;
	}

#menu span { /* Voor de toegankelijkheid en google */
	position: absolute;
	z-index: -1;
	text-decoration: underline;
	}

Resultaat
Met vriendelijke groet,
CSShunter
________
PS: met de css3-eigenschap background-size is het uitkijken geblazen: lang niet alle surfers hebben een browser die dat ondersteunt.
 
Ik had eigenlijk al gewacht op een reactie van csshunter hierop :P

Ik ga het direct even uitproberen, lijkt me echt een tof idee!
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan