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 28KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671
  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>
  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,minimum-scale=1,initial-scale=1,shrink-to-fit=no">
  11. <!-- Required to make a valid HTML5 document. -->
  12. <title>Form design: from zero to hero all in one blog post (archive) — David Larlet</title>
  13. <!-- Generated from https://realfavicongenerator.net/ such a mess. -->
  14. <link rel="apple-touch-icon" sizes="180x180" href="/static/david/icons/apple-touch-icon.png">
  15. <link rel="icon" type="image/png" sizes="32x32" href="/static/david/icons/favicon-32x32.png">
  16. <link rel="icon" type="image/png" sizes="16x16" href="/static/david/icons/favicon-16x16.png">
  17. <link rel="manifest" href="/manifest.json">
  18. <link rel="mask-icon" href="/static/david/icons/safari-pinned-tab.svg" color="#5bbad5">
  19. <link rel="shortcut icon" href="/static/david/icons/favicon.ico">
  20. <meta name="apple-mobile-web-app-title" content="David Larlet">
  21. <meta name="application-name" content="David Larlet">
  22. <meta name="msapplication-TileColor" content="#da532c">
  23. <meta name="msapplication-config" content="/static/david/icons/browserconfig.xml">
  24. <meta name="theme-color" content="#f0f0ea">
  25. <!-- That good ol' feed, subscribe :p. -->
  26. <link rel=alternate type="application/atom+xml" title=Feed href="/david/log/">
  27. <meta name="robots" content="noindex, nofollow">
  28. <meta content="origin-when-cross-origin" name="referrer">
  29. <!-- Canonical URL for SEO purposes -->
  30. <link rel="canonical" href="https://adamsilver.io/articles/form-design-from-zero-to-hero-all-in-one-blog-post/">
  31. <style>
  32. /* http://meyerweb.com/eric/tools/css/reset/ */
  33. html, body, div, span,
  34. h1, h2, h3, h4, h5, h6, p, blockquote, pre,
  35. a, abbr, address, big, cite, code,
  36. del, dfn, em, img, ins,
  37. small, strike, strong, tt, var,
  38. dl, dt, dd, ol, ul, li,
  39. fieldset, form, label, legend,
  40. table, caption, tbody, tfoot, thead, tr, th, td,
  41. article, aside, canvas, details, embed,
  42. figure, figcaption, footer, header, hgroup,
  43. menu, nav, output, ruby, section, summary,
  44. time, mark, audio, video {
  45. margin: 0;
  46. padding: 0;
  47. border: 0;
  48. font-size: 100%;
  49. font: inherit;
  50. vertical-align: baseline;
  51. }
  52. /* HTML5 display-role reset for older browsers */
  53. article, aside, details, figcaption, figure,
  54. footer, header, hgroup, menu, nav, section { display: block; }
  55. body { line-height: 1; }
  56. blockquote, q { quotes: none; }
  57. blockquote:before, blockquote:after,
  58. q:before, q:after {
  59. content: '';
  60. content: none;
  61. }
  62. table {
  63. border-collapse: collapse;
  64. border-spacing: 0;
  65. }
  66. /* http://practicaltypography.com/equity.html */
  67. /* https://calendar.perfplanet.com/2016/no-font-face-bulletproof-syntax/ */
  68. /* https://www.filamentgroup.com/lab/js-web-fonts.html */
  69. @font-face {
  70. font-family: 'EquityTextB';
  71. src: url('/static/david/css/fonts/Equity-Text-B-Regular-webfont.woff2') format('woff2'),
  72. url('/static/david/css/fonts/Equity-Text-B-Regular-webfont.woff') format('woff');
  73. font-weight: 300;
  74. font-style: normal;
  75. font-display: swap;
  76. }
  77. @font-face {
  78. font-family: 'EquityTextB';
  79. src: url('/static/david/css/fonts/Equity-Text-B-Italic-webfont.woff2') format('woff2'),
  80. url('/static/david/css/fonts/Equity-Text-B-Italic-webfont.woff') format('woff');
  81. font-weight: 300;
  82. font-style: italic;
  83. font-display: swap;
  84. }
  85. @font-face {
  86. font-family: 'EquityTextB';
  87. src: url('/static/david/css/fonts/Equity-Text-B-Bold-webfont.woff2') format('woff2'),
  88. url('/static/david/css/fonts/Equity-Text-B-Bold-webfont.woff') format('woff');
  89. font-weight: 700;
  90. font-style: normal;
  91. font-display: swap;
  92. }
  93. @font-face {
  94. font-family: 'ConcourseT3';
  95. src: url('/static/david/css/fonts/concourse_t3_regular-webfont-20190806.woff2') format('woff2'),
  96. url('/static/david/css/fonts/concourse_t3_regular-webfont-20190806.woff') format('woff');
  97. font-weight: 300;
  98. font-style: normal;
  99. font-display: swap;
  100. }
  101. /* http://practice.typekit.com/lesson/caring-about-opentype-features/ */
  102. body {
  103. /* http://www.cssfontstack.com/ Palatino 99% Win 86% Mac */
  104. font-family: "EquityTextB", Palatino, serif;
  105. background-color: #f0f0ea;
  106. color: #07486c;
  107. font-kerning: normal;
  108. -moz-osx-font-smoothing: grayscale;
  109. -webkit-font-smoothing: subpixel-antialiased;
  110. text-rendering: optimizeLegibility;
  111. font-variant-ligatures: common-ligatures contextual;
  112. font-feature-settings: "kern", "liga", "clig", "calt";
  113. }
  114. pre, code, kbd, samp, var, tt {
  115. font-family: 'TriplicateT4c', monospace;
  116. }
  117. em {
  118. font-style: italic;
  119. color: #323a45;
  120. }
  121. strong {
  122. font-weight: bold;
  123. color: black;
  124. }
  125. nav {
  126. background-color: #323a45;
  127. color: #f0f0ea;
  128. display: flex;
  129. justify-content: space-around;
  130. padding: 1rem .5rem;
  131. }
  132. nav:last-child {
  133. border-bottom: 1vh solid #2d7474;
  134. }
  135. nav a {
  136. color: #f0f0ea;
  137. }
  138. nav abbr {
  139. border-bottom: 1px dotted white;
  140. }
  141. h1 {
  142. border-top: 1vh solid #2d7474;
  143. border-bottom: .2vh dotted #2d7474;
  144. background-color: #e3e1e1;
  145. color: #323a45;
  146. text-align: center;
  147. padding: 5rem 0 4rem 0;
  148. width: 100%;
  149. font-family: 'ConcourseT3';
  150. display: flex;
  151. flex-direction: column;
  152. }
  153. h1.single {
  154. padding-bottom: 10rem;
  155. }
  156. h1 span {
  157. position: absolute;
  158. top: 1vh;
  159. left: 20%;
  160. line-height: 0;
  161. }
  162. h1 span a {
  163. line-height: 1.7;
  164. padding: 1rem 1.2rem .6rem 1.2rem;
  165. border-radius: 0 0 6% 6%;
  166. background: #2d7474;
  167. font-size: 1.3rem;
  168. color: white;
  169. text-decoration: none;
  170. }
  171. h2 {
  172. margin: 4rem 0 1rem;
  173. border-top: .2vh solid #2d7474;
  174. padding-top: 1vh;
  175. }
  176. h3 {
  177. text-align: center;
  178. margin: 3rem 0 .75em;
  179. }
  180. hr {
  181. height: .4rem;
  182. width: .4rem;
  183. border-radius: .4rem;
  184. background: #07486c;
  185. margin: 2.5rem auto;
  186. }
  187. time {
  188. display: bloc;
  189. margin-left: 0 !important;
  190. }
  191. ul, ol {
  192. margin: 2rem;
  193. }
  194. ul {
  195. list-style-type: square;
  196. }
  197. a {
  198. text-decoration-skip-ink: auto;
  199. text-decoration-thickness: 0.05em;
  200. text-underline-offset: 0.09em;
  201. }
  202. article {
  203. max-width: 50rem;
  204. display: flex;
  205. flex-direction: column;
  206. margin: 2rem auto;
  207. }
  208. article.single {
  209. border-top: .2vh dotted #2d7474;
  210. margin: -6rem auto 1rem auto;
  211. background: #f0f0ea;
  212. padding: 2rem;
  213. }
  214. article p:last-child {
  215. margin-bottom: 1rem;
  216. }
  217. p {
  218. padding: 0 .5rem;
  219. margin-left: 3rem;
  220. }
  221. p + p,
  222. figure + p {
  223. margin-top: 2rem;
  224. }
  225. blockquote {
  226. background-color: #e3e1e1;
  227. border-left: .5vw solid #2d7474;
  228. display: flex;
  229. flex-direction: column;
  230. align-items: center;
  231. padding: 1rem;
  232. margin: 1.5rem;
  233. }
  234. blockquote cite {
  235. font-style: italic;
  236. }
  237. blockquote p {
  238. margin-left: 0;
  239. }
  240. figure {
  241. border-top: .2vh solid #2d7474;
  242. background-color: #e3e1e1;
  243. text-align: center;
  244. padding: 1.5rem 0;
  245. margin: 1rem 0 0;
  246. font-size: 1.5rem;
  247. width: 100%;
  248. }
  249. figure img {
  250. max-width: 250px;
  251. max-height: 250px;
  252. border: .5vw solid #323a45;
  253. padding: 1px;
  254. }
  255. figcaption {
  256. padding: 1rem;
  257. line-height: 1.4;
  258. }
  259. aside {
  260. display: flex;
  261. flex-direction: column;
  262. background-color: #e3e1e1;
  263. padding: 1rem 0;
  264. border-bottom: .2vh solid #07486c;
  265. }
  266. aside p {
  267. max-width: 50rem;
  268. margin: 0 auto;
  269. }
  270. /* https://fvsch.com/code/css-locks/ */
  271. p, li, pre, code, kbd, samp, var, tt, time, details, figcaption {
  272. font-size: 1rem;
  273. line-height: calc( 1.5em + 0.2 * 1rem );
  274. }
  275. h1 {
  276. font-size: 1.9rem;
  277. line-height: calc( 1.2em + 0.2 * 1rem );
  278. }
  279. h2 {
  280. font-size: 1.6rem;
  281. line-height: calc( 1.3em + 0.2 * 1rem );
  282. }
  283. h3 {
  284. font-size: 1.35rem;
  285. line-height: calc( 1.4em + 0.2 * 1rem );
  286. }
  287. @media (min-width: 20em) {
  288. /* The (100vw - 20rem) / (50 - 20) part
  289. resolves to 0-1rem, depending on the
  290. viewport width (between 20em and 50em). */
  291. p, li, pre, code, kbd, samp, var, tt, time, details, figcaption {
  292. font-size: calc( 1rem + .6 * (100vw - 20rem) / (50 - 20) );
  293. line-height: calc( 1.5em + 0.2 * (100vw - 50rem) / (20 - 50) );
  294. margin-left: 0;
  295. }
  296. h1 {
  297. font-size: calc( 1.9rem + 1.5 * (100vw - 20rem) / (50 - 20) );
  298. line-height: calc( 1.2em + 0.2 * (100vw - 50rem) / (20 - 50) );
  299. }
  300. h2 {
  301. font-size: calc( 1.5rem + 1.5 * (100vw - 20rem) / (50 - 20) );
  302. line-height: calc( 1.3em + 0.2 * (100vw - 50rem) / (20 - 50) );
  303. }
  304. h3 {
  305. font-size: calc( 1.35rem + 1.5 * (100vw - 20rem) / (50 - 20) );
  306. line-height: calc( 1.4em + 0.2 * (100vw - 50rem) / (20 - 50) );
  307. }
  308. }
  309. @media (min-width: 50em) {
  310. /* The right part of the addition *must* be a
  311. rem value. In this example we *could* change
  312. the whole declaration to font-size:2.5rem,
  313. but if our baseline value was not expressed
  314. in rem we would have to use calc. */
  315. p, li, pre, code, kbd, samp, var, tt, time, details, figcaption {
  316. font-size: calc( 1rem + .6 * 1rem );
  317. line-height: 1.5em;
  318. }
  319. p, li, pre, details {
  320. margin-left: 3rem;
  321. }
  322. h1 {
  323. font-size: calc( 1.9rem + 1.5 * 1rem );
  324. line-height: 1.2em;
  325. }
  326. h2 {
  327. font-size: calc( 1.5rem + 1.5 * 1rem );
  328. line-height: 1.3em;
  329. }
  330. h3 {
  331. font-size: calc( 1.35rem + 1.5 * 1rem );
  332. line-height: 1.4em;
  333. }
  334. figure img {
  335. max-width: 500px;
  336. max-height: 500px;
  337. }
  338. }
  339. figure.unsquared {
  340. margin-bottom: 1.5rem;
  341. }
  342. figure.unsquared img {
  343. height: inherit;
  344. }
  345. @media print {
  346. body { font-size: 100%; }
  347. a:after { content: " (" attr(href) ")"; }
  348. a, a:link, a:visited, a:after {
  349. text-decoration: underline;
  350. text-shadow: none !important;
  351. background-image: none !important;
  352. background: white;
  353. color: black;
  354. }
  355. abbr[title] { border-bottom: 0; }
  356. abbr[title]:after { content: " (" attr(title) ")"; }
  357. img { page-break-inside: avoid; }
  358. @page { margin: 2cm .5cm; }
  359. h1, h2, h3 { page-break-after: avoid; }
  360. p3 { orphans: 3; widows: 3; }
  361. img {
  362. max-width: 250px !important;
  363. max-height: 250px !important;
  364. }
  365. nav, aside { display: none; }
  366. }
  367. ul.with_columns {
  368. column-count: 1;
  369. }
  370. @media (min-width: 20em) {
  371. ul.with_columns {
  372. column-count: 2;
  373. }
  374. }
  375. @media (min-width: 50em) {
  376. ul.with_columns {
  377. column-count: 3;
  378. }
  379. }
  380. ul.with_two_columns {
  381. column-count: 1;
  382. }
  383. @media (min-width: 20em) {
  384. ul.with_two_columns {
  385. column-count: 1;
  386. }
  387. }
  388. @media (min-width: 50em) {
  389. ul.with_two_columns {
  390. column-count: 2;
  391. }
  392. }
  393. .gallery {
  394. display: flex;
  395. flex-wrap: wrap;
  396. justify-content: space-around;
  397. }
  398. .gallery figure img {
  399. margin-left: 1rem;
  400. margin-right: 1rem;
  401. }
  402. .gallery figure figcaption {
  403. font-family: 'ConcourseT3'
  404. }
  405. footer {
  406. font-family: 'ConcourseT3';
  407. display: flex;
  408. flex-direction: column;
  409. border-top: 3px solid white;
  410. padding: 4rem 0;
  411. background-color: #07486c;
  412. color: white;
  413. }
  414. footer > * {
  415. max-width: 50rem;
  416. margin: 0 auto;
  417. }
  418. footer a {
  419. color: #f1c40f;
  420. }
  421. footer .avatar {
  422. width: 200px;
  423. height: 200px;
  424. border-radius: 50%;
  425. float: left;
  426. -webkit-shape-outside: circle();
  427. shape-outside: circle();
  428. margin-right: 2rem;
  429. padding: 2px 5px 5px 2px;
  430. background: white;
  431. border-left: 1px solid #f1c40f;
  432. border-top: 1px solid #f1c40f;
  433. border-right: 5px solid #f1c40f;
  434. border-bottom: 5px solid #f1c40f;
  435. }
  436. </style>
  437. <h1>
  438. <span><a id="jumper" href="#jumpto" title="Un peu perdu ?">?</a></span>
  439. Form design: from zero to hero all in one blog post (archive)
  440. <time>Pour la pérennité des contenus liés. Non-indexé, retrait sur simple email.</time>
  441. </h1>
  442. <section>
  443. <article>
  444. <h3><a href="https://adamsilver.io/articles/form-design-from-zero-to-hero-all-in-one-blog-post/">Source originale du contenu</a></h3>
  445. <p>Hi there. If we haven’t met before, I’m Adam and I’m obsessed with designing forms. And I have been for almost 20 years.</p>
  446. <p>What is it about forms then?</p>
  447. <p>Every meaningful interaction on the web is achieved by a form of some sort. Whether it’s letting users renew their passport, send an email or buy something.</p>
  448. <p>Basically anything that isn’t just reading content.</p>
  449. <p>What’s interesting though is that on first glance, forms are easy. In a few minutes you can have text boxes and radio buttons on screen and working.</p>
  450. <p>But look around the internet for a minute, and you’ll find a million and one usability issues revolving around forms.</p>
  451. <p>I’m pretty sure I’ve come across every single one of them. And spent hours solving each one in a way that works for everyone.</p>
  452. <p>And some forms have more than just fields and buttons. They can contain complex interactions or form part of a wider journey—both of which need due care and attention.</p>
  453. <p>So, if I was designing a new form, I’d want to know how to avoid the common issues. And to use my time to solve newer and perhaps more difficult problems.</p>
  454. <p>Seriously, who wants to spend time solving something that’s already been solved?</p>
  455. <p>That’s right—nobody.</p>
  456. <h2 id="a-note-before-we-begin">A note before we begin</h2>
  457. <p>Much of what I’m going to say might sound obvious and boring. But <a href="http://blog.capwatkins.com/the-boring-designer">boring is good</a>, we don’t need to over complicate matters.</p>
  458. <p>So if you’re looking for new and innovative ways to design forms, this is not for you.</p>
  459. <p>This is about designing forms that everyone can use and complete as quickly as possible. Because nobody actually wants to use your form. They just want the outcome of having used it.</p>
  460. <p>This guide is quick and to the point—a whistle stop tour of the knowledge I’ve accrued in my years of form design. It’s not exhaustive, but rather an entry point, designed to save you time on the basics.</p>
  461. <p>Many points I make link off to other articles. If you read each of them, you’ll be more than equipped to make simple and inclusive forms that get out of the user’s way.</p>
  462. <p>Let’s begin.</p>
  463. <h2 id="don%E2%80%99t-mess-with-labels">Don’t mess with labels</h2>
  464. <p><a href="https://adamsilver.io/articles/always-use-a-label/">Every input needs a label</a>. Sighted users can see them, visually-impaired users can hear them and motor-impaired users can more easily set focus to the related input.</p>
  465. <p>Labels should be placed above the input because this works well for different size content and different screen sizes.</p>
  466. <p><a href="https://adamsilver.io/articles/placeholders-are-problematic/">Placeholders are problematic</a>—both as makeshift labels and as a means of storing additional hint text. <a href="http://nostyle.herokuapp.com/examples/registration-form">Instead put hint text below the label and above the input</a>.</p>
  467. <p><a href="https://adamsilver.io/articles/float-labels-are-problematic/">Float labels are also problematic</a>. They have many of the same problems that placeholders have—and some of their own.</p>
  468. <p>Seriously, don’t mess with labels.</p>
  469. <h2 id="crafting-questions">Crafting questions</h2>
  470. <p>You should <a href="https://www.gov.uk/service-manual/design/form-structure#know-why-youre-asking-every-question">know exactly why you’re asking every question</a>. Use a <a href="https://www.uxmatters.com/mt/archives/2010/06/the-question-protocol-how-to-make-sure-every-form-field-is-necessary.php">question protocol</a> to help you.</p>
  471. <p>Don’t mark required fields, mark optional ones. Or better yet <a href="https://adamsilver.io/articles/form-design-handling-optional-fields/">avoid optional questions by using a branching question</a>.</p>
  472. <p>Use hint text to tell users why you’re asking them for certain information—it’s not always obvious.</p>
  473. <p>Hint text should be used where users are more likely to make a mistake, like when having to satisfy a complex set of password rules. Error messages should be a last resort.</p>
  474. <h2 id="style-and-microcopy">Style and microcopy</h2>
  475. <p>Form fields should look like form fields. That means they should be bordered and empty so it’s obvious where the input goes. Make fields easy to tap—44px height or more is good.</p>
  476. <p>The width of the field gives users a clue as to the length of the content it requires. So don’t make all fields the same width for aesthetic purposes when you know the expected length.</p>
  477. <p>Avoid <a href="https://baymard.com/blog/avoid-multi-column-forms">multi column form layouts</a>. They’re error prone, slower to use and can cause abandonment.</p>
  478. <p>Buttons should look like buttons. They’re harder to spot when they’re aligned right, especially for screen magnifier users. So <a href="https://www.uxmatters.com/mt/archives/2012/05/7-basic-best-practices-for-buttons.php">position the button to the left and below the last field</a>.</p>
  479. <p><a href="https://medium.com/@jsaito/making-a-case-for-letter-case-19d09f653c98">Use sentence case for labels, hints and error messages</a>. It’s easier to read and to spot nouns. Button text should be a simple verb because the user is <em>doing</em> something.</p>
  480. <h2 id="form-validation">Form validation</h2>
  481. <p><a href="https://adamsilver.io/articles/inline-validation-is-problematic/">Live inline validation is problematic</a>. <a href="http://adrianroselli.com/2019/02/avoid-default-field-validation.html">Turn off HTML5 default validation</a>. Don’t <a href="https://axesslab.com/disabled-buttons-suck/">disable buttons</a>—users won’t know how to fix errors without feedback.</p>
  482. <p>Validate forms <code>onsubmit</code>. You can still catch errors with JavaScript to avoid a server-side round trip.</p>
  483. <p>Be tolerant of mistakes like extra whitespace, dashes and slashes. Do the hard work so users don’t have to.</p>
  484. <p>Show an error summary at the top of the page which contains a list of errors. When one is clicked, set focus to the input. For a group of inputs, like radio buttons, set focus to the first input.</p>
  485. <p>The error message should also be placed in context of the field. Put the message just above the field. Placing it <a href="http://adrianroselli.com/2017/01/avoid-messages-under-fields.html">below can cause problems</a>.</p>
  486. <p>Prefix the word “Error:” to the document’s title. It’s the first thing announced by screen readers when the page loads.</p>
  487. <p>Style error messages in red and use a warning icon to provide a <a href="https://developer.paciellogroup.com/blog/2018/01/inclusive-design-principle-provide-a-comparable-experience/">comparable experience for colour blind users</a>.</p>
  488. <p>Error messages should be concise, specific, use plain language and avoid pleasantries like ‘please’. The <a href="https://design-system.service.gov.uk/">GOV.UK Design System</a> is full of brilliant examples.</p>
  489. <p>You can <a href="http://nostyle.herokuapp.com/examples/validation">see all of this in action here</a>.</p>
  490. <h2 id="flow-and-order">Flow and order</h2>
  491. <p><a href="https://www.smashingmagazine.com/2017/05/better-form-design-one-thing-per-page/">Start with one thing per page</a>. Then put the questions in a sensible order. For example, payment details should come after delivery details.</p>
  492. <p><a href="https://design-system.service.gov.uk/patterns/question-pages/#using-progress-indicators">Start without a progress indicator</a>. They’re often not noticed and can be tricky to design for dynamic flows.</p>
  493. <p>Tell users what they need and how long the form will take to complete before they start.</p>
  494. <p>In really long forms, let users save their progress and return to finish it later. Use the <a href="https://design-system.service.gov.uk/patterns/task-list-pages/">task list</a> pattern to break up the journey into small, manageable parts.</p>
  495. <p>Put <a href="https://design-system.service.gov.uk/patterns/question-pages/">back links in the top left of the page</a> so users don’t have to scroll past the form to go back. Avoid putting links within the body of the form as it disrupts the tab sequence for keyboard users.</p>
  496. <p>Just before the end of a transaction, let users <a href="https://design-system.service.gov.uk/patterns/check-answers/">check their answers</a> and make changes. This provides reassurance and <a href="https://inclusivedesignprinciples.org/#give-control">keeps users in control</a>.</p>
  497. <p>When a transaction is complete, show a <a href="https://design-system.service.gov.uk/patterns/confirmation-pages/">confirmation page</a> and send users an email confirmation. Tell users what will happen next.</p>
  498. <p>Now’s a good a time to let your brand shine through. This is the beginning of the relationship—not the end.</p>
  499. <h2 id="go-faster">Go faster</h2>
  500. <p><a href="https://www.gov.uk/service-manual/design/form-structure#design-for-the-most-common-scenarios-first">Design for common circumstances</a> by putting the most used option first and marking it as selected. Except when you need to avoid bias—like in surveys.</p>
  501. <p>Use the <a href="https://www.smashingmagazine.com/2017/03/improve-billing-form-ux/">browser’s autofill routine</a> to stop users from typing data manually. This also reduces the risk of typos.</p>
  502. <p>Avoid the <code>maxlength</code> attribute. Many users don’t look at the screen as they type, so they won’t notice that some of their keystrokes were ignored until they look up.</p>
  503. <p>Use form validation and a <a href="http://nostyle.herokuapp.com/components/character-countdown">character count</a> component instead.</p>
  504. <p>Use <code>autocapitalize="none"</code>, <code>autocorrect="off"</code> and <code>spellcheck="false"</code> to stop browsers automatically changing user input on fields that expect grammatically incorrect data—like email addresses and passwords.</p>
  505. <h2 id="field-design">Field design</h2>
  506. <p>Use the right input type. On mobile it will provide users with a more useful keyboard.</p>
  507. <p>Learn <a href="https://adamsilver.io/articles/form-design-when-to-use-the-number-input/">when and when not to use the number input</a>.</p>
  508. <p>Don’t mix up radio buttons and checkboxes. And remember <a href="https://uxmyths.com/post/931925744/myth-23-choices-should-always-be-limited-to-seven">you can have more than 7 options on a page</a>.</p>
  509. <p><a href="https://www.youtube.com/watch?v=CUkMCQR4TpY">Select boxes should be a last resort</a> because they’re really hard to use. Try radio buttons instead. Or use an autocomplete, if there’s a long list of options.</p>
  510. <p>Don’t use <code>datalist</code> for an autocomplete. It’s <a href="https://caniuse.com/#feat=datalist">buggy and lacks support</a>. Autocompletes are really tricky, so you can <a href="http://nostyle.herokuapp.com/components/autocomplete">use mine</a>.</p>
  511. <p>Use <a href="http://nostyle.herokuapp.com/components/memorable-date">three separate text boxes for dates</a>. Only use a date picker when users need to find a date in relation to another, or if they need to know the day, week or month that the date relates to. Date pickers are tricky, so you can <a href="http://nostyle.herokuapp.com/components/date-picker">use mine</a>.</p>
  512. <p>Use a <a href="http://nostyle.herokuapp.com/components/stepper">stepper component</a> to help users make small numerical adjustments quickly and easily.</p>
  513. <p>Don’t use multiple inputs when one will do, like when asking for a sort code. If you do have multiple inputs for a field, don’t auto tab between them. It causes users to make mistakes.</p>
  514. <p>File uploading: try to accept large files and as many file types as possible. Don’t <em>rely</em> on the <code>multiple</code> attribute. Besides a lack of support, it can only be used to select files from a single directory.</p>
  515. <p>Here’s one accessible way to let <a href="http://nostyle.herokuapp.com/examples/dropzone">users upload multiple files</a>.</p>
  516. <h2 id="the-end">The end</h2>
  517. <p>So there you are. A few hundred words on how to avoid 90% of the problems found in most online forms.</p>
  518. </article>
  519. </section>
  520. <nav id="jumpto">
  521. <p>
  522. <a href="/david/blog/">Accueil du blog</a> |
  523. <a href="https://adamsilver.io/articles/form-design-from-zero-to-hero-all-in-one-blog-post/">Source originale</a> |
  524. <a href="/david/stream/2019/">Accueil du flux</a>
  525. </p>
  526. </nav>
  527. <footer>
  528. <div>
  529. <img src="/static/david/david-larlet-avatar.jpg" loading="lazy" class="avatar" width="200" height="200">
  530. <p>
  531. Bonjour/Hi!
  532. Je suis <a href="/david/" title="Profil public">David&nbsp;Larlet</a>, je vis actuellement à Montréal et j’alimente cet espace depuis 15 ans. <br>
  533. Si tu as apprécié cette lecture, n’hésite pas à poursuivre ton exploration. Par exemple via les <a href="/david/blog/" title="Expériences bienveillantes">réflexions bimestrielles</a>, la <a href="/david/stream/2019/" title="Pensées (dés)articulées">veille hebdomadaire</a> ou en t’abonnant au <a href="/david/log/" title="S’abonner aux publications via RSS">flux RSS</a> (<a href="/david/blog/2019/flux-rss/" title="Tiens c’est quoi un flux RSS ?">so 2005</a>).
  534. </p>
  535. <p>
  536. Je m’intéresse à la place que je peux avoir dans ce monde. En tant qu’humain, en tant que membre d’une famille et en tant qu’associé d’une coopérative. De temps en temps, je fais aussi des <a href="https://github.com/davidbgk" title="Principalement sur Github mais aussi ailleurs">trucs techniques</a>. Et encore plus rarement, <a href="/david/talks/" title="En ce moment je laisse plutôt la place aux autres">j’en parle</a>.
  537. </p>
  538. <p>
  539. Voici quelques articles choisis :
  540. <a href="/david/blog/2019/faire-equipe/" title="Accéder à l’article complet">Faire équipe</a>,
  541. <a href="/david/blog/2018/bivouac-automnal/" title="Accéder à l’article complet">Bivouac automnal</a>,
  542. <a href="/david/blog/2018/commodite-effondrement/" title="Accéder à l’article complet">Commodité et effondrement</a>,
  543. <a href="/david/blog/2017/donnees-communs/" title="Accéder à l’article complet">Des données aux communs</a>,
  544. <a href="/david/blog/2016/accompagner-enfant/" title="Accéder à l’article complet">Accompagner un enfant</a>,
  545. <a href="/david/blog/2016/senior-developer/" title="Accéder à l’article complet">Senior developer</a>,
  546. <a href="/david/blog/2016/illusion-sociale/" title="Accéder à l’article complet">L’illusion sociale</a>,
  547. <a href="/david/blog/2016/instantane-scopyleft/" title="Accéder à l’article complet">Instantané Scopyleft</a>,
  548. <a href="/david/blog/2016/enseigner-web/" title="Accéder à l’article complet">Enseigner le Web</a>,
  549. <a href="/david/blog/2016/simplicite-defaut/" title="Accéder à l’article complet">Simplicité par défaut</a>,
  550. <a href="/david/blog/2016/minimalisme-esthetique/" title="Accéder à l’article complet">Minimalisme et esthétique</a>,
  551. <a href="/david/blog/2014/un-web-omni-present/" title="Accéder à l’article complet">Un web omni-présent</a>,
  552. <a href="/david/blog/2014/manifeste-developpeur/" title="Accéder à l’article complet">Manifeste de développeur</a>,
  553. <a href="/david/blog/2013/confort-convivialite/" title="Accéder à l’article complet">Confort et convivialité</a>,
  554. <a href="/david/blog/2013/testament-numerique/" title="Accéder à l’article complet">Testament numérique</a>,
  555. et <a href="/david/blog/" title="Accéder aux archives">bien d’autres…</a>
  556. </p>
  557. <p>
  558. On peut <a href="mailto:david%40larlet.fr" title="Envoyer un courriel">échanger par courriel</a>. Si éventuellement tu souhaites que l’on travaille ensemble, tu devrais commencer par consulter le <a href="http://larlet.com">profil dédié à mon activité professionnelle</a> et/ou contacter directement <a href="http://scopyleft.fr/">scopyleft</a>, la <abbr title="Société coopérative et participative">SCOP</abbr> dont je fais partie depuis six ans. Je recommande au préalable de lire <a href="/david/blog/2018/cout-site/" title="Attention ce qui va suivre peut vous choquer">combien coûte un site</a> et pourquoi je suis plutôt favorable à une <a href="/david/pro/devis/" title="Discutons-en !">non-demande de devis</a>.
  559. </p>
  560. <p>
  561. Je ne traque pas ta navigation mais mon
  562. <abbr title="Alwaysdata, 62 rue Tiquetonne 75002 Paris, +33.184162340">hébergeur</abbr>
  563. conserve des logs d’accès.
  564. </p>
  565. </div>
  566. </footer>
  567. <script type="text/javascript">
  568. ;(_ => {
  569. const jumper = document.getElementById('jumper')
  570. jumper.addEventListener('click', e => {
  571. e.preventDefault()
  572. const anchor = e.target.getAttribute('href')
  573. const targetEl = document.getElementById(anchor.substring(1))
  574. targetEl.scrollIntoView({behavior: 'smooth'})
  575. })
  576. })()
  577. </script>