A place to cache linked articles (think custom and personal wayback machine)
Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

4 лет назад
4 лет назад
4 лет назад
4 лет назад
4 лет назад
4 лет назад
4 лет назад
4 лет назад
4 лет назад
4 лет назад
4 лет назад
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  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,initial-scale=1">
  11. <!-- Required to make a valid HTML5 document. -->
  12. <title>Why is CSS Frustrating? (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="#f0f0ea">
  24. <meta name="msapplication-config" content="/static/david/icons2/browserconfig.xml">
  25. <meta name="theme-color" content="#f0f0ea">
  26. <!-- Documented, feel free to shoot an email. -->
  27. <link rel="stylesheet" href="/static/david/css/style_2020-06-19.css">
  28. <!-- See https://www.zachleat.com/web/comprehensive-webfonts/ for the trade-off. -->
  29. <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>
  30. <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>
  31. <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>
  32. <link rel="preload" href="/static/david/css/fonts/triplicate_t3_regular.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: dark)" crossorigin>
  33. <link rel="preload" href="/static/david/css/fonts/triplicate_t3_bold.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: dark)" crossorigin>
  34. <link rel="preload" href="/static/david/css/fonts/triplicate_t3_italic.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: dark)" crossorigin>
  35. <script type="text/javascript">
  36. function toggleTheme(themeName) {
  37. document.documentElement.classList.toggle(
  38. 'forced-dark',
  39. themeName === 'dark'
  40. )
  41. document.documentElement.classList.toggle(
  42. 'forced-light',
  43. themeName === 'light'
  44. )
  45. }
  46. const selectedTheme = localStorage.getItem('theme')
  47. if (selectedTheme !== 'undefined') {
  48. toggleTheme(selectedTheme)
  49. }
  50. </script>
  51. <meta name="robots" content="noindex, nofollow">
  52. <meta content="origin-when-cross-origin" name="referrer">
  53. <!-- Canonical URL for SEO purposes -->
  54. <link rel="canonical" href="https://css-tricks.com/why-is-css-frustrating/">
  55. <body class="remarkdown h1-underline h2-underline h3-underline hr-center ul-star pre-tick">
  56. <article>
  57. <header>
  58. <h1>Why is CSS Frustrating?</h1>
  59. </header>
  60. <nav>
  61. <p class="center">
  62. <a href="/david/" title="Aller à l’accueil">🏠</a> •
  63. <a href="https://css-tricks.com/why-is-css-frustrating/" title="Lien vers le contenu original">Source originale</a>
  64. </p>
  65. </nav>
  66. <hr>
  67. <main>
  68. <p>Here’s <a href="https://twitter.com/KevinJPowell/status/1231979370446802945">a great thread</a> by Kevin Powell that's making the rounds. He believes so many folks see CSS as a frustrating and annoying language:</p>
  69. <blockquote class="twitter-tweet" data-width="500" data-dnt="true"><p lang="en" dir="ltr">That&#39;s just as unintuitive as JS starting to count at 0, but since you learned that and accept it, it&#39;s fine.<br><br>The real issue isn&#39;t with CSS. If you struggle with it, or ever call it unintuitive, it&#39;s probably because you don&#39;t really understand how CSS is meant to work.</p>&mdash; Kevin Powell (@KevinJPowell) <a href="https://twitter.com/KevinJPowell/status/1231979376830484481?ref_src=twsrc%5Etfw">February 24, 2020</a></blockquote>
  70. <p>Why do people respect JavaScript or other languages enough to learn them inside-out, and yet constantly dunk on CSS? Well, all this reminds me of what Jeremy Keith wrote a while back when he argued that <a href="https://adactio.com/journal/12571">CSS is simple, but not easy</a>:</p>
  71. <blockquote class="wp-block-quote"><p>Unlike a programming language that requires knowledge of loops, variables, and other concepts, CSS is pretty easy to pick up. Maybe it’s because of this that it has gained the reputation of being simple. It <em>is</em> simple in the sense of “not complex”, but that doesn’t mean it’s easy. Mistaking “simple” for “easy” will only lead to heartache.</p><p>I think that’s what’s happened with some programmers coming to CSS for the first time. They’ve heard it’s simple, so they assume it’s easy. But then when they try to use it, it doesn’t work. It must be the fault of the language, because they know that they are smart, and this is supposed to be easy. So they blame the language. They say it’s broken. And so they try to “fix” it by making it conform to a more programmatic way of thinking.</p></blockquote>
  72. <p>There have been time where I’ve sat down with engineers to pair with them about a tricky layout issue and the CSS is treated as being beneath them — as if the language is somehow too unpredictable to warrant learning and mastering. Perhaps this has something to do with the past, where we’ve spent years fighting the way browsers render things differently. But this is mostly a solved problem. I can’t remember the last time I fought against browsers like that.</p>
  73. <p>Instead, I reckon the biggest issue that engineers face — and the reason why they find it all so dang frustrating — is that CSS forces you to face the <em>webishness</em> of the web. Things require fallbacks. You need to take different devices into consideration, and all the different ways of seeing a website: mobile, desktop, no mouse, no keyboard, etc. Sure, you have to deal with that when writing JavaScript, too, but it’s easier to ignore. You can’t ignore the layout of your site being completely broken on a phone.</p>
  74. <p><strong>Side note:</strong> We have <a href="https://css-tricks.com/centering-css-complete-guide/">a guide to centering in CSS</a> not because CSS is busted and dumb, but because there are so many variables to the extent that a simple question like, “How do I center text?” is actually much more complicated than it appears. There’s so much context that’s missed.</p>
  75. <p>This reminds me of one of my favorite blog posts of all time, where Brandon Smith argues that <a href="https://css-tricks.com/css-is-awesome/">CSS is awesome</a> and we should respect the language and learn how it works under the hood:</p>
  76. <blockquote class="wp-block-quote"><p>CSS is hard because its properties interact, often in unexpected ways. Because when you set one of them, you're never just setting that one thing. That one thing combines and bounces off of and contradicts with a dozen other things, including default things that you never actually set yourself.</p><p>One rule of thumb for mitigating this is, <strong>never be more explicit than you need to be</strong>. Web pages are responsive by default. Writing good CSS means leveraging that fact instead of overriding it. Use percentages or viewport units instead of a media query if possible. Use <code>min-width</code> instead of <code>width</code> where you can. Think in terms of rules, in terms of <em>what you really mean to say</em>, instead of just adding properties until things look right. Try to get a feel for how the browser resolves layout and sizing, and make your changes and additions on top of that judiciously. Work with CSS, instead of against it.</p></blockquote>
  77. </main>
  78. </article>
  79. <hr>
  80. <footer>
  81. <p>
  82. <a href="/david/" title="Aller à l’accueil">🏠</a> •
  83. <a href="/david/log/" title="Accès au flux RSS">🤖</a> •
  84. <a href="http://larlet.com" title="Go to my English profile" data-instant>🇨🇦</a> •
  85. <a href="mailto:david%40larlet.fr" title="Envoyer un courriel">📮</a> •
  86. <abbr title="Hébergeur : Alwaysdata, 62 rue Tiquetonne 75002 Paris, +33184162340">🧚</abbr>
  87. </p>
  88. <template id="theme-selector">
  89. <form>
  90. <fieldset>
  91. <legend>Thème</legend>
  92. <label>
  93. <input type="radio" value="auto" name="chosen-color-scheme" checked> Auto
  94. </label>
  95. <label>
  96. <input type="radio" value="dark" name="chosen-color-scheme"> Foncé
  97. </label>
  98. <label>
  99. <input type="radio" value="light" name="chosen-color-scheme"> Clair
  100. </label>
  101. </fieldset>
  102. </form>
  103. </template>
  104. </footer>
  105. <script type="text/javascript">
  106. function loadThemeForm(templateName) {
  107. const themeSelectorTemplate = document.querySelector(templateName)
  108. const form = themeSelectorTemplate.content.firstElementChild
  109. themeSelectorTemplate.replaceWith(form)
  110. form.addEventListener('change', (e) => {
  111. const chosenColorScheme = e.target.value
  112. localStorage.setItem('theme', chosenColorScheme)
  113. toggleTheme(chosenColorScheme)
  114. })
  115. const selectedTheme = localStorage.getItem('theme')
  116. if (selectedTheme && selectedTheme !== 'undefined') {
  117. form.querySelector(`[value="${selectedTheme}"]`).checked = true
  118. }
  119. }
  120. const prefersColorSchemeDark = '(prefers-color-scheme: dark)'
  121. window.addEventListener('load', () => {
  122. let hasDarkRules = false
  123. for (const styleSheet of Array.from(document.styleSheets)) {
  124. let mediaRules = []
  125. for (const cssRule of styleSheet.cssRules) {
  126. if (cssRule.type !== CSSRule.MEDIA_RULE) {
  127. continue
  128. }
  129. // WARNING: Safari does not have/supports `conditionText`.
  130. if (cssRule.conditionText) {
  131. if (cssRule.conditionText !== prefersColorSchemeDark) {
  132. continue
  133. }
  134. } else {
  135. if (cssRule.cssText.startsWith(prefersColorSchemeDark)) {
  136. continue
  137. }
  138. }
  139. mediaRules = mediaRules.concat(Array.from(cssRule.cssRules))
  140. }
  141. // WARNING: do not try to insert a Rule to a styleSheet you are
  142. // currently iterating on, otherwise the browser will be stuck
  143. // in a infinite loop…
  144. for (const mediaRule of mediaRules) {
  145. styleSheet.insertRule(mediaRule.cssText)
  146. hasDarkRules = true
  147. }
  148. }
  149. if (hasDarkRules) {
  150. loadThemeForm('#theme-selector')
  151. }
  152. })
  153. </script>
  154. </body>
  155. </html>