Archive for August, 2012

Towards A Retina Web // Resolution Independence in Web Design


  

With the recent announcement and release of the Retina Macbook Pro, Apple has brought double-density screens to all of the product categories in its current lineup, significantly paving the way for the next wave of display standards. While the fourth-generation iPhone gave us a taste of the “non-Retina� Web in 2010, we had to wait for the third-generation iPad to fully realize how fuzzy and outdated our Web graphics and content images are.

In the confines of Apple’s walled garden, popular native apps get updated with Retina graphics in a timely fashion, with the help of a solid SDK and a well-documented transition process. By contrast, the Web is a gargantuan mass whose very open nature makes the transition to higher-density displays slow and painful. In the absence of industry-wide standards to streamline the process, each Web designer and developer is left to ensure that their users are getting the best experience, regardless of the display they are using.

Before diving into the nitty gritty, let’s briefly cover some basic notions that are key to understanding the challenges and constraints of designing for multiple display densities.

Device Pixels

Device Pixels

A device pixel (or physical pixel) is the tiniest physical unit in a display. Each and every pixel sets its own color and brightness as instructed by the operating system, while the imperceptible distance between these tiny dots takes care of tricking the eye into perceiving the full image.

Screen density refers to the number of device pixels on a physical surface. It is often measured in pixels per inch (PPI). Apple has coined the marketing term “Retina� for its double-density displays, claiming that the human eye can no longer distinguish individual pixels on the screen from a “natural� viewing distance.

CSS Pixels

CSS Pixels

A CSS pixel is an abstract unit used by browsers to precisely and consistently draw content on Web pages. Generically, CSS pixels are referred to as device-independent pixels (DIPs). On standard-density displays, 1 CSS pixel corresponds to 1 device pixel.

<div height="200" width="300"></div>

This would use 200 × 300 device pixels to be drawn on screen. On a Retina display, the same div would use 400 × 600 device pixels in order to keep the same physical size, resulting in four times more pixels, as shown in the figure below.

Device Pixels In Retina Displays
On a Retina display, four times as many device pixels are on the same physical surface.

The ratio between device pixels and CSS pixels can be obtained using the following media query and its vendor-specific equivalents:

        device-pixel-ratio,
     -o-device-pixel-ratio,
   -moz-device-pixel-ratio,
-Webkit-device-pixel-ratio {
…
}

Or you can use their future-proof siblings:

            device-pixel-ratio,
     -o-min-device-pixel-ratio,
   min--moz-device-pixel-ratio,
-Webkit-min-device-pixel-ratio {
…
}

In Javascript, window.devicePixelRatio can be used to obtain the same ratio, although browser support is still relatively limited. Both of these techniques will be discussed in depth later in this article.

Bitmap Pixels

Bitmap Pixels

A bitmap pixel is the smallest unit of data in a raster image (PNG, JPG, GIF, etc). Each pixel contains information on how it is to be displayed, including its position in the image’s coordinate system and its color. Some image formats can store additional per-pixel data, such as opacity (which is the alpha channel).

Beside its raster resolution, an image on the Web has an abstract size, defined in CSS pixels. The browser squeezes or stretches the image based on its CSS height or width during the rendering process.

When a raster image is displayed at full size on a standard-density display, 1 bitmap pixel corresponds to 1 device pixel, resulting in a full-fidelity representation. Because a bitmap pixel can’t be further divided, it gets multiplied by four on Retina displays to preserve the same physical size of the image, losing detail along the way.

Bitmap Pixels On Retina Displays
Each bitmap pixel gets multiplied by four to fill the same physical surface on a Retina display.

The Tool Chest

Even though we are still in the early stages of this major shift, several approaches to optimizing Web graphics for Retina displays have sprung up, and more are popping up as we speak. Each method makes some degree of compromise between performance, ease of implementation and cross-browser support. As such, choosing a tool should be done case by case, taking into account both quantitative and qualitative factors.

HTML And CSS Sizing

The most straightforward way to serve Retina-ready Web graphics is to halve the size of your raster assets using CSS or HTML, either manually or programatically. For instance, to serve a 200 × 300-pixel image (remember, those are CSS pixels), you would upload an image with a bitmap resolution of 400 × 600 pixels to your server, then shrink it by exactly 50% using CSS properties or HTML attributes. On a standard-resolution display, the result would be an image rendered with four times fewer pixels than its full bitmap size — a process commonly referred to as downsampling.

How downsampling works
A CSS-sized image gets its dimensions halved during the rendering process.

Because the same image would use four times as many physical pixels on a Retina screen, every physical pixel ends up matching exactly 1 bitmap pixel, allowing the image to render at full fidelity once again.

How HTML sizing works
CSS-sized images regain their full-detail glory on Retina displays.

There are several ways to achieve this:

Using HTML

The easiest way to apply CSS sizing would be by using the width and height attributes of the img tag:

<img src="example@2x.png" width="200" height="300" />

Please note that, even though specifying height is optional, it allows the browser to reserve the space required for the image before loading it. This prevents the page layout from changing as the image loads.

What to use it for? Single-page websites with few content images.

Using Javascript

The same result can also be obtained using Javascript by targeting all Retina-ready content images in the document and halving their sizes. With the help of jQuery, this would look like this:

$(window).load(function() {
  var images = $('img');
    images.each(function(i) {
      $(this).width($(this).width() / 2);
    });
});

What to use it for? Websites with few content images.

Using CSS (SCSS)

If you want to keep all of the presentation code in your CSS files, then the most common technique involves setting the image as the background of another HTML element, usually a div, then specifying its background-size property. You could either set explicit width and height values for the background image or use the contain value if the dimensions of the HTML element are already specified. It is worth noting that the background-size property is not supported in IE 7 or 8.

.image {
  background-image: url(example@2x.png);
  background-size: 200px 300px;
  /* Alternatively background-size: contain; */
  height: 300px;
  width: 200px;
}

You could also target a :before or :after pseudo-element instead:

.image-container:before {
  background-image: url(example@2x.png);
  background-size: 200px 300px;
  content:'';
  display: block;
  height: 300px;
  width: 200px;
}

This technique works just as well with CSS sprites, as long as the background-position is specified relatively to the CSS size (200 × 300 pixels in this case):

.icon {
  background-image: url(example@2x.png);
  background-size: 200px 300px;
  height: 25px;
  width: 25px;

  &.trash {
    background-position: 25px 0;
  }

  &.edit {
    background-position: 25px 25px;
  }
}

When using image sprites, consider any OS-specific limitations.

What to use it for? Websites that make limited use of the background-image property, such as those that rely on a single-image sprite.

HTML and CSS Sizing: Pros

  • Easy to implement
  • Cross-browser compatible

HTML and CSS Sizing: Cons

  • Non-Retina devices have to download larger assets.
  • Downsampled images might lose some of their sharpness on standard-density screens, depending on the algorithm used.
  • The background-size property is not supported in IE 7 or 8.

Querying Pixel Density

Querying Pixel Density

Perhaps the most popular way to serve Retina-ready graphics on the Web is by querying the device for its pixel density and then serving assets accordingly. This can be done using either CSS or JavaScript.

Using CSS Media Queries

As of this writing, almost every major browser vendor has implemented a prefixed variant of device-pixel-ratio and its two siblings, min-device-pixel-ratio and max-device-pixel-ratio. These media queries can be used in conjunction with the background-image property to serve Retina-ready assets to high-density devices:

.icon {
  background-image: url(example.png);
  background-size: 200px 300px;
  height: 300px;
  width: 200px;
}

@media only screen and (-Webkit-min-device-pixel-ratio: 1.5),
only screen and (-moz-min-device-pixel-ratio: 1.5),
only screen and (-o-min-device-pixel-ratio: 3/2),
only screen and (min-device-pixel-ratio: 1.5) {
  .icon {
    background-image: url(example@2x.png);
  }
}

By using a ratio of 1.5 instead of 2, you can target other non-Apple devices with the same query.

What to use it for? Any website or app that uses the background-image property for graphic assets. Not suitable for content images.

CSS Querying: Pros

  • Devices download only those assets that target them.
  • Cross-browser compatible
  • Pixel-precise control

CSS Querying: Cons

  • Tedious to implement, especially on large websites.
  • Displaying content images as backgrounds of other HTML elements is semantically incorrect.

Using Javascript

The pixel density of the screen can be queried in Javascript using window.devicePixelRatio, which reports the same value as its CSS counterpart. Once a higher-density screen is identified, you can replace every inline image with its Retina counterpart:

$(document).ready(function(){
  if (window.devicePixelRatio > 1) {
    var lowresImages = $('img');

    images.each(function(i) {
      var lowres = $(this).attr('src');
      var highres = lowres.replace(".", "@2x.");
      $(this).attr('src', highres);
    });
  }
});

Retina.js is a Javascript plugin that implements roughly the same technique as described above, with some additional features, such as skipping external images and skipping internal images with no @2x counterparts.

Lastly, it is worth noting that devicePixelRatio is not entirely cross-browser compatible.

What to use it for? Any website with content images, such as landing pages and blogs.

Javascript Querying: Pros

  • Easy to implement
  • Non-Retina devices do not download large assets.
  • Pixel-precise control

Javascript Querying: Cons

  • Retina devices have to download both standard- and high-resolution images.
  • The image-swapping effect is visible on Retina devices.
  • Does not work on some popular browsers (such as IE and Firefox).

Scalable Vector Graphics

Scalable Vector Graphics

Regardless of the method used, raster images remain inherently constrained by their bitmap resolution; they were never meant to be infinitely scalable. This is where vector graphics have the advantage, being a future-proof way to “Retinize� your Web graphics.

As of this writing, the vector XML-based SVG format has cross-browser support of more than 70% and can be used in several ways on the Web. SVG images can be easily created in and exported from a number of vector-graphic editors, such as Adobe Illustrator and free alternatives such as Inkscape.

As far as Web design goes, the most straightforward way to use SVG assets is with the HTML img tag or with the CSS background-image and content:url() properties.

<img src="example.svg" width="200" height="300" />

In the example above, a single SVG image can be used as a universal asset, scaling infinitely up or down as required. This not only saves precious bandwidth (most SVG files tend to be smaller in size than standard-resolution PNGs), but also makes your graphic assets much easier to maintain. The same would apply if used in CSS:

/* Using background-image */

.image {
  background-image: url(example.svg);
  background-size: 200px 300px;
  height: 200px;
  width: 300px;
}

/* Using content:url() */

.image-container:before {
  content: url(example.svg);
  /* width and height do not work with content:url() */
}

If you have to support IE 7 or 8 or Android 2.x, then you will need a fallback solution that swaps SVG images with their PNG counterparts. This can be easily done with Modernizr:

.image {
  background-image: url(example.png);
  background-size: 200px 300px;
}

.svg {
  .image {
    background-image: url(example.svg);
  }
}

For best cross-browser results and to avoid some rasterization headaches in Firefox and Opera, make each SVG image at least the size of its parent HTML element.

In HTML, you can implement a similar fallback solution by adding a custom data attribute to your img tag:

<img src="example.svg" data-png-fallback="example.png" />

Then, handle the rest with jQuery and Modernizr:

$(document).ready(function(){
  if(!Modernizr.svg) {
    var images = $('img[data-png-fallback]');
    images.each(function(i) {
      $(this).attr('src', $(this).data('png-fallback'));
    });
  }
});

This HTML and JavaScript route, however, would not prevent browsers with no SVG support from downloading the SVG assets.

What to use it for? Any website or app. Suitable for icons, logos and simple vector illustrations.

SVG: Pros

  • One universal asset for all devices
  • Easy to maintain
  • Future-proof: infinitely scalable vector graphics

SVG: Cons

  • No pixel precision due to anti-aliasing
  • Unsuitable for complex graphics due to large file sizes
  • No native support in IE 7 and 8 or early Android versions

Icon Fonts

Icon Fonts

Popularized by Twitter’s Bootstrap, the technique of using @font-face with icon-based fonts has garnered a following of its own as a resolution-independent alternative to bitmap icons. The technique consists of using a custom Web font that replaces the alphabet with monochrome glyphs, which can be styled using CSS, just like any other text on the website.

There is no shortage of comprehensive, good-quality icon fonts that would cover most of your needs. That being said, importing a large font in half a dozen formats only to use a small subset of the icons is a bad idea. Consider building your own custom font with free tools such as Fontello, Font Builder or even Inkscape.

The most common way to use icon fonts on websites is by assigning an .icon or .glyph class to a particular HTML element — most often a <span> or an <i> — and then using the letter corresponding to the desired icon as its content:

<span class="icon">a</span>

After having imported your custom font using @font-face, you would declare it:

.icon {
  font-family: 'My Icon Font';
}

Another technique consists of using the :before pseudo-element and the content property, with a unique class for each icon:

<span class="glyph-heart"></span>
[class^="glyph-"]:before {
  font-family: 'My Icon Font';
}

.glyph-heart:before {
  content: 'h';
}

What to use it for? Websites or apps with a high number of icons, and for rapid prototyping.

Icon Fonts: Pros

  • Future-proof: infinitely scalable glyphs
  • Cross-browser compatible
  • More flexible than graphic assets: can be used in placeholder text and other form elements, etc.

Icon Fonts: Cons

  • No pixel precision due to subpixel anti-aliasing
  • Hard to maintain: changing a single icon requires regenerating the whole font.
  • Relies on semantically incorrect markup (unless used with :before or :after pseudo-elements).

Favicons

Favicons are getting their fair share of attention, being increasingly used outside of browser chrome as an iconic representation of our websites and apps. To make your favicons Retina-ready, export an .ico file in both 16- and 32-pixel versions. If you are using a Mac, you can create your own .ico files with Apple’s Icon Composer (included in the Graphic Tools in Xcode) or with Icon Slate, a paid third-party application.

A Glimpse Of The Future

Besides the techniques covered above, several other efforts are being made independently by organizations and individuals alike, not the least of which is Apple’s own -Webkit-image-set, introduced last spring. This proposal allows for multiple variants of the same image to be provided in one CSS declaration:

.image {
  background-image: -Webkit-image-set(url(example.png) 1x, url(example@2x.png) 2x);
  background-size: 200px 300px;
}

This technique does not, however, cover images inside img tags, and it is Webkit-only as of this writing.

Another notable effort is Scott Jehl’s Picturefill, an HTML and Javascript solution that makes heavy use of data attributes and media queries to serve different images in different media contexts.

<div data-picture>
     <div data-src="example.png"></div>
     <div data-src="example@2x.png" data-media="(min-device-pixel-ratio: 1.5)"></div>

  <!-- Fallback content for non-JS browsers -->
  <noscript>
    <img src="example.png" >
  </noscript>
</div>

Even if the markup puts you off, it is a good cross-browser solution to consider if you are dealing with few content images.

Last but not least, the ambitious picture element proposal aims to bring responsive images to the Web using a markup-only approach for multiple image sources, coupled with media queries that route each device to the right asset.

Closing Words

Like other major shifts the Web is currently undergoing, attaining resolution independence will be a long journey. As Web designers and developers, either we can sit down and wait passively for a convention to be standardized, or we can immediately start offering a pleasurable viewing experience to our users. Let’s get to work.

(al)


© Reda Lemeden for Smashing Magazine, 2012.


Creep Factor: A Collection of Dark and Spooky Photography


  

Photographers not only use their work to freeze moments of time, they often set a mood through the shots that they capture. No matter what direction they are aiming, their ability to compose just the right image to connect the viewer with that particular feeling is inspiring. When that aim comes down in the dark or spooky territories it is easy for the work to feel more contrived than anything else. Which is why, when it’s done well it can truly send shivers down your spine.

Today we bring you a collection we hope will do just that. With this look at dark and spooky photography we’ve found artists that have done a wonderful job keeping their work fresh and poignant. At times, to a near terrifying degree. So enjoy the spine-tingling showcase we have prepared.

Creep Factor

Let Me In by mant01

Wolves are Withering by andyp89

I am Jack’s Inflamed Sense of Rejection by TrizTaess

Face your fear, face the darkness by TeoHope

I dream with a rabbit…

Haunted? by NutellaDreams

after midnight by Senju-Hime

a rose between her teeth by Maerchenfee

Where The Dreams Came From by thebrokenfool

Nightmare by Ashitaro

Spider by MandiMalfunction

Haunted – playground by BlackCocktail

Clown Project Teaser 1 by viletaste

Welcome Home by moonshinerose

dark blue world by kayjensen

Solitary Mourner by Maceo-x

Passed Life II by shreeb

Let Me Out by JohnKyo

Broken by DepravedDesire

Dear Death by psypence

Wings by Gwarf

fog in the forest by EtanOlka

Letter from silent heaven by Beezqp

Deadly Sorrow by y0upy0uplab0um

Still I go by zombiex495

Three Hundred Sixty by SoulofNovember

Lost In my Agony by Griefy

They call me The Wild Rose by Maerchenfee

destination chaos by Gosia-Firewarrior

Lost by Milandentjestoe

Dark by Ozbanica

No More Fear

Feel free to unclench your mouse or keyboard and breath easy once again, the showcase is over. Which of the photographs connected with you the most? Did any of them leave you with chills? Leave us your thoughts in the comments below.

(rb)


JavaScript Events And Responding To The User // Back To Basics


  

Whenever people ask me about the most powerful things in JavaScript and the DOM, I quickly arrive at events. The reason is that events in browsers are incredibly useful. Furthermore, decoupling functionality from events is a powerful idea, which is why Node.js became such a hot topic.

Today, let’s get back to the basics of events and get you in the mood to start playing with them, beyond applying click handlers to everything or breaking the Web with <a href="javascript:void(0)"> links or messing up our HTML with onclick="foo()" inline handlers (I explained in detail in 2005 why these are bad ideas).

Note: This article uses plain JavaScript and not any libraries. A lot of what we’ll talk about here is easier to achieve in jQuery, YUI or Dojo, but understanding the basics is important because you will find yourself in situations where you cannot use a library but should still be able to deliver an amazing solution.

Disclaimer: The event syntax we’ll be using here is addEventListener(), as defined in the “DOM Level 3 Events� specification, which works in all browsers in use now except for Internet Explorer below version 9. A lot of the things we’ll show can be achieved with jQuery, though, which also supports legacy browsers. Come to think of it, one simple addEventListener() on DOMContentLoaded is a great way to make sure your script does not run on legacy browsers. This is a good thing. If we want the Web to evolve, we need to stop giving complex and demanding code to old browsers. If you build your solutions the right way, then IE 6 would not need any JavaScript to display a workable, albeit simpler, solution. Think of your product as an escalator: if your JavaScript does not execute, the website should still be usable as stairs.

Before we get into the details of events and how to use them, check out a few demos that use scroll events in a clever way to achieve pretty sweet results:

All of this is based on event handling and reading out what the browser gives us. Now, let’s look at repeating the basics of that.

Basics: What Is An Event?

var log = document.getElementById('log'),
    i = null, 
    out = [];
for (var i in window) {
  if ( /^on/.test(i)) { out[out.length] = i; }
}
log.innerHTML = out.join(', ');

In my case, running Firefox, I get this:

onmouseenter, onmouseleave, onafterprint, onbeforeprint, onbeforeunload, onhashchange, onmessage, onoffline, ononline, onpopstate, onpagehide, onpageshow, onresize, onunload, ondevicemotion, ondeviceorientation, onabort, onblur, oncanplay, oncanplaythrough, onchange, onclick, oncontextmenu, ondblclick, ondrag, ondragend, ondragenter, ondragleave, ondragover, ondragstart, ondrop, ondurationchange, onemptied, onended, onerror, onfocus, oninput, oninvalid, onkeydown, onkeypress, onkeyup, onload, onloadeddata, onloadedmetadata, onloadstart, onmousedown, onmousemove, onmouseout, onmouseover, onmouseup, onmozfullscreenchange, onmozfullscreenerror, onpause, onplay, onplaying, onprogress, onratechange, onreset, onscroll, onseeked, onseeking, onselect, onshow, onstalled, onsubmit, onsuspend, ontimeupdate, onvolumechange, onwaiting, oncopy, oncut, onpaste, onbeforescriptexecute, onafterscriptexecute

That is a lot to play with, and the way to do that is by using addEventListener():

element.addEventListener(event, handler, useCapture);

For example:

var a = document.querySelector('a'); // grab the first link in the document
a.addEventListener('click', ajaxloader, false);

The element is the element that we apply the handler to; as in, “Hey you, link! Make sure you tell me when something happens to you.� The ajaxloader() function is the event listener; as in, “Hey you! Just stand there and keep your ears and eyes peeled in case something happens to the link.� Setting the useCapture to false means that we are content to capture the event on bubbling, rather than the capturing phase. This is a long and arduous topic, well explained on Dev.Opera. Let’s just say that by setting the useCapture to false, you will be fine in 99.7434% of cases (a rough approximation). The parameter is actually optional in all browsers but Opera.

Now, the event handler function gets an object as a parameter from the event, which is full of awesome properties that we can play with. If you try out my example, you’ll see what the following code does:

var log = document.getElementById('log'),
    i = 0,
    out = '';
    
document.addEventListener('click', logeventinfo, false);
document.addEventListener('keypress', logeventinfo, false);

function logeventinfo (ev) {
  log.innerHTML = '';
  out = '<ul>';
  for (var i in ev) {
    if (typeof ev[i] === 'function' || i === i.toUpperCase()) {
      continue;
    }
    out += '<li><span>'+i+'</span>: '+ev[i]+'</li>';
  }
  log.innerHTML += out + '</ul>';
}

You can assign several event handlers to the same event, or the same handler to various events (as shown in this demo).

The ev is what we get back from the event. And (again, in my case, in Firefox) a lot of interesting things are in it:

originalTarget: [object HTMLHtmlElement]
type: click
target: [object HTMLHtmlElement]
currentTarget: [object HTMLDocument]
eventPhase: 3
bubbles: true
cancelable: true
timeStamp: 574553210
defaultPrevented: false
which: 1
rangeParent: [object Text]
rangeOffset: 23
pageX: 182
pageY: 111
isChar: false
screenX: 1016
screenY: 572
clientX: 182
clientY: 111
ctrlKey: false
shiftKey: false
altKey: false
metaKey: false
button: 0
relatedTarget: null
mozPressure: 0
mozInputSource: 1
view: [object Window]
detail: 1
layerX: 182
layerY: 111
cancelBubble: false
explicitOriginalTarget: [object HTMLHtmlElement]
isTrusted: true
originalTarget: [object HTMLHeadingElement]
type: click
target: [object HTMLHeadingElement]
currentTarget: [object HTMLDocument]
eventPhase: 3
bubbles: true
cancelable: true
timeStamp: 574554192
defaultPrevented: false
which: 1
rangeParent: [object Text]
rangeOffset: 0
pageX: 1
pageY: 18
isChar: false
screenX: 835
screenY: 479
clientX: 1
clientY: 18
ctrlKey: false
shiftKey: false
altKey: false
metaKey: false
button: 0
relatedTarget: null
mozPressure: 0
mozInputSource: 1
view: [object Window]
detail: 1
layerX: 1
layerY: 18
cancelBubble: false
explicitOriginalTarget: [object Text]
isTrusted: true

It also differs from event to event. Try clicking the demo and pressing keys, and you will see that you get different results. You can also refer to the full list of standard event properties.

The Last Of The Basics: Preventing Execution And Getting The Target

Two more things are important when it comes to events in the browser: we have to stop the browser from carrying out its default action for the event, and we have to find out which element the event fired on. The former is achieved with the ev.preventDefault() method, and the latter is stored in ev.target.

Say you want to know that a link has been clicked, but you don’t want the browser to follow it because you have a great idea of what to do with that event instead. You can do this by subscribing to the click event of the link, and you can stop the browser from following it by calling preventDefault(). Here is the HTML:

<a class="prevent" href="http://smashingmagazine.com">Smashing, my dear!</a>
<a class="normal" href="http://smashingmagazine.com">Smashing, my dear!</a>

And the JavaScript:

var normal = document.querySelector('.normal'),
    prevent = document.querySelector('.prevent');

prevent.addEventListener('click', function(ev) {
  alert('fabulous, really!');
  ev.preventDefault();
}, false);

normal.addEventListener('click', function(ev) {
  alert('fabulous, really!');
}, false);

Note: document.querySelector() is the standard way to get an element in the DOM. It is what the $() method in jQuery does. You can read the W3C’s specification for it and get some explanatory code snippets on the Mozilla Developer Network (MDN).

If you now click the link, you will get an alert. And when you hit the “OK� button, nothing more happens; the browser does not go to http://smashingmagazine.com. Without the preventDefault(), the browser will show the alert and follow the link. Try it out.

The normal way to access the element that was clicked or hovered over or that had a key pressed is to use the this keyword in the handler. This is short and sweet, but it’s actually limiting because addEventListener() gives us something better: the event target. It could also be confusing because this might already be bound to something else, so using ev.currentTarget as noted in the specification is a safer bet.

Event Delegation: It Rocks. Use It!

Using the target property of the event object, you can find out which element the event occurred on.

Events happen by going down the whole document tree to the element that you interacted with and back up to the main window. This means that if you add an event handler to an element, you will get all of the child elements for free. All you need to do is test the event target and respond accordingly. See my example of a list:

<ul id="resources">
  <li><a href="http://developer.mozilla.org">MDN</a></li>
  <li><a href="http://html5doctor.com">HTML5 Doctor</a></li>
  <li><a href="http://html5rocks.com">HTML5 Rocks</a></li>
  <li><a href="http://beta.theexpressiveweb.com/">Expressive Web</a></li>
  <li><a href="http://creativeJS.com/">CreativeJS</a></li>
</ul>

Hover your mouse over the list in this example and you will see that one event handler is enough to get the links, the list item and the list itself. All you need to do is compare the tagName of the event target to what you want to have.

var resources = document.querySelector('#resources'),
    log = document.querySelector('#log');

resources.addEventListener('mouseover', showtarget, false);

function showtarget(ev) {
  var target = ev.target;
  if (target.tagName === 'A') {
    log.innerHTML = 'A link, with the href:' + target.href;
  }
  if (target.tagName === 'LI') {
    log.innerHTML = 'A list item';
  }
  if (target.tagName === 'UL') {
    log.innerHTML = 'The list itself';
  }
}

This means you can save a lot of event handlers — each of which is expensive to the browser. Instead of applying an event handler to each link and responding that way — as most people would do in jQuery with $('a').click(...) (although jQuery’s on is OK) — you can assign a single event handler to the list itself and check which element was just clicked.

The main benefit of this is that you are independent of the HTML. If you add more links at a later stage, there is no need to assign new handlers; the event handler will know automatically that there is a new link to do things with.

Events For Detection, CSS Transitions For Smoothness

If you remember the list of properties earlier in this article, there is a lot of things we can use. In the past, we used events for simple hover effects, which now have been replaced with effects using the :hover and :focus CSS selectors. Some things, however, cannot be done with CSS yet; for example, finding the mouse’s position. With an event listener, this is pretty simple. First, we define an element to position, like a ball. The HTML:

<div class="plot"></div>

And the CSS:

.plot {
  position:absolute;
  background:rgb(175,50,50);
  width: 20px;
  height: 20px;
  border-radius: 20px;
  display: block;
  top:0;
  left:0;
}

We then assign a click handler to the document and position the ball at PageX and pageY. Notice that we need to subtract half the width of the ball in order to center it on the mouse pointer:

var plot = document.querySelector('.plot'),
    offset = plot.offsetWidth / 2;
document.addEventListener('click', function(ev) {
  plot.style.left = (ev.pageX - offset) + 'px';
  plot.style.top = (ev.pageY - offset) + 'px';
}, false);

Clicking anywhere on the screen will now move the ball there. However, it’s not smooth. If you enable the checkbox in the demo, you will see that the ball moves smoothly. We could animate this with a library, but browsers can do better these days. All we need to do is add a transition to the CSS, and then the browser will move the ball smoothly from one position to another. To achieve this, we define a new class named smooth and apply it to the plot when the checkbox in the document is clicked. The CSS:

.smooth {
  -webkit-transition: 0.5s;
     -moz-transition: 0.5s;
      -ms-transition: 0.5s;
       -o-transition: 0.5s;
          transition: 0.5s;
}

The JavaScript:

var cb = document.querySelector('input[type=checkbox]');
cb.addEventListener('click', function(ev) {
  plot.classList.toggle('smooth');
}, false);

The interplay between CSS and JavaScript events has always been powerful, but it got even better in newer browsers. As you might have guessed, CSS transitions and animations have their own events.

How Long Was A Key Pressed?

As you might have seen in the list of available events earlier, browsers also give us a chance to respond to keyboard entry and tell us when the user has pressed a key. Sadly, though, key handling in a browser is hard to do properly, as Jan Wolter explains in detail. However, as a simple example, let’s look how we can measure in milliseconds how long a user has pressed a button. See this keytime demo for an example. Press a key, and you will see the output field grow while the key is down. Once you release the key, you’ll see the number of milliseconds that you pressed it. The code is not hard at all:

var resources = document.querySelector('#resources'),
    log = document.querySelector('#log'),
    time = 0;

document.addEventListener('keydown', keydown, false);
document.addEventListener('keyup', keyup, false);

function keydown(ev) {
  if (time === 0) { 
    time = ev.timeStamp; 
    log.classList.add('animate');
  }
}
function keyup(ev) {
  if (time !== 0) {
    log.innerHTML = ev.timeStamp - time;
    time = 0;
    log.classList.remove('animate');
  }
}

We define the elements we want and set the time to 0. We then apply two event handlers to the document, one on keydown and one on keyup.

In the keydown handler, we check whether time is 0, and if it is, we set time to the timeStamp of the event. We assign a CSS class to the output element, which starts a CSS animation (see the CSS for how that is done).

The keyup handler checks whether time is still 0 (as keydown gets fired continuously while the key is pressed), and it calculates the difference in the time stamps if it isn’t. We set time back to 0 and remove the class to stop the animation.

Working With CSS Transitions (And Animations)

CSS transitions fire a single event that you can listen for in JavaScript called transitionend. The event object then has two properties: propertyName, which contains the property that was transitioned, and elapsedTime, which tells you how long it took.

Check out the demo to see it in action. The code is simple enough. Here is the CSS:

.plot {
  background:rgb(175,50,50);
  width: 20px;
  height: 20px;
  border-radius: 20px;
  display: block;
  -webkit-transition: 0.5s;
     -moz-transition: 0.5s;
      -ms-transition: 0.5s;
       -o-transition: 0.5s;
          transition: 0.5s;
}

.plot:hover {
  width: 50px;
  height: 50px;
  border-radius: 100px;
  background: blue;
}

And the JavaScript:

plot.addEventListener('transitionend', function(ev) {
  log.innerHTML += ev.propertyName + ':' + ev.elapsedTime + 's ';
}, false);

This, however, works only in Firefox right now because Chrome, Safari and Opera have vendor-prefixed events instead. As David Calhoun’s gist shows, you need to detect what the browser supports and define the event’s name that way.

CSS animation events work the same way, but you have three events instead of one: animationstart, animationend and animationiteration. MDN has a demo of it.

Speed, Distance And Angle

Detecting events happening is one thing. If you want to do something with them that is a beautiful and engaging, then you need to go further and put some math into it. So, let’s have a go at using a few mouse handlers to calculate the angle, distance and speed of movement when a user drags an element across the screen. Check out the demo first.

var plot = document.querySelector('.plot'),
    log = document.querySelector('output'),
    offset = plot.offsetWidth / 2,
    pressed = false,
    start = 0, x = 0, y = 0, end = 0, ex = 0, ey = 0, mx = 0, my = 0, 
    duration = 0, dist = 0, angle = 0;

document.addEventListener('mousedown', onmousedown, false);
document.addEventListener('mouseup', onmouseup, false);
document.addEventListener('mousemove', onmousemove, false);

function onmousedown(ev) {
  if (start === 0 && x === 0 && y === 0) {
    start = ev.timeStamp;
    x = ev.clientX;
    y = ev.clientY;
    moveplot(x, y);
    pressed = true;
  }
}
function onmouseup(ev) {
  end = ev.timeStamp;
  duration = end - start;
  ex = ev.clientX;
  ey = ev.clientY;
  mx = ex - x;
  my = ey - y;
  dist = Math.sqrt(mx * mx + my * my);
  start = x = y = 0;
  pressed = false;
  angle = Math.atan2( my, mx ) * 180 / Math.PI;
  log.innerHTML = '<strong>' + (dist>>0) +'</strong> pixels in <strong>'+
                  duration +'</strong> ms ( <strong>' +
                  twofloat(dist/duration) +'</strong> pixels/ms)'+
                  ' at <strong>' + twofloat(angle) +
                  '</strong> degrees';
}
function onmousemove (ev) {
  if (pressed) {
    moveplot(ev.pageX, ev.pageY);
  }
}
function twofloat(val) {
  return Math.round((val*100))/100;
}
function moveplot(x, y) {
  plot.style.left = (x - offset) + 'px';
  plot.style.top = (y - offset) + 'px';
}

OK, I admit: quite a lot is going on here. But it is not as hard as it looks. For both onmousedown and onmouseup, we read the mouse’s position with clientX and clientY and the timeStamp of the event. Mouse events have time stamps that tell you when they happened. When the mouse moves, all we check is whether the mouse button has been pressed (via a boolean set in the mousedown handler) and move the plot with the mouse.

The rest is geometry — good old Pythagoras, to be precise. We get the speed of the movement by checking the number of pixels traveled in the time difference between mousedown and mouseup.

We get the number of pixels traveled as the square root of the sum of the squares of the difference between x and y at the start and end of the movement. And we get the angle by calculating the arctangent of the triangle. All of this is covered in “A Quick Look Into the Math of Animations With JavaScript�; or you can play with the following JSFiddle example:

Media Events

Both video and audio fire a lot of events that we can tap into. The most interesting are the time events that tell you how long a song or movie has been playing. A nice little demo to look at is the MGM-inspired dinosaur animation on MDN; I recorded a six-minute screencast explaining how it is done.

If you want to see a demo of all the events in action, the JPlayer team has a great demo page showing media events.

Input Options

Traditionally, browsers gave us mouse and keyboard interaction. Nowadays, this is not enough because we use hardware that offers more to us. Device orientation, for example, allows you to respond to the tilting of a phone or tablet; touch events are a big thing on mobiles and tablets; the Gamepad API allows us to read out game controllers in browsers; postMessage allows us to send messages across domains and browser windows; pageVisibility allows us to react to users switching to another tab. We can even detect when the history object of the window has been manipulated. Check the list of events in the window object to find some more gems that might not be quite ready but should be available soon for us to dig into.

Whatever comes next in browser support, you can be sure that events will be fired and that you will be able to listen to them. The method works and actually rocks.

Go Out And Play

And that is it. Events are not hard; in most cases, you just need to subscribe to them and check what comes back as the event object to see what you can do with it. Of course, a lot of browser hacking is still needed at times, but I for one find incredible the number of ways we can interact with our users and see what they are doing. If you want to get really creative with this, stop thinking about the use cases we have now and get down into the nitty gritty of what distances, angles, speed and input can mean to an interface. If you think about it, playing Angry Birds to the largest degree means detecting the start and end of a touch event and detecting the power and direction that the bird should take off in. So, what is stopping you from creating something very interactive and cool?

Image source of picture on front page.

(al)


© Christian Heilmann for Smashing Magazine, 2012.


Beautiful Button Design in Action: Examples & Tips for Creating Effective Buttons


  

Designing beautiful buttons for the web is an art form in and of itself. The best buttons often appear simple and easy to design, yet are deceptively difficult, and are often comprised of many subtle design elements, backed by solid marketing theories. Today we’re going to look at some of the principles behind great button design, and give you some practical tips to improve your own website’s buttons, and boost your conversions/click-through rates.

Tips and Techniques for Designing Effective Buttons

Below are some applicable tips for improving your web buttons and boosting their click through rates.

1. Make Your Buttons Bold and Bright

Whilst a bold/bright button will clearly not fit with every web layout, as a rule of thumb these are the buttons that receive the most clicks. A bolder/brighter button naturally attracts more attention from your visitors, as the human eye is drawn to color and solid hues.

If you’re into split testing your designs then try increasing the saturation of your buttons (within a tasteful level) and watch your click through rates go up slightly.

2. Larger Buttons Attract More Attention

This is another common sense part of button theory, but one ignored by many website owners. Generally speaking, larger buttons will naturally attract more attention.

It’s been proven time and time again that by increasing the size of your call to action buttons more people will notice them, and by extension click them.

The trend of HUGE web 2.0 buttons may be over, but by integrating a tasteful, large button into your design you will definitely be prompting action on the part of your visitors.

3. Buttons Should Fit With Your Site’s Theme

Whilst contrast is good (we’ll get to that in the next step) you should remember to integrate your buttons well with the surrounding website design.

If you run a nature themed website then it would look pretty weird to have an industrial steel textured button. Even if it did attract attention it would be the wrong type of attention, as the button would appear awkward and visually clash.

Try to find common themes, moods and motifs in your website design and then artfully integrate these into your button design. Taking elements from the surrounding website (be it icons, textures, lighting etc…) can add a lot to a strong button design.

4. Contrast is Good!

Another staple of button design theory is that contrast will get you more click through rates. If you have a plain white background for your website then don’t make your button light gray or cream, make it black, or a solid, bold color!

Contrast is one of the most powerful techniques for getting your buttons noticed. It also applies to the text, which should contrast well against the button color.

Don’t make your buttons something that people can skim over, make them noticeable.

5. Small Details Make a Big Difference

As with all design, the small details can take your work from ‘good’ to ‘great’. A website button may be a fairly simple visual element, but don’t forget to pay attention to the subtle details.

A thin border, subtle gradient, faint pattern, or lighting effect can make a world of difference. Not only do these kinds of visual touches show professionalism and an attention to detail, but they often add depth to your buttons, making them stand out and ‘pop’ from the surrounding page more.

6. Don’t Forget the Text!

Probably the main element people overlook in their button design is the text, yet it can have the biggest impact. In this sense your button text or ‘copy’ is crucial to it’s success.

Gone are the days when ‘buy now’ or ‘join’ were sufficient. People like a bit of creativity in their button copy, and they also appreciate getting a hint at the benefits of your service/website.

Try some of the following techniques for making your button copy more interesting:

  • Instead of just having ‘buy now’ use ‘Try (Your Service)’
  • Going one step further have ‘Try (Your Service) for (Low Price)’ by ‘Try (Your Service) and (Give Brief Benefit)’
  • Another variation is ‘(Common Problem)? Try (Your Service)’

A real life example that you’ll see in this post is Akismet, whose main call to action button reads: ‘Get Started and Say Goodbye to Spam’.

7. Think About the Surrounding Details

A successful button design doesn’t end with the button, you need to also consider the details of the surrounding website. Think about how this surrounding area can point people towards your call to action button, and help accentuate it.

Here are some practical ideas:

  • If your web design has a common light source make sure that this is reflected in your button design (i.e.: ensure that your buttons highlights/shadows relate to the wider light source on the page)
  • Use shapes such as arrows to direct attention to your button. These have been proven to vastly increase click through rates.
  • Think about establishing trust/credibility if you’re offering a service. Using ‘secure payment’ signs, major credit card logos, or testimonials near your button can make people more likely to click it.
  • Consider the amount of padding around your button. Generally speaking if a button has more padding then it will seem more isolated and will draw more attention, as there is less competing content around it.

8. The Magic Button Example

On his blog Smart Passive Income, Pat Flynn wrote an article about how he increased his earnings for an ebook in 5 minutes by simply updating his ‘buy now’ button to a ‘Magic Button’ invented by marketer Ryan Deiss.

You can read the article here: How to Increase Your Earnings in 5 Minutes or Less. We won’t repeat the details of Pat’s entire post, but essentially Ryan Deiss came up with the button design by split testing 43 variations to find the one that converted best.

Now you’ll probably agree that the final button isn’t the most attractive, or elegant. However, it undeniably gets the job done!

Whether you opt for something this in your face or not, you should take away some of the principles that this button utilizes (it’s large, bold, uses surrounding details like the border/credit cards/discounted price to draw more attention etc…).

Beautiful Button Design

Beautiful Button Design in Action

Groupon
Groupon has one of the most unique button designs around. The button combines with a progress bar that entices people to see what lies ahead if they sign up for the site. The forward arrow and bold blue button are equally enticing.

Beautiful Button Design

Bundlr
Bundlr uses a very simple, but effective call to action button on their site that works for several reasons. It is clearly very bold and colorful against the plainer background, which helps it stand out. The imperative text ‘start now’ also pushes users in the right direction. Finally, the subtle design touches such as the drop shadow, 1px border and inner highlight all help the button pop and appear more professional.

Beautiful Button Design

Status Board
Status Board’s button is everything I love about effective button design. It’s bright, it’s bold and it makes you want to click it! The bevel effect really makes the button stand out and feel more ‘pushable’, which must help their conversions. The text choice is also interesting, shying away from standard web fonts and opting for something more creative.

Beautiful Button Design

Votizen
Votizen uses a bold red button design to attract visitor’s attention, and also overlay a pixelated pattern to make the button more eye catching. Importantly, the red of the button ties in with the other primary colors in the design, which allude to the US flag.

Beautiful Button Design

My Design Deals
My Design Deals uses an effective button design to help get subscribers to their newsletter. The bright, lime green button design contrasts the dark gray backdrop really well, whilst the accompanying yellow arrow helps draw further attention to the area. The imperative ‘get free updates now’ encourages users to sign up by giving them a direct action to take.

Beautiful Button Design

Club Divot
Club Divot shows how button design doesn’t have to be boring! Their charming wooden button fits perfectly with the site’s golfing theme, and gives a very natural feel for the site. The embedded design with a sharp white highlight across the top also gives depth.

Beautiful Button Design

Kissmetrics
You would hope that a company dealing with online metrics and testing had an effective button design, and Kissmetrics don’t disappoint! Their understated button is professional and sleek, and fits perfectly with the surrounding clean website. The copy ‘get me started with Kissmetrics’ is effective as it’s fairly casual, yet entirely relevant to their company.

Beautiful Button Design

The Copper Tree
The Copper Tree uses some charming button designs that complement the surrounding web design nicely. The red leaves fit well with the surrounding graphics, and also act as graphical arrows which encourage users to click the buttons.

Beautiful Button Design

Zero Bundle
Zero Bundle is a classic example of a bold, bright button that converts very well. The green call to action button is paired with some creative, bold text to draw extra attention. The white text is given a bold drop shadow to help it stand out.

Beautiful Button Design

App Sumo
App Sumo started as a ‘get it live, not perfect’ kind of business, but as they’ve grown to a giant in the online deals market they began rigorously testing each element of their page. It’s safe to say that their current buttons are the best converting they’ve ever had. The current deal button is incredibly bright, and uses a very tall font to take up most of the button.

Beautiful Button Design

Pixeno
Pixeno uses a fairly standard button design with some lovely touches to help draw attention to it. The green button uses a subtle highlight effect, faint border and stylish arrow to stand out. The text also uses an elegant drop shadow to give it extra depth.

Beautiful Button Design

Hot Sauce Fever
Hot Sauce Fever has a really interesting grungy button design on their website to encourage action from their visitors. The button has a rough texture overlay, as well as a unique, relevant icon. Overall it’s large, eye catching and well designed.

Beautiful Button Design

Make it Bloom
Another great example of a simple, effective button design. Make it Bloom uses a bold green button that fits with the nature theme of their site. The subtle gradient and bevel effect makes the button appear more 3D and add depth.

Beautiful Button Design

Mighty Deals
Mighty Deals uses a very clever button that fits well with their design deals site. The button is in the shape of a sales tag and therefore is really unique to their website. The bold text combined with bright orange button gradient is very eye catching.

Beautiful Button Design

Desk Time
Desk Time uses the principle of ‘bigger is better’ by using a HUGE call to action button that encourages users to sign up for their free trial. The button is very clean and colorful and uses the additional tagline ‘no credit-card required’ to boost conversions.

Beautiful Button Design

The Forge
The Forge have an interesting choice of button. Their ‘hire us’ button is the same size and shape as the main menu buttons. This should help increase click through rate on the button. The button also establishes positive connotations by including a tick icon, which should further help engagement.

Beautiful Button Design

Akismet
The call to action button at Akismet could easily be just another button. However, it’s incredibly eye catching for a couple of reasons. Other than the bright blue design, the bold white border adds far more contrast against the green background. The text provides an instant reason for signing up ‘say goodbye to spam’ which gives people more incentive to click.

Beautiful Button Design

Ampersand Commerce
Ampersand Commerce is a classic example of a button effectively contrasting the surrounding design. The button is bold, colorful and ‘solid’, whilst the surrounding area is fairly sparse, monotone and plainer. This contrast ensures that your eye is drawn to the button straight away.

Beautiful Button Design

Xhtml Genius
A very clean and professional button design that is classically ‘clickable’. The ‘ORDER NOW’ text stands out by being all in caps and bolder than all the surrounding website text. The red button color complements the shades of lighter red and green in the rest of the site, whilst standing out against the plain background.

Beautiful Button Design

What Do You Think?

We would love to know what you guys thought! Did you have any favorite examples from this post, or perhaps a technique that stood out to you especially? What makes a great button in your opinion?

(rb)


Useful Print And Online Magazines For Web Designers // Recommended Reading


  

One of the advantages of working in a creative industry is the number of designers and developers who take their craft seriously. The design community shines in one regard in particular: the design community seems to be less willing to hoard knowledge and skills. Instead, we present them, elaborate on them and keep improving on each other’s techniques — among other media — magazines and books.

In this overview of useful magazines you’ll find everything from purely online publications to monthly, glossy print editions, where all subjects relevant to art and design are being investigated in colorful, eloquent detail.

Print And Digital Indie Publications

The Manual
Three beautiful A5 handcrafted hardback books-magazines a year, each one with a bit over 100 pages. The Manual delivers intelligent and critical thinking, and voices on the “Why?” of Web design, taking the reader to a deeper and richer level of work. Published by Andy McMillan, edited by Carolyn Wood, and designed by Jez Burrows, you can get it for 25$.

CODEX, The Journal of Typography
An infrequent 164 page magazine with feature articles, book and typeface reviews, interviews, type history, essays and type design — from typography experts. The first issue was released in spring of 2011, the second one is coming out in summer of 2012. The Codex magazine is only available in print and PDF version (8$).

Offscreen Mag: The People Behind Bits & Pixels
Offscreen is a high-quality print magazine created, edited, designed and published by Kai Brach, issued three to four times a year, and available online for 17,90$. With each issue built around six lengthy interviews, it explores the off-screen life and work of people who create websites and apps, and tells their stories of creativity, passion and hard work.

Offscreen Magazine

TYPO
A magazine dedicated to visual communication, graphic design and typography. It is aimed at both professionals and beginners in typography, font design, graphic design and education, as well as marketing and visual communication specialists. The magazine is published quarterly. All 34 issues between 2003 and 2008 are also available in PDF.

8Faces
“If you could only use eight typefaces for the rest of your life, which would you choose?” This is the core question of 8faces, which — amongst many others — is asked to leading designers from the fields of Web design, print design, illustration and type design. With each issue (printed on heavy stock and pressed at just 2000 limited editions), this is definitely a collector’s item, and only 19£. Designed and edited by Elliot Jay Stocks, 8faces is also available as a PDF.

8faces
8faces
Image credit: Typetoken.

Distance
A quarterly journal about design and technology. Each issue contains three well-researched essays with opinions from day-to-day practitioners who speak out on contentious issues. Distance comes in both digital and print formats (digital 5$, print 15$), the digital bundles contain ePub, Kindle, and PDF editions.

Distance - 2nd Issue
Distance - 2nd Issue
Image credit: Brent Knepper.

Process Journal
The Melbourne-based quarterly publication Process Journal exhibits designers and their work on 96 pages (at a format slightly larger than A4). These high-quality prints (25$) and their congruent iPad app are dedicated to the artistry of design.

Process Journal

Ferocious Quarterly
A printed publication (with a handy size of around A5) featuring illustrators, graphic artists, short fiction authors and written text. Ferocious Quarterly calls itself an ongoing exercise in curation and collaboration, and has been released yearly since its first edition in 2010 (12$).


Ammo Magazine
The independent, UK-based Ammo Magazine is dedicated to illustrations and their creators. This cute little A6 Landscape publication (with thick 160 g pages) displays it feature illustrations in full color on 64 pages and for the cute price of 5£. Best of all, the editors refuse to let editions go out of print. Find it in their shop, in print format only.

Ammo Magazine

IN GRAPHICS
In Graphics is a printed magazine from Berlin that features only infographics. It’s released twice a year, and bilingually in German and English and available on Amazon for 14,90€. Its 96 pages cover challenging topics from politics and economics to architecture, TV shows, culture, entertainment and the environment — very interesting and fascinating content for visual people who have a love for details.

Plog
An autonomous publication designed and cared for by students and dedicated to showcasing student and graduate artwork (both on and offline). Plog is issued four times a year, in print, and with a limited run of 1000 issues. It can be ordered online (or purchased in many leading stores and universities around the UK) for 3£.


Image credit: Booooooom.com.

Collect
This Australian Adelaide-based magazine talks about design, culture and lifestyle around the world — all in a small-world context. Collect is about people, “neighborhoods” and a revival of quality print media. This 64 pages print-only publication comes out every two months for 5$.

Collect Magazine

IdN Magazine
A publication for creative people which wants to be exactly what its initials declare: an International designers’ Network. The magazine features creative designs, works, projects and events from around the globe. Each issue is sold world-wide (17,50$), published bimonthly, available in English and Chinese, and connected with feeds such as iTunes Podcasts and Video. Each issue comes with a DVD, which presents a theme-based, visual compilation of IdN magazine.

Hacker Monthly
The print magazine version of Hacker News features the top-voted articles from it’s mother-website, ranging from coffee guides to design and coding philosophy — anything goes. Available in glossy print (9$) and various digital formats (3$) (PDF, MOBI, EPUB) this magazine is often gorgeously illustrated, curated by Lim Cheng Soon.

Hacker Monthly

Colors
A fair-minded magazine that celebrates cultural diversity and deals with current social issues through an abundance of photography and unambiguous text. With its single-subject publications, Colors explores each theme with creative virtuosity on non-glossy, recycled pages. The monthly publication is available in print in most book stores or via an iPad app.

Colors Magazine

Online Publications

Think Quarterly
Google’s Think Quarterly looks like an online magazine (but Google calls it a book on its website). The articles are in-depth insights and outlooks on the digital future from visionaries, heads of industry, innovators and experts. It’s issued about three times per year, and with a very good look: clean lines and minimalism mixed with colorful art and images.

Dmig
This online-only publication presents the works of Germany’s best designers and firms. Even though it requires fluency in the German language, the content of this magazine is varied with serious journalism, and is well worth browsing if you can read the language. The content ranges from design industry facts and news to interviews — of which there are many — focused around one main theme in every issue.

Dmig

Appliness
Appliness is a digital magazine edited by passionate developers for passionate developers. Available on iPad and Android tablets, and funded by Adobe.

Appliness

TGD
The Great Discontent is a journal for artists, by artists, and about artists. This online publication concentrates on interviews focusing on subjects that are close to the community’s heart — creativity, risk and connections. This illustrated journal churns out a new interview every Tuesday.

TGD

Method & Craft
This small magazine focuses on the “making-ofsâ€� within the design industry. Their contributions take on an educational aspect when they discuss the techniques or motivations behind design pieces in different formats — articles, interviews, videos and notes. Available only on the website, this journal continuously publishes new and interesting content.

Method & Craft

Contents
Contents is an online magazine about content strategy, online publishing and new-school editorial work. It’s aimed at everyone who creates, edits, publishes, analyzes or cares for internet content. The issues run six to eight weeks, and each one has a set of annotations that links to thematically related work.

Contents

.net magazine
.net magazine is one of the most respected online magazines for Web designers and developers. The articles feature general news in the industry, tutorials, interviews as well as practical tips and techniques for everybody who is designing or building websites. A (beautifully designed) print edition of the magazine is available as well.

.net magazine

GOOD Magazine
GOOD is a very well-done online magazine, a collaboration of individuals, businesses, and non-profits who — besides doing many other great things — have made this magazine “for people who give a damn”, and care about what is sustainable, prosperous, productive and creative.

GOOD magazine

TXP Magazine
TXP Magazine is the mouthpiece and discussion center to the world the good ol’ Textpattern project. With two issues already published and one issue every two to three month planed, this publication aims at providing the best publishing system conceived, discusses topics with the community and features expert in the field. However, TXP also features topics that aren’t directly related to Textpattern, so even if you aren’t using the CMS, you might want to check the magazine as well.

TXP Magazine

Form And Future
This magazine’s tag line says it all; “A Journal for New Designers”. This small online publication specializes on featuring interviews with accomplished designer. Their goal is to allay fears of beginners and help them stay the course. This very young publication releases several interviews per month.

Further Resources

Magpile
Magpile is a Web community for magazine lovers. In it you can browse through your friends’ lists of publications, show off your own stockpile of magazines and put together a wish list of issues you’ve been craving to read. With it’s growing wiki-like database of publications. Magpile represents one of the most comprehensive archives of Magazine titles.

Magpile

No Layout
No Layout is a no-frills digital library for independent art and fashion publishers. Freely accessible from any platform, all featured magazines are all only readable online. It is meant as a promotional and archive tool for any topic-related media.

No Layout

Mag Is In
This dynamic Italian project is an archive as well as a prophet of contemporary independent magazines. They are dedicated to spreading consciousness about the excellence of current magazines. The creators are planing to complement their online presence with an exhibition to introduce indie magazines to non-expert audiences.

Mag Is In

Counter-Print
Counter-Print is committed to promoting art and design related products. While this is not a free website, they sell all sorts of educational materials that a designer might need. From posters to vintage books, their large selection caters to designers’ specialized requirements. All of their materials are in print formats.

What Publications Do You Read?

What print and online publications would you recommend and why? An important magazine is missing? Share your tips and pointers with the community by leaving the comments below!

(fi) (jc) (ea) (vf)


© Smashing Editorial for Smashing Magazine, 2012.


  •   
  • Copyright © 1996-2010 BlogmyQuery - BMQ. All rights reserved.
    iDream theme by Templates Next | Powered by WordPress