<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Hvem glor - din bror</title>
	<atom:link href="http://dinbror.dk/blog/feed/" rel="self" type="application/rss+xml" />
	<link>http://dinbror.dk/blog</link>
	<description>Den ikke-så-personlige blog af Bjørn Klinggaard</description>
	<lastBuildDate>Sat, 21 Apr 2012 22:18:14 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>CSS: Alt du bør vide omkring centrering</title>
		<link>http://dinbror.dk/blog/css-alt-du-b%c3%b8r-vide-omkring-centrering/</link>
		<comments>http://dinbror.dk/blog/css-alt-du-b%c3%b8r-vide-omkring-centrering/#comments</comments>
		<pubDate>Mon, 25 Apr 2011 12:34:06 +0000</pubDate>
		<dc:creator>dinbror</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[center]]></category>
		<category><![CDATA[centrering]]></category>
		<category><![CDATA[horisontal]]></category>
		<category><![CDATA[margin]]></category>
		<category><![CDATA[vertikal]]></category>

		<guid isPermaLink="false">http://dinbror.dk/blog/?p=619</guid>
		<description><![CDATA[I min hverdag som webudvikler støder jeg ofte på problematikker, hvor et element skal centreres. Det har til tider givet mig problemer, hvorfor jeg har løst det med hjælp af javascript. I dag har jeg fået mere indsigt i CSS, hvorfor jeg har samlet en række måder, at centrere elementer horisontalt og vertikalt udelukkende ved [...]]]></description>
			<content:encoded><![CDATA[<p>I min hverdag som webudvikler støder jeg ofte på problematikker, hvor et element skal centreres. Det har til tider givet mig problemer, hvorfor jeg har løst det med hjælp af javascript. I dag har jeg fået mere indsigt i CSS, hvorfor jeg har samlet en række måder, at centrere elementer horisontalt og vertikalt udelukkende ved brug af CSS.</p>
<p><a title="CSS centrering" href="http://dinbror.dk/csscenter">Alle CSS centrerings eksempler kan ses i aktion her</a></p>
<h3>Horisontal centrering af tekst og billeder</h3>
<p>Simpel <em>text-align</em> centrering:</p>
<pre>&lt;img src="image.jpg" alt="alternative text" /&gt;
&lt;p&gt;Centered text&lt;/p&gt;

img, p { <strong>text-align:center;</strong> }</pre>
<p>[ <a href="http://dinbror.dk/csscenter/index.html#hct">Se eksempel</a> ]</p>
<h3>Vertikal centrering af tekst og billeder</h3>
<p>I de "gode" gamle tabel dage var det ingen problemer at centrere vertikalt. Men efter <a href="http://en.wikipedia.org/wiki/Tableless_web_design">tabel-fri-design</a> så dagens lys blev det til en større udfordring og nærmest umuligt for mit vedkommende. I dag er det heldigvis blevet "nemt" igen, der er selvfølgelig de normale Internet Explorer, IE, problemer! Tricket er, at få et element til at opføre sig som et tabel element, hvilket gøres vha. <a href="http://www.quirksmode.org/css/display.html">display</a> attributten (<em>display: table; og display:table-cell;</em>). IE 6 og 7 understøtter desværre ikke table værdien, hvorfor en omvej må tages <img src='http://dinbror.dk/blog/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' /> </p>
<pre> &lt;ul&gt;
    &lt;li&gt;
       &lt;a href="#"&gt;
          &lt;span&gt;Vertical&lt;br /&gt;centered&lt;br /&gt;text&lt;/span&gt;
          &lt;!--[if lte ie 7]&gt;&lt;b&gt;&lt;/b&gt;&lt;![endif]--&gt;
       &lt;/a&gt;
    &lt;/li&gt;
    &lt;li&gt;
       &lt;a href="#"&gt;
          &lt;span&gt;Line one&lt;br /&gt;Line two&lt;br /&gt;Line three&lt;/span&gt;
          &lt;!--[if lte ie 7]&gt;&lt;b&gt;&lt;/b&gt;&lt;![endif]--&gt;
       &lt;/a&gt;
    &lt;/li&gt;
    &lt;li&gt;
       &lt;a href="#"&gt;
          &lt;span&gt;Only two&lt;br /&gt;lines here&lt;/span&gt;
          &lt;!--[if lte ie 7]&gt;&lt;b&gt;&lt;/b&gt;&lt;![endif]--&gt;
       &lt;/a&gt;
    &lt;/li&gt;
 &lt;/ul&gt;

 ul { margin:0 auto; width:400px; }
 li { float:left; }
 a { <strong>display: table; height: 100px;</strong> }
 span { <strong>display: table-cell; vertical-align: middle;</strong> }

 <strong>IE 6 + 7 Styling:</strong>
 span { display: inline-block; }
 b { display: inline-block; height: 100%; vertical-align: middle; }</pre>
<p>[ <a href="http://dinbror.dk/csscenter/index.html#vct">Se eksempel</a> ]</p>
<h3>Horisontal centrering af block elementer med fast bredde</h3>
<p>Horisontal centrering med en fast bredde kan løses på mange måder, men den nemmeste og mest rene er immervæk "margin: 0 auto" tricket!</p>
<pre>&lt;ul&gt;
   &lt;li&gt;&lt;a href="#"&gt;Item 1&lt;/a&gt;&lt;/li&gt;
   &lt;li&gt;&lt;a href="#"&gt;Item 2&lt;/a&gt;&lt;/li&gt;
   &lt;li&gt;&lt;a href="#"&gt;Item 3&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

ul { <strong>margin:0 auto; width:400px;</strong> }
li { float:left; width:33,3%;}</pre>
<p>[ <a href="http://dinbror.dk/csscenter/index.html#hcmf">Se eksempel</a> ]</p>
<h3>Horisontal centrering af block elementer med dynamisk bredde</h3>
<p>Horisontal centrering af menuer med dynamisk bredde har givet mig mange kvæler, hvorfor javascript har været min ven. Dette er dog ikke nødvendigt mere, hvorfor en pænere og mere ren løsning med CSS kan bruges <img src='http://dinbror.dk/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<pre>&lt;ul&gt;
   &lt;li&gt;&lt;a href="#"&gt;First item&lt;/a&gt;&lt;/li&gt;
   &lt;li&gt;&lt;a href="#"&gt;Item in the middle&lt;/a&gt;&lt;/li&gt;
   &lt;li&gt;&lt;a href="#"&gt;Last item, no more items&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

ul, li { <strong>float:left; position:relative;</strong> }
ul { <strong>left:50%;</strong> }
li { <strong>right:50%;</strong> }</pre>
<p>[ <a href="http://dinbror.dk/csscenter/index.html#hcmu">Se eksempel</a> ]</p>
<h3>Vertikal og horisontal centrering af baggrundsbilleder</h3>
<p>En meget effektiv men også overset måde at centrere på er vha <em>background-position</em>. Du undrer dig sikkert over, at jeg skriver overset, men det er min erfaring, at udviklere som kun kender løst til CSS ikke kender attributten!</p>
<pre>&lt;div class="bg"&gt;&lt;/div&gt;

.bg { background: url('image.jpg') <strong>center center</strong> no-repeat; }</pre>
<p>[ <a href="http://dinbror.dk/csscenter/index.html#vhcb">Se eksempel</a> ]</p>
<h4 style="text-align: center;"><a title="CSS centrering" href="http://dinbror.dk/csscenter"><span style="color: #ff0000;">Se alle kodeeksempler med vertikal og horisontal centrering her</span></a></h4>
]]></content:encoded>
			<wfw:commentRss>http://dinbror.dk/blog/css-alt-du-b%c3%b8r-vide-omkring-centrering/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tips &amp; tricks til bedre CSS og markup</title>
		<link>http://dinbror.dk/blog/tips-tricks-til-bedre-css-og-markup/</link>
		<comments>http://dinbror.dk/blog/tips-tricks-til-bedre-css-og-markup/#comments</comments>
		<pubDate>Sun, 20 Feb 2011 18:47:20 +0000</pubDate>
		<dc:creator>dinbror</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[conditional comments]]></category>
		<category><![CDATA[divitus]]></category>
		<category><![CDATA[markup]]></category>
		<category><![CDATA[normalisering]]></category>
		<category><![CDATA[oocss]]></category>
		<category><![CDATA[progressiv]]></category>
		<category><![CDATA[præcedens]]></category>
		<category><![CDATA[shortcase]]></category>

		<guid isPermaLink="false">http://dinbror.dk/blog/?p=562</guid>
		<description><![CDATA[Der er gået et år, siden jeg skrev indlægget Sådan laver du perfekt CSS, og jeg er i den tid blevet lidt klogere og fået noget mere erfaring, hvorfor en re-evaluering er på sin plads. Størstedelen af punkterne er stadig gældende, nogle er blevet ligegyldige og nye er opstået. Min påstand er, at alle udviklere [...]]]></description>
			<content:encoded><![CDATA[<p>Der er gået et år, siden jeg skrev indlægget <a title="Sådan laver du perfekt CSS" href="http://dinbror.dk/blog/css-sadan-laver-du-perfekt-css/">Sådan laver du perfekt CSS</a>, og jeg er i den tid blevet lidt klogere og fået noget mere erfaring, hvorfor en re-evaluering er på sin plads. Størstedelen af punkterne er stadig gældende, nogle er blevet ligegyldige og nye er opstået.</p>
<p>Min påstand er, at alle udviklere på et tidspunkt kommer til at støde på front-end arbejde herunder CSS og markup. Mange af de tungere drenge bryder sig ofte ikke om det, hvilket til tider resulterer i spaghetti kode! Om det er manglende interesse/viden eller bare arrogance, skal jeg ikke kunne sige. Ved at følge nogle simple principper kan det hele blive lidt sjovere og nemmere for alle parter, for de tunge drenge, for dem som er begejstret for det og sidst men ikke mindst for dem som skal vedligeholde det efterfølgende.</p>
<h3>1. Markup før CSS</h3>
<p>Lav altid dit markup før du begynder at style. Sørg for at den så vidt muligt er <a href="http://validator.w3.org/">valid</a>, og at den er semantisk opbygget. En god tommelfingerregel er, at ens markup skal give mening uden CSS.</p>
<h3>2. Lav valid kode</h3>
<p>Ligesom med dit markup skal dit CSS være valid. Hvis du er i tvivl, kan du validere dine <em>stylesheets</em> via <a title="W3 CSS validator" href="http://jigsaw.w3.org/css-validator/" target="_self">W3's CSS validator</a>. Mange undervurderer vigtigheden af valid kode, så længe det bare virker. Men ved ikke at have valid kode, kan man ikke være sikker på, at ens kode vil virke i fremtiden. Ved at følge en vis standard undgår vi kaos og monopolisme.</p>
<h3>3. Normalisering</h3>
<p>Normaliser altid dit <em>stylesheet</em> inden du går i gang. Forskellige browsere har forskellige <a href="http://en.wikipedia.org/wiki/Default_%28computer_science%29">default</a> værdier for de forskellige elementer, hvorfor det til tider kan være umuligt at lave en side, der opfører sig ens <a title="Cross-browser" href="http://en.wikipedia.org/wiki/Cross-browser">cross-browser</a> uden brug af reset. Hvor meget eller hvor lidt der skal resettes er en temperamentssag. Herunder er listet nogle eksempler:</p>
<ol>
<li><a href="http://meyerweb.com/eric/thoughts/2007/05/01/reset-reloaded/">CSS Reset Reloaded</a> by Eric Meyer</li>
<li><a href="http://developer.yahoo.com/yui/reset/">Yahoo! UI Library: Reset CSS</a></li>
<li><a href="http://warpspire.com/features/css-frameworks/">CSS Global Styles Reset</a> by Kyle Neath</li>
</ol>
<p>Være opmærksom på at det korte og brugte reset: <strong>* { margin: 0; padding: 0; } </strong> er et misforstået reset. Det er "tungere" at renderer (især med store websider), da det definerer regler for hvert enkelt element i ens dokument og nulstiller alt, hvorfor det <span style="text-decoration: underline;">ikke</span> er anbefalingsværdigt.</p>
<h3>4. Navngivning</h3>
<p>Navngivningen er vigtig og desværre også utrolig undervurderet. Uanset hvad du vælger så vær konsekvent. Hold dig evt. til engelsk, brug <a href="http://en.wikipedia.org/wiki/CamelCase">camelCaseMedLilleBegyndelsebogstav</a> eller adskil ord med bindestreg (-)  og giv som udgangspunkt strukturelle navne frem for <span id="result_box"><span style="background-color: #ffffff;" title="presentational">præsentationsmæssige</span></span>.<br />
Et strukturelt navn beskriver, hvad det er for et element, du vil henvise til frem for et præsentationsmæssigt navn, som beskriver, hvor elementet befinder sig på siden, eller hvordan det ser ud.</p>
<p><span style="background-color: #ffffff;" title="presentational">Præsentationsmæssige navne:<br />
</span></p>
<pre><span style="text-decoration: line-through;">topNav, leftTopLogo, leftContent, redBoldLink</span></pre>
<p>Strukturelle navne:</p>
<pre><span style="color: #0000ff;">primaryNav, branding, mainContent, externalLink</span></pre>
<p>De <span id="result_box"><span style="background-color: #ffffff;" title="presentational">præsentationsmæssige</span></span> navne låser elementet fast, hvorfor de skal undgås. Hvad nu hvis din top menu (#topNav) pludselig skal ligge til venstre for dit indhold? Der findes dog som altid undtagelser, hvor de <span id="result_box"><span style="background-color: #ffffff;" title="presentational">præsentationsmæssige </span></span>navne giver mening, som næste punkt vil illustrere.</p>
<h3>5. Lav genanvendelig kode</h3>
<p>Du er sikkert stødt på ordet "<em>object-oriented CSS</em>" også kaldet OOCSS?! Hvis ikke gør du det nu. Selve navnet, OOCSS, er en smule misvisende og forvirrede mig, da jeg første gang stødte på det. OOCSS er ikke, hvad man traditionelt vil betegne som <a href="http://en.wikipedia.org/wiki/Object_orientated_programming">objekt-orienteret programmering</a>, OOP, men i stedet benytter man nogle af OOPs principper såsom polymorfi, abstraktion, arv mm.<br />
Ideen bag OOCSS er at lave mindre og mere genanvendeligt CSS vha klasser. For en dybere redegørelse henvises til "opfinderens" hjemmeside, <a title="OOCSS" href="http://www.stubbornella.org/content/2009/02/28/object-oriented-css-grids-on-github/">Nicole Sullivan</a>.</p>
<p>Hvordan opnår man så genanvendeligt CSS? Først et eksempel på, hvordan man <span style="text-decoration: underline;">ikke</span> skal gøre:</p>
<pre><strong>CSS:</strong>
#element1 a.btn {background-color:#000;color:#fff;}
#element2 a.btn2 {background-color:#000;color:#fff;}
#element1 a.btnWithBorder {background-color: #000;border:1px solid #ccc;color:#fff;}
<strong>Markup:</strong>
&lt;div id="element1"&gt;
   &lt;a href="#" class="btn"&gt;Knap 1&lt;/a&gt;
   &lt;a href="#" class="btnWithBorder"&gt;Knap 1 med border&lt;/a&gt;
&lt;/div&gt;
&lt;div id="element2"&gt;
   &lt;a href="#" class="btn2"&gt;Knap 2&lt;/a&gt;
&lt;/div&gt;</pre>
<p>Her indkapsler og fastlåser du din knap til et anchor tag samt id element og opnår derved redundans CSS samt kode, der ikke kan genbruges! Fjern afhængighederne og du har genanvendelig kode:</p>
<pre><strong>CSS:</strong>
<span style="color: #0000ff;">.btn {background-color:#000;color:#fff;}
.border {border:1px solid #ccc;}</span>
<strong>Markup:</strong>
&lt;div id="element1"&gt;
   &lt;a href="#" class="<span style="color: #0000ff;">btn</span>"&gt;Knap 1&lt;/a&gt;
   &lt;a href="#" class="<span style="color: #0000ff;">btn border</span>"&gt;Knap 1 med border&lt;/a&gt;
&lt;/div&gt;
&lt;div id="element2"&gt;
   &lt;a href="#" class="<span style="color: #0000ff;">btn</span>"&gt;Knap 2&lt;/a&gt;
&lt;/div&gt;</pre>
<p>Nu kan dine klasser bruges på alle typer af objekter og ikke kun anchor tagget:</p>
<pre>&lt;<span style="color: #0000ff;">button</span> type="button" class="btn"&gt;Knap&lt;/button&gt;
&lt;<span style="color: #0000ff;">div</span> class="btn"&gt;Knap&lt;/div&gt;</pre>
<h3>6. CSS struktur</h3>
<p>CSS strukturen bliver ofte glemt eller nedprioriteret, hvilket er ærgerligt, da den kan spare dig og andre for en masse spildtid! Et godt råd er, at man i sit team/udviklingsmiljø aftaler nogle strukturelle regler, så man nemt kan arbejde på tværs af hinandens projekter.  Eksempler på strukturelle regler kunne være:</p>
<ul>
<li>Stylesheets inddeles i afsnit, fx via sektioner eller <em>selectors</em>.</li>
<li>En regels egenskaber opstilles i alfabetisk rækkefølge for at få et hurtigere overblik (#element { <span style="color: #0000ff;">float: left; height: 250px; width: 250px;</span> }).</li>
<li>Man har et element pr linje kontra en egenskab pr linje i sit stylesheet.</li>
<li>Hierarkisk inddeling.</li>
<li>etc.</li>
</ul>
<p>Hvis det skal have nogen effekt, er det vigtigt, at man er konsekvent. Man laver en ens struktur for at gøre udviklingen nemmere her og nu samt i fremtiden. Når man skal have sit projekt <em>live</em> bliver strukturen ligegyldig, hvorfor man altid skal minify sine stylesheets for at spare kb.</p>
<h3>7. Stylesheets</h3>
<p>Stylesheets skal altid være placeret i toppen fordi:</p>
<ol>
<li><a href="http://www.w3schools.com/css/css_howto.asp">W3</a> dikterer, at stylesheets skal være i toppen (<em>head</em>), medmindre det er<em> inline-styling</em>.</li>
<li>Ved at placere stylesheets i toppen opnår man, at ens side loader  progressivt, hvilket er vigtigt, hvis din side har meget indhold, eller  brugeren sidder bag en langsom forbindelse. Siden viser indholdet så  snart, det er klart, og brugeren har en indikation af, at siden er ved  at loade. Denne indikation er meget vigtig for <a href="http://www.useit.com/papers/responsetime.html">brugervenligheden</a>.  Hvis man derimod indsatte stylesheets nær bunden, ville man i mange  browsere (eksempelvis Internet Explorer) miste den progressiv hentning  og stå tilbage med en hvid blank side, da browsere blokerer renderingen  for at forhindre at skulle gentegne elementer, der måtte ændre sig.</li>
</ol>
<p>Der findes mange meninger omkring, hvordan du opnår den bedste <em>performance</em> samt struktur mht stylesheet inddelingen. Jeg er dog ikke stødt på en løsning, der kan bruges bestandigt og som hos så meget andet, mener jeg, at det skal vurderes fra projekt til projekt. Oftest ender jeg med et setup, hvor jeg samler mit reset jf. punkt 3, klasse objekter jf. punkt 5 og fællesregler (element styling, h1, h2 etc) i et stylesheet og, hvis nødvendigt, et side-specifikt stylesheet (internt eller eksternt), hvor regler der kun gælder for den aktuelle side er.</p>
<h3>8. Brug shortcase</h3>
<p>Brug <em>shortcase</em>, da det formindsker din kode og giver et bedre overblik. Et eksempel illustrer pointen:</p>
<pre>#element { margin-top: 15px; margin-right: 10px; margin-bottom: 15px; margin-left: 10px; }</pre>
<p>bliver til</p>
<pre>#element { <span style="color: #0000ff;">margin: 15px 10px;</span> }</pre>
<p>Du kan også bruge <em>shortcase</em> hos følgende egenskaber; <em>background, border, font, list, margin, outline</em> og <em>padding</em>. <a href="http://www.dustindiaz.com/css-shorthand/">Dustin Diaz</a> har skrevet en fremragende guide til emnet.</p>
<h3>9. Spring mellemledet over</h3>
<p>Som i den virkelige verden er det oftest billigst for forbrugeren, at mellemledet bliver fjernet, og det er det også hos CSS. Mellemledet er ofte ubrugeligt og fylder kun ekstra i dit <em>stylesheet</em>, hvorfor det skal fjernes. Der findes dog situationer, hvor du kan blive tvungen til at inkludere det men som udgangspunkt; <em>fjern det</em>:</p>
<pre>#element ul li a span.class</pre>
<p>bliver til</p>
<pre><span style="color: #0000ff;">.class</span> eller <span style="color: #0000ff;">#element .class</span> hvis man har behov for indkapsling</pre>
<h3>10. Undgå hacks</h3>
<p>Hold dig fra at bruge hacks! Hvad enten det er * hack, _ hack eller lignende. Brug i stedet <a href="http://msdn.microsoft.com/en-us/library/ms537512%28VS.85%29.aspx"><em>Conditional Comments</em></a> til fx at indsætte et Internet Explorer 6 specifikt <em>stylesheet</em>.</p>
<pre style="margin-right: -982px;"><span style="color: #0000ff;">&lt;!--[if IE 6]&gt;</span>
&lt;link type="text/css" href="ie6styling.css" rel="stylesheet"&gt;
<span style="color: #0000ff;">&lt;![endif]--&gt;</span></pre>
<p>Eller til at sætte en klasse på <em>html</em> tagget for derved at kunne style specifikt til en ønsket version af IE.</p>
<pre><span style="color: #0000ff;">&lt;!--[if lt IE 7 ]&gt; &lt;html lang="en" class="no-js ie6"&gt;&lt;![endif]--&gt;
&lt;!--[if IE 7 ]&gt; &lt;html lang="en" class="no-js ie7"&gt;&lt;![endif]--&gt;
&lt;!--[if IE 8 ]&gt; &lt;html lang="en" class="no-js ie8"&gt;&lt;![endif]--&gt;
&lt;!--[if IE 9 ]&gt; &lt;html lang="en" class="no-js ie9"&gt;&lt;![endif]--&gt;
&lt;!--[if (gt IE 9)|!(IE)]&gt;&lt;!--&gt; &lt;html lang="en" class="no-js"&gt; &lt;!--&lt;![endif]--&gt;</span></pre>
<h3>11. Adskillelse</h3>
<p>Markup og CSS er som <a href="http://en.wikipedia.org/wiki/Batman">Batman</a> og <a href="http://en.wikipedia.org/wiki/Robin_%28comics%29">Robin</a>. De er fantastiske sammen, dog kan Batman fint klare sig alene, hvorimod Robin er ubrugelig uden Batman.<br />
Man må aldrig begynde at sammensmelte markup og CSS og lave noget så uhyggeligt som<a href="http://www.w3schools.com/CSS/css_howto.asp"><em> inline styling</em></a>. For at sikre fleksibilitet og overblik er det vigtigt at alt styling adskilles fra markup og kun lever i et <em>stylesheet</em>. Nu siger du sikkert, at der findes situationer, hvor <em>inline-styling</em> er eneste løsning, og ja det gør der, men brug det kun som sidste udvej, og <span style="text-decoration: underline;"><strong>ikke</strong></span> fordi du er doven.</p>
<h3>12. Divitus, classitis og idikus</h3>
<p>Undgå at få divitus, classitis eller idikus. Generelt for alle 3 sygdomme er, at man overforbruger. Man kan sammenligne det med et <a href="http://www.graenseforeningen.dk/aab98.html">sønderjysk kaffebord</a>, hvor der minimum er 14 forskellige kager, 7 bløde og 7 hårde, hvilket er helt unødvendigt. Derimod ville 1-2 kager fra hver kategori have været rigeligt.<br />
Divitus er når man bruger for mange div'er. Mange nybegynder har en tendens til at smide en <em>div</em> rundt om alt:</p>
<pre>&lt;div id="mainHeader"&gt;&lt;h1&gt;Min overskift&lt;/h1&gt;&lt;/div&gt;</pre>
<p>Div'en er ikke nødvendig, og man kan i stedet skrive</p>
<pre><span style="color: #0000ff;">&lt;h1&gt;Min overskrift&lt;/h1&gt;</span></pre>
<p>og så style på <em>h1</em> i stedet for #mainHeader. Dog må man ikke være bange for at bruge div'er!  Jeg kan godt lide <a href="http://diveintohtml5.org/semantics.html">html5 tankegangen</a>, som giver bedre overblik og en pænere struktur, hvorfor jeg til tider indkapsler hovedområder i en div med et sigende id!</p>
<p>Classitis og idikus minder meget om divitus:</p>
<pre>&lt;ul id="unsortedList"&gt;
  &lt;li class="listItem firstItem"&gt;Item 1&lt;/li&gt;
  &lt;li class="listItem"&gt;Item 2&lt;/li&gt;
  &lt;li class="listItem"&gt;Item 3&lt;/li&gt;
&lt;/ul&gt;</pre>
<p>Det er ikke nødvendigt at overklistre alle <em>selectors</em> med klasser og id'er:</p>
<pre><span style="color: #0000ff;">&lt;ul&gt;
  &lt;li&gt;Item 1&lt;/li&gt;
  &lt;li&gt;Item 2&lt;/li&gt;
  &lt;li&gt;Item 3&lt;/li&gt;
&lt;/ul&gt;</span></pre>
<p>Brug i stedet de elementer der allerede er til rådighed (ul, li) og, hvis IE6 også er død for dig, de smarte og hjælpefulde <a href="http://www.w3.org/TR/CSS2/selector.html">CSS selectors</a>!<span style="color: #0000ff;"><em> </em></span></p>
<pre><span style="color: #0000ff;">li:first-child  </span> = Første li element.
<span style="color: #0000ff;">ul &gt; li</span>          = Alle <em>ul</em>'ers børn der er <em>li</em>.
<span style="color: #0000ff;">li + li</span>          = Alle <em>li</em>'er der har samme forældre,
                   og hvor der kommer en <em>li</em> lige efter en <em>li</em>.</pre>
<h3>13. Vær god til matematik</h3>
<p>Undersøgelser har vist, at personer med gode matematiske færdigheder har nemmere ved at programmere, hvilket også gavner, når man skal forstå, hvilken regel der er præcedens ved kollision. Fx kan et element have 2 regler der modsiger hinanden:</p>
<pre>HTML:
&lt;h1 class="h1"&gt;Header&lt;/h1&gt;

CSS:
.h1{color:white;}
h1{color:black;}</pre>
<p>Mange vil måske tro, at sidste regel altid er vigtigst, og at header teksten derfor vil være sort! Men hos CSS er der andre faktorer, der spiller ind. Først vægtes måden din styling bliver indlæst på:</p>
<pre>1. prioritet: Inline styling
2. prioritet: Internt stylesheet
3. prioritet: Eksternt stylesheet
(4. prioritet: Browser default)</pre>
<p>Dernæst vægtes attributterne:</p>
<pre>li             {...}  /* a=0 b=0 c=1 -&gt; specificity =   1 */
ul li          {...}  /* a=0 b=0 c=2 -&gt; specificity =   2 */
ul ol li       {...}  /* a=0 b=0 c=3 -&gt; specificity =   3 */
li.class       {...}  /* a=0 b=1 c=1 -&gt; specificity =  11 */
ul ol li.class {...}  /* a=0 b=1 c=3 -&gt; specificity =  13 */
#element       {...}  /* a=1 b=0 c=0 -&gt; specificity = 100 */</pre>
<p>hvor <strong>a</strong> repræsentere antal #id attributter, <strong>b</strong> antal klasse attributter og <strong>c</strong> antal tag elementer.  Jo højere tallet er, jo højere vægtning. I fornævnte eksempel vil header teksten være hvid, da klassen (.h1) vægtes med 10 point og tagget (h1) med 1 point.</p>
<h3>14. Vær progressiv</h3>
<p>I stedet for at udvikle til laveste fællesnævner, bør man være progressiv og anvende den nye teknologi, browsere løbende får, så længe siden stadig fungerer funktionelt hos laveste fællesnævner. Fx understøtter firefox bl.a. <em><a href="http://hacks.mozilla.org/2009/12/file-drag-and-drop-in-firefox-3-6/">drag and drop </a></em><a href="http://hacks.mozilla.org/2009/12/file-drag-and-drop-in-firefox-3-6/">af filer</a>, hvor en bruger, der skal uploade en fil, kan <em>dragge </em>og <em>droppe </em>filen direkte ind i browseren og derved spare adskillige kliks. IE understøtter i skrivende stund ikke denne feature, hvorfor det selvfølgelig stadig skal være muligt at uploade en fil på den gammeldags måde. Her får brugeren med den bedre browsere bare en bedre oplevelse.</p>
<p>Et andet eksempel kunne være, hvor du har et element, der skal have runde hjørner og en <em>gradient </em>baggrund. I stedet for at skulle være afhængig af et stykke grafik eller flere, kan du lave runde hjørner samt gradient med CSS. Dette understøttes dog ikke i alle browser, nærmere bestemt IE, så når man udvikler efter laveste fællesnævner, bliver man nødt til at løse det med grafik, som gør siden tungere. Men nu er vi jo progressive, og derfor vælger vi den lettere og elegante CSS løsning, og lader brugerne af IE se et firkantet element med fast baggrund, og alle andre et lækkert rundt element med gradient. Siden kan stadig bruges af IE brugere, og IE brugerne ser stadig samme indhold, som andre brugere. Dog kan designere være tunge at danse med, og ofte kan det ende i et kompromis, hvor man bruger CSS3 de steder, der understøtter det og ellers grafik (IE).</p>
<h3>15. Kend dine elementer</h3>
<p>Som med alle programmeringssprog er det en god ide at kende til basis funktionaliteterne. Nogle gange er området dog så stort, at en del erfaring er påkrævet. CSS har derimod et overkommeligt antal basis elementer, der derfor gør det hurtigere og nemmere at få et overblik og derved at kunne vælge de rigtige elementer i den rigtige situation. Lær elementerne at kende før du går i gang, float vs. position, display vs. visibility, tabel vs. div etc.</p>
<h3>16. Centrer med margin</h3>
<p>Centrer med margin: 0 auto; i stedet for fx at fastkode en fast <em>padding</em> i venstre side. For at centrer med margin skal du definere en bredde:</p>
<pre>#element { <span style="color: #0000ff;">margin: 0 auto;</span> width: 800px; }</pre>
<h3>17. Vær doven</h3>
<p>Sidste punkt som i øvrigt gælder programmering generelt er, at man skal være doven. Der findes et utal af udviklere, som allerede har haft de problemstillinger, som du støder på, hvorfor det vil være fjollet ikke at benytte sig af deres viden og erfaringer. Genbrug dine og andres komponenter og brug de erfaringer, der allerede er tilgængelige. I CSS støder man på mange lignende problemstillinger, hvorfor man nemt kan ende som <a href="http://da.wikipedia.org/wiki/Sisyfos">Sisyfos</a>!</p>
<h3>SLUT</h3>
<p>Det var mit bud på, hvordan man ved hjælp af nogle simple principper, opnår bedre og mere overskueligt CSS og markup. Vigtigst af alt er, at man er konsekvent hele vejen igennem og tro mod kode standarderne. Sammen kan vi gøre verden til et bedre sted!</p>
<p><strong>P.S. Har jeg glemt noget, eller er du bare dybt enig/uenig så smid gerne en kommentar.</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://dinbror.dk/blog/tips-tricks-til-bedre-css-og-markup/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>bPopup</title>
		<link>http://dinbror.dk/blog/bpopup/</link>
		<comments>http://dinbror.dk/blog/bpopup/#comments</comments>
		<pubDate>Wed, 14 Jul 2010 11:00:08 +0000</pubDate>
		<dc:creator>dinbror</dc:creator>
				<category><![CDATA[Programmering]]></category>
		<category><![CDATA[bpopup]]></category>
		<category><![CDATA[dialog]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[modal]]></category>
		<category><![CDATA[overlay]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[popup]]></category>

		<guid isPermaLink="false">http://dinbror.dk/blog/?p=390</guid>
		<description><![CDATA[21.04.12: New release, bPopup version 0.7.0 bPopup is a learning and exploring jQuery project. It's a lightweight cross browser jQuery popup plugin. It's not creating your popup but doing all the logic as opening, closing, centering on resize &#38; scroll, creating a modal overlay etc. It can open any container you create with all kinds of [...]]]></description>
			<content:encoded><![CDATA[<blockquote>
<h3><span style="color: #ff6600;">21.04.12: </span><span style="color: #ff6600;">New release, bPopup version 0.7.0</span></h3>
</blockquote>
<p>bPopup is a learning and exploring jQuery project. It's a lightweight cross browser jQuery popup plugin. It's not creating your popup but doing all the logic as opening, closing, centering on resize &amp; scroll, creating a modal overlay etc. It can open any container you create with all kinds of content. bPopup has been tested in IE<del>6</del>7-9, FF2-7, Opera 9-10, Safari 4-5 and Chrome 4-15.</p>
<div style="text-align: center;"><a href="http://dinbror.dk/bpopup"><img class="alignnone size-full wp-image-485" title="DEMO" src="http://dinbror.dk/blog/wp-content/uploads/2010/06/Demobtn3.png" alt="DEMO" width="200" height="100" /></a><a href="http://dinbror.dk/downloads/jquery.bpopup-0.7.0.min.js"><img class="alignnone size-full wp-image-490" title="Download" src="http://dinbror.dk/blog/wp-content/uploads/2010/06/DLbtn6.png" alt="Download" width="200" height="100" /></a></div>
<h3><strong>Contents</strong></h3>
<ol>
<li><a href="#Usage">How to use bPopup</a></li>
<li><a href="#Options">Options (API)</a></li>
<li><a href="#Changelist">Changelist</a></li>
<li><a href="#WhatCanYouDo">What can you do?</a></li>
<li><a href="#Downloads">Downloads</a></li>
</ol>
<h3 id="Usage">How to use bpopup</h3>
<p>Basic example that will bind a click event which will trigger bPopup when fired. Add a reference to the jquery core lib (newer than 1.3.x) and bPopup. Please don't hotlink to bPopup:</p>
<pre>    &lt;script src="<span class="code-string">http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js</span>"&gt;&lt;/script&gt;
    &lt;script src="<span class="code-string">jquery.bpopup-x.x.x.min.js</span>"&gt;&lt;/script&gt;</pre>
<p><strong>Markup:</strong></p>
<pre>    &lt;html&gt;
        &lt;head&gt; ... &lt;/head&gt;
        &lt;body&gt;
          ...
            <span class="code-comment">&lt;!-- Button that triggers the popup --&gt;</span>
            &lt;button&gt;<span class="code-string">POP IT UP</span>&lt;/button&gt;
            <span class="code-comment">&lt;!-- Element to pop up --&gt;</span>
            &lt;div&gt;<span class="code-string">Content of popup</span>&lt;/div&gt;
          ...
        &lt;/body&gt;
    &lt;/html&gt;</pre>
<p><strong>CSS:</strong></p>
<pre>    element_to_pop_up { display:none; }</pre>
<p><strong>The magic:</strong></p>
<pre>    <span class="code-comment">// Semicolon (;) to ensure closing of earlier scripting</span>
    <span class="code-comment">// Encapsulation</span>
    <span class="code-comment">// $ is assigned to jQuery</span>
    ;(<span class="code-function">function</span>($) {

        <span class="code-comment"> // DOM Ready</span>
        $(<span class="code-function">function</span>() {

            <span class="code-comment">// Binding a click event</span>
            <span class="code-comment">// From jQuery v.1.7.0 use .on() instead of .bind()</span>
            $(<span class="code-string">'button'</span>).bind(<span class="code-string">'click'</span>, <span class="code-function">function</span>(e) {

                <span class="code-comment">// Prevents the default action to be triggered. </span>
                e.preventDefault();

                <span class="code-comment">// Triggering bPopup when click event is fired</span>
                $(<span class="code-string">'element_to_pop_up'</span>).bPopup();

            });

        });

    })(jQuery);</pre>
<p>Or with custom settings</p>
<pre>    ;(<span class="code-function">function</span>($) {
        $(<span class="code-function">function</span>() {
            $(<span class="code-string">'button'</span>).bind('<span class="code-string">click'</span>, <span class="code-function">function</span>(e) {
                e.preventDefault();
                $(<span class="code-string">'element_to_pop_up'</span>).bPopup({
                    appendTo: <span class="code-string">'form'</span>
                    , zIndex: <span class="code-int">2</span>
                    , modalClose: <span class="code-function">false</span>
                });
            });
         });
     })(jQuery);</pre>
<p id="Options">Enjoy</p>
<h3>Options</h3>
<table style="border: 0px none; height: 506px;" width="100%" border="0">
<tbody>
<tr>
<td style="background-color: #1e1e1e;" colspan="2"><span style="color: #ffffff;"><strong>API – name [<em>type</em>] (default value)</strong></span></td>
</tr>
<tr>
<td width="30%"><strong>amsl</strong><strong> </strong>[<em>int</em>] (50)</td>
<td>Above Mean Sea Level. Vertical distance from the middle of the window, + = above, - = under.</td>
</tr>
<tr>
<td width="30%"><strong>appendTo </strong>[<em>string</em>] (’body’)</td>
<td>Element to append popup (and modal overlay) to. For asp.net sites append to 'form'.</td>
</tr>
<tr>
<td width="30%"><strong>appending </strong>[<em>bool</em>] (true)</td>
<td>Should the popup append to an element or just open where it is?  <strong>Version 0.7.0</strong></td>
</tr>
<tr>
<td width="30%"><strong>closeClass</strong> [<em>string</em>] ('bClose')</td>
<td>Class to bind the close event to. <strong>Version 0.3.3</strong></td>
</tr>
<tr>
<td width="30%"><strong>content</strong> [<em>string</em>] ('ajax')</td>
<td>Content of bpopup. Types: ['ajax', 'iframe', '<span style="text-decoration: line-through;">xlink</span>']. If loadUrl isn't defined it'll not use content type. <strong>Version 0.4.1</strong></td>
</tr>
<tr>
<td width="30%"><strong>contentContainer</strong> [<em>string</em>] (null)</td>
<td>Element which content should be added to. If undefined/null it will add it to $(this). Usage contentContainer:'.element' or contentContainer:'#element'.  <strong>Version 0.4.1</strong></td>
</tr>
<tr>
<td width="30%"><strong>escClose</strong> [<em>bool</em>] (true)</td>
<td>Should popup close when press on escape?</td>
</tr>
<tr>
<td width="30%"><strong>fadeSpeed</strong> [<em>int</em>/string] (250)</td>
<td>Animation speed on fadeIn/out. <strong>Version 0.3.6</strong></td>
</tr>
<tr>
<td width="30%"><strong>follow</strong> [<em>bool,</em><em>bool</em>] ([true,true])</td>
<td>Should the popup follow the screen vertical and/or horizontal on scroll/resize? [horizontal, vertical, <span style="text-decoration: line-through;">fixed on screen</span> (see positionStyle instead)] <strong>Version 0.3.6. <span style="color: #ff0000;">Changed in version 0.5.0 and again in version 0.6.0 and again in version 0.7.0.</span></strong></td>
</tr>
<tr>
<td width="30%"><strong>followSpeed</strong> [<em>int/string</em>] (500)</td>
<td>Animation speed for the popup on scroll/resize. <strong>Version 0.3.6</strong></td>
</tr>
<tr>
<td width="30%"><strong>loadUrl</strong> [<em>string</em>] (null)</td>
<td>External page or selection to load in popup.  <strong>Version 0.3.4</strong></td>
</tr>
<tr>
<td width="30%"><strong>modal</strong> [<em>boolean</em>] (true)</td>
<td>Should there be a modal overlay behind the popup?</td>
</tr>
<tr>
<td width="30%"><strong>modalClose</strong> [<em>bool</em>] (true)</td>
<td>Should the popup close on click on overlay? <strong>Version 0.4.0</strong></td>
</tr>
<tr>
<td width="30%"><strong>modalColor</strong> [<em>string</em>] ('#000')</td>
<td>What color should the overlay be? <strong>Version 0.3.5</strong></td>
</tr>
<tr>
<td width="30%"><strong>opacity</strong> [<em>float</em>] (0.7)</td>
<td>Transparency, from 0.1 to 1.0 (filled). <strong>Version 0.3.3</strong></td>
</tr>
<tr>
<td width="30%"><strong>position</strong> [int,int] (['auto','auto'])</td>
<td>Defines the position where the popup should pop up. 'auto' = center, [horizontal, vertical]  <strong>Version 0.5.0. <span style="color: #ff0000;">Changed in version 0.7.0</span></strong>, swapped positions so it's now x, y instead of y, x</td>
</tr>
<tr>
<td width="30%"><strong>positionStyle</strong> [string] ('absolute')</td>
<td>How you the popup follow? Position 'absolute' or 'fixed'  <strong>Version 0.7.0</strong></td>
</tr>
<tr>
<td width="30%"><strong>scrollBar</strong> [<em>bool</em>] (true)</td>
<td>Should scrollbar be visible?</td>
</tr>
<tr>
<td width="30%"><strong>zIndex</strong> [<em>int</em>] (9999)</td>
<td>Popup z-index, modal overlay = popup z-index - 1.</td>
</tr>
</tbody>
</table>
<table style="border: 0px none; height: 50px;" width="100%" border="0">
<tbody>
<tr>
<td style="background-color: #1e1e1e;" colspan="2"><span style="color: #ffffff;"><strong>Events</strong></span></td>
</tr>
<tr>
<td width="30%"><strong>callback</strong></td>
<td>Event fires after the popup has loaded.</p>
<p>Usage: $('element_to_pop_up').bPopup({ //options }, function(){ //callback }); <strong>Version 0.3.5</strong></td>
</tr>
<tr>
<td width="30%"><strong>onOpen</strong></td>
<td>Event fires before the popup opens.</p>
<p>Usage: $('element_to_pop_up').bPopup({ onOpen: function(){ //doMagic }});  <strong>Version 0.5.0</strong></td>
</tr>
<tr>
<td width="30%"><strong>onClose</strong></td>
<td>Event fires after the popup closes.</p>
<p>Usage: $('element_to_pop_up').bPopup({ onClose: function(){ //doMagic }}); <strong>Version 0.5.0</strong></td>
</tr>
</tbody>
</table>
<table style="border: 0px none; height: 50px;" width="100%" border="0">
<tbody>
<tr>
<td style="background-color: #1e1e1e;" colspan="2"><span style="color: #ffffff;"><strong>Public Function</strong></span></td>
</tr>
<tr>
<td width="30%"><strong>close()</strong></td>
<td>Closes the popup.</p>
<p>Usage: $('element_to_pop_up').bPopup().close(); <strong>Version 0.4.0</strong></td>
</tr>
</tbody>
</table>
<table style="border: 0px none; height: 50px;" width="100%" border="0">
<tbody>
<tr>
<td style="background-color: #1e1e1e;" colspan="2"><span style="color: #ffffff;"><strong>Recycle Bin - not there anymore</strong></span></td>
</tr>
<tr>
<td width="30%"><span style="text-decoration: line-through;"><strong>duration</strong></span>[<em>int/string</em>] ('normal')</td>
<td>Animation speed.<span style="color: #ff0000;"><strong>Removed in version 0.3.6</strong></span> - See fadeSpeed and followSpeed.</td>
</tr>
<tr>
<td width="30%"><span style="text-decoration: line-through;"><strong>minTop</strong></span> [<em>int</em>] (20)</td>
<td>Minimum distance from top to popup. <span style="color: #ff0000;"><strong>Removed in version 0.3.6</strong></span></td>
</tr>
<tr>
<td width="30%"><span style="text-decoration: line-through;"><strong>vStart </strong></span>[<em>int</em>] (null)</td>
<td>Vertical start position for popup. <strong>Version 0.3.6 </strong><span style="color: #ff0000;"><strong>Removed in version 0.5.0 </strong></span><span style="color: #000000;">- See Position.</span></td>
</tr>
<tr>
<td width="30%"><span style="text-decoration: line-through;"><strong>xLink</strong></span> [<em>boolean</em>] (false)</td>
<td>Is the popup a xlink popup? <strong>Version 0.3.4, </strong><span style="color: #ff0000;"><strong>Removed in version 0.4.1 </strong></span><span style="text-decoration: line-through;">use content type instead (content:'xlink')</span></td>
</tr>
</tbody>
</table>
<h3 id="Changelist">Changelist</h3>
<p><strong>0.7.0 change-list (21.04.12):</strong></p>
<ul>
<li>Bugfix: Multiple popup count fix (Thanks to Michael for reporting)</li>
<li>Bugfix: Callback now returns 'this' instead of 'window' (Thanks to Jeppe for reporting)</li>
<li>Bugfix: Scroll before popup is loaded opacity fix</li>
<li>Bugfix: Moved initialization of popup to after onOpen event so it will center properly when adding stuff onOpen.</li>
<li>Changed: <strong style="color: #ff0000;">Important note</strong> - Swapped arguments in Position so it now takes [x, y] instead of [y, x] like everything else in the world.</li>
<li>Changed: <strong style="color: #ff0000;">Important note</strong> - Also swapped arguments in Follow so it also takes [x, y] instead of [y, x] and removed third argument. See positionStyle instead.</li>
<li>New option: appending: true. Defines if the popup should append to an element or just open where it is.</li>
<li>New option: positionStyle: 'absolute'. Defines the position style which has impact on how the popup follows on scroll and resize. Absolute or fixed.</li>
<li>Removed private function, getDistanceToBodyFromLeft().</li>
</ul>
<p><strong>0.6.0 change-list (29.10.11):</strong></p>
<ul>
<li>New feature: Supports multiple bPopups. Now you can open all the bPopups you want on top of each other.</li>
<li>New feature: Won't follow if popup is bigger then the window.</li>
<li>Changed: Added 3rd parameter to follow, default false. If true the popup will be fixed on the screen.</li>
<li>Removed: Browser detecting is bad why I removed the check for IE6. IE6 doesn't support position: fixed but I don't support IE6 any more. I'm afraid I killed it. It's easy to add if you still need to support IE6.</li>
</ul>
<p><strong>0.5.1 change-list (13.04.11):</strong></p>
<ul>
<li>Bugfix: Added a duration time to the hide() call so onOpen and loadUrl always will be trigged when needed.</li>
<li>Bugfix: Added frameborder="0" and scrolling="no" to iframe to remove borders in IE. Removed width="100%" and height=100%" from iframe so you have full control over the iframe</li>
<li>Code update: updated the logic regarding follow and position</li>
</ul>
<p><strong>0.5.0 change-list (12.03.11):</strong></p>
<ul>
<li><span style="color: #ff0000;"><strong>bPopup, now with more control and features</strong>!</span></li>
<li>New events: onOpen and onClose</li>
<li>New option: Position['auto','auto']. Replacing vStart. Gives you full control where the popup should be.</li>
<li>Changed option: follow changed to array of booleans, follow[true,true]. Defines if the popup should follow vertical and/or horizontal.</li>
<li>Changed option: default value for amsl changed from 150px to 50px.</li>
<li>Removed option: vStart, see Position.</li>
<li>Removed feature: the popup doesn't auto reset input fields or auto focus any more. If you need this feature do the magic inside the onOpen event.</li>
<li>Removed feature: xlink removed from content type. Instead do the xlink stuff inside the onOpen event.</li>
<li>Bugfix: Modal overlay fits whole screen on an iphone in safari.</li>
<li>Known issue: The popup doesn't center properly when zooming on an iphone in safari.</li>
</ul>
<p><strong>0.4.1 change-list (17.10.10):</strong></p>
<ul>
<li>New option: content, now it's possible to load content into the popup through Ajax or in an iframe. It takes the url from loadUrl.</li>
<li>New option: contentContainer, gives you the possibility to load content into a small area of the popup e.g. a div at the bottom.</li>
<li>Removed option: xLink, use content type instead (content:'xlink')!</li>
</ul>
<p><strong>0.4.0 change-list (22.09.10):</strong></p>
<ul>
<li><span style="color: #ff6600;"><strong>Attention</strong></span>: In this update there has been changes that affect how you interact with the popup!</li>
<li>New option: modalClose (should the popup close on click on overlay?)</li>
<li>New way to create the popup.You should now call <strong>$(selector).bPopup()</strong> instead of <span style="text-decoration: line-through;">$(selector).openPopup()</span>.</li>
<li>New way to force popup to close. Force close by calling the public function close(), <strong>$(selector).bPopup().close()</strong>, instead of triggering the close event with <span style="text-decoration: line-through;">$('.bClose').closePopup()</span>. This will stop cluttering up the <code>$.fn</code> namespace.</li>
<li>Changed default value for opacity from 0.5 to 0.7</li>
<li>Ensures that the same popup can't be opened twice at a time.</li>
<li>Next update will include support for iframes, generic xlink support and more.</li>
</ul>
<p><strong>0.3.6 change-list (14.07.10):</strong></p>
<ul>
<li>New options: fadeSpeed, follow, followSpeed, vStart</li>
<li>Deleted: duration, minTop</li>
<li>Included position:absolute styling on popup in plugin</li>
</ul>
<p><strong>0.3.5 change-list (05.07.11):</strong></p>
<ul>
<li>New option: modalColor</li>
<li>bPopup can now take callback functions</li>
</ul>
<p><strong>0.3.4 change-list:</strong></p>
<ul>
<li>New option: loadUrl</li>
<li>The popup can now open an url inside the popup</li>
<li>Implemented x-link feature</li>
<li>Refactored code, created private help functions</li>
<li>Changed default value for scrollBar to true</li>
</ul>
<p><strong>0.3.3 change-list:</strong></p>
<ul>
<li>New options: opacity, closeClass</li>
<li>Changed modal overlay to position fixed in supported browsers. Non position fixed supported browsers still uses position absolute.</li>
<li>Added default close event</li>
<li>Fixed issue with overlay in IE6+7 and body positioned relative with a width</li>
</ul>
<p><strong>0.3.2 change-list:</strong></p>
<ul>
<li>Modal overlay width miscalculation on resize.</li>
<li>Auto textfield focus</li>
<li>Resetting textfields before showing popup</li>
</ul>
<p><strong>0.3.1 change-list:</strong></p>
<ul>
<li>New options: escClose, zIndex and minTop.</li>
<li>Fixed bug with modal overlay when body has position: relative and a width. Now calculates the distance from the left to the body.</li>
</ul>
<p><strong>0.3.0 change-list:</strong></p>
<ul>
<li>Unbind events on close.</li>
<li>Centering popup on resize.</li>
<li>Centering popup on horizontal scroll.</li>
<li>Refactor code.</li>
</ul>
<h3 id="WhatCanYouDo">What can you do?</h3>
<ul>
<li>Report bugs</li>
<li>Help optimizing code</li>
<li>Give suggestions</li>
</ul>
<h3 id="Downloads">Downloads</h3>
<p><a href="../../downloads/jquery.bpopup-0.7.0.min.js">v 0.7.0 minified</p>
<p></a><a href="../../downloads/jquery.bpopup-0.6.0.js">v 0.6.0 developer</p>
<p></a><a href="../../downloads/jquery.bpopup-0.6.0.min.js">v 0.6.0 minified</a></p>
<p><a href="../../downloads/jquery.bpopup-0.5.1.js">v 0.5.1 developer</a></p>
<p><a href="../../downloads/jquery.bpopup-0.5.1.min.js">v 0.5.1 minified</p>
<p></a><a href="../../downloads/jquery.bpopup-0.5.0.js">v 0.5.0 developer</a></p>
<p><a href="../../downloads/jquery.bpopup-0.5.0.min.js">v 0.5.0 minified</a></p>
<p><a href="../../downloads/jquery.bpopup-0.4.1.js">v 0.4.1 developer</a></p>
<p><a href="../../downloads/jquery.bpopup-0.4.1.min.js">v 0.4.1 minified</a></p>
<p><a href="../../downloads/jquery.bpopup-0.4.0.js">v 0.4.0 developer</a></p>
<p><a href="../../downloads/jquery.bpopup-0.4.0.min.js">v 0.4.0 minified</a></p>
<p><a href="../../downloads/jquery.bpopup-0.3.6.js">v 0.3.6 developer</a></p>
<p><a href="../../downloads/jquery.bpopup-0.3.6.min.js">v 0.3.6 minified</a></p>
<p><a href="../../downloads/jquery.bpopup-0.3.5.js">v 0.3.5 developer</a></p>
<p><a href="../../downloads/jquery.bpopup-0.3.5.min.js">v 0.3.5 minified</a></p>
]]></content:encoded>
			<wfw:commentRss>http://dinbror.dk/blog/bpopup/feed/</wfw:commentRss>
		<slash:comments>191</slash:comments>
		</item>
		<item>
		<title>CSS: Sådan bruger du @font-face</title>
		<link>http://dinbror.dk/blog/css-sadan-bruger-du-font-face/</link>
		<comments>http://dinbror.dk/blog/css-sadan-bruger-du-font-face/#comments</comments>
		<pubDate>Sun, 04 Jul 2010 17:15:26 +0000</pubDate>
		<dc:creator>dinbror</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[@font-face]]></category>
		<category><![CDATA[base64]]></category>
		<category><![CDATA[eot]]></category>
		<category><![CDATA[firefox]]></category>
		<category><![CDATA[otf]]></category>
		<category><![CDATA[svg]]></category>
		<category><![CDATA[ttf]]></category>
		<category><![CDATA[woff]]></category>

		<guid isPermaLink="false">http://dinbror.dk/blog/?p=452</guid>
		<description><![CDATA[OPDATERET: Efter at Internet Explorer 9 har set dagens lys, er man tvungen til en syntaks ændring, hvis man vil have en bulletproof @font-face syntaks! Se mere under afsnittet "Hvordan bruger man font-face?". Hvorfor bruge font-face? I dag er vi sørgeligt nok stadig begrænset af få standard fonte, der er websikre. Man kan dog altid [...]]]></description>
			<content:encoded><![CDATA[<blockquote style="background-color: yellow;"><p><strong>OPDATERET</strong>: Efter at Internet Explorer 9 har set dagens lys, er man tvungen til en syntaks ændring, hvis man vil have en bulletproof @font-face syntaks! Se mere under afsnittet "Hvordan bruger man font-face?".</p></blockquote>
<h3><strong>Hvorfor bruge font-face?</strong></h3>
<p>I dag er vi sørgeligt nok stadig begrænset af få <a href="http://dustinbrewer.com/fonts-on-the-web-and-a-list-of-web-safe-fonts/">standard fonte</a>, der er websikre. Man kan dog altid bruge ikke-websikre fonte og håbe på, at ens brugere har den valgte font på sin computer. Dette er selvfølgeligt meget usikkert, og man risikerer at ødelægge sit design samt struktur, hvorfor man i stedet <em>embetter</em> sine specielle fonte i form af grafik. Men takket være font-face er den tid nu ovre.</p>
<p><strong>Ulemper ved grafik <em>embetting</em>:</strong></p>
<ul>
<li> <strong>Ekstra arbejde </strong>- Hver gang du vil bruge din font, skal du lave det som grafik. En lille rettelse betyder, at designeren skal åbne sit billedbehandling program, lave rettelsen, gemme filen i det ønskede billedformat og uploade billedet.</li>
<li><strong>Tungere sider </strong>- I stedet for ren tekst har du grafik, som fylder mere og koster HTTP-requests. Stor skift størrelse = stor grafik.</li>
<li><strong>Manglende indeksering </strong>- <a href="http://en.wikipedia.org/wiki/Web_crawler"><em>Web crawlers</em></a> kan ikke indeksere tekst i grafik. Dog kan (<em>læs</em> skal) man give sine billeder <a href="http://www.w3schools.com/tags/tag_IMG.asp"><em>alt</em></a> beskrivelser, hvilke bliver indekseret.</li>
</ul>
<p><strong>Ulemper ved font-face:</strong></p>
<ul>
<li><strong>Manglende standard </strong>- I skrivende stund findes der desværre ikke et font format, der understøttes af de meste brugte browsere, hvorfor det kræver, at man som minimum har fonten i formatet .eot, .ttf og .svg. Som det kan ses af nedenstående tabel tyder det dog på, at <a href="http://en.wikipedia.org/wiki/Web_Open_Font_Format">WOFF</a> bliver fremtidens standard webfont format!</li>
</ul>
<h3>Font-face browser support</h3>
<table style="height: 124px;" border="0">
<thead>
<tr style="background-color: #aaa; color: #ffffff;">
<td style="width: 180px;"><span style="color: #000000;"><strong>Browser</strong></span></td>
<td style="width: 320px;"><span style="color: #000000;"><strong>Format</strong></span></td>
<td style="width: 150px;"><span style="color: #000000;"><strong>Supporteret siden</strong></span></td>
</tr>
</thead>
<tbody>
<tr style="background-color: #eee;">
<td>Gecko/Mozilla/Firefox</td>
<td><strong>ttf </strong>(<em>TrueType/OpenType</em>),<strong><br />
otf</strong> (<em>OpenType PS</em>),<br />
<strong>woff</strong> (<em>Web Open Font Format</em>)<br />
- woff er understøttet fra v. 3.6</td>
<td style="text-align: center;">v. 3.5</td>
</tr>
<tr style="background-color: #ccc;">
<td>Internet Explorer</td>
<td><strong>eot</strong> (<em>Embedded OpenType</em>)<br />
<strong>woff</strong> (<em>Web Open Font Format</em>)<br />
- woff er understøttet fra v. 9</td>
<td style="text-align: center;">v. 4</td>
</tr>
<tr style="background-color: #eee;">
<td>Webkit/Safari</td>
<td><strong>ttf </strong>(<em>TrueType/OpenType</em>),<strong><br />
otf</strong> (<em>OpenType PS</em>),<strong><br />
iPhone/iPad</strong> understøtter kun<br />
<strong>svg</strong> (<em>Scalable Vector Graphics</em>)</td>
<td style="text-align: center;">v. 3.1</td>
</tr>
<tr style="background-color: #ccc;">
<td>Google Chrome</td>
<td><strong>ttf </strong>(<em>TrueType/OpenType</em>),<strong><br />
otf</strong> (<em>OpenType PS</em>)<br />
<strong>woff</strong> (<em>Web Open Font Format</em>)<br />
- woff er understøttet fra v.6</td>
<td style="text-align: center;">v. 4</td>
</tr>
<tr style="background-color: #eee;">
<td>Opera</td>
<td><strong>ttf </strong>(<em>TrueType/OpenType</em>),<strong><br />
otf</strong> (<em>OpenType PS</em>),<br />
<strong>svg</strong> (<em>Scalable Vector Graphics</em>)</td>
<td style="text-align: center;">v. 10</td>
</tr>
</tbody>
</table>
<h3>Hvordan bruger man font-face?</h3>
<p>En mere dybdegående forklaring på font-face syntaks kan læses på Paul Irish blog indlæg; <a href="http://paulirish.com/2009/bulletproof-font-face-implementation-syntax/">Bulletproof @font-face syntax</a>. Nedenstående eksempel er mit forslående minimum setup for at understøtte alle overstående browsere samt iphone/ipad. Url'en til svg fonten har et id (#id) , som skal stemme overens med id'et i svg filen.</p>
<div>
<div>
<pre><del>@font-face {
   font-family: 'Font Navn';
   src: url('font.eot');
   src: local('☺'),
      url('font.ttf') format('truetype'),
      url('font.svg#id') format('svg');
   font-weight: normal;
   font-style: normal;
}</del></pre>
</div>
</div>
<p>Ny bulletproof syntaks efter at IE9 er udkommet:</p>
<pre>@font-face {
   font-family: 'font Navn';
   src: url('font.eot'); /* IE9 Compat Modes */
   src: url('font.eot?#iefix') format('eot'), /* IE6-IE8 */
     url('font.woff') format('woff'), /* Modern Browsers */
     url('font.ttf')  format('truetype'), /* Safari, Android, iOS */
     url('font.svg#id') format('svg'); /* Legacy iOS */
}</pre>
<p>Fonten kan nu bruges som enhver anden standard font:</p>
<pre>h1 { font: 100% 'Font Navn', Arial, sans-serif; }</pre>
<p>De forskellige font formater kan genereres med <a href="http://www.fontsquirrel.com/fontface/generator">font squirrel's font generator</a>. <strong>Husk</strong> at sikre at du har tilladelse til at bruge fonten som @font-face.<br />
<img src="file:///C:/Users/klinggaard/Desktop/fontface.jpg" alt="" /></p>
<h3>Undgå "blink" effekten!</h3>
<p>Først lidt baggrundsviden. IE downloader .eot filen så snart den støder  på @font-face erklæringen, hvorimod Gecko, Webkit og Opera alle venter  indtil de støder på markup, der har en CSS regel, hvori den specielle  font indgår. Webkit har en <em>feature/bug</em>, der gør, at fonten først  bliver vist, når den er indlæst, hvor Gecko og Opera viser en standard  font imens, og så genrender når fonten er hentet.<br />
Problemet med Webkit  er, at hvis en bruger sidder bag en langsom forbindelse, vil brugeren  ikke se teksten før den har hentet font filen, hvorfor brugeren kan se  en (delvis) blank side i op til flere minutter afhængig af forbindelsen.<br />
Problemet i Gecko og  Opera er, at brugeren vil kunne se genrederingen (blinket), og at  designet muligvis vil brække indtil fonten er hentet. Nedenstående billede illustrerer blinket og er et simplificeret eksempel på, at strukturen også kan ændre sig.</p>
<div id="attachment_523" class="wp-caption alignnone" style="width: 510px"><img class="size-full wp-image-523" title="Font-face &quot;blink&quot; eksempel" src="http://dinbror.dk/blog/wp-content/uploads/2010/12/fontface1.jpg" alt="Font-face &quot;blink&quot; eksempel" width="500" height="151" /><p class="wp-caption-text">Font-face &quot;blink&quot; eksempel</p></div>
<p>For at opnå Webkit featuren i Gecko og Opera findes der et javascript bibliotek, <a href="http://code.google.com/intl/da/apis/webfonts/docs/webfont_loader.html">WebFont Loader</a>, der vha klasser på html tagget fortæller når fonten er hentet, hvorfor du selv kan gemme teksten via CSS indtil fonten er hentet, og dermed undgå blinket:</p>
<pre>&lt;script src="http://ajax.googleapis.com/ajax/libs/webfont/1/webfont.js"&gt;&lt;/script&gt;
&lt;script type="text/javascript"&gt;
   WebFont.load({
      custom: {
         families: ['Font Navn'],
         urls : ['http://dinbror.dk/font-face-stylesheet.css']
      }
   });
&lt;/script&gt;</pre>
<p>CSS:</p>
<pre>.wf-loading h1 {
   visibility:hidden;
}
.wf-active h1, .wf-inactive h1 {
   visibility: visible;
   font-family: 'Font Navn', Arial, sans-serif;
}</pre>
<p>Ulempen er ligesom hos Webkit, at teksten ikke kan ses imens fonten hentes, og at man nu også skal hente og være afhængig af et javascript bibliotek. Dog kan man i stedet for at gemme teksten helt tilpasse den, så den i stedet passer størrelsesmæssigt med font-face fonten. Et lille tip er, at man ikke gemmer teksten i IE, da det ikke er nødvendigt (IE downloader .eot filen så snart den støder  på @font-face erklæringen), og da IE ikke er kendt for sin hurtige rendering af javascript.</p>
<p>En anden og mindre ressourcekrævende løsning, hvor man dog kun minimere blinket, og som pt kun er understøttet i Gecko, er CSS attributten <a href="https://developer.mozilla.org/en/CSS:font-size-adjust">font-size-adjust</a>. Den giver dig mulighed for at normalisere x-højden på tværs af en font, hvorfor forskellen reduceres og designet holdes konstant!</p>
<h3>Hjælp, font-face virker ikke i Firefox!?</h3>
<p>Selvom font-face er understøttet i Firefox, kan Firefox godt drille. Firefox tillader ikke <em>cross-domain</em> fonte som standard, hvilket betyder, at fonten skal ligge på samme domæne, endda samme sub-domæne medmindre <strong>man kan tilføje en “<a href="https://developer.mozilla.org/en/http_access_control"><em>Access-Control-Allow-Origin</em></a>” header til fonten</strong>. Dette er ikke altid en mulighed, men fortvivl ikke. Der findes selvfølgelig også en løsning på det. Det er måske ikke den pæneste løsning og heller ikke helt uden bivirkninger.  Løsningen er at<em> embette</em> fonten i sit <em>stylesheet</em> som <a href="http://da.wikipedia.org/wiki/Base64">Base64</a>. Hvis du bruger <a href="http://www.fontsquirrel.com/fontface/generator">font squirrel's font generator</a> kan du vælge "<em>Expert</em>", og herefter sætte flueben i <em>Base64 Encode</em> under <em>CSS options</em> som nedenstående billede illustrerer.</p>
<div id="attachment_536" class="wp-caption alignnone" style="width: 450px"><img class="size-full wp-image-536" title="Base64 Encode" src="http://dinbror.dk/blog/wp-content/uploads/2010/12/base.jpg" alt="Base64 Encode" width="440" height="57" /><p class="wp-caption-text">Vælg Base64 Encode</p></div>
<p>Resultatet er, at ttf fonten nu i stedet bliver <em>embettet</em> i <em>stylesheetet</em>:</p>
<pre>@font-face {
   font-family: 'Font Navn';
   src: url('font.eot');
   src: local('☺'),
      url("data:font/opentype;base64,[<strong><span style="color: #ff0000;">base64-encoded font her</span></strong>]");
      url('font.svg#id') format('svg');
   font-weight: normal;
   font-style: normal;
}</pre>
<p>Bivirkningerne er, at <em>stylesheetet</em> bliver tungere, og at <em>base64 encoding</em> fylder mere selve ttf fonten.</p>
<h3>Åhh nej @font-face virker ikke i IE9</h3>
<p>Internet Explorer 9 kommer med mange gode opdateringer og standardiseringer, hvilket har medført ændringer i måden, hvad IE tillader. Det har bl.a. betydet, at IE9 som FF ikke tillader cross-domain font-linkning. Løsningen er som med FF, at tilføje en “<a href="https://developer.mozilla.org/en/http_access_control"><em>Access-Control-Allow-Origin</em></a>” header til fonten.</p>
<p><strong>Problemer med WOFF</strong><br />
IE9 understøtter modsat sine forgængere .woff fonte. Hvis du benytter en IIS skal huske at tilføje .woff's MIME type til IIS'en for ikke at få en 404 not found:</p>
<pre>&lt;MimeType extention=".woff" type="application/x-font-woff" /&gt;</pre>
<p>Hvis dette ikke er en mulighed, kan du også tvinge IE9 til at bruge .eot fonten i stedet ved at ændre formatet fra <em>eot</em> til <em>embedded-opentype</em>. IE9 supporterer formatet <em>embedded-opentype</em> modsat formatet <em>eot</em>, hvorfor fonten indlæses:</p>
<pre>src: url('webfont.eot?#iefix') format('<strong>embedded-opentype</strong>')</pre>
<p>EOT er som default kendt af IIS'en.</p>
<p><strong>@font-face virker stadig ikke i IE9</strong><br />
Jeg er ikke selv stødt på problemet, men har læst at I nogle sjældne tilfælde vil @font-face fejle i IE pga. for mange karakter. Dette kan løses ved at tilføje et hash tegn efter spørgsmålstegnet:</p>
<pre>src: url('font.eot?<strong>#</strong>iefix') format('eot')</pre>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://dinbror.dk/blog/css-sadan-bruger-du-font-face/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Sådan laver du hurtigere websider</title>
		<link>http://dinbror.dk/blog/sadan-laver-du-hurtigere-websider/</link>
		<comments>http://dinbror.dk/blog/sadan-laver-du-hurtigere-websider/#comments</comments>
		<pubDate>Tue, 13 Apr 2010 20:30:17 +0000</pubDate>
		<dc:creator>dinbror</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[Performance]]></category>
		<category><![CDATA[browsere]]></category>
		<category><![CDATA[CSS sprites]]></category>
		<category><![CDATA[guide]]></category>
		<category><![CDATA[HTTP-request]]></category>
		<category><![CDATA[minify]]></category>
		<category><![CDATA[optimering]]></category>
		<category><![CDATA[stylesheet]]></category>

		<guid isPermaLink="false">http://dinbror.dk/blog/?p=310</guid>
		<description><![CDATA[Efter påpegelse af Niels Gamborg og i forlængelse af mit forrige indlæg Sådan laver du perfekt CSS kommer her en tilføjelse, som omhandler performance aspektet. Selvfølgelig skal man ikke være ligeglad med performance, hvorfor man skal huske at optimere sine websider. Hvis det ikke er for din egen skyld og/eller pengepung, så for at brugerne [...]]]></description>
			<content:encoded><![CDATA[<p>Efter påpegelse af <a href="http://www.nielsgamborg.dk/">Niels Gamborg</a> og i forlængelse af mit forrige indlæg<strong> <a href="http://dinbror.dk/blog/css-sadan-laver-du-perfekt-css/">Sådan laver du perfekt CSS</a></strong> kommer her en tilføjelse, som omhandler performance aspektet. Selvfølgelig skal man ikke være ligeglad med performance, hvorfor man skal huske at optimere sine websider. Hvis det ikke er for din egen skyld og/eller pengepung, så for at brugerne får en bedre (og hurtigere) oplevelse. Ligeledes tyder det desuden på, at <a href="http://googlewebmastercentral.blogspot.com/2010/04/using-site-speed-in-web-search-ranking.html">Google</a> vil (og til dels allerede gør) vægte hurtigere hjemmesider højere.<br />
Jeg har opstillet nogle simple punkter, som gerne skulle hjælpe med at opnå hurtigere indlæsningstider på dine websider.</p>
<h3>0: Minimer HTTP-requests</h3>
<p>Jo færre requests jo bedre. Den største og nok nemmest måde at reducere dine indlæsningstider på dine websider ligger i antallet af HTTP-requests, hvorfor du skal eliminere unødvendige requests.</p>
<p><strong>Hvorfor</strong><br />
Browsere bruger i dag cirka 80% af deres tid på at hente eksterne filer såsom stylesheets, scripts, billeder etc. Hver fil er lig med et request, dog henter browsere disse requests parallelt (på nær script-filerne), og alt afhængig af browser, kan de have x antal forbindelser kørende på samme host på samme tid.  Herunder er opstillet nogle eksempler på, hvor mange forbindelser per host samt max forbindelser de mest benyttede browsere kan håndtere:</p>
<pre><strong>    Browser </strong>          |   <strong>Connection per hostname</strong>   |   <strong>Max connections</strong>
Internet Explorer 8                   6                        57
Chrome 4                              6                        55
Chrome 5                              6                        40
Firefox 3.5+3.6                       6                        30
Safari 4                              5                        60
Opera 10                              4                        20
Internet Explorer 7                   2                        60
Internet Explorer 6                   2                        56</pre>
<p>Andre browsere og flere detaljer omkring de enkelte browsere kan findes på <a href="http://www.browserscope.org/">browserscope</a>, som er et open source projekt startet af <a href="http://stevesouders.com/">Steve Souders</a> og Lindsey Simon.</p>
<p><strong>Hvordan</strong><br />
Ja nu ved vi, hvorfor det er en god ide at minimere HTTP-requests, men hvordan gør vi det egentlig i praksis?<br />
Der findes flere måder at gøre det på. Jeg vil her præsentere 2 måder, som jeg selv finder nyttige, brugbare og bruger til dagligt.</p>
<p style="padding-left: 30px;">a) <strong>Kombinerede filer</strong>: Så snart det er muligt, skal man kombinere sine scripts og stylesheets således, at alle ens stylesheets bliver samlet i en fil og ligeledes med sine scripts. På denne måde kan man spare requests.<br />
Det kan dog være svært, hvis scripts og stylesheets varierer meget fra side til side. Her må man gå ind og vurdere den enkelte situation, og kigge på hvad der mest gavner indlæsninghastigheden. Man skal være opmærksom på, at fx billeder i stylesheets også generer requests, så hvis tendensen på din side <span style="text-decoration: underline;">ikke</span> er, at brugeren besøger mange sider, og du har meget forskelligt styling fra side til side, kan man spare requests ved at benytte sig af en side-modulær CSS opbygning. Men som tommelfingerregel skal man samle sine stylesheets samt scripts i en fil.</p>
<p style="padding-left: 30px;">b) <strong>CSS Sprites</strong>: CSS Sprites reducerer antallet af billede requests. Kort fortalt går det ud på, at man samler flere af sine billeder i et billede, og vha. <em>background-position</em> styre hvilken sekvens af billedet, man vil vise. Hvis du ikke kender til sprites, kan du læse mere omkring emnet her:</p>
<p style="padding-left: 60px;">-  <a href="http://www.alistapart.com/articles/sprites/">CSS Sprites: Image Slicing’s Kiss of Death af David Shea</a></p>
<p style="padding-left: 60px;">-  <a href="http://www.smashingmagazine.com/2009/04/27/the-mystery-of-css-sprites-techniques-tools-and-tutorials/">The Mystery Of CSS Sprites af Sven Lennartz</a></p>
<p style="padding-left: 60px;">-  <a href="http://css-tricks.com/css-sprites/">CSS Sprite: What they are ... af Chris Coyier</a></p>
<p style="padding-left: 30px;">Eller kigge nærmere på hvordan jeg har lavet min top menu.</p>
<p style="padding-left: 30px;">
<h3>1: Placerer stylesheets i toppen</h3>
<p>Der er to grunde til at placerer stylesheets i toppen.</p>
<ol>
<li><a href="http://www.w3schools.com/css/css_howto.asp">W3</a> dikterer, at stylesheets skal være i toppen (<em>head</em>), medmindre det er<em> inline-styling</em>.</li>
<li>Ved at placere stylesheets i toppen opnår man, at ens side loader progressivt, hvilket er vigtigt, hvis din side har meget indhold, eller brugeren sidder bag en langsom forbindelse. Siden viser indholdet så snart, det er klart, og brugeren har en indikation af, at siden er ved at loade. Denne indikation er meget vigtig for <a href="http://www.useit.com/papers/responsetime.html">brugervenligheden</a>. Hvis man derimod indsatte stylesheets nær bunden, ville man i mange browsere (eksempelvis Internet Explorer) miste den progressiv hentning og stå tilbage med en hvid blank side, da browsere blokerer renderingen for at forhindre at skulle gentegne elementer, der måtte ændre sig.</li>
</ol>
<h3>2: Placerer scripts i bunden</h3>
<p>Grunden til at scripts skal være i bunden er, at scripts blokerer for den parallelle hentning, hvorfor resten af dit indhold må vente til scriptet er færdighentet. Derfor placerer altid dine scripts i bunden, når det er muligt. Der findes selvfølgelig situationer, hvor du ikke kan, fx hvis du indsætter markup via <code>document.write</code>, hvilket jeg dog ikke er den store fan af eller initialisere ting i dit script i den øvre del af dit HTML dokument.</p>
<h3>3: Stylesheets og scripts skal være eksterne</h3>
<p>Nu kommer jeg til at modsige mig selv, men der er en mening med galskaben. I første punkt fik du at vide, at du skulle spare på HTTP-requests, og undgå dem så snart det var muligt, men nu fortæller jeg dig, at du skal gemme dine stylesheets samt scripts eksternt frem for at gemme dem<em> inline</em>, og dermed generer et ekstra request per fil. Igen kommer det an på situationen, men oftest er der mest at hente ved at gemme dem eksternt. Ved at gemme dem eksternt bruger du som sagt et ekstra request per fil, men da browsere<em> cacher</em> filerne, kan det være en fordel, hvis du eksempelvis bruger de samme filer på flere sider. Ved at gemme dem <em>inline</em> spare du det ekstra request, men HTML dokumentet bliver tungere, og filerne bliver indlæst ved hver <em>page load</em>. Når dine filer derimod er <em>cachet</em> generer de ikke et ekstra request og HTML dokumentet er ligeledes lettere.</p>
<h3>4: Minify</h3>
<p>Ved at <em>minify</em> sine stylesheets og scripts fjerner man unødvendige tegn og luft, og gør dem derved lettere at hente. Der findes forskellige værktøjer til at <em>minify</em> med:</p>
<ol>
<li><a href="http://developer.yahoo.com/yui/compressor/">YUI Compressor</a>: YUI er et af de mest kendte og mest effektive <em>minify</em> værktøjer. Det er skrevet i <a href="http://en.wikipedia.org/wiki/Java_%28programming_language%29">Java</a>, og man skal afvikle det på sin computer. Det gode ved YUI er selvfølgelig den effektive algoritme som <em>minify</em>er, men også at den kan <em>minify</em> scripts såvel som stylesheets.<a href="http://developer.yahoo.com/yui/compressor/"> </a></li>
<li><a href="http://www.csscompressor.com/">CSS Compressor</a>: Online værktøj, som kan <em>minify</em> dit CSS ud fra forskellige indstillinger.</li>
<li><a href="http://closure-compiler.appspot.com/home">Closure compiler</a>: Googles svar på et script <em>minify</em> værktøj, som eftersigende skulle være bedre end YUI. <em>Compileren</em> kan både downloades eller benyttes online samt indstilles efter behov og temperament.</li>
</ol>
<h3>5: Fjern duplikater</h3>
<p>Punktet burde egentligt ikke have været med på listen, da det giver sig selv. Men jeg har set steder, hvor de stadig forekommer, duplikater af scripts. Ved at have duplikater forøges indlæsningstiden. Internet Explorer laver et ekstra unødvendigt request, hvorimod Firefox godt kan se, at det er det samme script. Dog spilder begge browsere tid på at evaluere scriptet to gange, så undgå at have duplikerende scripts.</p>
<h3>6: Reducer DOM-elementer</h3>
<p>En tommelfingerregel er, at jo flere elementer du har på en side, jo tungere er den at renderer. Sørg derfor altid for at have så ren og meningsfuld<em> markup</em> som muligt. Mange elementer på en side gør det ligeledes sværere for JavaScript at tilgå dem. En måde du kan undersøge, hvor mange elementer en side har, er ved hjælp af <a href="http://www.getfirebug.com">Firebug</a>. Skriv blot følgende i konsol vinduet:</p>
<pre>document.getElementsByTagName('*').length</pre>
<h3>7: Brug dine subdomæner</h3>
<p><a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec8.html#sec8.1.4">HTTP   1.1 specifikationen</a> anbefaler, at browsere ikke downloader mere  end 2 komponenter parallelt  per host. Ved at gemme dine billeder på flere  forskellige hosts, kan du opnå mere end 2 parallelle downloads ad gangen, og dermed gøre din side hurtigere. Steve Souders har lavet et lille <a href="http://stevesouders.com/efws/domains1.php">eksempel</a>, hvor han illustrerer forskellen på at gemme sine billeder på et host kontra to.</p>
<h3>8: Undgå @import</h3>
<p>Brug <code>&lt;link /&gt;</code> frem for @import. Internet Explorer opfatter filer indsat ved hjælp af @import som link-tags, der er indsat i bunden af siden.</p>
<h3>9: Undgå filters</h3>
<p>Hvis du vil have transparente png billeder i Internet Explorer 6, kan du bruge Microsofts eget filter, <a href="http://msdn.microsoft.com/en-us/library/ms532969%28VS.85%29.aspx">AlphaImageLoader</a>. Dette er dog ikke anbefalingsmækværdi! Problemet ligger i at filteret blokerer rendering af siden og fryser browservinduet, mens billedet bliver hentet. Filteret forøger ligeledes brugen af computerens hukommelse. Undgå derfor at bruge dem, og brug i stedet gif eller png8 billeder eller nogle af de andre alternativer der findes, hvis du vil understøtte semi-transparente billeder i IE6.</p>
<h3>10: Undgå tomme billede referencer</h3>
<p>Tomme billede referencer resulterer i ekstra og nytteløse serverkald:</p>
<pre>&lt;img src="" alt="Tomt billede reference" /&gt;</pre>
<p>Nicholas C. Zakas har skrevet en udmærket <a href="http://www.nczonline.net/blog/2009/11/30/empty-image-src-can-destroy-your-site/">artikel</a>, der beskriver problemet rigtig godt.</p>
<h3>11: Komprimerer dine billeder</h3>
<p>Hvis du som jeg ikke altid selv klipper dit grafik og dermed gemmer det, kan der opnås store besparelser ved selv at genkomprimerer billederne. Uden at slå alle designer over en kam, så tænker de ikke på størrelsen.</p>
<h3>12: Komprimerer dine komponenter</h3>
<p>GNU zip eller også kaldet <a href="http://en.wikipedia.org/wiki/Gzip">gzip</a> er en komprimeringsmetode, som kan spare dig adskillige kilo bytes og dermed minimere svar tiderne. Vel og mærket hvis server samt klient understøtter det. Fra og med HTTP/1.1 er web-klienter begyndt at understøtte komprimering med Accept-Encoding i headeren af HTTP-request'et, fx:</p>
<pre>Accept-Encoding: gzip, deflate</pre>
]]></content:encoded>
			<wfw:commentRss>http://dinbror.dk/blog/sadan-laver-du-hurtigere-websider/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Validering af e-mail adresser</title>
		<link>http://dinbror.dk/blog/validering-af-e-mail-adresser/</link>
		<comments>http://dinbror.dk/blog/validering-af-e-mail-adresser/#comments</comments>
		<pubDate>Sat, 16 May 2009 20:08:41 +0000</pubDate>
		<dc:creator>dinbror</dc:creator>
				<category><![CDATA[Programmering]]></category>
		<category><![CDATA[e-mail]]></category>
		<category><![CDATA[expression]]></category>
		<category><![CDATA[reg exp]]></category>
		<category><![CDATA[regular]]></category>
		<category><![CDATA[validering]]></category>

		<guid isPermaLink="false">http://dinbror.dk/blog/?p=106</guid>
		<description><![CDATA[Når jeg udvikler software eller websider, arbejder jeg ofte med formular, hvorfor der forekommer input felter, som en bruger skal udfylde. For at sikre sin data, så det er mest brugbart og korrekt, er det altid en god skik at lave validering. Uden validering kan man risikerer at dataene bliver ubrugelig og dermed værdiløse. Ofte [...]]]></description>
			<content:encoded><![CDATA[<p>Når jeg udvikler software eller websider, arbejder jeg ofte med formular, hvorfor der forekommer input felter, som en bruger skal udfylde. For at sikre sin data, så det er mest brugbart og korrekt, er det altid en god skik at lave validering. Uden validering kan man risikerer at dataene bliver ubrugelig og dermed værdiløse. Ofte er valideringen simpel i form af tjek om et givet felt er udfyldt eller om det er den korrekte datatype. Men når vi snakker e-mail adresser, er det lidt mere kompliceret. En korrekt e-mail adresse består af en række regler:</p>
<blockquote><p>Starter med minimum et tegn efterfulgt af et snabel a, hvor der så igen er minimum et tegn efterfulgt af en prik. Sidste men ikke mindst defineres domænetypen, som er på minimum 2 bogstaver fx dk, de etc.</p></blockquote>
<p>En nem måde at håndtere en række regler for en tekststreng er ved at bruge <em>Regular Expression</em>. Et regulært udtryk er en tekststreng, som beskriver en mængde af tekststrenge og som overholder syntaksen for opstilling af det regulære udtryk. Så for at kunne validere en e-mail adresse vil jeg lave et regulært udtryk:</p>
<blockquote><p>(/^.*?@\w[\w.-]*\.[a-z]{2,4}$/i)</p></blockquote>
<p>Overstående giver måske ikke så meget mening, hvis man ikke kender til regulære udtryk, så jeg vil anbefale, at man læser om det på nettet [<a href="http://en.wikipedia.org/wiki/Regular_expression">1</a>][<a href="http://www.regular-expressions.info/">2</a>][<a href="http://www.zytrax.com/tech/web/regex.htm">3</a>]. Men jeg vil selvfølgelig ikke snyde jer for en forklaring af overstående udtryk.</p>
<blockquote>
<p style="text-align: left;"><strong>^</strong> : Starten af strengen.<br />
<strong>.* </strong>: 0 eller flere tegn.<br />
<strong>? </strong>: Non greedy (dvs. match mindst mulige tegn i stedet for flest mulige, 0 eller 1 gange).<br />
<strong>@</strong> : Et ”@”<br />
<strong>\w</strong> : Et tegn a-z, A-Z eller 0-9 og ”_”<br />
<strong>[\w.-]*</strong> : 0 eller flere tegn, som er a-z, A-Z eller 0-9, foruden ”.” eller ”-”<br />
<strong>\.</strong> : Et ”.”<br />
<strong>[a-z]{2,4}</strong> : 2-4 tegn af typen a-z. For eventuelt at fremtidsikre sine e-mail adresser kan man sætte max antal tegn op.<br />
<strong>$</strong> : Slutningen på strengen.<br />
<strong>i</strong> : ”ignore case”, ingen forskel på store og små bogstaver.</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://dinbror.dk/blog/validering-af-e-mail-adresser/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Test din side i forskellige browsere</title>
		<link>http://dinbror.dk/blog/test-din-side-i-forskellige-browsere/</link>
		<comments>http://dinbror.dk/blog/test-din-side-i-forskellige-browsere/#comments</comments>
		<pubDate>Thu, 14 May 2009 15:36:53 +0000</pubDate>
		<dc:creator>dinbror</dc:creator>
				<category><![CDATA[Værktøjer]]></category>
		<category><![CDATA[browsere]]></category>
		<category><![CDATA[chrome]]></category>
		<category><![CDATA[FF]]></category>
		<category><![CDATA[firefox]]></category>
		<category><![CDATA[IE]]></category>
		<category><![CDATA[internet explorer]]></category>
		<category><![CDATA[konqueror]]></category>
		<category><![CDATA[opera]]></category>
		<category><![CDATA[safari]]></category>
		<category><![CDATA[webdesign]]></category>

		<guid isPermaLink="false">http://dinbror.dk/blog/?p=89</guid>
		<description><![CDATA[Et almindeligt problem når man designer hjemmesider er, at få dem til at se ud som man ønsker i alle browsere ens målgruppe måtte benytte. En af de vigtigste ting i kampen for ensartet design uafhængigt af browser og god kode er, at følge w3c's standarder [link til w3c validator]. Desværre er det ikke altid [...]]]></description>
			<content:encoded><![CDATA[<p>Et almindeligt problem når man designer hjemmesider er, at få dem til at se ud som man ønsker i alle browsere ens målgruppe måtte benytte. En af de vigtigste ting i kampen for ensartet design uafhængigt af browser og god kode er, at følge w3c's standarder [<a href="http://validator.w3.org/">link til w3c validator</a>]. Desværre er det ikke altid nok. Nogle browsere følger ikke standarderne 100%, og der er stadig brugere af Internettet, der kan finde på at bruge en forældet browser som Internet Explorer 6, IE6.</p>
<p>Heldigvis findes der en række gratis værktøjer, der gør det muligt at teste sit design i de forskellige browsere. Nogle er online, hvor andre skal installeres på computeren:</p>
<p><strong><a href="http://Browsershots.org">Browsershots.org</a><br />
</strong>En hjemmeside der gør det muligt at teste sine sider i alverdens kombinationer mellem browsere, operativsystemer og ekstra indstillinger. De ekstra indstillinger består af skærm størrelse, farve dybde og om javascript, java eller flash skal være aktiveret eller deaktiveret.<br />
Værktøjet kan ikke bruges lokalt, men kun online. Man indtaster en url og vælger de browsere samt operativsystemer, der skal testes i. Herefter loader programmet din url i de forskellige browsere og tager et screenprint af siden. Værktøjet kræver en smule tålmodighed, da der kan forkomme ventetid på resultatet.</p>
<p><a href="http://ipinfo.info/netrenderer/index.php"><strong>IE NetRenderer</strong></a><br />
Ligesom browsershots.org er dette et online værktøj til at se sine sider i forskellige browsere. Dog kan der kun vælges mellem forskellige versioner af IE ned til version 5.5. Testen renderer med det samme, og er derfor et godt alternativ til browsershots, hvis man kun skal teste IE.</p>
<p><strong><a href="http://tredosoft.com/Multiple_IE?page=1">Multiple versions of IE<br />
</a></strong>Et program udviklet af TredoSoft, som hjælper dig med at installere flere versioner af IE på en gang. Her kan du teste dine sider online såvel som lokalt.</p>
<p><strong><a href="http://www.my-debugbar.com/wiki/IETester/HomePage">IETester</a><br />
</strong>Et program udviklet af My DebugBar, som kan vise dine sider i IE ned til version 5.5. Programmet gør det mulig nemt og hurtigt at skifte mellem de forskellige browsere både lokalt samt online. GUI mæssigt er programmet nok det flottest og det fungere ok, dog skal man stadig tænke på, at det er et alpha release, hvorfor fejl kan opstå. Ligeledes har det stadig nogle begrænsninger, fx kan der forekomme problemer med visning af flashelementernår man tester i IE 6.</p>
<p><a href="http://blogs.msdn.com/xweb/archive/2009/03/18/Microsoft-Expression-Web-SuperPreview-for-Windows-Internet-Explorer.aspx"><strong>MS Expression Web SuperPreview</strong></a><br />
Microsofts eget værktøj til at teste sine designs i forskellige IE versioner. Værktøjet viser dit design i IE 6 og IE 7 eller IE 8, afhængigt af hvilken version du har installeret på computeren. Du kan se siderne ved siden af hinanden eller ovenpå hinanden, og programmet giver dig nogle værktøjer, der kan identificere forskelle helt ned til pixelniveau.</p>
]]></content:encoded>
			<wfw:commentRss>http://dinbror.dk/blog/test-din-side-i-forskellige-browsere/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Unified Process, UP</title>
		<link>http://dinbror.dk/blog/unified-process-up/</link>
		<comments>http://dinbror.dk/blog/unified-process-up/#comments</comments>
		<pubDate>Sun, 28 Dec 2008 09:33:17 +0000</pubDate>
		<dc:creator>dinbror</dc:creator>
				<category><![CDATA[Udviklingsmetoder]]></category>
		<category><![CDATA[Iterativ]]></category>
		<category><![CDATA[Ivar Jacobson]]></category>
		<category><![CDATA[Kravspecifikation]]></category>
		<category><![CDATA[Objektorienteret]]></category>
		<category><![CDATA[Unified Process]]></category>
		<category><![CDATA[UP]]></category>

		<guid isPermaLink="false">http://dinbror.dk/blog/?p=3</guid>
		<description><![CDATA[Kort gennemgang af udviklingsmetoden Unified process faser. UP bruger UML som notationsprog, hvilket jeg ikke går yderligere i dybden med. Jeg nævner blot de forskellige diagrammer som et softwareudviklingsprojekt kan inddrage her: use case diagram, use case specifikationer, domænediagram, designdiagram, systemsekvensdiagram, designsekvensdiagram og tilstandsdiagram. UP er en iterativ udviklingsmetode, som oprindeligt blev udviklet af Ivar [...]]]></description>
			<content:encoded><![CDATA[<table border="0">
<tbody border="0">
<tr>
<td>Kort gennemgang af udviklingsmetoden Unified process faser. UP bruger UML som notationsprog, hvilket jeg ikke går yderligere i dybden med. Jeg nævner blot de forskellige diagrammer som et softwareudviklingsprojekt kan inddrage her: use case diagram, use case specifikationer, domænediagram, designdiagram, systemsekvensdiagram, designsekvensdiagram og tilstandsdiagram.</td>
</tr>
<tr>
<td></td>
</tr>
<tr>
<td>UP er en iterativ udviklingsmetode, som oprindeligt blev udviklet af Ivar Jacobsen, Grady Booch og James Rumbaugh sidst i 90´erne. De tre samlede hovederne for at definere en ensartet objektorienteret softwareudviklingsmetode, hvilket udmundede i beskrivelsessproget UML samt fire faser:</td>
</tr>
<tr>
<td>
<dl>
<dd>1) Inception</dd>
<dd>2) Elaboration</dd>
<dd>3) Construction</dd>
<dd>4) Transition</dd>
</dl>
</td>
</tr>
<tr>
<td>Hver fase består af en række iterationer. Antallet af iterationer afhænger af udviklingsprojektets kompleksitet.</td>
</tr>
<tr>
<td></td>
</tr>
<tr>
<td>
<h2>Fase 1: Inception (Forberedelsesfasen)</h2>
</td>
</tr>
<tr>
<td>Forberedelsesfasen er ikke lig med kravspecifikation, som det kendes fra vandfladsmodellen. Man analysere i stedet kritiske krav og fastslår de grundlæggende ideer om systemet. Der foretages en risikoanalyse og der vurderes om projektet kan realiseres. Denne fase består som regel af 1-2 iterationer.</td>
</tr>
<tr>
<td></td>
</tr>
<tr>
<td>
<h2>Fase 2: Elaboration (Etableringsfasen)</h2>
</td>
</tr>
<tr>
<td>Fortsættelse på første fase, hvor man fordyber sig i sine krav, man udspecificere dem, beskriver dem og gør dem målbare. De største risici elimineres, og man får sin grundlæggende arkitektur på plads samt programmering og test påbegyndes. Der er en del iterationer i denne fase.</td>
</tr>
<tr>
<td></td>
</tr>
<tr>
<td>
<h2>Fase 3: Construction (Konstruktionsfasen)</h2>
</td>
</tr>
<tr>
<td>Produktet konstrueres. Man udvikler og tester systemets funktioner samt laver brugerorienteret dokumentation og manualer. Construction er fasen, som består af flest iterationer.</td>
</tr>
<tr>
<td></td>
</tr>
<tr>
<td>
<h2>Fase 4: Transition (Overdragelsesfasen)</h2>
</td>
</tr>
<tr>
<td>Systemet udrulles. Man laver de afsluttende tests samt installerer og oplærer brugerne. Herefter kan man evaluere på forløbet og projektet afsluttes. Dette varer normalt 1-2 iterationer.</td>
</tr>
<tr>
<td></td>
</tr>
<tr>
<td>
<dl>
<dt></dt>
<h2>Fordele ved Unified Process:</h2>
<dd>-	UP egner sig til store og tidskrævende projekter med mange udviklere.</dd>
<dd>- Løbende reviews.</dd>
<dd>- Meget dokumentation. UP er arkitekturcentreret og systemet beskrives grundigt, som gerne skulle resultere i, at andre udviklere hurtigt kan få et overblik og overtage systemet.</dd>
</dl>
</td>
</tr>
<tr>
<td>
<dl>
<dt></dt>
<h2>Ulemper ved Unified Process:</h2>
<dd>- Meget dokumentation, i form af use case specifikationer, sekvensdiagrammer mm. Den grundige dokumentation er tidskrævende og resulterer i, at ændringer løbende koster meget tid.</dd>
<dd>- Ufleksibelt, UP er låst fast i sine faser, og det er derfor ikke nemt at lave store ændringer, når man er sidst i en fase eller har afsluttet en fase.</dd>
</dl>
</td>
</tr>
</tbody>
</table>
]]></content:encoded>
			<wfw:commentRss>http://dinbror.dk/blog/unified-process-up/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

