Slide 1

Slide 1 text

A BRIEF HISTORY of that time YOU USED WEBFONTS

Slide 2

Slide 2 text

@zachleat zachleat.com

Slide 3

Slide 3 text

IN THE BEGINNING 4,500,000,000 Years Ago

Slide 4

Slide 4 text

IN THE BEGINNING 4,500,000,000 Years Ago IN 1995

Slide 5

Slide 5 text

IN THE BEGINNING 4,500,000,000 Years Ago VERDANA GEORGIA COURIER NEW TIMES NEW ROMAN IMPACT COMIC SANS MS THERE WAS ARIAL IN 1995

Slide 6

Slide 6 text

Slide 7

Slide 7 text

No content

Slide 8

Slide 8 text

http://acumin.typekit.com/

Slide 9

Slide 9 text

FAST FORWARD TO TODAY

Slide 10

Slide 10 text

@font-­‐face  {    font-­‐family:  Open  Sans;    src:  url('opensans.woff2')  format('woff2'),          url('opensans.woff')  format('woff');   }

Slide 11

Slide 11 text

N C T @

Slide 12

Slide 12 text

N T O F C A F E @ -

Slide 13

Slide 13 text

56% http://httparchive.org/trends.php OF WEB SITES

Slide 14

Slide 14 text

http://httparchive.org/trends.php AVERAGE PAYLOAD 105KB

Slide 15

Slide 15 text

0 350 700 1050 1400 CSS javaScript Images WebFonts TRANSFER SIZE

Slide 16

Slide 16 text

REMOVE AN IMAGE! JAVASCRIPT SIZE? WORRIED ABOUT

Slide 17

Slide 17 text

REMOVE AN IMAGE! JAVASCRIPT SIZE? WORRIED ABOUT

Slide 18

Slide 18 text

NOT ALL REQUESTS ARE CREATED EQUAL

Slide 19

Slide 19 text

PERCEIVED PERFORMANCE

Slide 20

Slide 20 text

IMG

Slide 21

Slide 21 text

CSS

Slide 22

Slide 22 text

JavaScript

Slide 23

Slide 23 text

WEB FONT

Slide 24

Slide 24 text

@font-­‐face  {    font-­‐family:  Open  Sans;    src:  url('opensans.woff2')  format('woff2'),          url('opensans.woff')  format('woff');   }

Slide 25

Slide 25 text

IS 30% SMALLER THAN WOFF On average across all of Google Fonts: https://groups.google.com/a/chromium.org/forum/#!topic/chromium-dev/j27Ou4RtvQI/discussion WOFF2

Slide 26

Slide 26 text

Woff caniuse.com 6 5 7.5 7

Slide 27

Slide 27 text

62% 38% 4.3 and below 4.4+ WOFF

Slide 28

Slide 28 text

@font-­‐face  {    font-­‐family:  Open  Sans;    src:  url('opensans.woff2')  format('woff2'),          url('opensans.woff')  format('woff'),          url('opensans.otf')  format('opentype');   }

Slide 29

Slide 29 text

    @font-­‐face  {    font-­‐family:  Open  Sans;    src:  url('opensans.woff2')  format('woff2'),          url('opensans.woff')  format('woff');   }    

Slide 30

Slide 30 text

No content

Slide 31

Slide 31 text

dAY 0 since last pluralization ERROR

Slide 32

Slide 32 text

IF NOT USED NOT DOWNLOADED

Slide 33

Slide 33 text

Slide 34

Slide 34 text

     Content.  

Slide 35

Slide 35 text

36+ 23+ 6.1+ 2.3+ 7+ DOWNLOADS WITH

28+ 9+ DOWNLOADS WITH

Content

Slide 36

Slide 36 text

RESTRICT TO SPECIFIC CHARACTERS

Slide 37

Slide 37 text

@font-­‐face  {      font-­‐family:  Ampersand;      src:  url('ampersand.woff2')  format('woff2'),                url('ampersand.woff')  format('woff');      unicode-­‐range:  U+26;   } unicode- range

Slide 38

Slide 38 text

Needs an _ Ampersand serif p  {      font-­‐family:  Ampersand,  serif;   }

Slide 39

Slide 39 text

unicode- range 36 9+ 23 8+ 2.1+ 8+ Supported Supported with SMART DOWNLOAD NOT SUPPORTED

Slide 40

Slide 40 text

EXACT MATCH ON Font-Family ✔ @FONT-FACE DOWNLOAD CHECKLIST

Slide 41

Slide 41 text

EXACT MATCH ON Font-Family USED ON AN ELEMENT IN THE DOCUMENT ✔ ✔ @FONT-FACE DOWNLOAD CHECKLIST

Slide 42

Slide 42 text

EXACT MATCH ON Font-Family USED ON AN ELEMENT IN THE DOCUMENT ELEMENT HAS CONTENT ✔ ✔ @FONT-FACE DOWNLOAD CHECKLIST ✔

Slide 43

Slide 43 text

EXACT MATCH ON Font-Family USED ON AN ELEMENT IN THE DOCUMENT ELEMENT HAS CONTENT CONTENT IS WITHIN UNICODE-RANGE ✔ ✔ @FONT-FACE DOWNLOAD CHECKLIST ✔ ✔

Slide 44

Slide 44 text

http://www.w3.org/TR/css3-fonts/ FONT-WEIGHT FONT-STYLE EXACT MATCH

Slide 45

Slide 45 text

@font-­‐face  {      font-­‐family:  My  Web  Font;      font-­‐weight:  400;      font-­‐style:  normal;   } p  {      font-­‐family:  My  Web  Font;      font-­‐weight:  400;      font-­‐style:  normal;   } ✔

Slide 46

Slide 46 text

@font-­‐face  {      font-­‐family:  My  Web  Font;      font-­‐weight:  600;   } p  {      font-­‐family:  My  Web  Font;      font-­‐weight:  100;   } ✘

Slide 47

Slide 47 text

MisMatch weight 600 Available, 100 assigned, FORCED BOLD p  {      font-­‐family:  My  Web  Font;      font-­‐weight:  100;   } @font-­‐face  {      font-­‐family:  My  Web  Font;      font-­‐weight:  600;   } ✘ ✘ ✔ ✔

Slide 48

Slide 48 text

MISMATCH STYLE ITALIC AVAILABLE, NORMAL ASSIGNED, FORCED ITALIC p  {      font-­‐family:  My  Web  Font;      font-­‐style:  normal;   } @font-­‐face  {      font-­‐family:  My  Web  Font;      font-­‐style:  italic;   } ✘ ✘ ✔ ✔

Slide 49

Slide 49 text

100  200  300  400  500  600  700  800  900 FONT-WEIGHT

‐ ‐ Normal/Roman Bold @font-­‐face ‑

Slide 50

Slide 50 text

@font-­‐face  {      font-­‐family:  My  Web  Font;      font-­‐weight:  500;   } p  {      font-­‐family:  My  Web  Font;      font-­‐weight:  600;   } ✘

Slide 51

Slide 51 text

FAUX BOLD p  {      font-­‐family:  My  Web  Font;      font-­‐weight:  600;   } @font-­‐face  {      font-­‐family:  My  Web  Font;      font-­‐weight:  500;   }

Slide 52

Slide 52 text

FAUX ITALIC p  {      font-­‐family:  My  Web  Font;      font-­‐style:  italic;   } @font-­‐face  {      font-­‐family:  My  Web  Font;      font-­‐style:  normal;   }

Slide 53

Slide 53 text

  @font-­‐face  {      font-­‐weight:  400;      font-­‐style:  normal;   }    

     Roman  Text      Bold  Text      Italic  Text  

Slide 54

Slide 54 text

FONT-SYNTHESIS https://developer.mozilla.org/en-US/docs/Web/CSS/font-synthesis

Slide 55

Slide 55 text

No content

Slide 56

Slide 56 text

http://stateofwebtype.com/

Slide 57

Slide 57 text

LET’s LOOK at a REAL WORLD EXAMPLE

Slide 58

Slide 58 text

instagram.com 6 @font-face BLOCKS

Slide 59

Slide 59 text

No content

Slide 60

Slide 60 text

No content

Slide 61

Slide 61 text

No content

Slide 62

Slide 62 text

No content

Slide 63

Slide 63 text

Slide 64

Slide 64 text

.page-­‐home  .content  .home-­‐login  i  {      font-­‐style:  normal;   }

Slide 65

Slide 65 text

TRIGGER A FONT DOWNLOAD BEHAVIOR WHILE DOWNLOADING

Slide 66

Slide 66 text

LOCAL FONT { @FONT-FACE {

Slide 67

Slide 67 text

Flash of Invisible Text F O I T

Slide 68

Slide 68 text

FOIT

Slide 69

Slide 69 text

http://www.webpagetest.org/video/compare.php?tests=141205_VE_STK-r:1-c:0

Slide 70

Slide 70 text

http://www.webpagetest.org/video/compare.php?tests=141205_VE_STK-r:1-c:0

Slide 71

Slide 71 text

People will visit a Web site less often if it is slower than a close competitor by more than 250 milliseconds.” http://www.nytimes.com/2012/03/01/technology/impatient-web-users-flee-slow-loading-sites.html “

Slide 72

Slide 72 text

No content

Slide 73

Slide 73 text

No content

Slide 74

Slide 74 text

https://twitter.com/zoompf/status/578901383253995520

Slide 75

Slide 75 text

http://www.webpagetest.org/video/compare.php?tests=141209_AY_Z79-r:1-c:0

Slide 76

Slide 76 text

http://www.webpagetest.org/video/compare.php?tests=141209_AY_Z79-r:1-c:0

Slide 77

Slide 77 text

FONT REQUESTs ARE A SINGLE POINT OF FAILURE

Slide 78

Slide 78 text

STOP BUTTON HAS NO EFFECT

Slide 79

Slide 79 text

LOCAL FONT { @FONT-FACE {

Slide 80

Slide 80 text

Flash of UNSTYLED Text F O U T

Slide 81

Slide 81 text

FOUT

Slide 82

Slide 82 text

IS 3 SECONDS A GOOD TIMEOUT?

Slide 83

Slide 83 text

40% abandon your website before it finishes loading 13 children are born 10,200,000 Emails are sent

Slide 84

Slide 84 text

WARNING THE NEXT SLIDE CONTAINS GRAPHIC IMAGERY THAT SOME VIEWERS MAY FIND DISTURBING

Slide 85

Slide 85 text

♥ and

Slide 86

Slide 86 text

LOCAL FONT { @FONT-FACE {

Slide 87

Slide 87 text

ANTI- PATTERNS A N TI-PA TTER N

Slide 88

Slide 88 text

CSS ONLOAD A N TI-PA TTER N

Slide 89

Slide 89 text

  h1  {  font-­‐family:  serif;  }   .loaded  h1  {  font-­‐family:  My  Web  Font;  }       A N TI-PA TTER N

Slide 90

Slide 90 text

BLOCKING FONTS.CSS Blocking FONT REQUESTS onload DEFAULT BROWSER BEHAVIOR DANGER ZONE A N TI-PA TTER N

Slide 91

Slide 91 text

ASYNC- CSSwith DATA-URIS A N TI-PA TTER N

Slide 92

Slide 92 text

filamentgroup / loadcss https://github.com/filamentgroup/loadCSS

Slide 93

Slide 93 text

No content

Slide 94

Slide 94 text

@font-­‐face  {      font-­‐family:  My  Web  Font;      src:  url('data:application/x-­‐font-­‐ woff;charset=utf-­‐8;base64,...')  format('woff');   }   @font-­‐face  {      font-­‐family:  My  Web  Font;      src:  url('data:application/x-­‐font-­‐ woff;charset=utf-­‐8;base64,...')  format('woff');      font-­‐weight:  700;   } A N TI-PA TTER N

Slide 95

Slide 95 text

ASYNC FONTS.CSS REPAINT DEFAULT BROWSER BEHAVIOR DANGER ZONE A N TI-PA TTER N

Slide 96

Slide 96 text

A N TI-PA TTER N

Slide 97

Slide 97 text

INLINE DATA URIS WITH MAIN CSS A N TI-PA TTER N

Slide 98

Slide 98 text

A N TI-PA TTER N

Slide 99

Slide 99 text

ONE 50KB CSS REQUEST A N TI-PA TTER N

Slide 100

Slide 100 text

NOT JUST A PERFORMANCE PROBLEM

Slide 101

Slide 101 text

https://twitter.com/jmuspratt/status/561239961924403200 Read more: http://zachleat.com/web/mitt-romney-webfont-problem/ A N TI-PA TTER N

Slide 102

Slide 102 text

https://twitter.com/jmuspratt/status/561239961924403200 Read more: http://zachleat.com/web/mitt-romney-webfont-problem/ A N TI-PA TTER N

Slide 103

Slide 103 text

https://twitter.com/jmuspratt/status/561239961924403200 Read more: http://zachleat.com/web/mitt-romney-webfont-problem/ A N TI-PA TTER N

Slide 104

Slide 104 text

No content

Slide 105

Slide 105 text

No content

Slide 106

Slide 106 text

USING FONT ICONS A N TI-PA TTER N

Slide 107

Slide 107 text

A N TI-PA TTER N

Slide 108

Slide 108 text

https://twitter.com/raganwald/status/452092613529567233 GitHub A N TI-PA TTER N

Slide 109

Slide 109 text

A N TI-PA TTER N

Slide 110

Slide 110 text

READ AS x2261 ≡ IDENTICAL TO x2605 ★ BLACK STAR or STAR x2665 ♥ HEART SUIT ACCESSIBILITY A N TI-PA TTER N

Slide 111

Slide 111 text

REPLACE YOUR FONT ICONS WITH SVG

Slide 112

Slide 112 text

EMBRACE MORE FOUT

Slide 113

Slide 113 text

AT A BARE MINIMUM ADD A TIMEOUT

Slide 114

Slide 114 text

EVEN BETTER EMBRACE FULL FOUT

Slide 115

Slide 115 text

font-DISPLAY CSS DESCRIPTOR https://tabatkins.github.io/specs/css-font-display/ from Kenji Baheux, Tab Atkins

Slide 116

Slide 116 text

@font-­‐face  {      font-­‐family:  Open  Sans;      /*  full  FOUT  */      font-­‐display:  swap;   }

Slide 117

Slide 117 text

@font-­‐face  {      font-­‐family:  Open  Sans;      /*  100ms  maximum  FOIT  */      /*  Do  not  repaint  after  3s  */      font-­‐display:  fallback;   }

Slide 118

Slide 118 text

@font-­‐face  {      font-­‐family:  Open  Sans;      /*  100ms  maximum  FOIT  */      /*  never  FOUT  */      /*  if  not  in  cache,  use  fallback  */      font-­‐display:  optional;   }

Slide 119

Slide 119 text

CSS Font Loading http://dev.w3.org/csswg/css-font-loading/

Slide 120

Slide 120 text

FONTFACEONLOAD github.com/zachleat/fontfaceonload USES THE CSS FONT LOADING API WHEN AVAILABLE. FONTFACEOBSERVER github.com/bramstein/fontfaceobserver/ INCLUDES A NICE PROMISES POLYFILL

Slide 121

Slide 121 text

var  doc  =  document,          docEl  =  doc.documentElement;   doc.fonts.load("1em  Raleway")    .then(function()  {          //  The  font  has  loaded.      docEl.className  +=  "  raleway-­‐loaded";    });

Slide 122

Slide 122 text

body  {      font-­‐family:  sans-­‐serif;   }   .raleway-­‐loaded  body  {      font-­‐family:  Raleway,  sans-­‐serif;   }

Slide 123

Slide 123 text

FONT REQUEST DEFAULT BROWSER BEHAVIOR DANGER ZONE REPAINT

Slide 124

Slide 124 text

FONT REQUEST FORCE  FONT  LOAD REPAINT

Slide 125

Slide 125 text

https://twitter.com/jmuspratt/status/561239961924403200

Slide 126

Slide 126 text

FONT REQUESTS REPAINT REPAINT MITT ROMNEY FONT LOADING DANGER ZONE

Slide 127

Slide 127 text

ONE REPAINT TO RULE THEM ALL

Slide 128

Slide 128 text

Promise.all([      document.fonts.load("400  1em  Raleway"),      document.fonts.load("700  1em  Raleway")   ]).then(function  ()  {      docEl.className  +=  "  raleway-­‐loaded";   }); ‑ document.fonts.load("1em  Raleway").then(function()  {      docEl.className  +=  "  raleway-­‐loaded";   }); BECOMES

Slide 129

Slide 129 text

MITT ROMNEY FONT LOADING DANGER ZONE FONT REQUESTS REPAINT REPAINT

Slide 130

Slide 130 text

FONT REQUESTS REPAINT REPAINT

Slide 131

Slide 131 text

FALLBACKS ARE IMPORTANT

Slide 132

Slide 132 text

No content

Slide 133

Slide 133 text

No content

Slide 134

Slide 134 text

fontfamily.io

Slide 135

Slide 135 text

MINIMIZE THE FALLBACK to WEBFONT REFLOW

Slide 136

Slide 136 text

font-­‐family   FALLBACK STYLE font-­‐size   font-­‐size-­‐adjust   line-­‐height

Slide 137

Slide 137 text

No content

Slide 138

Slide 138 text

No content

Slide 139

Slide 139 text

No content

Slide 140

Slide 140 text

EASE THE TRANSITION FROM FALLBACK TO WEBFONT

Slide 141

Slide 141 text

THE DEFAULT BROWSER BEHAVIOR FOR FONT-LOADING IS HARMFUL TO CONTENT ON THE WEB. FONT-LOADING

Slide 142

Slide 142 text

TAKE THE ROAD LESS TRAVELED

Slide 143

Slide 143 text

USE A FONT LOADING STRATEGY

Slide 144

Slide 144 text

@zachleat zachleat.com