Top Banner
CSS Lessons Learned the Hard Way Zoe Mickley Gillenwater @zomigi ConvergeSE Columbia, SC, USA 15 April 2015
94
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: CSS Lessons Learned the Hard Way (ConvergeSE)

CSS Lessons Learned the Hard Way

Zoe Mickley Gillenwater @zomigi

ConvergeSE

Columbia, SC, USA 15 April 2015

Page 2: CSS Lessons Learned the Hard Way (ConvergeSE)

I make things…

Page 3: CSS Lessons Learned the Hard Way (ConvergeSE)

…some of which come out nicely…

Page 4: CSS Lessons Learned the Hard Way (ConvergeSE)

Web sites

Page 5: CSS Lessons Learned the Hard Way (ConvergeSE)

Books

Stunning CSS3: A Project-based Guide

to the Latest in CSS

www.stunningcss3.com

Flexible Web Design: Creating Liquid and Elastic

Layouts with CSS

www.flexiblewebbook.com

Page 6: CSS Lessons Learned the Hard Way (ConvergeSE)

Kids

Page 7: CSS Lessons Learned the Hard Way (ConvergeSE)

Cakes

Page 8: CSS Lessons Learned the Hard Way (ConvergeSE)

…but sometimes I make mistakes…

Page 9: CSS Lessons Learned the Hard Way (ConvergeSE)

Gardening

Page 10: CSS Lessons Learned the Hard Way (ConvergeSE)

Gardening

https://www.flickr.com/photos/coachjeff/3600883487/

Page 11: CSS Lessons Learned the Hard Way (ConvergeSE)
Page 12: CSS Lessons Learned the Hard Way (ConvergeSE)

Never compare your inside with somebody else’s outside.

Page 13: CSS Lessons Learned the Hard Way (ConvergeSE)

special people vs.

normal people

Page 14: CSS Lessons Learned the Hard Way (ConvergeSE)

Innovation requires a mindset that rejects the

fear of failure and replaces that fear of failure with the

joy of exploration and experimental learning.

Dr. Edward D. Hess

Page 15: CSS Lessons Learned the Hard Way (ConvergeSE)

We also need to accept and embrace the concept of failure, not because failure is a good thing but

because it’s a natural part of the path of progress.

If you’re failing, at least that means you’re trying — not remaining on the outside of the arena, looking in.

Helen Walters

Page 16: CSS Lessons Learned the Hard Way (ConvergeSE)

Creative people experiment a lot more,

therefore succeed a lot more, therefore fail a lot more.

Page 17: CSS Lessons Learned the Hard Way (ConvergeSE)

Some of my helpful CSS mistakes

Page 18: CSS Lessons Learned the Hard Way (ConvergeSE)

Flexbox demo www.smoresday.us Use Chrome, Opera, Safari 7, Firefox 28+, or IE 10+ for full effect

Page 19: CSS Lessons Learned the Hard Way (ConvergeSE)

.action

.component

Page 20: CSS Lessons Learned the Hard Way (ConvergeSE)

HTML without flexbox <form class="builder">

<div class="wrap">

<section class="component">

<section class="component">

<section class="component">

<section class="component">

</div>

<section class="action">

</form>

Page 21: CSS Lessons Learned the Hard Way (ConvergeSE)

HTML for flexbox version

<form class="builder">

<section class="component">

<section class="component">

<section class="component">

<section class="component">

<section class="action">

</form>

Page 22: CSS Lessons Learned the Hard Way (ConvergeSE)

Allow boxes to wrap

.builder {

display: flex;

flex-wrap: wrap;

justify-content: space-between;

margin: 0 0 40px -20px;

}

Page 23: CSS Lessons Learned the Hard Way (ConvergeSE)

Using flex to control width/height

.flex-item {

flex: 1 0 100px;

}

flex-grow flex-shrink flex-basis

Page 24: CSS Lessons Learned the Hard Way (ConvergeSE)

Defining the flex property

flex-grow

how much flex item will grow relative to other items if extra space is available (proportion of extra space that it gets)

flex-shrink

how much item will shrink relative to others if there is not enough space (proportion of overflow that gets shaved off)

flex-basis

the initial starting size before free space is distributed (any standard width/height value, including auto)

Page 25: CSS Lessons Learned the Hard Way (ConvergeSE)

My first attempt

.component {

flex: 1;

}

.action {

flex: 1 1 100%;

}

Zoe’s Brain Said: “Since .action starts out at 100%, it won’t have space to sit on the first line with the content preceding it, and will wrap to a second line.”

Page 26: CSS Lessons Learned the Hard Way (ConvergeSE)

Flexbox fail

Page 27: CSS Lessons Learned the Hard Way (ConvergeSE)

This fixed it

.component {

flex: 1;

margin-right: 1px;

}

Page 28: CSS Lessons Learned the Hard Way (ConvergeSE)

/* this is needed to

make .action wrap to

second line. why??? */

My comment on the 1px margin

Page 29: CSS Lessons Learned the Hard Way (ConvergeSE)

The hidden flex-basis value

.component {

flex: 1 1 0px;

}

.action {

flex: 1 1 100%;

}

Reality: Since it’s fine for each .component to shrink to only 0px wide, a 100% wide element can and will sit on the same line as all the components.

Page 30: CSS Lessons Learned the Hard Way (ConvergeSE)

That’s why margin “fixed” it

.component {

flex: 1;

margin-right: 1px;

}

.action {

flex: 1 1 100%;

}

What’s happening: Now each .component starts out taking up 1px of space, so a 100% wide element can’t and won’t sit on the same line with any of the components.

Page 31: CSS Lessons Learned the Hard Way (ConvergeSE)

Fixing flex-basis to force the wrap

.component {

flex: 1 1 200px;

}

.action {

flex: 1 1 100%;

}

Fixed: .action will always wrap to new line, and .component boxes will wrap to additional lines when there’s less space than their combined flex-basis values (plus margin, etc.).

Page 32: CSS Lessons Learned the Hard Way (ConvergeSE)

This was not just a case of succeeding despite a mistake.

It was a case of succeeding because of a mistake.

Page 33: CSS Lessons Learned the Hard Way (ConvergeSE)

Takeaway: don’t use CSS shorthand without understanding

all the pieces

Page 34: CSS Lessons Learned the Hard Way (ConvergeSE)

Takeaway: you are smarter than the

spec

Page 35: CSS Lessons Learned the Hard Way (ConvergeSE)

Let’s talk about another mistake

Page 36: CSS Lessons Learned the Hard Way (ConvergeSE)

Shadow style inspiration

http://sliderpro.net/examples/minimal-slider/

Page 37: CSS Lessons Learned the Hard Way (ConvergeSE)

The plan: 1. create shadow with generated content

2. skew it with CSS perspective

3. profit

Page 38: CSS Lessons Learned the Hard Way (ConvergeSE)
Page 39: CSS Lessons Learned the Hard Way (ConvergeSE)
Page 40: CSS Lessons Learned the Hard Way (ConvergeSE)

My first attempt .lightbox:before {

content: "";

position: absolute;

z-index: -2;

left: 2%;

bottom: 0;

width: 96%;

height: 1px;

box-shadow: 0 25px 30px 15px hsla(0,0%,0%,.4);

transform: perspective(20em);

}

Page 41: CSS Lessons Learned the Hard Way (ConvergeSE)

Perspective fail

Page 42: CSS Lessons Learned the Hard Way (ConvergeSE)
Page 43: CSS Lessons Learned the Hard Way (ConvergeSE)

What does rotateX actually do?

Page 44: CSS Lessons Learned the Hard Way (ConvergeSE)

The 3 axes

X horizontal, left-right

Y vertical, up-down

Z away-towards you

A helpful diagram: your hand. Photo: http://www.smashingmagazine.com/2012/01/06/adventures-in-the-third-dimension-css-3-d-transforms/

Page 45: CSS Lessons Learned the Hard Way (ConvergeSE)

Or, if your hand is effed up:

http://architecture.gtu.ge/MPL/Multimodal%20Explorer/Acad_11/14control_workplane0/control_workplane.htm

?

Page 46: CSS Lessons Learned the Hard Way (ConvergeSE)

Rotate around the axis not in the direction of the axis

As explained well by Peter Gasston in http://www.smashingmagazine.com/2012/01/06/adventures-

in-the-third-dimension-css-3-d-transforms/

Page 47: CSS Lessons Learned the Hard Way (ConvergeSE)

My quick sketch

Page 48: CSS Lessons Learned the Hard Way (ConvergeSE)

Adding rotateX with perspective .lightbox:before {

content: "";

position: absolute;

z-index: -2;

left: 6%;

bottom: 0;

width: 88%;

height: 1px;

box-shadow: 0 25px 30px 15px hsla(0,0%,0%,.4);

transform: perspective(20em) rotateX(50deg);

}

Page 49: CSS Lessons Learned the Hard Way (ConvergeSE)

Perspective working

Page 50: CSS Lessons Learned the Hard Way (ConvergeSE)

Takeaway: sometimes pen and paper can make a new concept

real to you

Page 51: CSS Lessons Learned the Hard Way (ConvergeSE)

A two-dimensional problem

Page 52: CSS Lessons Learned the Hard Way (ConvergeSE)

Absolute positioning

Page 53: CSS Lessons Learned the Hard Way (ConvergeSE)

https://www.flickr.com/photos/40325561@N04/8176648959/

Web layout is horizontally biased

Page 54: CSS Lessons Learned the Hard Way (ConvergeSE)

Flexbox is not row-centric

.container {

display: flex;

flex-direction: column-reverse;

align-items: flex-start;

min-height: 200px;

}

Page 55: CSS Lessons Learned the Hard Way (ConvergeSE)

Correct

IE 11 min-height bug

Page 56: CSS Lessons Learned the Hard Way (ConvergeSE)

Fixed with another flex wrapper

<div class="outer">

<div class="container">

<div class="bottom">...</div>

</div>

</div>

.outer {

display: flex;

}

Page 57: CSS Lessons Learned the Hard Way (ConvergeSE)

Takeaway: thinking about web layout in

rows can be limiting

Page 58: CSS Lessons Learned the Hard Way (ConvergeSE)

A more public mistake

Page 59: CSS Lessons Learned the Hard Way (ConvergeSE)

Sometimes you need to add special content for

screen reader users…

Page 60: CSS Lessons Learned the Hard Way (ConvergeSE)
Page 61: CSS Lessons Learned the Hard Way (ConvergeSE)

…and occasionally you need to hide content from

screen reader users.

Page 62: CSS Lessons Learned the Hard Way (ConvergeSE)
Page 63: CSS Lessons Learned the Hard Way (ConvergeSE)

I needed CSS classes to:

1. Hide content visually and aurally 2. Hide just the text of an element, not

whole element, but keep text spoken 3. Hide whole element visually but keep

its text spoken by screen readers

Page 64: CSS Lessons Learned the Hard Way (ConvergeSE)

Hide content visually and aurally

.hidden-silent {

display: none;

visibility: hidden;

}

Page 65: CSS Lessons Learned the Hard Way (ConvergeSE)

Hide text only but keep it spoken

.hidden-text-spoken {

text-indent: -999em;

overflow: hidden;

display: inline-block;

}

Page 66: CSS Lessons Learned the Hard Way (ConvergeSE)

Hide element but keep it spoken

Yahoo! Accessibility blog said to use:

.hidden-spoken {

position: absolute !important;

clip: rect(1px 1px 1px 1px); /* IE 6-7 */

clip: rect(1px, 1px, 1px, 1px);

padding: 0 !important;

border: 0 !important;

height: 1px !important;

width: 1px !important;

overflow: hidden;

}

Article now online at https://developer.yahoo.com/blogs/ydn/clip-hidden-content-better-accessibility-53456.html

Page 67: CSS Lessons Learned the Hard Way (ConvergeSE)

Problem: NVDA in Firefox wouldn’t read <label> with this class

Page 68: CSS Lessons Learned the Hard Way (ConvergeSE)

https://www.flickr.com/photos/87255087@N00/6261885005/

Delete half the code, see if bug goes away,

repeat

Page 69: CSS Lessons Learned the Hard Way (ConvergeSE)

I narrowed it down to overflow: hidden

Removing this part caused labels to be read correctly in Firefox by NVDA

Page 70: CSS Lessons Learned the Hard Way (ConvergeSE)

But removing it still kept the content hidden.

So why was it there to begin with?

Page 71: CSS Lessons Learned the Hard Way (ConvergeSE)
Page 72: CSS Lessons Learned the Hard Way (ConvergeSE)
Page 73: CSS Lessons Learned the Hard Way (ConvergeSE)
Page 74: CSS Lessons Learned the Hard Way (ConvergeSE)

This scrollbar is what overflow fixes

Page 75: CSS Lessons Learned the Hard Way (ConvergeSE)

Now that I understood what overflow did, I could

decide if I needed it.

Page 76: CSS Lessons Learned the Hard Way (ConvergeSE)

How I fixed my mistake

• Removed overflow:hidden from new instances going forward (but sadly not fixed in existing style sheets)

• Updated documentation to advise adding it on as-needed basis

Page 77: CSS Lessons Learned the Hard Way (ConvergeSE)

(By the way, this FF/NVDA bug seems to be gone now.)

Page 78: CSS Lessons Learned the Hard Way (ConvergeSE)

Takeaway: one-size-fits-all isn’t always

best for your needs

Page 79: CSS Lessons Learned the Hard Way (ConvergeSE)

Takeaway: you can get help when you

share your confusion publicly

Page 80: CSS Lessons Learned the Hard Way (ConvergeSE)

Be willing to fail…

Page 81: CSS Lessons Learned the Hard Way (ConvergeSE)

…and then tell us about it.

Page 82: CSS Lessons Learned the Hard Way (ConvergeSE)

Vulnerability is the birthplace of innovation, creativity, and change.

To create is to make something that has never existed before.

There's nothing more vulnerable than that.

Dr. Brené Brown

Page 83: CSS Lessons Learned the Hard Way (ConvergeSE)

Sharing mistakes has benefits

Page 84: CSS Lessons Learned the Hard Way (ConvergeSE)

http://www.flickr.com/photos/stilleben/49644790/

Page 85: CSS Lessons Learned the Hard Way (ConvergeSE)

We all do imperfect work

Page 86: CSS Lessons Learned the Hard Way (ConvergeSE)

/* this is needed to

make .action wrap to

second line. why??? */

Page 87: CSS Lessons Learned the Hard Way (ConvergeSE)

The evidence in the comments

// Dear future me. Please forgive me. // I can't even begin to express how sorry I am.

// I am not sure if we need this, but too scared to delete.

// Magic. Do not touch.

Page 88: CSS Lessons Learned the Hard Way (ConvergeSE)

Revisiting comments

// TODO: Fix this. Fix what?

// somedev1 - 6/7/02 Adding temporary tracking of Login screen // somedev2 - 5/22/07 Temporary my ass

Page 89: CSS Lessons Learned the Hard Way (ConvergeSE)
Page 90: CSS Lessons Learned the Hard Way (ConvergeSE)

99% of the population of the world doesn’t know CSS.

Zoe’s made-up statistic

Page 91: CSS Lessons Learned the Hard Way (ConvergeSE)

99% of the population of the world doesn’t know ______.

This is probably true too.

Page 92: CSS Lessons Learned the Hard Way (ConvergeSE)

You are awesome, but and you make mistakes.

Page 93: CSS Lessons Learned the Hard Way (ConvergeSE)

Let’s use our confidence in our skills to build others up and bravely admit our own

shortcomings.

Page 94: CSS Lessons Learned the Hard Way (ConvergeSE)

Thank you

Zoe Mickley Gillenwater @zomigi

Beyond Tellerand

Berlin 4 November 2014