CS 318 Lab 13 – Responsive Design
Dear students,
Today we begin our investigation into responsive design, of which designer Ethan Marcotte had this to say:
Recently, an emergent discipline called “responsive architecture” has begun asking how physical spaces can respond to the presence of people passing through them. Through a combination of embedded robotics and tensile materials, architects are experimenting with art installations and wall structures that bend, flex, and expand as crowds approach them. Motion sensors can be paired with climate control systems to adjust a room’s temperature and ambient lighting as it fills with people. Companies have already produced “smart glass technology” that can automatically become opaque when a room’s occupants reach a certain density threshold, giving them an additional layer of privacy.In their book Interactive Architecture, Michael Fox and Miles Kemp described this more adaptive approach as “a multiple-loop system in which one enters into a conversation; a continual and constructive information exchange.” Emphasis mine, as I think that’s a subtle yet powerful distinction: rather than creating immutable, unchanging spaces that define a particular experience, they suggest inhabitant and structure can—and should—mutually influence each other.
The central mechanic behind responsive design is selectively applying styles. You have one set of styles for large desktop displays, another for tablets, another for phones, and so on. Really, however, the styles are not applied based on the device itself, but on the available screen properties. In general, we might do the following on smaller screens:
- Remove images or present images of smaller resolutions.
- Reorganize the page to be a single vertical column.
- Hide navigation items, sidebars, and details, but provide a button or link to toggle their display.
Let’s do a quick example. Suppose we’ve got this content:
body { background-color: pink; }
When the viewport shrinks, let’s switch to cyan. We can use a media query to selectively apply that rule:
@media (max-width: 42em) { body { background-color: cyan; } }
Now if we resize the browser, we can see the page switch between styles. The background color is probably not a meaningful property to adjust. Let’s add this content:
<div><img src="https://upload.wikimedia.org/wikipedia/commons/thumb/2/29/Gold_Star.svg/2000px-Gold_Star.svg.png">1</div> <div><img src="https://upload.wikimedia.org/wikipedia/commons/thumb/2/29/Gold_Star.svg/2000px-Gold_Star.svg.png">2</div> <div><img src="https://upload.wikimedia.org/wikipedia/commons/thumb/2/29/Gold_Star.svg/2000px-Gold_Star.svg.png">3</div> <div><img src="https://upload.wikimedia.org/wikipedia/commons/thumb/2/29/Gold_Star.svg/2000px-Gold_Star.svg.png">4</div> <div><img src="https://upload.wikimedia.org/wikipedia/commons/thumb/2/29/Gold_Star.svg/2000px-Gold_Star.svg.png">5</div> <div><img src="https://upload.wikimedia.org/wikipedia/commons/thumb/2/29/Gold_Star.svg/2000px-Gold_Star.svg.png">6</div>
And style it like so:
div { font-size: 48pt; border: 2px solid black; text-align: center; margin: 5px; float: left; } img { width: 50px; margin-right: 10px; }
When the page shrinks, we’d still like the most important content to stay on one line. What can we do to enable that? Get rid of the images! We add this to the media query:
img { display: none; }
Here’s your TODO list:
- Browse Opportunity for All? Technology and Learning in Lower-income Families, a report by the Joan Ganz Cooney Center—the same folks that brought us Sesame Street.
- Read chapter 8 in your book.
- On a quarter sheet, share 2-3 questions or observations from your readings. Consider commenting on the role of responsive design in a society with considerable socioeconomic stratification.
See you next time!
Lab
First create a lab13 directory. Add a partners.html and include your first names and last initials.
Book
Your goal today is typeset a book that will display differently on screens of different size. The end result should behave like this:
Here’s your checklist to make it happen:
- Create
book.html, add the boilerplate (including settingbox-sizing), and provideheader,nav, andmainelements. In theheadelement, add this line:This is recommended on pages that you expect to be viewed on mobile devices. It forces the browser window to have the same width as the device, and to not be zoomed in or out.<meta name="viewport" content="width=device-width, initial-scale=1.0">
- Download the plain text version of The Light Princess by George Macdonald. This story is in the public domain, but Project Gutenberg provided the plain text source. I have taken liberty to enclose every paragraph in a
pelement. - Add the title and author to
header. Use anh1for the title, and tweak its margin and padding to make the text cohere. - Embed the story inside
main. - Add
h2elements around every chapter title. Give each anidattribute (likechapter1) so that the chapters can be linked to in the next step. Theidused in this way is called a fragment identifier. - In the
navelement, add links to every chapter title in an unordered list. Link to the fragment identifiers. For example:<a href="#chapter7">7. Try Metaphysics.</a>. Remove the bullets using thelist-styleproperty, zero out the left padding so the items aren’t indented. Here’s a list of the chapter titles for your convenience:1. What! No Children? 2. Won't I, Just? 3. She Can't Be Ours. 4. Where Is She? 5. What Is to Be Done? 6. She Laughs Too Much. 7. Try Metaphysics. 8. Try a Drop of Water. 9. Put Me in Again. 10. Look at the Moon. 11. Hiss! 12. Where Is the Prince? 13. Here I Am. 14. This Is Very Kind of You. 15. Look at the Rain!
- Choose an aesthetically pleasing triadic or quadratic color scheme using a tool of your choice. Use these colors as the backgrounds of the three semantic elements.
- An element’s background color only appears behind the border box, not in the margin. So, to make the colors snap together, eliminate the margin from all elements. Compensate by adding in some padding.
- Impose a two-column layout. Make the
navfloat to the left. Give it a width usingemunits.1emis the width of the letter M in the current font settings. Many web designers advocate measuring elements in terms of ems, as these units more directly measure the textual content. - Switch partners.
- We want
mainto sit beside thenavand fill the remaining space. We could try to float it to the left as well, but we don’t know how to specify it’s width so that it consumes the rest of the window. (Suppose thenavhas width10em. There’s no way to write100% - 10em.) However, we can anchormainrelative to its parent frame. Whichpositionscheme does that? Inset its left edge from its parent’s left edge by however wide yournavis. Inset its right edge 0 units from its parent’s right edge. This pinsmainso that it fills the available space! - Add some quote boxes. We’ve seen HTML5’s semantic elements (like
main,nav,header, andfooter), which help screen readers understand the meaning and purpose of your HTML elements. There’s alsoaside, which is used for peripheral content. Find a couple of quotable sentences, and copy and paste them each into their ownasideof classquote. Make these quotes float right, consuming a fixed number ofems. Adjust the padding, margin, font size, and background color to make the text stand out. - Apply three different fonts to your text: a sans-serif font to the headings and links, a serif font to the text of
main, and a light font to the quotations. - Find the four poems scattered throughout the book. Wrap each up in a
divof classpoem. Stylepoemso that it is inset from the regular text. Instead of adding a bunch ofbrtags to separate the lines, set thewhite-spaceproperty topre-wrapto preserve the linebreaks that are already in the text. Recall that linebreaks are normally not significant.
The preceding steps should produce a page that renders nicely on an normal-size window on a desktop computer. But try shrinking the window. What happens? We enter Clobberville. These next steps will fix that:
- Add a media query for contexts in which the
max-widthis the width of yournavplus the width of yourquotes. When the page gets smaller than this, the content will start to clobber itself. We don’t want that. The rules described below should be nested inside the media query, which should be placed after all the other rules in order to override them. - We don’t want
mainto show up besidenavanymore. Revert itspositiontostatic, andclearall preceding floats. Have it fill the window. - Have the
navlistdisplayits links inline. - Have the chapter titles disappear in the
navlinks, showing only the chapter numbers. Nest all text in a link but the chapter number in an element. Set those elements to notdisplay. - Make the quotes fill the window horizontally.