The New Smashing Mystery Riddle: Have You Figured It Out Yet?


  

Remember the Smashing Book Mystery riddle from a couple of months ago? Guess what: the Mystery continues! To celebrate the launch of the SmashingConf NYC and our lovely book, we’ve prepared a new riddle, and this time it’s not going to be any easier, but the reward is definitely worth the effort.

How does it work? Below you’ll find an animated GIF that contains a hidden message. Once you resolved the mystery, you’ll see a Twitter hashtag displayed in plain text.

Are you ready? Action! (Hint: watch out for the file name).

Smashing Book Mystery
A hint: watch out for the file name.

What Can You Win?

Among the first readers who tweet us with the hidden hashtag, we’ll raffle a quite extraordinary, smashing prize (and a couple of other Smashing extras):

  • a roundtrip flight to New York, USA,
  • full accommodation in a fancy hotel,
  • a ticket to the Smashing Conference New York 2014,
  • any Smashing workshop ticket of your choice,
  • full access to the Smashing eBook Library,
  • a signed edition of the Smashing Book #4,
  • a truly Smashing laptop bag,
  • your very own Smashing caricature, designed just for you.

Please notice that to avoid spoilers, comments are closed for this post. And sorry, we aren’t going to make it too easy for you.

Alright. Let’s get to work. Or have you already figured it out? 😉


© Vitaly Friedman for Smashing Magazine, 2014.



The New Smashing Mystery Riddle: Have You Figured It Out Yet?
http://feedproxy.google.com/~r/SmashingMagazine/~3/4L4fkPoivzQ/
http://feeds.feedburner.com/SmashingMagazine
Smashing Magazine Feed
For Professional Web Designers and Developers

Powered by WPeMatico

Writing A Better JavaScript Library For The DOM


  

At present, jQuery is the de facto library for working with the document object model (DOM). It can be used with popular client-side MV* frameworks (such as Backbone), and it has a ton of plugins and a very large community. As developers’ interest in JavaScript increases by the minute, a lot of people are becoming curious about how native APIs really work and about when we can just use them instead of including an extra library.

Lately, I have started to see more and more problems with jQuery, at least my use of it. Most of the problems are with jQuery’s core and can’t be fixed without breaking backwards compatibility — which is very important. I, like many others, continued using the library for a while, navigating all of the pesky quirks every day.

Then, Daniel Buchner created SelectorListener, and the idea of “live extensions” manifested. I started to think about creating a set of functions that would enable us to build unobtrusive DOM components using a better approach than what we have used so far. The objective was to review existing APIs and solutions and to build a clearer, testable and lightweight library.

Adding Useful Features To The Library

The idea of live extensions encouraged me to develop the better-dom project, although other interesting features make the library unique. Let’s review them quickly:

  • live extensions
  • native animations
  • embedded microtemplating
  • internationalization support

Live Extensions

jQuery has a concept called “live events.” Drawing on the idea of event delegation, it enables developers to handle existing and future elements. But more flexibility is required in a lot of cases. For example, delegated events fall short when the DOM needs to be mutated in order to initialize a widget. Hence, live extensions.

The goal is to define an extension once and have any future elements run through the initialization function, regardless of the widget’s complexity. This is important because it enables us to write Web pages declaratively; so, it works great with AJAX applications.

Live extensions make is easier to handle any future elements.
Live extensions enable you to handle any future elements without the need to invoke the initialization function. (Image credits)

Let’s look at a simple example. Let’s say our task is to implement a fully customizable tooltip. The :hover pseudo-selector won’t help us here because the position of the tooltip changes with the mouse cursor. Event delegation doesn’t fit well either; listening to mouseover and mouseleave for all elements in the document tree is very expensive. Live extensions to the rescue!


DOM.extend("[title]", {
  constructor: function() {
    var tooltip = DOM.create("span.custom-title");

    // set the title's textContent and hide it initially
    tooltip.set("textContent", this.get("title")).hide();

    this
      // remove legacy title
      .set("title", null)
      // store reference for quicker access
      .data("tooltip", tooltip)
      // register event handlers
      .on("mouseenter", this.onMouseEnter, ["clientX", "clientY"])
      .on("mouseleave", this.onMouseLeave)
      // insert the title element into DOM
      .append(tooltip);
  },
  onMouseEnter: function(x, y) {
    this.data("tooltip").style({left: x, top: y}).show();
  },
  onMouseLeave: function() {
    this.data("tooltip").hide();
  }
});

We can style the .custom-title element in CSS:


.custom-title {
  position: fixed; /* required */
  border: 1px solid #faebcc;
  background: #faf8f0;
}

The most interesting part happens when you insert a new element with a title attribute in the page. The custom tooltip will work without any initialization call.

Live extensions are self-contained; thus, they don’t require you to invoke an initialization function in order to work with future content. So, they can be combined with any DOM library and will simplify your application logic by separating the UI code into many small independent pieces.

Last but not least, a few words on Web components. A section of the specification, “Decorators,” aims to solve a similar problem. Currently, it uses a markup-based implementation with a special syntax for attaching event listeners to child elements. But it’s still an early draft:

“Decorators, unlike other parts of Web Components, do not have a specification yet.”

Native Animations

Thanks to Apple, CSS has good animation support now. In the past, animations were usually implemented in JavaScript via setInterval and setTimeout. It was a cool feature — but now it’s more like a bad practice. Native animations will always be smoother: They are usually faster, take less energy and degrade well if not supported by the browser.

In better-dom, there is no animate method: just show, hide and toggle. To capture a hidden element state in CSS, the library uses the standards-based aria-hidden attribute.

To illustrate how it works, let’s add a simple animation effect to the custom tooltip that we introduced earlier:


.custom-title {
  position: fixed; /* required */
  border: 1px solid #faebcc;
  background: #faf8f0;
  /* animation code */
  opacity: 1;
  -webkit-transition: opacity 0.5s;
  transition: opacity 0.5s;
}

.custom-title[aria-hidden=true] {
  display: block; /* have to override default "none" */
  opacity: 0;
}

Internally, show() and hide() just set the aria-hidden attribute value to be false and true. This is enough to enable the CSS to handle the animations and transitions.

You can see a demo with more animation examples that use better-dom.

Embedded Microtemplating

HTML strings are annoyingly verbose. Looking for a replacement, I found the excellent Emmet. Today, Emmet is quite a popular plugin for text editors, and it has a nice and compact syntax. Take this HTML:


body.append("<ul><li class='list-item'></li><li class='list-item'></li><li class='list-item'></li></ul>");

And compare it to the equivalent microtemplate:


body.append("ul>li.list-item*3");

In better-dom, any method that accepts HTML may use Emmet expressions as well. The abbreviation parser is fast, so no need to worry about a performance penalty. A template precompilation function also exists to be used on demand.

Internationalization Support

Developing a UI widget often requires localization — not an easy task. Over the years, many have tackled this in different ways. With better-dom, I believe that changing the state of a CSS selector is like switching languages.

Conceptually speaking, switching a language is like changing the “representation” of content. In CSS2, several pseudo-selectors help to describe such a model: :lang and :before. Take the code below:


[data-i18n="hello"]:before {
  content: "Hello Maksim!";
}

[data-i18n="hello"]:lang(ru):before {
  content: "Привет Максим!";
}

The trick is simple: The value of the content property changes according to the current language, which is determined by the lang attribute of the html element. By using data attributes such as data-i18n, we can maintain the textual content in HTML:


[data-i18n]:before {
  content: attr(data-i18n);
}

[data-i18n="Hello Maksim!"]:lang(ru):before {
  content: "Привет Максим!";
}

Of course, such CSS isn’t exactly attractive, so better-dom has two helpers: i18n and DOM.importStrings. The first is used to update the data-i18n attribute with the appropriate value, and the second localizes strings for a particular language.


label.i18n("Hello Maksim!");
// the label displays "Hello Maksim!"
DOM.importStrings("ru",  "Hello Maksim!", "Привет Максим!");
// now if the page is set to ru language,
// the label will display "Привет Максим!"
label.set("lang", "ru");
// now the label will display "Привет Максим!"
// despite the web page's language

Parameterized strings can be used as well. Just add ${param} variables to a key string:


label.i18n("Hello ${user}!", {user: "Maksim"});
// the label will display "Hello Maksim!"

Making Native APIs More Elegant

Generally, we want to stick to standards. But sometimes the standards aren’t exactly user-friendly. The DOM is a total mess, and to make it bearable, we have to wrap it in a convenient API. Despite all of the improvements made by open-source libraries, some parts could still be done better:

  • getter and setter,
  • event handling,
  • functional methods support.

Getter and Setter

The native DOM has the concept of attributes and properties of elements that could behave differently. Assume we have the markup below on a Web page:


<a href="/chemerisuk/better-dom" id="foo" data-test="test">better-dom</a>

To explain why “the DOM is a total mess,” let’s look at this:


var link = document.getElementById("foo");

link.href; // => "https://github.com/chemerisuk/better-dom"
link.getAttribute("href"); // => "/chemerisuk/better-dom"
link["data-test"]; // => undefined
link.getAttribute("data-test"); // => "test"

link.href = "abc";
link.href; // => "https://github.com/abc"
link.getAttribute("href"); // => "abc"

An attribute value is equal to the appropriate string in HTML, while the element property with the same name could have some special behavior, such as generating the fully qualified URL in the listing above. These differences can be confusing.

In practice, it’s hard to imagine a practical situation in which such a distinction would be useful. Moreover, the developer should always keep in mind which value (attribute or property) is being used that introduces unnecessary complexity.

In better-dom, things are clearer. Every element has only smart getters and setters.


var link = DOM.find("#foo");

link.get("href"); // => "https://github.com/chemerisuk/better-dom"
link.set("href", "abc");
link.get("href"); // => "https://github.com/abc"
link.get("data-attr"); // => "test"

In the first step, it does a property lookup, and if it’s defined, then it’s used for manipulation. Otherwise, getter and setter work with the appropriate attribute of the element. For booleans (checked, selected, etc.), you could just use true or false to update the value: Changing such a property on an element would trigger the appropriate attribute (native behavior) to be updated.

Improved Event Handling

Event handling is a big part of the DOM, however, I’ve discovered one fundamental problem: Having an event object in element listeners forces a developer who cares about testability to mock the first argument, or to create an extra function that passes only event properties used in the handler.


var button = document.getElementById("foo");

button.addEventListener("click", function(e) {
  handleButtonClick(e.button);
}, false);

This is really annoying. What if we extracted the changing part as an argument? This would allow us to get rid of the extra function:


var button = DOM.find("#foo");

button.on("click", handleButtonClick, ["button"]);

By default, the event handler passes the ["target", "defaultPrevented"] array, so no need to add the last argument to get access to these properties:


button.on("click", function(target, canceled) {
  // handle button click here
});

Late binding is supported as well (I’d recommend reading Peter Michaux’s review of the topic). It’s a more flexible alternative to the regular event handlers that exist in the W3C’s standard. It could be useful when you need frequent on and off method calls.


button._handleButtonClick = function() { alert("click!"); };

button.on("click", "_handleButtonClick");
button.fire("click"); // shows "clicked" message
button._handleButtonClick = null;
button.fire("click"); // shows nothing

Last but not least, better-dom has none of the shortcuts that exist in legacy APIs and that behave inconsistently across browsers, like click(), focus() and submit(). The only way to call them is to use the fire method, which executes the default action when no listener has returned false:


link.fire("click"); // clicks on the link
link.on("click", function() { return false; });
link.fire("click"); // triggers the handler above but doesn't do a click

Functional Methods Support

ES5 standardized a couple of useful methods for arrays, including map, filter and some. They allow us to use common collection operations in a standards-based way. As a result, today we have projects like Underscore and Lo-Dash, which polyfill these methods for old browsers.

Each element (or collection) in better-dom has the methods below built in:

  • each (which differs from forEach by returning this instead of undefined)
  • some
  • every
  • map
  • filter
  • reduce[Right]

var urls, activeLi, linkText; 

urls = menu.findAll("a").map(function(el) {
  return el.get("href");
});
activeLi = menu.children().filter(function(el) {
  return el.hasClass("active");
});
linkText = menu.children().reduce(function(memo, el) {
  return memo || el.hasClass("active") && el.find("a").get()
}, false);

Avoiding jQuery Problems

Most of the following issues can’t be fixed in jQuery without breaking backwards compatibility. That’s why creating a new library seemed like the logical way out.

  • the “magical” $ function
  • the value of the [] operator
  • issues with return false
  • find and findAll

The “Magical” $ Function

Everyone has heard at some point that the $ (dollar) function is kind of like magic. A single-character name is not very descriptive, so it looks like a built-in language operator. That’s why inexperienced developers call it inline everywhere.

Behind the scenes, the dollar is quite a complex function. Executing it too often, especially in frequent events such as mousemove and scroll, could cause poor UI performance.

Despite so many articles recommending jQuery objects to be cached, developers continue to insert the dollar function inline, because the library’s syntax encourages them to use this coding style.

Another issue with the dollar function is that it allows us to do two completely different things. People have gotten used to such a syntax, but it’s a bad practice of a function design in general:


$("a"); // => searches all elements that match “a” selector
$("<a>"); // => creates a <a> element with jQuery wrapper

In better-dom, several methods cover the responsibilities of the dollar function in jQuery: find[All] and DOM.create. find[All] is used to search element(s) according to the CSS selector. DOM.create makes a new elements tree in memory. Their names make it very clear what they are responsible for.

Value of the [] Operator

Another reason for the problem of frequent dollar function calls is the brackets operator. When a new jQuery object is created, all associated nodes are stored in numeric properties. But note that the value of such a property contains a native element instance (not a jQuery wrapper):


var links = $("a");

links[0].on("click", function() { ... }); // throws an error
$(links[0]).on("click", function() { ... }); // works fine

Because of such a feature, every functional method in jQuery or another library (like Underscore) requires the current element to be wrapped with $() inside of a callback function. Therefore, developers must always keep in mind the type of object they are working with — a native element or a wrapper — despite the fact that they are using a library to work with the DOM.

In better-dom, the brackets operator returns a library’s object, so developers can forget about native elements. There is only one acceptable way to access them: by using a special legacy method.


var foo = DOM.find("#foo");

foo.legacy(function(node) {
  // use Hammer library to bind a swipe listener
  Hammer(node).on("swipe", function(e) {
    // handle swipe gesture here
  }); 
});

In reality, this method is required in very rare cases, such as to be compatible with a native function or with another DOM library (like Hammer in the example above).

Issues With return false

One thing that really blows my mind is the strange return false interception in jQuery’s event handlers. According to the W3C’s standards, it should in most cases cancel the default behavior. In jQuery, return false also stops event delegation.

Such interception creates problems:

  1. Invoking stopPropagation() by itself could lead to compatibility problems, because it prevents listeners that are related to some other task from doing their work.
  2. Most developers (even experienced ones) are not aware of such behavior.

It’s unclear why the jQuery community decided to go cross-standards. But better-dom is not going to repeat the same mistake. Thus, return false in an event handler only prevents the browser’s default action, without messing with event propagation, as everyone would expect.

find and findAll

Element search is one of the most expensive operations in the browser. Two native methods could be used to implement it: querySelector and querySelectorAll. The difference is that the first one stops searching on the first match.

This feature enables us to decrease the iterations count dramatically in certain cases. In my tests, the speed was up to 20 times faster! Also, you can expect that the improvement will grow according to the size of the document tree.

jQuery has a find method that uses querySelectorAll for general cases. Currently, no function uses querySelector to fetch only the first matched element.

The better-dom library has two separate methods: find and findAll. They allow us to use querySelector optimization. To estimate the potential improvement in performance, I searched for the usage of these methods in all of the source code of my last commercial project:

  • find
    103 matches across 11 files
  • findAll
    14 matches across 4 files

The find method is definitely much more popular. It means that querySelector optimization makes sense in most use cases and could give a major performance boost.

Conclusion

Live extensions really make solving front-end problems much easier. Splitting the UI in many small pieces leads to more independent and maintainable solutions. But as we’ve shown, a framework is not only about them (although it is the main goal).

One thing I’ve learned in the development process is that if you don’t like a standard or you have a different opinion of how things should work, then just implement it and prove that your approach works. It’s really fun, too!

More information about the better-dom project can be found on GitHub.

(al, il, ea)


© Maksim Chemerisuk for Smashing Magazine, 2014.



Writing A Better JavaScript Library For The DOM
http://feedproxy.google.com/~r/SmashingMagazine/~3/_wmuVdYK8s4/
http://feeds.feedburner.com/SmashingMagazine
Smashing Magazine Feed
For Professional Web Designers and Developers

Powered by WPeMatico

How Optimized Are Your Images? Meet ImageOptim-CLI, a Batch Compression Tool


  

Exporting images for the Web from one’s favorite graphics software is something many of us have done hundreds of times. Our eyes fixate on an image’s preview, carefully adjusting the quality and optimization settings until we’ve found that sweet spot, where the file size and quality are both the best they can possibly be.

After exporting the image — usually using a feature called “Save for the Web” — and having gone to all that care and effort, we would be forgiven for thinking that our image is in the best shape possible. That’s not always the case, of course.

In fact, much more data is usually left in such files, data that browsers have to download despite not requiring or even using it, data that keeps our users waiting just a bit longer than necessary.

Thankfully, a number of popular tools can help us optimize images even further, but which should we use? We assumed, for a time at least, that our graphics editing software properly optimized our files, but what do we really know about our image optimization tools?

Image Optimization Tools

If you’re not currently using any image optimization tool, I would urge you to choose one. Any is better than none. Regardless of which you choose, you will likely speed up your website and keep users happy.

To inform our work, I ran the most popular image optimization tools over a varied sample of images (kindly donated by Daan Jobsis via his “Retina Revolution” article), and I’ve published the results on GitHub.

The report shows us how much data each tool saves and how much quality was lost statistically. However, how great a loss in quality is noticeable and how much is acceptable will vary from person to person, project to project and image to image.

Aim For The Biggest Gains

I’ve been using ImageOptim for many years, with ImageAlpha and JPEGmini joining it more recently.

With this trio, we have a specialist in JPEGs, another in PNGs, and a great all-round application, ImageOptim, which also supports GIF and other formats. Each uses different techniques to deliver impressive savings, but they complement each other when combined to offer better savings still.

ImageOptim

ImageOptim beats any single lossless optimizer by bundling all of them. It works by finding the best combination of compression parameters and removes unnecessary comments and color profiles.

ImageAlpha

ImageAlpha is unique in its lossy conversion of PNG24 to PNG8, delivering savings many times bigger than popular PNG optimizers such as Smush.it and TinyPNG. The conversion even maintains alpha-transparency in all browsers, including on iOS and even in IE 6.

JPEGmini

JPEGmini is a “patent-pending photo recompression technology, which significantly reduces the size of photographs without affecting their perceptual quality.” The creators claim it reduces a file’s size by up to 80%, while maintaining quality that is visually identical to the original.

The savings are quite remarkable, but you will need to purchase the software to use it without restriction.

Prioritize Convenience

In terms of performance, the comparative data is reassuring, and to date I’ve been happy with my decisions. But there’s a real problem: all of these tools are GUI applications for OS X.

This has some benefits because everything is local. You don’t need to upload and download files to a Web server, so there’s no risk of the service being temporarily unavailable. This also means that your images don’t need to leave your machine either.

But at some point ahead of every launch, I had to remember to open each application, manually process new images, then wait for the tool to finish, before doing the same in the next application.

This soon gets tedious: We need to automate! This is why (with James Stout and Kornel Lesiński) I’ve created ImageOptim-CLI, automated image optimization from the command line interface (CLI).

ImageOptim-CLI

Though other image optimization tools are available from the command line, ImageOptim-CLI exists because the current benchmarks suggest that ImageOptim, ImageAlpha and JPEGmini currently outperform those alternatives over lossless and lossy optimizations.

I wanted to take advantage of this.

Given a folder or other set of images, ImageOptim-CLI automates the process of optimizing them with ImageAlpha, JPEGmini and ImageOptim. In one command, we can run our chosen images through all three optimizers — giving us automated, multi-stage image optimization right from the command line.

This gives us the levels of optimization of all three applications, with the convenience of the command line, opening up all kinds of possibilities for integration with other utilities:

  • Integrate it with Alfred workflows.
  • Extend OS X with folder actions and more using Automator.
  • Optimize images whenever they change with the Guard RubyGem.
  • Ensure that images are optimized when you Git commit.

Do you know of other ways to integrate image optimization in your workflow? If so, please share your ideas in the comments.

Installation and Usage

The CLI can be downloaded as a ZIP archive or cloned using Git, but the easiest way is by running this:

npm install -g imageoptim-cli

Running all three applications before closing them afterwards can be achieved with this:

imageoptim --image-alpha --jpeg-mini --quit --directory ~/Sites/MyProject

Or you can do it with the equivalent shorthand format:

imageoptim -a -j -q -d ~/Sites/MyProject

You will find more installation and usage examples on the project page on GitHub.

Case Study: Myspace

Earlier this week, I visited Myspace and found that 4.1 MB of data was transferred to my machine. With the home page’s beautiful magazine-style layout, it’s no surprise that roughly 76% (or 3.1 MB) of that were images.

I was curious whether any data could be saved by running the images through ImageOptim-CLI. So, I recorded the video below to show the tool being installed and then run over Myspace’s home page.

As you can see, the total size of images before running the command was 3,186 KB, and ImageOptim-CLI was able to remove 986 KB of data, while preserving 99.93% of image quality.

grunt-imageoptim

There is a companion Grunt plugin for ImageOptim-CLI, called grunt-imageoptim, which offers full support for the optimization of folders and collections of images. It can also be paired with grunt-contrib-watch to run whenever any images are modified in your project.

Smashing Magazine has a great article for those who want to get up and running with Grunt.

Summary

Image optimization is an essential step in a designer’s workflow, and with so many tools to choose from, there’s bound to be one that suits your needs.

Data should bear heavily in your decision, so that you reap bigger rewards, but choose one that is convenient — using a weak tool every time is better than using than a strong tool sometimes. You’ll rarely make a decision in your career that doesn’t have some kind of trade-off, and this is no different.

Resources

If you’ve made it this far, I thank you for reading and welcome your questions, comments and ideas.

(al, ea)


© Jamie for Smashing Magazine, 2013.



How Optimized Are Your Images? Meet ImageOptim-CLI, a Batch Compression Tool
http://feedproxy.google.com/~r/SmashingMagazine/~3/6AXkZ7Ka91c/
http://feeds.feedburner.com/SmashingMagazine
Smashing Magazine Feed
For Professional Web Designers and Developers

Powered by WPeMatico

A Glance over Depositphotos, the Fastest-Growing Microstock Agency

Image 1

Stock photography business has become trend. It could be seen from the number of stock photography providers or so called microstock agencies in the internet which is increasing. The number affects the effort of every microstock agency to survive and get much buyers as possible.

As a result, we can see so many microstock agencies racing for getting buyers. Various promos, features, and gifts are given to not just their customers but also the potential customers. Some real example to win the rivalry is giving affordable prices for buyers and tempting incentives for the contributors / artists.
One of the successful microstock agency found in the internet is Depositphotos. The fact is that Depositphotos is reputed as the fastest-growing microstock agency in the internet. Of course that title is not given without reason.

Working together
Working together From Depositphotos.com

Depositphotos was founded in 2009 by Dmitry Sergiev. At the beginning, with limited collection, the content was focused on photos, illustrations, and vectors images. Although this website faced so many obstacles at their beginning years, they managed to survive and become successful just like today. After two years since it was founded, Depositphotos even successfully increased its library with 5 million files and achieved rank 6 in Google Pagerank.

August 2012 was the month when they announced that Depositphotos had reached 9 million image files collection. Not just that, because this year they also allowed contributors to sell videos by uploading it into this website’s library. Other features and functions were also improved such as “smart search” and “lightbox”. All of the improvements were surely aimed to ease their customers and raise the sale at the same time.

In December 2012, they had 2 million more images added into their collection makes their library as large as 11 million files. From 2011, Depositphotos had successfully doubled the size of their collection. It is such an achievement for a website which at the beginning was not even counted for competing in microstock agencies’ race.

Image 3

Then, in less than two month, this website once again broke a new record for increasing the number of their files collection into 12 million. Finally, in the end of March, this website has nearly reached 13 million files collection consists of stock photos, vectors images, and videos. This collection is divided into several categories which will ease the users for finding images they need. Category with the highest number of stock images (until this article is created) is People Stock Photos with more than 3 million images. After that, there is Objects Stock Photos with more than 2 million images. Other categories’ average number is about 1 million files, such as in Food & Drink, Illustrations, Nature, Textures & Backgrounds, Vectors, and Abstract Stock Photos.

In conclusion, the title of “Fastest-Growing Microstock Agency” really suits Depositphotos well. Their intention to keep growing may even make them one of the biggest and strongest agencies in this business.



A Glance over Depositphotos, the Fastest-Growing Microstock Agency
http://feedproxy.google.com/~r/BlogPerfume/~3/LOP8PTBodrw/
http://feeds.feedburner.com/BlogPerfume
Blog Perfume
The Best WordPress Themes, WordPress Plugins and Blogging Resources

Powered by WPeMatico

Bootstrap Hornbook Interactive Infographic

As per scientists around 90% of all information we perceive comes through our eyes. The visual side always has been quite important for humanity, we can see it from the culture of writings and visual art having very long history.

The other suitable feature is laconism. We can experience the lack of time for finding useful knowledge in current period of high technology and internet. There is so much informational trash we have to flunk out the sphere of our interest.

And people have found the solution. Infographics. It’s meaningful though concise; it has a strong visual element that is convenient in a matter of better understanding. Let’s take an example of Bootstrap Hornbook, the fresh infographic about Bootstrap, which is helpful for web designers not just as a sample, but also as a piece of quite cognitive unit, because it’s telling about effective front-end framework. Bootstrap gives a lot of benefits for website owners and the infographics featured in this article offers all the needed definitions, features, advantages and practical potential.

bootstrap

As you can see, the infographic provides a wide range of information about the Bootstrap. Here you can find the definition of the Bootstrap and the description of the advantages together with breaking news about the framework. Additionally, there are links to useful textual and video tutorials which will guide you to the deeper understanding of Bootstrap functionality.

About the Author

Art Rivera is deeply interested in everything connected with Internet, I sincerely suppose the web is the only future reality for the humanity through its inevitable involving into every part of human life. And of course someone should make this future look nice: all hail to Web Design, the King of all my web-interests.



Bootstrap Hornbook Interactive Infographic
http://feedproxy.google.com/~r/BlogPerfume/~3/5mWJSrIKAu0/
http://feeds.feedburner.com/BlogPerfume
Blog Perfume
The Best WordPress Themes, WordPress Plugins and Blogging Resources

Powered by WPeMatico

Theme: A Beautiful Portfolio WordPress Theme

Agera is a beautiful portfolio. Easy to setup, enhanced with Massive Panel and custom shortcode wizard which makes adding shortcodes extremely easy. The main goal of Agera is to let photographers and designers showcase their work easily and in a beautiful and simple way. If you are a creative person this theme is for you.

responsive-theme

Pricing: $40
Requirements: WordPress
Source: Buy it Now



Theme: A Beautiful Portfolio WordPress Theme
http://feedproxy.google.com/~r/BlogPerfume/~3/uhyxXsdmKPs/
http://feeds.feedburner.com/BlogPerfume
Blog Perfume
The Best WordPress Themes, WordPress Plugins and Blogging Resources

Powered by WPeMatico

Theme: A Bold, Blog-Style WordPress Theme

Medium is a bold, blog-style WordPress theme featuring double sidebars, attention to typographic and design detail and plenty of white space. Use it as a personal blog or a minimal portfolio to show off your latest works.

Medium is responsive, all the way down to mobile. Images, videos and text will scale down gracefully to iPad, iPhone and all devices in-between. This theme looks just as great in your pocket as it does on the desktop!

medium-wordpress-theme

Pricing: $45
Requirements: WordPress
Source: Buy it Now



Theme: A Bold, Blog-Style WordPress Theme
http://feedproxy.google.com/~r/BlogPerfume/~3/WxSK11GaL_E/
http://feeds.feedburner.com/BlogPerfume
Blog Perfume
The Best WordPress Themes, WordPress Plugins and Blogging Resources

Powered by WPeMatico

The Line Of Least Resistance


  

In chess, the psychological dimension that springs from a dialogue between two brains, two ideas, two strategic conceptions that depend on the personality of each chess player has long been somewhat of a romantic mystery. How do Grandmasters think? What strategies do they use?

More often than not, the most successful strategies are rooted in our own very nature. And common to most Grandmasters is that they almost never take the easy way out. A different, better alternative is always available, and they go looking for it. That creativity, that compulsion, that drive to look beyond what comes instinctively is what fuels successful strategies and explains why so few Grandmasters are out there.

grandmaster-stratgey-opt
(Image credits: Mukumbura)

For most of us, however, things are simpler. We tend to favor the shortest path, the easy way out, the shortcut. We cut through the middle of the park if we have to.

We’re naturally lazy. When we think, we search for the nearest pattern, and when we find the pattern, we don’t need to think anymore — we just follow the pattern. Our brains have evolved to be — borrowing Edward de Bono’s expression — “brilliantly uncreative.”

This preference for shortcuts is what Grandmasters naturally exploit. Playing on well-known weaknesses, automatisms or unconscious actions has long been a common strategy in chess.

When it comes to using and interacting with technology, that underlying behavior seems to hold. Users unconsciously look for the line of least resistance — la loi du moindre effort, as psycholinguist François Richaudeau called it. Richaudeau’s work revolved around words, but considering how vital communication, language and words are to the design of interactions, the core principles still apply: The shortest words will be those emitted, understood and read with the minimum of effort, and also those most frequently employed due to their more profound presence — or incrustation — in our memory.

We remember shorter words better. That’s because, according to Kenneth S. Goodman, we process graphic, syntactic and semantic information simultaneously. In doing so, users carry out cycles of sampling, predicting, testing and confirming as strategies to bring in “the most reliable prediction with the minimum use of the information available.”

The process isn’t specific to words and reading, though. It underlies our behavior and interaction with the world around us.

Framing it in this way seems to suggest the generalized idea that behavioral patterns are linked to common causes — a concept expanded by behaviorism to the extent that it proposes a predictable and reliable link between a stimulus and the response it produces. That generalization is largely refuted by the cognitive revolution on the grounds that prior knowledge and mental processes intervene between a stimulus and response to reduce the predictability of human behavior — or the response — given a stimulus. Essentially, we can’t predict behavior.

While that may hold true at a micro level, there are still plenty of common paths of action in the way we work — stimulus, sensory organs, interneuron, brain, processing, motor neuron, response. It’s still safe to assume that if we design an environment in which even the subtlest of details is sympathetic to how we, as humans, work and think, and with the singular purpose of easing the experience, then users will always favor that line of least resistance.

brain-stimulus-500-opt
Is the environment we design sympathetic to the way we work? (Image credits: opensourceway)

Designing an experience from a perspective that is more closely related to how we naturally strategize, designing guidance through pattern prediction, as opposed to limit enforcement, might prove to be a more viable approach.

Let’s put that in perspective. Take decision fatigue.

We all make decisions every day. Some of them big, some of them small, some conscious and some so insignificant that they slip by us without our even realizing. And in a world in which we are constantly bombarded with information and media options, such as blogs, social networks, magazines and TV, the effects of so many decisions that we have to take day by day become increasingly obvious.

Our decisions, even those that are mere preferences between option A and B, gradually take their toll on our cognitive load. The mental processes of decision-making are strenuous; we have only a finite store of mental energy available to exert self-control.

Basically, we get tired if we make too many decisions. As a result, according to Barry Schwartz, one of three things is likely to happen: we end up making poor decisions, we become more dissatisfied with our choices, or we get paralyzed and don’t choose at all.

Interaction processes — regardless of the medium — are a prime example of decision fatigue in action. At a micro level, hundreds of small, subtle and, most of the time, unconscious decisions that we take every time we use an application, browse a website or even follow an ad can affect the way we experience the artefact that we’re interacting with.

At a macro level, thanks to what we know about decision fatigue, we can predict that users can be overwhelmed to the point of making a default choice or no choice at all, depending on the option they face. One example of this is Dan Ariely’s opt-in versus opt-out example for forms of the US Department of Motor Vehicles. It shows that we can basically predict how people will react in a very specific situation by controlling the design of the application form, paying close attention to the defaults.

This is a very specific prediction of behavior. We’re not normally used to thinking of behavior as being that predictable. But in a lot of situations, it is. Ariely calls it being predictably irrational.

Contextual cues — through signs or linguistic cues, because they have the potential to refer to a specific value system — can sometimes direct cognition in particular ways, either encouraging or discouraging certain patterns of behavior. Thus, it’s vital that user experience practitioners maintain complete control over and responsibly use all elements in an interface that could be used as contextual cues and predictors.

And one of the biggest cues at the disposal of designers is language.

We, as a species, have refined language through countless iterations over the span of millennia to such an extent that words are tied to complex experiences, rather than to singular instances, by way of symbolic representation.

The Power Of Words

In 1967, Paul Watzlawick described what later became a cornerstone of communication theory: meta communication. He postulated that every communication includes, apart from the plain meaning of words, more information: information on how the talker wants to be understood and how they see themselves in relation to the receiver of the information.

Language, as a clear manifestation of the cognitive capacity of the human mind, is only a medium to carry out acts of communication. That’s one of the reasons why H.F. Bradley once said that experience is basically incommunicable.

Still, there is always something to communicate — moods, annoyances, happiness, feelings, ideas. There is always something that we need to understand — a noise, a color, a sign, a danger, an emotion. There is always some medium that is familiar to us — a grammar, an artistic language, a chess board, an interface.

While context provides a window into how people behave, words have the power to steer people towards a particular pattern of behavior through frame manipulation.

Frame manipulation invariably affects users — admittedly, to different degrees. One prime example of how the context of options and the wording of a question affects behavior is Tversky and Kahneman’s famous experiment in 1981, which demonstrated systematic reversals of preference when the same problem was presented in different ways.

The experiment required participants to make a hypothetical decision, and the researchers tried to determine whether they could steer the participants towards an answer simply by wording the questions carefully.

The experiment proposed a hypothetical outbreak of disease with 60,000 predicted deaths, and participants had to choose between two programs:

  • Program A
    20,000 people would be saved.
  • Program B
    There is a 33% chance that all 60,000 would be saved, and a 66% chance that none of them would be saved.

Framing effect: second option

With these options, program A was a favorite among participants. But what happened when the same question was asked again, but this time, instead of counting the number of lives saved, counting the number of deaths? Here’s how the second option would have sounded:

  • Program A
    40,000 people would die.
  • Program B
    There is a 33% chance that none of them would die, and a 66% chance that all of them would die.

Framing effect: first option

This time around, the clear favorite was program B.

The interesting part is that the math is exactly the same for both: 40,000 out of 60,000 would die anyway. But with the first option, participants were given the choice of a gain: they were given the choice to save 20,000 people. So, the gamble was perceived as negative against the word “save.”

In the second option, participants were given the choice of a loss: 40,000 people would die, or they could gamble that none of them would die with a 30% chance.

Users were influenced simply by the wording. This later became known as the framing effect. The effect helps to explain why people are much more likely to buy meat when it’s labeled as 85% lean, instead of 15% fat. And it’s why twice as many patients opt for surgery when told they have an 80% chance of surviving, instead of a 20% chance of dying.

As the experiment demonstrates, words have the power to selectively influence a user’s perception of meaning. And, for most applications, words can also be used to elicit interactions.

Summing Up

Context is the barrier that makes or breaks a user’s experience. Those unconscious moments, every bit of information we discard on our way up an emotional peak, all of those fine details — they all could potentially lead to a sensible, sympathetic experience. A enjoyable experience is shaped only by context.

Some people use context and design great experiences, some don’t. Oliver Reichenstein calls it a continuum. That’s perfectly natural. We need to constantly make an effort to glance at the future once in a while — to permit ourselves educated dreams.

We need to permit ourselves to keep the vision going — from the ones whom we got it from, to the ones coming to get it. We all have the tools to do it. We just need to be responsible with them.

(al, ea, il)


© Sorin Pintilie for Smashing Magazine, 2013.



The Line Of Least Resistance
http://feedproxy.google.com/~r/SmashingMagazine/~3/57UtxHofKBo/
http://feeds.feedburner.com/SmashingMagazine
Smashing Magazine Feed
For Professional Web Designers and Developers

Powered by WPeMatico

Modifying Admin Post Lists In WordPress


  

Have you ever created a custom post type and then found that only the titles and dates of your posts are displayed in the admin lists? While WordPress will add taxonomies for you, that’s the most it can do. Adding relevant at-a-glance information is easy; in this article, we’ll look how to modify admin post lists with WordPress.

To make sure we’re on the same page, an admin list is the table of posts shown in the admin section when you click on “Posts,” “Pages” or another custom post type. Before we delve in, it is worth noting that admin tables are created using the WP_List_Table class. Jeremy Desvaux de Marigny has written a great article on native admin tables that explains how to make these from scratch.

We’ll focus in this article on how to extend existing tables. We’ll do this using an example from a theme that we recently built, named Rock Band. Rock Band includes event management, which means that we needed some custom event-specific interface elements and details to make the admin section more useful!

Creating A Custom Post Type

This process is fairly straightforward and is documented well in “The Complete Guide to Custom Post Types.” All we need is a definition of the labels that we’re going to use and a few settings. Open up your functions.php file and drop the following into it.

add_action( 'init', 'bs_post_types' );
function bs_post_types() {

	$labels = array(
		'name'                => __( 'Events', THEMENAME ),
		'singular_name'       => __( 'Event', THEMENAME ),
		'add_new'             => __( 'Add New', THEMENAME ),
		'add_new_item'        => __( 'Add New Event', THEMENAME ),
		'edit_item'           => __( 'Edit Event', THEMENAME ),
		'new_item'            => __( 'New Event', THEMENAME ),
		'all_items'           => __( 'All Event', THEMENAME ),
		'view_item'           => __( 'View Event', THEMENAME ),
		'search_items'        => __( 'Search Events', THEMENAME ),
		'not_found'           => __( 'No events found', THEMENAME ),
		'not_found_in_trash'  => __( 'No events found in Trash', THEMENAME ),
		'menu_name'           => __( 'Events', THEMENAME ),
	);

	$supports = array( 'title', 'editor' );

	$slug = get_theme_mod( 'event_permalink' );
	$slug = ( empty( $slug ) ) ? 'event' : $slug;

	$args = array(
		'labels'              => $labels,
		'public'              => true,
		'publicly_queryable'  => true,
		'show_ui'             => true,
		'show_in_menu'        => true,
		'query_var'           => true,
		'rewrite'             => array( 'slug' => $slug ),
		'capability_type'     => 'post',
		'has_archive'         => true,
		'hierarchical'        => false,
		'menu_position'       => null,
		'supports'            => $supports,
	);

	register_post_type( 'event', $args );

}

Quick Tip

By pulling the permalink from the theme settings, you can make sure that users of your theme are able to set their own permalinks. This is important for multilingual websites, on which administrators might want to make sure that URLs are readable by their users.

events_original

What we get is the post list above. It’s better than nothing, but it has no at-a-glance information at all. Event venue, start time and ticket status would be great additions, so let’s get cracking!

Adding Custom Table Headers

Throughout this whole process, we will never have to touch the WP_Lists_Table class directly. This is wonderful news! Because we’ll be doing everything with hooks, our code will be nice and modular, easily customizable.

Adding the header is as simple as modifying the value of an array. This sounds like a job for a filter!

add_filter('manage_event_posts_columns', 'bs_event_table_head');
function bs_event_table_head( $defaults ) {
    $defaults['event_date']  = 'Event Date';
    $defaults['ticket_status']    = 'Ticket Status';
    $defaults['venue']   = 'Venue';
    $defaults['author'] = 'Added By';
    return $defaults;
}

Note the name of the filter: It corresponds to the name of the post type we have created. This means you can modify the table of any post type, not only your custom ones. Just use manage_post_posts_columns to modify the columns for the table of regular posts.

Once this code has been placed in our functions file, you should see the four new table headers. The fields don’t have any content yet; it is for us to decide what goes in them.

Fill ’er Up!

Adding data for each column is about as “complex” as it was to create the columns.

add_action( 'manage_event_posts_custom_column', 'bs_event_table_content', 10, 2 );

function bs_event_table_content( $column_name, $post_id ) {
    if ($column_name == 'event_date') {
		$event_date = get_post_meta( $post_id, '_bs_meta_event_date', true );
			echo  date( _x( 'F d, Y', 'Event date format', 'textdomain' ), strtotime( $event_date ) );
    }
    if ($column_name == 'ticket_status') {
		$status = get_post_meta( $post_id, '_bs_meta_event_ticket_status', true );
		echo $status;
    }

    if ($column_name == 'venue') {
		echo get_post_meta( $post_id, '_bs_meta_event_venue', true );
    }

}

As is obvious from the structure of this function, it gets called separately for each column. Because of this, we need to check which column is currently being displayed and then spit out the corresponding data.

The data we need for this is stored in the postmeta table. Here’s how to do it:

  • The event’s date is stored using the _bs_meta_event_date key.
  • The ticket’s status uses the _bs_meta_event_ticket_status key.
  • The venue is stored using the _bs_meta_event_venue meta key.

Because these are all postmeta values, we just need to use the get_post_meta() function to retrieve them. With the exception of the date, we can echo these values right away.

This brings us to an important point. You are not restricted to showing individual snippets of data or showing links. Whatever you output will be shown. With sufficient time, you could attach a calendar to the dates, which would be shown on hover. You could create flyout menus that open up on click, and so on.

events_data

As you can see, this is much better. The event’s date, ticket status, venue and author can be seen, which makes this table actually informative, rather than just a way to get to edit pages. However, we can do more.

Ordering Columns

Enabling column ordering takes two steps but is fairly straightforward. First, use a filter to specify which of your columns should be sortable by adding it to an array. Then, create a filter for each column to modify the query when a user clicks to sorts the column.

add_filter( 'manage_edit-event_sortable_columns', 'bs_event_table_sorting' );
function bs_event_table_sorting( $columns ) {
	$columns['event_date'] = 'event_date';
	$columns['ticket_status'] = 'ticket_status';
	$columns['venue'] = 'venue';
	return $columns;
}

add_filter( 'request', 'bs_event_date_column_orderby' );
function bs_event_date_column_orderby( $vars ) {
    if ( isset( $vars['orderby'] ) && 'event_date' == $vars['orderby'] ) {
        $vars = array_merge( $vars, array(
            'meta_key' => '_bs_meta_event_date',
            'orderby' => 'meta_value'
        ) );
    }

    return $vars;
}

add_filter( 'request', 'bs_ticket_status_column_orderby' );
function bs_ticket_status_column_orderby( $vars ) {
    if ( isset( $vars['orderby'] ) && 'ticket_status' == $vars['orderby'] ) {
        $vars = array_merge( $vars, array(
            'meta_key' => '_bs_meta_event_ticket_status',
            'orderby' => 'meta_value'
        ) );
    }

    return $vars;
}

add_filter( 'request', 'bs_venue_column_orderby' );
function bs_venue_column_orderby( $vars ) {
    if ( isset( $vars['orderby'] ) && 'venue' == $vars['orderby'] ) {
        $vars = array_merge( $vars, array(
            'meta_key' => '_bs_meta_event_venue',
            'orderby' => 'meta_value'
        ) );
    }

    return $vars;
}

Here is what’s happening in each of these cases. Whenever posts are listed, an array of arguments is passed that determines what is shown — things like how many to show per page, which post type to display, and so on. WordPress knows how to construct the array of arguments for each of its built-in features.

When we say, “order by venue,” WordPress doesn’t know what this means. Results are ordered before they are displayed, not after the fact. Therefore, WordPress needs to know what order to pull posts in before it actually retrieves them. Thus, we tell WordPress which meta_key to filter by and how to treat the values (meta_value for strings, meta_value_num for integers).

As with displaying data, you can go nuts here. You can use all of the arguments that WP_Query takes to perform taxonomy filtering, meta field queries and so on.

By adding the code above, we can now click to order based on date, status and venue. We’re almost there. One more thing would help out a lot, especially when dealing with hundreds of events.

Data Filtering

Setting up the filters is analogous to setting up ordering. First, we tell WordPress which controls we want to use. Then, we need to make sure those controls actually do something. Let’s get started.

add_action( 'restrict_manage_posts', 'bs_event_table_filtering' );
function bs_event_table_filtering() {
	global $wpdb;
	if ( $screen->post_type == 'event' ) {

		$dates = $wpdb->get_results( "SELECT EXTRACT(YEAR FROM meta_value) as year,  EXTRACT( MONTH FROM meta_value ) as month FROM $wpdb->postmeta WHERE meta_key = '_bs_meta_event_date' AND post_id IN ( SELECT ID FROM $wpdb->posts WHERE post_type = 'event' AND post_status != 'trash' ) GROUP BY year, month " ) ;

		echo '';
			echo '' . __( 'Show all event dates', 'textdomain' ) . '';
		foreach( $dates as $date ) {
			$month = ( strlen( $date->month ) == 1 ) ? 0 . $date->month : $date->month;
			$value = $date->year . '-' . $month . '-' . '01 00:00:00';
			$name = date( 'F Y', strtotime( $value ) );

			$selected = ( !empty( $_GET['event_date'] ) AND $_GET['event_date'] == $value ) ? 'selected="select"' : '';
			echo '' . $name . '';
		}
		echo '';

		$ticket_statuses = get_ticket_statuses();
		echo '';
			echo '' . __( 'Show all ticket statuses', 'textdomain' ) . '';
		foreach( $ticket_statuses as $value => $name ) {
			$selected = ( !empty( $_GET['ticket_status'] ) AND $_GET['ticket_status'] == $value ) ? 'selected="selected"' : '';
			echo '' . $name . '';
		}
		echo '';

	}
}

I know, this is a bit scarier! Initially, all we are doing is making sure that we add filters to the right page. As you can see from the hook, this is not specific to the post’s type, so we need to check manually.

Once we’re sure that we’re on the events page, we add two controls: a selector for event dates and a selector for ticket statuses.

We have one custom function in there, get_ticket_statuses(), which is used to retrieve a list of ticket statuses. These are all defined by the user, so describing how it works would be overkill. Suffice it to say that it contains an array with the key-value pairs that we need for the selector.

events_final

Once this is done, the table will reach its final form. We now have our filters along the top, but they don’t work yet. Let’s fix that, shall we?

Filtering data is simply a matter of adding arguments to the query again. This time, instead of ordering our data, we’ll add parameters to narrow down or broaden our returned list of posts.

add_filter( 'parse_query','bs_event_table_filter' );
function bs_event_table_filter( $query ) {
	if( is_admin() AND $query->query['post_type'] == 'event' ) {
		$qv = &$query->query_vars;
		$qv['meta_query'] = array();


		if( !empty( $_GET['event_date'] ) ) {
			$start_time = strtotime( $_GET['event_date'] );
			$end_time = mktime( 0, 0, 0, date( 'n', $start_time ) + 1, date( 'j', $start_time ), date( 'Y', $start_time ) );
			$end_date = date( 'Y-m-d H:i:s', $end_time );
			$qv['meta_query'][] = array(
				'field' => '_bs_meta_event_date',
				'value' => array( $_GET['event_date'], $end_date ),
				'compare' => 'BETWEEN',
				'type' => 'DATETIME'
			);

		}

		if( !empty( $_GET['ticket_status'] ) ) {
			$qv['meta_query'][] = array(
				'field' => '_bs_meta_event_ticket_status',
				'value' => $_GET['ticket_status'],
				'compare' => '=',
				'type' => 'CHAR'
			);
		}

		if( !empty( $_GET['orderby'] ) AND $_GET['orderby'] == 'event_date' ) {
			$qv['orderby'] = 'meta_value';
			$qv['meta_key'] = '_bs_meta_event_date';
			$qv['order'] = strtoupper( $_GET['order'] );
		}

	}
}

For each filter, we need to add rules to the query. When we’re filtering for events, we need to add a meta_query. This will return only results for which the custom field key is _bs_meta_event_ticket_status and the value is the given ticket’s status.

Once this final piece of the puzzle is added, we will have a customized WordPress admin list, complete with filtering, ordering and custom data. Well done!

Overview

Adding custom data to a table is a great way to draw information to the attention of users. Plugin developers can hook their functionality into posts without touching any other functionality, and theme authors can add advanced information about custom post types and other things to relevant places.

Showing the right information in the right place can make a huge difference in the salability and likability of any product. That being said, don’t overexploit your newfound power. Don’t add fields just because you can, especially to WordPress’ main tables.

Don’t forget that others know about this, too, and many developers of SEO plugins and similar products already add their own columns to posts. If you’re going to add things to the default post types, I suggest including settings to enable and disable them.

If you’ve used these techniques in one of your products or are wondering how to show some tidbit of information in a table, let us know in the comments!

(al, il)


© Daniel Pataki for Smashing Magazine, 2013.



Modifying Admin Post Lists In WordPress
http://feedproxy.google.com/~r/SmashingMagazine/~3/twbNXBBasXA/
http://feeds.feedburner.com/SmashingMagazine
Smashing Magazine Feed
For Professional Web Designers and Developers

Powered by WPeMatico

The Smashing Book Mystery: Have You Figured It Out Yet?


  

To celebrate the long-awaited release of our new Smashing Book (yaaaay!), we’ve prepared a little mystery for you. Below you’ll find an animated GIF that contains a hidden message. Once you resolved the mystery, you’ll see a Twitter hashtag displayed in plain text.

Are you ready? Action! (Hint: watch out for the file name).

Smashing Book Mystery
A hint: watch out for the file name.

What Can You Win?

Among the first readers who tweet us with the hashtag we’ll raffle a quite extraordinary, smashing prize (and a couple of other Smashing extras):

  • a ticket to the Smashing Conference Oxford 2014,
  • a roundtrip flight to Oxford, UK,
  • full accommodation in a fancy hotel,
  • full access to the Smashing eBook Library,
  • any Smashing workshop ticket of your choice,
  • a signed edition of the Smashing Book #4,
  • a truly Smashing laptop bag,
  • your very own Smashing caricature, designed just for you.

Please notice that to avoid spoilers, comments are closed for this post. And sorry, we aren’t going to make it too easy for you. Alright. Let’s get to work. Have you figured it out yet? 😉


© Vitaly Friedman for Smashing Magazine, 2013.



The Smashing Book Mystery: Have You Figured It Out Yet?
http://feedproxy.google.com/~r/SmashingMagazine/~3/p00tVth2S78/
http://feeds.feedburner.com/SmashingMagazine
Smashing Magazine Feed
For Professional Web Designers and Developers

Powered by WPeMatico

Branding your blog is difficult, or is it?

This is a guest contribution from Olivia RoseA question mark

How much time have you spent on the branding of your blog? If you haven’t branded your blog, you may not realise what you’re missing out on.

Branding a blog is extremely important but it is also a bit of a nebulous concept to those who are not professionals in the marketing industry. The first step is to understand what a brand is and how it can help you develop your blog and reach and retain your audience. You also need to understand how to properly build a brand, or when rebranding may be necessary.

So let’s start at the beginning.

What is a Brand?

A brand is the essence of a thing. Your blog’s brand contains its tone, humour, character, colour scheme, visual logos and much more. A brand needs to be a cohesive thing and the actual thrust of the brand should be something simple that encapsulates what your blog is about. Your brand will also need to be about; who you are, and what your blog means to you and your readers. Once you have answered these core questions you will be able to begin connecting with readers who identify with your blog’s brand.

Rainbow colour chart

Why Should You Brand Your Blog?

Branding offers some very simple benefits, such as the ability to merchandise. However, it also offers subtler benefits. Customers will know what to expect from you and will understand who you are and what you represent. The power behind your brand will lead you into larger overall market exposure that can help expand your readership. Virtually every successful blog out there has a very clear brand that is emphasised and developed.

How Do You Brand a Blog?

Branding a blog begins with brainstorming. You will need to ask yourself very important questions, such as what your blog is about, what your goals are and how you want readers to engage with you – emotionally. You will then want to narrow this down to a few core concepts that form the foundation of what your brand represents. From there you can develop a name, slogan and logo, and a blog colour scheme and style.

How Do You Design a Brand?

Branding is so much more than a colour scheme, but the colours you use are important so it’s worth spending some time on this issue. After all, it’s much harder to change things once your blog is up and running! You may wish to study colour theory and choose colours that are best associated with your core principles.

WordPress themes are an excellent way for you to develop your brand quite quickly. A WordPress theme allows you to create an entire design and scheme almost immediately, and then you can base all of your additional branding and media off your chosen theme. Many WordPress themes are extremely customisable, which means that you can change the colours and add a logo of your choosing. It’s worth working on new themes or theme modifications when the majority of your readership is not active, because it is always possible to crash your blog.

Wordpress screen print

How Can You Develop a Tone of Voice?

Equally important to the physical aspects of a blog is the actual content of the blog. You will need to determine the tone of voice of your blog early on and be consistent. As noted in a previous post about branding, if your tone isn’t well-suited to your brand and consistent, you will dilute your brand. If you’re aiming at professional journalism you should stick with a very professional and dry tone, whereas if you are aiming for a funny entertainment website you will want to remain light-hearted and entertaining.

A consistent tone of voice is very important in letting readers know what they should expect from your blog.

Can You Avoid Branding?

An important point to remember is that a lack of brand development does not mean that your blog does not have a brand. A blog will still have a brand because it is, in large part, a conceptual thing that exists in a reader’s mind. However, a blogger that doesn’t actively develop their brand has absolutely no control over what the reader associates the blog with.

Creating a brand allows a blogger to take control over the image of their blog, and not creating a brand essentially relinquishes this control.

Is it Worth Branding Your Blog?

If you are in the blog industry for success and readership then there is really no choice but to brand your blog. You may not even realise that your blog already has a brand of sorts but it simply isn’t a concise or directed one. You may be able to take your existing blog brand and develop it further. Using an existing brand to create a new brand is a simple and easy conversion process that can build new readers without losing old readers.

What Do You Do After the Brand?

It is worth mentioning the most important part of having a brand: sticking with it.

Even an imperfect brand will gain momentum over the months or even years that it is in use, but changing your brand over and over will simply confuse your readership and dilute the impact of any further brand developments. It’s very important for you to find your brand and then stick with it for as long as is possible.

Have you branded your blog? Is it something you’re considering?

Olivia Rose’s hobbies are cycling, playing tennis and blogging. Her favourite thing to blog about is business- especially branding! She suggests a Print Management business such as Hague Print if you are thinking about branding or rebranding your business. 

Branding your blog is difficult, or is it?
http://www.problogger.net/archives/2013/08/15/branding-your-blog-is-difficult-or-is-it/
http://www.problogger.net/archives/category/blog-design/feed/
@ProBlogger» Blog Design
Blog Tips to Help You Make Money Blogging – ProBlogger
http://www.problogger.net/wp-content/plugins/podpress/images/powered_by_podpress_large.jpg