In this article you can learn how to make a minimalist web page readable on different format readers like larger desktop screens and handhelds. The ingredients are HTML, with CSS and few JavaScript. The goals for my home page are:
- most of the layout resides in CSS in a stateless way
minimal JavaScript- on small displays - single column layout
- on wide format displays - division of text in columns
- count of columns adapts to browser window width or screen size
- combine with markdown
CSS:
h1,h2,h3 { font-weight: bold; font-style: normal; } @media (min-width: 1000px) { .tiles { display: flex; justify-content: space-between; flex-wrap: wrap; align-items: flex-start; width: 100%; } .tile { flex: 0 1 49%; } .tile2 { flex: 1 280px } h1,h2,h3 { font-weight: normal; } } @media (min-width: 1200px) { @supports ( display: flex ) { .tile { flex: 0 1 24%; } } }
The content in class=”tile” is shown as one column up to 4 columns. tile2 has a fixed with and picks its column count by itself. All flex boxes behave like one normal column. With @media (min-width: 1000px) { a bigger screen is assumed. Very likely there is a overlapping width for bigger handhelds, tablets and smaller laptops. But the layout works reasonable and performs well on shrinking the web browser on a desktop or viewing fullscreen and is well readable. Expressing all tile stuff in flex: syntax helps keeping compatibility with non flex supporting layout engines like in e.g. dillo.
For reading on High-DPI monitors on small it is essential to set font size properly. Update: Google and Mozilla recommend a meta “viewport” tag to signal browsers, that they are prepared to handle scaling properly. No JavaScript is needed for that.
<meta name="viewport" content="width=device-width, initial-scale=1.0">
[Outdated: I found no way to do that in CSS so far. JavaScript:]
function make_responsive () { if( typeof screen != "undefined" ) { var fontSize = "1rem"; if( screen.width < 400 ) { fontSize = "2rem"; } else if( screen.width < 720 ) { fontSize = "1.5rem"; } else if( screen.width < 1320 ) { fontSize = "1rem"; } if( typeof document.children === "object" ) { var obj = document.children[0]; // html node obj.style["font-size"] = fontSize; } else if( typeof document.body != "undefined" ) { document.body.style.fontSize = fontSize; } } } document.addEventListener( "DOMContentLoaded", make_responsive, false ); window.addEventListener( "orientationchange", make_responsive, false );
[The above JavaScript checks carefully if various browser attributes and scales the font size to compensate for small screens and make it readable.]
The above method works in all tested browsers (FireFox, Chrome, Konqueror, IE) beside dillo and on all platforms (Linux/KDE, Android, WP8.1). The meta tag method works as well better for printing.
Below some markdown to illustrate the approach.
HTML:
<div class="tiles"> <div class="tile"> My first text goes here. </div> <div class="tile"> Second text goes here. </div> <div class="tile"> Third text goes here. </div> <div class="tile"> Fourth text goes here. </div> </div>
In my previous articles you can read about using CSS3 for Translation and Web Open Font Format (WOFF) for Web Documents.