Category Archives: CSS

Perfect your Vertical Rhythm: CSS Line-Height Explained and De-mystified

Props to Russ Weakley for this fantastic and quick slideshow on everything you wanted to know about line-height and adjusting your “Vertical Rhythm”.

I guess what I took out of this more than anything, is specifiying line-height: 1.25; (with no unit) is a great option that will cascade down through child objects in your DOM and re-calculate line-height based on each item’s size.

CSS border-box FTW!! Now with Sass and Compass!

From Paul Irish’s blog entry…:

One of my least favorite parts about layout with CSS is the relationship of width and padding. … If I say the width is 200px, gosh darn it, it’s gonna be a 200px wide box even if I have 20px of padding. … Anyway, I have a recommendation for your CSS going forward:

*, *:before, *:after { 
    -moz-box-sizing: border-box; 
    -webkit-box-sizing: border-box; 
    box-sizing: border-box; 
}

This gives you the box model you want. Applies it to all elements.

Now you can take this FTW layout moment and make it even more amazing by using Compass (with Sass) and making it a one-liner with no-need-to-type vendor prefixes!

*, *:before, *:after { @include box-sizing(border-box); }

Caveats?

From reading the comments, there appears to be an issue with doing this for images if the image also has a border.  If you use a 100×100 pixel image with a 1px border, the image will actually be scaled down to 98×98 pixels.  This could be a problem with some sites, so i would probably recommend adding another line like:

img { @include box-sizing(content-box); }

Anyway, if I hit any more problems with this, I’ll come back and talk about them.

Waiting for your web services? Hello JSON Mocking!

When we start a development sprint, as a UI / UX team, we will make sure that as a priority, that we identify all of the web services that we will need to consume. We then, define the parameters needed to call the service and generally, we will create a JSON object that we will expect the service to return us.

This helps us shorten the critical path by making sure that the service developers can prioritize their work efficiently, and also move development of web service stubs to the front of their work queue.  This process doesn’t always work perfectly and we are sometimes (often) in a position where the web service developers are days away from even making us a stub, so rather than postponing our own critical path work until later in our sprint, we can pretend we have a working web service using JSON mocking! Hooray!

The Tool : Mockjax

The library I use to fake a working web service is MockJax.  It is wonderfully simple.

  1. The library seamlessly wraps jQuery’s $.ajax command.
  2. You write your ajax call as you would if your service already existed
  3. In your page setup init function, you just once, setup an override based on the URL (and optionally POST type, etc), which can redirect to a function, or a static JSON text file, or another url
  4. When you call your $.ajax, the wrapper checks it’s override dictionary for a match, and if it finds one, it intercepts the call and serves your alternate mock data.

Creating a Website : Style-First Design

Before we started on Project Shylock, we were very badly burned by an extremely high maintenance web form. When we first started designing it, we made a screen mockup that was pixel-perfect and would dynamically resize its windows according to which panes you toggled open and shut. We created a screen first, then made unique design rules that would allow it to be possible.

It looked beautiful!

Only it wasn’t. It was a hot mess of intertwined javascript resize events that would cascade from parent events down to any dynamic child. A form resize or a toggled pane would trigger the display calculation of up to 10 items. By the time we delivered the form, it worked well and responsively, but the cost of sticking to the pixel-perfect screen layout cost us a few weeks of person-hours.

The Lesson : Style First, the rest will follow

When a graphic designer makes a pixel-perfect layout, there is a less-than-complete understanding of how all the pieces are grouped and how they will all push and pull upon each other.

Know your direction

Work out your fonts, your site’s persona, your flavor.  Make some designs on how you want your site layout, look and feel to flow.

Create your styles

Preferably with something like Sass or Less, lock in a gentle css reset, then start building up your styles. Make css modules of related rules. Typography module, color module, padding, layout, buttons, grids, forms, dialogs…  start with the essentials and expand as you need, but make your rules, work out how it all is going to flow

Communicate your rules to designers

If you are working with designers or graphic design team, communicate your styles and rules.  Make a prototype page with examples of how various objects will interact with each other and let them see and play with them.

When they make designs proposals for new functionality, make them use your rules to make the forms.

The pages will follow the design…

If you stay flexible and Keep It Simple (my mantra!), then when you create your pages, they will start naturally fitting in amongst each other and dictating their own flow.  This works especially well in a web site that has to be dynamic or responsive, because as your controls change or your available space, the controls will adapt as well, with minimal developer intervention.

Best Practice on “Project Shylock”

Our first sprint began with what I’m going to be calling “Project Shylock” that we are making for *******.

I am leading a passionate team of 3 other UI/UX developers who are all trying to make to best possible website that time will allow. The emphasis is particularly on “time will allow“.

Our organization is now known to us to as a place that will not give us realistic time to complete a project. So at some point, time will run out and we will have to make a decision on whether best practice continues, or we deliver all our required functionality.

Time will tell.

Goals

Our team’s goal for this project is:

  • To deliver code that we will be proud of in two years time
  • To use technology that will help, make sense, not just to look good on a resume
  • To be able to handover completed code that will make sense to a future UI developer who may have to maintain it.

Technology and Methodology

  • Sass style sheets
    1. Sass is fucking cool.
    2. .scss format is backwards compatible with regular .css
    3. Allows us to create style module files
    4. Re-usable variables
    5. Can comment with // (seriously, this may be the best thing about Sass!)
  • NOT using Coffeescript
    1. Harder to handover to a fresh developer
    2. Feels backwards to use a language that turns into another language
  • Mocking data with Mockjax
    1. Mocking allows us to develop without having to wait for the backend Java developers (referred to as Backend or BE) to write a service to connect to
    2. Allows us to give an example to BE to demonstrate the desired data contract
    3. We can re-use the mock in a unit test
  • Object Oriented CSS
    1. All styles are defined by classes.
    2. No objects have their own style. They use a styles from a set of rules to display themselves
    3. Close-to-zero page specific css rules
    4. Style rules dictates page layout, not the other way around
  • Unit testing with QUnit
    1. Will initially be avoiding Test Driven Development, as this approach require heavy pre-planning of design, and our delivery structure doesn’t allow for that.
    2. We will be writing unit tests after our functionality is written
    3. Using Mockjax to simulate AJAX transactions
    4. Unit tests will be reviewed in Code Reviews
    5. We will use an automated test runner to execute our unit tests on a frequent schedule
  • Code Reviews
    1. Code reviews are the best way to improve code quality as well as to cross-train team members of other’s functionality
    2. The only two times a code review won’t be required is for a basic copy text change or when development was performed as part of Paired Programming
    3. Code reviews will include copy text and localization (l10n)
    4. Code reviews will include unit tests
  • Paired Programming
    1. There is no requirement for Paired Programming, but if a developer is unsure of the best way to do something or is having difficulty fixing a problem, then why not grab a buddy and work on it together! It’s fun! 🙂
    2. If you pair program something, then you don’t have to do an additional Code Review!
  • Localization (l10n)
    1. Currently the project users don’t need a second language supported, but it will be used in multiple countries and they cannot 100% rule out that it will ALWAYS be in one language (en-US)
    2. Adding l10n once the project is completed is a special punishment reserved for those who spit gum on the street, play techno in apartments at night, or mistreat animals. If there is a chance it will be needed, we will add it to our project from the ground floor.
    3. l10n libraries will be minimalist to invoke, have helper classes and try and avoid getting in the way of development
    4. Copy Text will be organized into property files based on culture, and internally will be grouped into namespaces
  • Javascript
    1. Using jQuery because it makes everything easy and predictable
    2. All code will be enclosed in function encapsulation
    3. Functions will be broken into logical modules
    4. Common modules will be included in each page with a JSP include, so that when we are ready to combine and gzip them, it will be in one place only
    5. Functions will be written with Injection Dependency in mind. Core functionality will take parameters for UI objects and data, so that they are easier to write unit tests for.
  • Responsive
    1. Using FooTable to handle responsive table layout
    2. Using Sass media directives to handle different viewport sizes
    3. Using a percentage-based grid layout to simplify structure and flow
  • Agile Scrum
    1. Everyone says they are doing Agile Scrum, but we really are.
    2. If it’s not in JIRA, being tracked in our current sprint, then it’s not getting done
    3. Do not maintain your own personal “secret list” of things you have to get done. If you keep that list, be willing to work on that list in your own time on the weekend.
    4. Be transparent, put everything substantial into JIRA as a task so we can see what we can fit into a sprint
    5. All tasks in the current sprint to have story points.
    6. Use story point poker cards or shirt sizes to estimate all projects. Have multiple short rounds of estimates and discussions if you cannot agree initially on points
  • Mustache.js HTML Templating
    1. Our last project we chose the simplicity of Underscore.js to do our templating which gives you ERB style embedding and allows you to embed literal javascript code. This unfortunately allows you to write very messy templates with logic embeded right in them
    2. Mustache allows only template defined control blocks which makes templates easier to read
    3. No-code templates promotes MVC architecture
  • MVC (Model-View-Controller) Application Design
    1. The UI layer is broken into 3 sections, Controllers, Models & Views
    2. Models – Our JSON objects that we receive from our AJAX calls
    3. Controllers – Our javascript classes are our controllers, making ajax calls to retrieve our models. Models that are “too raw” for UI consumption are massaged into more consumable shapes
    4. Views – Using Mustache.js templates, we render business-logic-less localized templates

There is almost certainly more stuff we have decided on, and as I remember them I will add them to this list. Additionally, I will try to report back on what decisions worked, and which ones didn’t. I just hope we have enough time to get it done right.

Font scaling

PX vs EM? Neither!!! Heard of REM?

I’m starting a new project at my client and we have really been given almost complete free reign over what technology and styles we want to use. it’s lovely.

The one consequence of it however is that you have to make all the decisions on what tools and styles you are going to use… and if you choose poorly you can only blame yourself.

Scouring the web for the latest and greatest on best practices, I came along this CSS genius which talks about the most obscure metric you-never-heard-of. rem.

The problem with PX is that pixels don’t resize well on old browsers and containers don’t grow well.

The problem with EM as a CSS measurement is that if you have a child item with EM with an EM on the parent, the child will either shrink or grow as you nest more deeply. There are simple hacks for it, but I’ve never been happy with them.

What is nice about REM is that it works just like EM, but the scaled size doesn’t reapply as your child items nest further down.. they use the root element’s (usually html) size as a baseline and scale off that. Everyone wins!

Here is a cool hack/example:

html { font-size: 62.5%; }
body { font-size: 1.4rem; } /* =14px */
h1 { font-size: 2.4rem; } /* =24px */

Read this amazing article for more info over at snook.ca

NOTE: You can also do some cool font vertical rhythm tricks if you’re using Sass, but that is for another post, another day.