A place to cache linked articles (think custom and personal wayback machine)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

index.html 21KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323
  1. <!doctype html><!-- This is a valid HTML5 document. -->
  2. <!-- Screen readers, SEO, extensions and so on. -->
  3. <html lang="fr">
  4. <!-- Has to be within the first 1024 bytes, hence before the `title` element
  5. See: https://www.w3.org/TR/2012/CR-html5-20121217/document-metadata.html#charset -->
  6. <meta charset="utf-8">
  7. <!-- Why no `X-UA-Compatible` meta: https://stackoverflow.com/a/6771584 -->
  8. <!-- The viewport meta is quite crowded and we are responsible for that.
  9. See: https://codepen.io/tigt/post/meta-viewport-for-2015 -->
  10. <meta name="viewport" content="width=device-width,initial-scale=1">
  11. <!-- Required to make a valid HTML5 document. -->
  12. <title>In Praise of Buttons (archive) — David Larlet</title>
  13. <meta name="description" content="Publication mise en cache pour en conserver une trace.">
  14. <!-- That good ol' feed, subscribe :). -->
  15. <link rel="alternate" type="application/atom+xml" title="Feed" href="/david/log/">
  16. <!-- Generated from https://realfavicongenerator.net/ such a mess. -->
  17. <link rel="apple-touch-icon" sizes="180x180" href="/static/david/icons2/apple-touch-icon.png">
  18. <link rel="icon" type="image/png" sizes="32x32" href="/static/david/icons2/favicon-32x32.png">
  19. <link rel="icon" type="image/png" sizes="16x16" href="/static/david/icons2/favicon-16x16.png">
  20. <link rel="manifest" href="/static/david/icons2/site.webmanifest">
  21. <link rel="mask-icon" href="/static/david/icons2/safari-pinned-tab.svg" color="#07486c">
  22. <link rel="shortcut icon" href="/static/david/icons2/favicon.ico">
  23. <meta name="msapplication-TileColor" content="#f7f7f7">
  24. <meta name="msapplication-config" content="/static/david/icons2/browserconfig.xml">
  25. <meta name="theme-color" content="#f7f7f7" media="(prefers-color-scheme: light)">
  26. <meta name="theme-color" content="#272727" media="(prefers-color-scheme: dark)">
  27. <!-- Is that even respected? Retrospectively? What a shAItshow…
  28. https://neil-clarke.com/block-the-bots-that-feed-ai-models-by-scraping-your-website/ -->
  29. <meta name="robots" content="noai, noimageai">
  30. <!-- Documented, feel free to shoot an email. -->
  31. <link rel="stylesheet" href="/static/david/css/style_2021-01-20.css">
  32. <!-- See https://www.zachleat.com/web/comprehensive-webfonts/ for the trade-off. -->
  33. <link rel="preload" href="/static/david/css/fonts/triplicate_t4_poly_regular.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: light), (prefers-color-scheme: no-preference)" crossorigin>
  34. <link rel="preload" href="/static/david/css/fonts/triplicate_t4_poly_bold.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: light), (prefers-color-scheme: no-preference)" crossorigin>
  35. <link rel="preload" href="/static/david/css/fonts/triplicate_t4_poly_italic.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: light), (prefers-color-scheme: no-preference)" crossorigin>
  36. <link rel="preload" href="/static/david/css/fonts/triplicate_t3_regular.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: dark)" crossorigin>
  37. <link rel="preload" href="/static/david/css/fonts/triplicate_t3_bold.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: dark)" crossorigin>
  38. <link rel="preload" href="/static/david/css/fonts/triplicate_t3_italic.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: dark)" crossorigin>
  39. <script>
  40. function toggleTheme(themeName) {
  41. document.documentElement.classList.toggle(
  42. 'forced-dark',
  43. themeName === 'dark'
  44. )
  45. document.documentElement.classList.toggle(
  46. 'forced-light',
  47. themeName === 'light'
  48. )
  49. }
  50. const selectedTheme = localStorage.getItem('theme')
  51. if (selectedTheme !== 'undefined') {
  52. toggleTheme(selectedTheme)
  53. }
  54. </script>
  55. <meta name="robots" content="noindex, nofollow">
  56. <meta content="origin-when-cross-origin" name="referrer">
  57. <!-- Canonical URL for SEO purposes -->
  58. <link rel="canonical" href="https://www.nubero.ch/blog/009/">
  59. <body class="remarkdown h1-underline h2-underline h3-underline em-underscore hr-center ul-star pre-tick" data-instant-intensity="viewport-all">
  60. <article>
  61. <header>
  62. <h1>In Praise of Buttons</h1>
  63. </header>
  64. <nav>
  65. <p class="center">
  66. <a href="/david/" title="Aller à l’accueil"><svg class="icon icon-home">
  67. <use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-home"></use>
  68. </svg> Accueil</a> •
  69. <a href="https://www.nubero.ch/blog/009/" title="Lien vers le contenu original">Source originale</a>
  70. <br>
  71. Mis en cache le 2024-01-28
  72. </p>
  73. </nav>
  74. <hr>
  75. <p>Form is Function in Graphical User Interfaces</p>
  76. <p class="paragraph">
  77. In any design discipline there are always certain trends. One of these trends seems to be that buttons are now considered uncool. It doesn’t matter if they are buttons on physical objects or in graphical user interfaces.
  78. </p>
  79. <p class="paragraph">
  80. Buttons aren’t new. And for exactly that reason, they are uncool. Like hammers and paperclips, they have been around for a long time and they work. In fact, they have been around for a long time <em>because</em> they work.
  81. </p>
  82. <p class="paragraph">
  83. That is a problem if you’re a dishonest designer. After all, how do you tell your client that you’ve just reinvented the wheel? You can’t just use boring old buttons in your shiny new product. So what do you do? You redesign the look or the function of a button (or both) and sell it as “the newest development in design” – totally dis­re­gar­ding the needs of the user and compromising your integrity as a designer along the way.
  84. </p>
  85. <p class="baumedium">Buttons on Screens</p>
  86. <p class="paragraph">
  87. In graphical user interfaces, we have seen an increase in buttons recently that consist merely of text or icons, without a clear, visible button shape being present. This insipid, uninspired mediocrity, exemplified by Google’s “Material Design” or – even worse – IBM’s “Carbon Design System”, was popularised by Apple’s iOS 7 and its equally miserable “Flat Design” aesthetics. This lazy minimalism is often considered modern and streamlined, but we must ask: Is it also user-friendly?
  88. </p>
  89. <p class="paragraph">
  90. The answer is clearly: No, it is not!
  91. </p>
  92. <p class="paragraph">
  93. Consider the image below: In the first row we see a series of icons that are supposed to be buttons. The only way you could potentially recognise them as such, however, would be if they were implemented in a user interface. So it is in fact only the <em>context</em> that lets you recognise them as buttons, not their <em>appearance</em> by themselves.
  94. </p>
  95. <p class="essaynote">Two rows of buttons. Which appear more inviting to interact with?
  96. </p>
  97. <p class="paragraph">
  98. Compare the icons in the upper row with their counterparts in the lower row. Here, these same icons are embedded in button shapes. This does several things at the same time. First, the button shapes act as <em>signifiers</em>. That means that they let the user know that an action can occur there. The icons in the upper row do no such thing. They don’t commun­icate their ability to be pressed – to be <em>used</em> really – in any way.
  99. </p>
  100. <p class="paragraph">
  101. How important signifiers are becomes clear when you look at the physical objects around you. Take the Swiss Army Knife in the picture below for example. The small groove that you see in the main blade (and in almost every hinged tool of a Swiss Army Knife) is called the “nail nick”. Not only does this nail nick allow you to insert your finger­nail and pull the tool out, it also <em>looks like it allows for precisely that.</em> Pay attention to its exact shape too. It mirrors the slight curvature of a fingernail. And it doesn’t stop there: The angles of the walls <em>inside</em> the groove are contoured in such a way that your fingernail is guided deeper into the nail nick, ensuring a secure hold for pulling.
  102. </p>
  103. <p class="essaynote">This is the nail nick in the main blade of a Swiss Army Knife. It gives the user a clue that an action can occur here and that this action probably involves a fingernail.
  104. </p>
  105. <p class="paragraph">
  106. This should make it clear why there is a reason that the virtual buttons in our graphical user interface should indeed look like buttons: They should commu­nicate that they can be used. When they just look like icons, they don’t do that.
  107. </p>
  108. <p class="paragraph">
  109. Look at the image of the buttons once more, and this time, try to find groups that belong together. The icons for plus and minus and for left and right for instance form two groups while the magnifying glass stands separated. In the lower row, where the buttons have uniform shapes, it’s easier to notice the differences in spacing between them.
  110. </p>
  111. <p class="paragraph">
  112. There is another thing to consider. Take a look at the next picture.
  113. </p>
  114. <p class="essaynote">The buttons in the upper row not only <em>communicate</em> what they do badly, they <em>function</em> badly as well.
  115. </p>
  116. <p class="paragraph">
  117. The pink colour shows where a button can actually be clicked or touched, that is to say, it shows the region where the software will register an input. In the upper row, that is quite a small area if you think of it in terms of square-pixels. That being said, the clickable area in mouse-interfaces <em>might</em> sometimes be the same in the upper row as in the lower row. In touch interfaces however, that is often not the case. There, the actual outline of the graphic – let’s say the minus – is often the only thing that can be touched. So when you quickly tap your screen and don’t hit the target precisely, you might completely miss the button.
  118. </p>
  119. <p class="baumedium">Text in Buttons</p>
  120. <p class="paragraph">
  121. The importance of button shapes becomes even more apparent, when the buttons are actually just words, not icons. The example below shows the Terms and Conditions of an iOS update. You can see that the two words, “Agree” and “Disagree”, don’t stick out too much in an environment that already has a lot of text in it. Apple’s way of showing the user that the two words are actually buttons is done solely with colour. The default option of agreeing is also not differentiating itself enough from the disagree option. The only difference is a slightly bolder (but not really bold) typeface. And lastly, speaking of type­faces, the one that Apple chose – specially designed actually – is also not the best for user interfaces.
  122. </p>
  123. <p class="essaynote">Everything that can go wrong, will go wrong: The people who designed this blindly followed the notion, that removing everything they perceived as ornamental would result in simplicity.
  124. </p>
  125. <p class="paragraph">
  126. Now compare the example from Apple above with my redesign below. Look at the difference that the button shapes and a better choice of typeface make. The typeface in question is called “FF Unit” and has less ambiguous letter shapes than Apple’s “San Francisco”. Granted, this is less important in long text than it is in individual words, but since we want the same typeface for both our buttons and the legal text, choosing a typeface <em>like</em> FF Unit becomes rather obvious. Lastly, I used a slight shadow to set apart the scrollable text of the Terms and Conditions from the surrounding interface. This too makes for a better visual distinction between the different elements on screen.
  127. </p>
  128. <div class="essaypicture">
  129. <img src="pictures/tcb.png" srcset="pictures/tcb_2x.png 2x" alt="The Terms and Conditions redesigned">
  130. </div>
  131. <p class="essaynote">Just because a user interface uses 3D-buttons and some shading doesn’t mean that it has to look tacky. In fact, if you have to make the choice between tacky-but-usable and minimalistic-but-hard-to-use, tacky is the way to go. You don’t have to make that choice though: It’s perfectly possible to create something that is both good-looking <em>and</em> easy to use.
  132. </p>
  133. <p class="baumedium">Direct Manipulation</p>
  134. <p class="paragraph">
  135. The physical world that we evolved in is one where every action has an effect. When you push the coffee mug on your desk and it moves away from you, it will make a sound. You might also be able to see little waves forming in your coffee as the small vibrations from the mug sliding on the desk transmit to the liquid. All of this feedback is expected by our brain to come to us through our different senses.
  136. </p>
  137. <p class="paragraph">
  138. Think about what this means: You will get haptic feedback through your fingertip, giving you information about weight, temperature and texture. There will be acoustic feedback from the ceramic sliding on your desk. And you will get visual feedback from seeing your finger and the mug moving, and the little waves on the surface of the coffee. Since our brain builds a model of the world and then compares reality to it, these different feedbacks are both <em>expected</em> and <em>interconnected</em>. It would be extremely weird, for example, if the mug did not make any noise at all while it slides across the table or if the liquid wouldn’t move inside the mug.
  139. </p>
  140. <p class="paragraph">
  141. A button in a graphical user interface that has no button shape will likely give you no feedback either. While it might actually have an alternative state that gets activated when you touch it (a change of colour for instance), you are probably going to obstruct that with your finger. This is another advantage of buttons that look like buttons. Because they usually stick out from under a fingertip, you can see the press-down animation clearly. Direct feedback from direct manipulation. See the animation below:
  142. </p>
  143. <p class="nubero-video">
  144. <video autoplay muted loop playsinline preload="metadata" poster="pictures/buttons_a_2x.png">
  145. <source src="videos/hand.mp4" type="video/mp4">
  146. </source></video>
  147. </p>
  148. <p></p>
  149. <p class="essaynote">While the user cannot be sure that his tap on the upper arrow was registered by the device (and might therefore try multiple times), the “button depressed” state of the 3D-button signals to him that his action was successful.
  150. </p>
  151. <p class="paragraph">
  152. Why is this important? First of all, it should be self-evident that a feature of the world that our brains evolved around, namely feedback, should not be removed just to satisfy a fashionable trend. As mentioned above, we expect some sort of feedback from practically everything in the world. But there’s another thing to consider: The button you just pressed might make some webpage load or do something else which will take a second or more before its effect is apparent. While you wait for that to happen, a button that showed you that it got pressed – that gave you feedback – is going to give you reassurance that you actually tapped it correctly.
  153. </p>
  154. <p class="paragraph">
  155. Visual feedback is, of course, just one way to solve this. Acoustic or haptic feedback also works well. Even better is a combination of these. Remember the coffee mug, whose weight and vibration you can feel, while you also see it moving and hear it sliding across the table. This sort of multi-sensory feedback is what you should be going for – if the circumstances allow it.
  156. </p>
  157. <p class="nubero-video">
  158. <video autoplay muted loop playsinline preload="metadata" poster="pictures/iphone-album_2x.jpg">
  159. <source src="videos/iphone_album.mp4" type="video/mp4">
  160. </source></video>
  161. </p>
  162. <p></p>
  163. <p class="essaynote">One last example: In this video, you can see the Photos app as it appears in iOS 17, alternating with a redesign done by me. Apple is using lazy button shapes for “Select” and the ellipsis character (…) on the right. On the left however, the button for going to your albums is just the word “Albums” and a little arrow shape. Why those two different concepts on the same screen? In the redesign, everything that works like a button also looks like one. This, in my opinion, is how it should be done.
  164. </p>
  165. <p class="baumedium">Misguided Sentimentalism?</p>
  166. <p class="paragraph">
  167. Critics of my position may point to what they believe is some sort of sentimentalism for old user interfaces on my part. It’s true that the problems I point to in this piece are of the kind that I consider solved in many of the older user interfaces. That has nothing to do with being sentimental however. Products have to work properly. If a button is the right choice, use a button. If it’s not, don’t. But if you are going to implement a design element that <em>works</em> like a button, it should <em>look</em> like one too.
  168. </p>
  169. <p class="barbottom"></p>
  170. <ol>
  171. </ol>
  172. <p class="bartopbottom"></p>
  173. <p class="postscript">
  174. Does <em>every</em> virtual button – every button in a graphical user interface – have to look like a pressable, physical 3D button? Of course not. They also don’t need to look exactly like my redesigns either. On a case-to-case basis it might even be better to do something else entirely.
  175. </p>
  176. <p class="postscript">
  177. The whole idea is to reduce cognitive load. And since the brain works by recognising patterns and dividing the environment up into areas, this reduction is best done by making elements with different functions appear markedly distinct from one another. It is, in other words, a fallacy to believe, that the brain has an easier time if everything looks “simplified” in the way which happens with the flat design doctrine. The opposite is the case.
  178. </p>
  179. </article>
  180. <hr>
  181. <footer>
  182. <p>
  183. <a href="/david/" title="Aller à l’accueil"><svg class="icon icon-home">
  184. <use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-home"></use>
  185. </svg> Accueil</a> •
  186. <a href="/david/log/" title="Accès au flux RSS"><svg class="icon icon-rss2">
  187. <use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-rss2"></use>
  188. </svg> Suivre</a> •
  189. <a href="http://larlet.com" title="Go to my English profile" data-instant><svg class="icon icon-user-tie">
  190. <use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-user-tie"></use>
  191. </svg> Pro</a> •
  192. <a href="mailto:david%40larlet.fr" title="Envoyer un courriel"><svg class="icon icon-mail">
  193. <use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-mail"></use>
  194. </svg> Email</a> •
  195. <abbr class="nowrap" title="Hébergeur : Alwaysdata, 62 rue Tiquetonne 75002 Paris, +33184162340"><svg class="icon icon-hammer2">
  196. <use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-hammer2"></use>
  197. </svg> Légal</abbr>
  198. </p>
  199. <template id="theme-selector">
  200. <form>
  201. <fieldset>
  202. <legend><svg class="icon icon-brightness-contrast">
  203. <use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-brightness-contrast"></use>
  204. </svg> Thème</legend>
  205. <label>
  206. <input type="radio" value="auto" name="chosen-color-scheme" checked> Auto
  207. </label>
  208. <label>
  209. <input type="radio" value="dark" name="chosen-color-scheme"> Foncé
  210. </label>
  211. <label>
  212. <input type="radio" value="light" name="chosen-color-scheme"> Clair
  213. </label>
  214. </fieldset>
  215. </form>
  216. </template>
  217. </footer>
  218. <script src="/static/david/js/instantpage-5.1.0.min.js" type="module"></script>
  219. <script>
  220. function loadThemeForm(templateName) {
  221. const themeSelectorTemplate = document.querySelector(templateName)
  222. const form = themeSelectorTemplate.content.firstElementChild
  223. themeSelectorTemplate.replaceWith(form)
  224. form.addEventListener('change', (e) => {
  225. const chosenColorScheme = e.target.value
  226. localStorage.setItem('theme', chosenColorScheme)
  227. toggleTheme(chosenColorScheme)
  228. })
  229. const selectedTheme = localStorage.getItem('theme')
  230. if (selectedTheme && selectedTheme !== 'undefined') {
  231. form.querySelector(`[value="${selectedTheme}"]`).checked = true
  232. }
  233. }
  234. const prefersColorSchemeDark = '(prefers-color-scheme: dark)'
  235. window.addEventListener('load', () => {
  236. let hasDarkRules = false
  237. for (const styleSheet of Array.from(document.styleSheets)) {
  238. let mediaRules = []
  239. for (const cssRule of styleSheet.cssRules) {
  240. if (cssRule.type !== CSSRule.MEDIA_RULE) {
  241. continue
  242. }
  243. // WARNING: Safari does not have/supports `conditionText`.
  244. if (cssRule.conditionText) {
  245. if (cssRule.conditionText !== prefersColorSchemeDark) {
  246. continue
  247. }
  248. } else {
  249. if (cssRule.cssText.startsWith(prefersColorSchemeDark)) {
  250. continue
  251. }
  252. }
  253. mediaRules = mediaRules.concat(Array.from(cssRule.cssRules))
  254. }
  255. // WARNING: do not try to insert a Rule to a styleSheet you are
  256. // currently iterating on, otherwise the browser will be stuck
  257. // in a infinite loop…
  258. for (const mediaRule of mediaRules) {
  259. styleSheet.insertRule(mediaRule.cssText)
  260. hasDarkRules = true
  261. }
  262. }
  263. if (hasDarkRules) {
  264. loadThemeForm('#theme-selector')
  265. }
  266. })
  267. </script>
  268. </body>
  269. </html>