Hvem glor – din bror Den ikke-så-personlige blog af Bjørn Klinggaard

14jul/10176

bPopup

29.10.11: New release, bPopup version 0.6.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 & scroll, creating a modal overlay etc. It can open any container you create with all kinds of content.
bPopup has been tested in IE67-9, FF2-7, Opera 9-10, Safari 4-5 and Chrome 4-15.

DEMODownload

Contents

  1. Usage
  2. Options (API)
  3. Changelist
  4. What can you do?
  5. Downloads

Usage

This is a really simplified example. For using bPopup I recommend that you're familiar with HTML and CSS.

Scripts to include:

<script type="text/javascript" src="
   http://ajax.googleapis.com/ajax/libs/jquery/1.6.4/jquery.min.js"></script>
<script type="text/javascript" src="jquery.bpopup-0.6.0.min.js"></script>

HTML:

<html>
  <head> HeadContent ... </head>
  <body>
    BodyContent
    ...
    <a id="click" href="some url">Click here</a>
    <div id="div_to_popup">Content of Popup</div>
  </body>
</html>

CSS:

#div_to_popup {display:none;}

The magic:

$(document).ready(function(){
   $("#click").bind('click', function(){
      $("#div_to_popup").bPopup();
      return false
   });
});

Or with custom settings

$(document).ready(function(){
   $("#click").bind('click', function(){
      $("#div_to_popup").bPopup({appendTo:'form', zIndex: 2});
   });
});

Enjoy

Options

API – name [type] (default value)
amsl [int] (50) Above Mean Sea Level. Vertical distance from the middle of the window, + = above, - = under.
appendTo [string] (’body’) Element to append popup (and modal overlay) to. For asp.net sites append to 'form'.
closeClass [string] ('bClose') Class to bind the close event to. Version 0.3.3
content [string] ('ajax') Content of bpopup. Types: ['ajax', 'iframe', 'xlink']. If loadUrl isn't defined it'll not use content type. Version 0.4.1
contentContainer [string] (null) Element which content should be added to. If undefined/null it will add it to $(this). Usage contentContainer:'.element' or contentContainer:'#element'.  Version 0.4.1
duration [int/string] ('normal') Animation speed. Removed in version 0.3.6
escClose [boolean] (true) Should popup close when press on escape?
fadeSpeed [int/string] (250) Animation speed on fadeIn/out. Version 0.3.6
follow [boolean,boolean,boolean] ([true,true,false]) Should the popup follow the screen vertical and/or horizontal on scroll/resize? [vertical, horizontal, fixed on screen] Version 0.3.6. Changed in version 0.5.0 and again in version 0.6.0
followSpeed [int/string] (500) Animation speed for the popup on scroll/resize. Version 0.3.6
loadUrl [string] (null) External page or selection to load in popup.  Version 0.3.4
minTop [int] (20) Minimum distance from top to popup. Removed in version 0.3.6
modal [boolean] (true) Should there be a modal overlay behind the popup?
modalClose [boolean] (true) Should the popup close on click on overlay? Version 0.4.0
modalColor [string] ('#000') What color should the overlay be? Version 0.3.5
opacity [float] (0.7) Transparency, from 0.1 to 1.0 (filled). Version 0.3.3
position [int,int] (['auto','auto']) Defines the position where the popup should pop up. 'auto' = center, [vertical, horizontal]  Version 0.5.0
scrollBar [boolean] (true) Should scrollbar be visible?
vStart [int] (null) Vertical start position for popup. Version 0.3.6 Removed in version 0.5.0 - See Position.
xLink [boolean] (false) Is the popup a xlink popup? Version 0.3.4, Removed in version 0.4.1 use content type instead (content:'xlink')
zIndex [int] (9999) Popup z-index, modal overlay = popup z-index - 1.
Events
onOpen Event fires before the popup opens.
Usage: $(selector).bPopup({ onOpen: function(){ //doMagic }});  Version 0.5.0
onClose Event fires after the popup closes.
Usage: $(selector).bPopup({ onClose: function(){ //doMagic }}); Version 0.5.0
Public Function
close() Closes the popup (Usage: $(selector).bPopup().close()). Version 0.4.0

Changelist

0.6.0 change-list:

  • New feature: Supports multiple bPopups. Now you can open all the bPopups you want on top of each other.
  • New feature: Won't follow if popup is bigger then the window.
  • Changed: Added 3rd parameter to follow, default false. If true the popup will be fixed on the screen.
  • 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.

0.5.1 change-list:

  • Fixed issue: Added a duration time to the hide() call so onOpen and loadUrl always will be trigged when needed.
  • Fixed issue: 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
  • Code update: updated the logic regarding follow and position

0.5.0 change-list:

  • bPopup, now with more control and features!
  • New events: onOpen and onClose
  • New option: Position['auto','auto']. Replacing vStart. Gives you full control where the popup should be.
  • Changed option: follow changed to array of booleans, follow[true,true]. Defines if the popup should follow vertical and/or horizontal.
  • Changed option: default value for amsl changed from 150px to 50px.
  • Removed option: vStart, see Position.
  • 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.
  • Removed feature: xlink removed from content type. Instead do the xlink stuff inside the onOpen event.
  • Fixed issue: Modal overlay fits whole screen on an iphone in safari.
  • Known issue: The popup doesn't center properly when zooming on an iphone in safari.

0.4.1 change-list:

  • 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.
  • New option: contentContainer, gives you the possibility to load content into a small area of the popup e.g. a div at the bottom.
  • Removed option: xLink, use content type instead (content:'xlink')!

0.4.0 change-list:

  • Attention: In this update there has been changes that affect how you interact with the popup!
  • New option: modalClose (should the popup close on click on overlay?)
  • New way to create the popup.You should now call $(selector).bPopup() instead of $(selector).openPopup().
  • New way to force popup to close. Force close by calling the public function close(), $(selector).bPopup().close(), instead of triggering the close event with $('.bClose').closePopup(). This will stop cluttering up the $.fn namespace.
  • Changed default value for opacity from 0.5 to 0.7
  • Ensures that the same popup can't be opened twice at a time.
  • Next update will include support for iframes, generic xlink support and more.

0.3.6 change-list:

  • New options: fadeSpeed, follow, followSpeed, vStart
  • Deleted: duration, minTop
  • Included position:absolute styling on popup in plugin

0.3.5 change-list:

  • New option: modalColor
  • bPopup can now take callback functions

0.3.4 change-list:

  • New option: loadUrl
  • The popup can now open an url inside the popup
  • Implemented x-link feature
  • Refactored code, created private help functions
  • Changed default value for scrollBar to true

0.3.3 change-list:

  • New options: opacity, closeClass
  • Changed modal overlay to position fixed in supported browsers. Non position fixed supported browsers still uses position absolute.
  • Added default close event
  • Fixed issue with overlay in IE6+7 and body positioned relative with a width

0.3.2 change-list:

  • Modal overlay width miscalculation on resize.
  • Auto textfield focus
  • Resetting textfields before showing popup

0.3.1 change-list:

  • New options: escClose, zIndex and minTop.
  • Fixed bug with modal overlay when body has position: relative and a width. Now calculates the distance from the left to the body.

0.3.0 change-list:

  • Unbind events on close.
  • Centering popup on resize.
  • Centering popup on horizontal scroll.
  • Refactor code.

What can you do?

  • Report bugs
  • Help optimizing code
  • Give suggestions

Downloads

v 0.6.0 developer
v 0.6.0 minified
v 0.5.1 developer
v 0.5.1 minified
v 0.5.0 developer
v 0.5.0 minified

v 0.4.1 developer
v 0.4.1 minified
v 0.4.0 developer

v 0.4.0 minified
v 0.3.6 developer
v 0.3.6 minified
v 0.3.5 developer

v 0.3.5 minified

4jul/102

CSS: Sådan bruger du @font-face

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 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 embetter sine specielle fonte i form af grafik. Men takket være font-face er den tid nu ovre.

Ulemper ved grafik embetting:

  • Ekstra arbejde - 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.
  • Tungere sider - I stedet for ren tekst har du grafik, som fylder mere og koster HTTP-requests. Stor skift størrelse = stor grafik.
  • Manglende indeksering - Web crawlers kan ikke indeksere tekst i grafik. Dog kan (læs skal) man give sine billeder alt beskrivelser, hvilke bliver indekseret.

Ulemper ved font-face:

  • Manglende standard - 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 WOFF bliver fremtidens standard webfont format!

Font-face browser support

Browser Format Supporteret siden
Gecko/Mozilla/Firefox ttf (TrueType/OpenType),
otf
(OpenType PS),
woff (Web Open Font Format)
- woff er understøttet fra v. 3.6
v. 3.5
Internet Explorer eot (Embedded OpenType)
woff (Web Open Font Format)
- woff er understøttet fra v. 9
v. 4
Webkit/Safari ttf (TrueType/OpenType),
otf
(OpenType PS),
iPhone/iPad
understøtter kun
svg (Scalable Vector Graphics)
v. 3.1
Google Chrome ttf (TrueType/OpenType),
otf
(OpenType PS)
woff (Web Open Font Format)
- woff er understøttet fra v.6
v. 4
Opera ttf (TrueType/OpenType),
otf
(OpenType PS),
svg (Scalable Vector Graphics)
v. 10

Hvordan bruger man font-face?

En mere dybdegående forklaring på font-face syntaks kan læses på Paul Irish blog indlæg; Bulletproof @font-face syntax. 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.

@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;
}

Ny bulletproof syntaks efter at IE9 er udkommet:

@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 */
}

Fonten kan nu bruges som enhver anden standard font:

h1 { font: 100% 'Font Navn', Arial, sans-serif; }

De forskellige font formater kan genereres med font squirrel's font generator. Husk at sikre at du har tilladelse til at bruge fonten som @font-face.

Undgå "blink" effekten!

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 feature/bug, 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.
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.
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.

Font-face "blink" eksempel

Font-face "blink" eksempel

For at opnå Webkit featuren i Gecko og Opera findes der et javascript bibliotek, WebFont Loader, 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:

<script src="http://ajax.googleapis.com/ajax/libs/webfont/1/webfont.js"></script>
<script type="text/javascript">
   WebFont.load({
      custom: {
         families: ['Font Navn'],
         urls : ['http://dinbror.dk/font-face-stylesheet.css']
      }
   });
</script>

CSS:

.wf-loading h1 {
   visibility:hidden;
}
.wf-active h1, .wf-inactive h1 {
   visibility: visible;
   font-family: 'Font Navn', Arial, sans-serif;
}

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.

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 font-size-adjust. Den giver dig mulighed for at normalisere x-højden på tværs af en font, hvorfor forskellen reduceres og designet holdes konstant!

Hjælp, font-face virker ikke i Firefox!?

Selvom font-face er understøttet i Firefox, kan Firefox godt drille. Firefox tillader ikke cross-domain fonte som standard, hvilket betyder, at fonten skal ligge på samme domæne, endda samme sub-domæne medmindre man kan tilføje en “Access-Control-Allow-Origin” header til fonten. 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 embette fonten i sit stylesheet som Base64. Hvis du bruger font squirrel's font generator kan du vælge "Expert", og herefter sætte flueben i Base64 Encode under CSS options som nedenstående billede illustrerer.

Base64 Encode

Vælg Base64 Encode

Resultatet er, at ttf fonten nu i stedet bliver embettet i stylesheetet:

@font-face {
   font-family: 'Font Navn';
   src: url('font.eot');
   src: local('☺'),
      url("data:font/opentype;base64,[base64-encoded font her]");
      url('font.svg#id') format('svg');
   font-weight: normal;
   font-style: normal;
}

Bivirkningerne er, at stylesheetet bliver tungere, og at base64 encoding fylder mere selve ttf fonten.

Åhh nej @font-face virker ikke i IE9

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 “Access-Control-Allow-Origin” header til fonten.

Problemer med WOFF
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:

<MimeType extention=".woff" type="application/x-font-woff" />

Hvis dette ikke er en mulighed, kan du også tvinge IE9 til at bruge .eot fonten i stedet ved at ændre formatet fra eot til embedded-opentype. IE9 supporterer formatet embedded-opentype modsat formatet eot, hvorfor fonten indlæses:

src: url('webfont.eot?#iefix') format('embedded-opentype')

EOT er som default kendt af IIS'en.

@font-face virker stadig ikke i IE9
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:

src: url('font.eot?#iefix') format('eot')