<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/feeds/stylesheet.xsl"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	
	
	<link href="https://blog.comandeer.pl/feeds/kategorie/a11y.xml" rel="self" type="application/atom+xml"/>
	<link href="https://blog.comandeer.pl/kategorie/a11y" rel="alternate" type="text/html"/>
	<updated>2026-04-25T11:06:04.890Z</updated>
	<id>https://blog.comandeer.pl/feeds/kategorie/a11y.xml</id>
	<title type="html">Comandeerowy blog</title>
	
		<category term="Dostępność"/>
		<subtitle>Kategoria Dostępność</subtitle>
	
	
		
	
	
		<entry>
			<title type="html">Dobry ziomek system</title>
			
				<author>
					<name>Comandeer</name>
				</author>
			
			<link href="https://blog.comandeer.pl/dobry-ziomek-system" rel="alternate" type="text/html"/>
			<published>2025-12-22T23:00:00.000Z</published>
			<updated>2025-12-22T23:00:00.000Z</updated>
			<id>https://blog.comandeer.pl/dobry-ziomek-system</id>
			
				<summary><![CDATA[Systemy operacyjne wcale nie są takie najgorsze, jeśli chodzi o dostępność.]]></summary>
			
			<content type="html"><![CDATA[<p>Dzisiaj chciałbym zwrócić uwagę na cichego bohatera dostępności: system operacyjny! Dostarcza on bowiem szeregu technologii asystujących oraz innych usprawnień dla osób z niepełnosprawnościami.</p>
<h2 id="technologia-asystująca"><a class="header-anchor" href="https://blog.comandeer.pl/dobry-ziomek-system#technologia-asystująca">Technologia asystująca</a></h2>
<p>Czym jednak jest technologia asystująca? Za <a href="https://www.who.int/news-room/fact-sheets/detail/assistive-technology" rel="noreferrer noopener">definicją proponowaną przez WHO</a>:</p>
<blockquote>
<p lang="en">Assistive products help maintain or improve an individual’s functioning related to cognition, communication, hearing, mobility, self-care and vision, thus enabling their health, well-being, inclusion and participation.</p>
<p>[Produkty asystujące pomagają w utrzymaniu lub poprawie funkcjonowania osoby w zakresie funkcji poznawczych, komunikacji, słuchu, mobilności, samoopieki oraz wzroku, pozwalając tej osobie być zdrową fizycznie i psychicznie, włączoną w życie społeczne oraz uczestniczącą w nim.]</p>
</blockquote>
<p>Ta definicja jest niezwykle szeroka i obejmuje tak naprawdę wszystkie sprzęty oraz oprogramowanie, które pomagają w codziennym funkcjonowaniu. Stąd można do niej zaliczyć np. wózek inwalidzki, czytniki ekranu, ale też choćby lupę. Swego czasu <a href="https://gwd.comandeer.pl/dostepnosc/technologia-asystujaca/" rel="noreferrer noopener">opisałem trochę przykładów takich technologii</a>.</p>
<h2 id="systemowa-technologia-asystująca"><a class="header-anchor" href="https://blog.comandeer.pl/dobry-ziomek-system#systemowa-technologia-asystująca">Systemowa technologia asystująca</a></h2>
<p>Systemy operacyjne dostarczają osobom z nich korzystających wbudowanych technologii asystujących. Lista takich technologii będzie się różnić w zależności od systemu. Weźmy jako przykład macOS-a. Chyba najbardziej znaną technologią asystującą dostępną wraz z tym systemem jest <a href="https://en.wikipedia.org/wiki/VoiceOver" rel="noreferrer noopener">czytnik ekranowy VoiceOver</a>. Nie jest bynajmniej jedyną. Ustawienia systemu posiadają mocno rozbudowaną sekcję poświęconą dostępności:</p>
<figure class="figure"><a class="figure__link" href="/assets/images/dobry-ziomek-system/macos-ustawienia-1360w.avif"><picture><source type="image/avif" srcset="/assets/images/dobry-ziomek-system/macos-ustawienia-440w.avif 440w, /assets/images/dobry-ziomek-system/macos-ustawienia-880w.avif 880w, /assets/images/dobry-ziomek-system/macos-ustawienia-1024w.avif 1024w, /assets/images/dobry-ziomek-system/macos-ustawienia-1360w.avif 1360w" sizes="90vw"><source type="image/webp" srcset="/assets/images/dobry-ziomek-system/macos-ustawienia-440w.webp 440w, /assets/images/dobry-ziomek-system/macos-ustawienia-880w.webp 880w, /assets/images/dobry-ziomek-system/macos-ustawienia-1024w.webp 1024w, /assets/images/dobry-ziomek-system/macos-ustawienia-1360w.webp 1360w" sizes="90vw"><source type="image/jpeg" srcset="/assets/images/dobry-ziomek-system/macos-ustawienia-440w.jpeg 440w, /assets/images/dobry-ziomek-system/macos-ustawienia-880w.jpeg 880w, /assets/images/dobry-ziomek-system/macos-ustawienia-1024w.jpeg 1024w, /assets/images/dobry-ziomek-system/macos-ustawienia-1360w.jpeg 1360w" sizes="90vw"><img src="/assets/images/dobry-ziomek-system/macos-ustawienia-1360w.jpeg" width="1360" height="1200" style="aspect-ratio: 1360 / 1200" alt="Aplikacja Ustawienia, zakładka &quot;Accessibility&quot;;&nbsp;w sekcji &quot;Vision&quot;&nbsp;znajdują się opcje &quot;VoiceOver&quot;, &quot;Zoom&quot;, &quot;Hover Text&quot;, &quot;Display&quot;, &quot;Motion&quot;, &quot;Read &amp; Speak&quot;, &quot;Audio Descriptions&quot;; w sekcji &quot;Hearing&quot;&nbsp;znajdują się opcje &quot;Hearing Devices&quot; oraz &quot;Audio&quot;; więcej opcji jest niewidocznych." loading="lazy" decoding="async"></picture></a><figcaption class="figure__caption"><p>Sekcja ustawień dostępności</p></figcaption></figure>
<p>Jak widać, macOS dzieli te ustawienia na poszczególne zmysły, które dane opcje mają wspierać. Stąd w kategorii wzroku mamy <a href="http://m.in" rel="noreferrer noopener">m.in</a>. czytnik ekranu (VoiceOver), ale też ustawienia wyświetlacza czy animacji ruchowych, w słuchu – ustawienia dźwięku itd. Każda z tych opcji w menu posiada konkretne ustawienia, np. odnośnie animacji ruchowych:</p>
<figure class="figure"><a class="figure__link" href="/assets/images/dobry-ziomek-system/macos-ruch-1360w.avif"><picture><source type="image/avif" srcset="/assets/images/dobry-ziomek-system/macos-ruch-440w.avif 440w, /assets/images/dobry-ziomek-system/macos-ruch-880w.avif 880w, /assets/images/dobry-ziomek-system/macos-ruch-1024w.avif 1024w, /assets/images/dobry-ziomek-system/macos-ruch-1360w.avif 1360w" sizes="90vw"><source type="image/webp" srcset="/assets/images/dobry-ziomek-system/macos-ruch-440w.webp 440w, /assets/images/dobry-ziomek-system/macos-ruch-880w.webp 880w, /assets/images/dobry-ziomek-system/macos-ruch-1024w.webp 1024w, /assets/images/dobry-ziomek-system/macos-ruch-1360w.webp 1360w" sizes="90vw"><source type="image/jpeg" srcset="/assets/images/dobry-ziomek-system/macos-ruch-440w.jpeg 440w, /assets/images/dobry-ziomek-system/macos-ruch-880w.jpeg 880w, /assets/images/dobry-ziomek-system/macos-ruch-1024w.jpeg 1024w, /assets/images/dobry-ziomek-system/macos-ruch-1360w.jpeg 1360w" sizes="90vw"><img src="/assets/images/dobry-ziomek-system/macos-ruch-1360w.jpeg" width="1360" height="1200" style="aspect-ratio: 1360 / 1200" alt="Aplikacja Ustawienia, zakładka &quot;Accessibility&quot;, podsekcja &quot;Motion&quot;; dostępne utawienia: &quot;Reduce motion&quot;, &quot;Dim flashing lights&quot;, &quot;Auto-play animated images&quot;, &quot;Prefer non-blinking cursor&quot;, &quot;Vehicle Motion Cues&quot;." loading="lazy" decoding="async"></picture></a><figcaption class="figure__caption"><p>Sekcja ustawień dostępności dotyczących animacji ruchowych</p></figcaption></figure>
<p>System od Apple pozwala na dostosowanie większości aspektów systemu, np. wyłączając autoodtwarzanie ruchomych obrazków (GIF-ów). I choć na początku ogrom opcji może przytłaczać, to sam fakt ich istnienia jest jak najbardziej pozytywny. W końcu jedne z najbardziej dostępnych rozwiązań to te, które można <a href="https://gwd.comandeer.pl/inkluzywnosc/preferencje-osoby-uzytkowniczej/" rel="noreferrer noopener">najbardziej dostosować pod siebie</a>!</p>
<p>Windows również posiada dość rozbudowane opcje dostępności. Podobnie jak macOS udostępnia czytnik ekranowy, <a href="https://www.microsoft.com/en-us/windows/tips/narrator" rel="noreferrer noopener">Narratora</a>. W przypadku jednak tego systemu nie zdobył on nigdy większej popularności. Od lat na tej platformie królują <a href="https://vispero.com/jaws-screen-reader-software/" rel="noreferrer noopener">JAWS</a> (płatny) oraz <a href="https://www.nvaccess.org/about-nvda/" rel="noreferrer noopener">NVDA</a> (darmowy). Oprócz czytnika Windows oferuje choćby <a href="https://support.microsoft.com/pl-pl/windows/u%C5%BCywanie-lupy-do-zapewnienia-lepszej-widoczno%C5%9Bci-element%C3%B3w-na-ekranie-414948ba-8b1c-d3bd-8615-0e5e32204198" rel="noreferrer noopener">lupę ekranową</a> (do powiększania fragmentów ekranu) czy <a href="https://blog.comandeer.pl/czy-div-jest-dostepny#dost%C4%99pno%C5%9B%C4%87-to-nie-tylko-czytniki-ekranowe">tryb wysokiego kontrastu</a>.</p>
<p>Systemy mobilne także dostarczają technologii asystujących. Zarówno Android, jak i iOS, mają wbudowane czytniki ekranowe – odpowiednio <a href="https://support.google.com/accessibility/android/answer/6007100?hl=en" rel="noreferrer noopener">TalkBack</a> i VoiceOver. Mają także choćby opcję ograniczania animacji ruchowych. Także sporo linuksowych dystrybucji ma ustawienia dostępności, np. LInux Mint pozwala włączyć tryb wysokiego kontrastu i ma wbudowany czytnik ekranu (<a href="https://orca.gnome.org/" rel="noreferrer noopener">Orcę</a>).</p>
<p>Innymi słowy: systemy operacyjne próbują dostarczyć niezbędnych narzędzi do tego, by mogło z nich korzystać jak najwięcej osób, w tym osoby z niepełnosprawnościami.</p>
<h2 id="system-a-przeglądarka"><a class="header-anchor" href="https://blog.comandeer.pl/dobry-ziomek-system#system-a-przeglądarka">System a przeglądarka</a></h2>
<p>Jak zatem taka systemowa technologia asystująca przekłada się na przeglądarkę? To zależy. Wraz z rozwojem technologii sieciowych, osoby tworzące strony WWW dostały możliwość dowiedzenia się nieco więcej o systemie operacyjnym, na którym uruchomiona jest przeglądarka. Najczęściej dzięki nowym media queries w CSS-ie. Wśród nich wymienić można:</p>
<ul>
<li><a href="https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/At-rules/@media/prefers-reduced-motion" rel="noreferrer noopener"><code>prefers-reduced-motion</code></a> – informujące o ustawieniach dotyczących ograniczenia animacji ruchowych,</li>
<li><a href="https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/At-rules/@media/forced-colors" rel="noreferrer noopener"><code>forced-colors</code></a> – informujące o trybie wymuszonych kolorów, czyli ograniczeniu palety dostępnych kolorów, jak w przypadku Windowsowego trybu wysokiego kontrastu,</li>
<li><a href="https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/At-rules/@media/prefers-color-scheme" rel="noreferrer noopener"><code>prefers-color-scheme</code></a> – informujące o preferencjach osoby użytkowniczej co do doboru schematu kolorystycznego; inaczej mówiąc: czy woli jasny, czy ciemny motyw.</li>
</ul>
<p>Część z systemowych ułatwień dostępu może być jednak “zakamuflowana”. Dobrym przykładem są tu różnego rodzaju powiększenia. Działają one trochę jak zmniejszenie rozdzielczości: poszczególne elementy robią się większe, przez co są bardziej czytelne. Równocześnie jednak ogranicza to liczbę elementów widocznych w danej chwili na ekranie. Przeglądarka często interpretuje to jako mniejszy <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/Guides/CSSOM_view/Viewport_concepts" rel="noreferrer noopener">viewport</a>. Co też dobrze pokazuje, jak zawodne jest opieranie responsywności na założeniu <q>mały ekran = urządzenie mobilne</q>.</p>
<p>Jeszcze inne technologie asystujące są całkowicie przezroczyste dla przeglądarki, jak np. czytniki ekranu. Nie ma żadnego sposobu, aby dowiedzieć się, że osoba odwiedzająca stronę używa czytnika ekranu. I to <a href="https://axesslab.com/digital-apartheid/" rel="noreferrer noopener">akurat dobrze</a>. Zwłaszcza, że stworzenie strony z zachowaniem standardów sieciowych i dobrych praktyk dostępności jest w większości przypadków wystarczające, by strona ta działała poprawnie we wszystkich popularnych czytnikach ekranu. Innymi słowy: wystarczy <em>dobrze</em> wykonywać swoją pracę – jakkolwiek brutalnie by to nie brzmiało.</p>
<p>Podsumowując: przeglądarka i system to para zaufanych przyjaciół, która niektóre sekrety zostawia wyłącznie dla siebie. Ale to, czym się jednak z nami dzielą, powinno wystarczyć do stworzenia dostępnej, przyjaznej strony WWW.</p>
]]></content>
		</entry>
	
		<entry>
			<title type="html">Zostawiając awizo…</title>
			
				<author>
					<name>Comandeer</name>
				</author>
			
			<link href="https://blog.comandeer.pl/zostawiajac-awizo" rel="alternate" type="text/html"/>
			<published>2025-12-10T23:01:00.000Z</published>
			<updated>2025-12-10T23:01:00.000Z</updated>
			<id>https://blog.comandeer.pl/zostawiajac-awizo</id>
			
				<summary><![CDATA[Krótko o powiadamianiu czytników ekranowych o zmianach na stronie i czemu potrzebujemy ariaNotify.]]></summary>
			
			<content type="html"><![CDATA[<p>Kolejną teoretycznie prostą sprawą jest powiadamianie czytników ekranu o zmianach na stronie. Jednak w praktyce jest to o wiele bardziej skomplikowane, niż się wydaje na pierwszy rzut oka.</p>
<h2 id="powiadamianie-o-zmianach-na-stronie"><a class="header-anchor" href="https://blog.comandeer.pl/zostawiajac-awizo#powiadamianie-o-zmianach-na-stronie">Powiadamianie o zmianach na stronie</a></h2>
<p>Czasy całkowicie statycznych stron skończyły się eony temu. Obecnie bardzo często zachodzi potrzeba dynamicznej zmiany treści na stronie, np. w aktualizowanej na żywo relacji z meczu czy w odpowiedzi na akcję osoby użytkowniczej. Osoby, które nie korzystają z technologii asystującej, najczęściej są w stanie taką zmianę zauważyć (strona się wizualnie zmienia). Niemniej osobom korzystającym z technologii asystującej (a zwłaszcza czytników ekranu) taka zmiana może umknąć. Wypada więc w jakiś sposób je o niej poinformować.</p>
<p>Jednym ze sposobów są tzw. <a href="https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Guides/Live_regions" rel="noreferrer noopener"><i lang="en">live regions</i> (żywe regiony, regiony zmieniające się na żywo)</a>. Gdy oznaczy się element na stronie przy pomocy <a href="https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Reference/Attributes/aria-live" rel="noreferrer noopener">atrybutu <code>[aria-live]</code></a>, wszelkie zmiay w jego zawartości będą odczytywane osobie korzystającej z czytnika ekranu. Dodatkowo, przy pomocy wartości tego atrybutu, możemy określić, czy czytanie ma być “uprzejme” (<code>polite</code>), czy “asertywne” (<code>assertive</code>). To pierwsze poczeka, aż osoba skończy wykonywać aktualną czynność (np. czytać akapit tekstu) i dopiero przeczyta komunikat. To drugie przerwie aktualną czynność i komunikat zostanie przeczytany natychmiast. Dodatkowo, przy pomocy <a href="https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Reference/Attributes/aria-atomic" rel="noreferrer noopener">atrybutu <code>[aria-atomic]</code></a> można określić, czy za każdym razem ma być odczytywana cała zawartość elementu z <code>[aria-live]</code>, czy tylko jej zmieniona część.</p>
<p>Warto też zauważyć, że istnieją <a href="https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Reference/Roles" rel="noreferrer noopener">role</a>, które odpowiadają wartościom atrybutu <code>[aria-live]</code>. Elementy z <a href="https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Reference/Roles/status_role" rel="noreferrer noopener">atrybutem  <code>[role=status]</code></a> będą czytane uprzejmie, natomiast elementy z <a href="https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Reference/Roles/alert_role" rel="noreferrer noopener">atrybutem <code>[role=alert]</code></a> – asertywnie.</p>
<div class="note" role="note" aria-labelledby="note-6"><p class="note__label" id="note-6">Dygresja</p><div class="note__content"><p>W większości przypadków nie ma potrzeby przerywać osobie użytkowniczej aktualnej czynności, stąd <code>[aria-live=assertive]</code> oraz <code>[role=alert]</code> powinny być używane tylko w naprawdę ważnych sytuacjach – takich jak np. krytyczne błędy.</p></div></div>
<p>Niemniej żywe regiony mają jedną, zasadniczą wadę: powiadamiają czytnik ekranu tylko, gdy ich zawartość się zmieni. Nie da się po prostu wstawić elementu z komunikatem na stronę. Trzeba najpierw wstawić pusty element, a dopiero potem dodać do niego treść komunikatu. To sprawia, że całe API zaczyna być mocno upierdliwe w użyciu. Zwykle kończy się na tym, że na stronie istnieje sobie pusty element z atrybutem <code>[aria-live]</code>, a wokół niego istnieje całe API, którego zadaniem jest dodawać i usuwać komunikaty. A jeśli robimy większą aplikację, w której komunikatów może być sporo i mogą się pojawiać często, to de facto musimy zrobić cały mechanizm ich kolejkowania. Tak to działa np. <a href="https://github.com/ckeditor/ckeditor5/blob/master/packages/ckeditor5-ui/src/arialiveannouncer.ts" rel="noreferrer noopener">w CKEditorze 5</a>. Strasznie dużo roboty jak na coś, co powinno być proste.</p>
<h2 id="nowy-wygodniejszy-sposób"><a class="header-anchor" href="https://blog.comandeer.pl/zostawiajac-awizo#nowy-wygodniejszy-sposób">Nowy, wygodniejszy sposób</a></h2>
<p>Na całe szczęście, <a href="https://blogs.windows.com/msedgedev/2025/05/05/creating-a-more-accessible-web-with-aria-notify" rel="noreferrer noopener">Edge zaproponował</a> jakiś czas temu nowe API, <a href="https://developer.mozilla.org/en-US/docs/Web/API/Element/ariaNotify" rel="noreferrer noopener"><code>ariaNotify()</code></a>. To metoda, przypięta do elementów HTML, która pozwala na wysłanie komunikatu do czytnika ekranu:</p>
<figure class="code" typeof="SoftwareSourceCode">
			<figcaption class="code__caption">
				<span class="code__title" property="programmingLanguage">JavaScript</span>
				
			</figcaption>
			<div class="code__code" translate="no" property="text">
				<pre class="shiki shiki-themes github-light github-dark" style="background-color:#fff;--shiki-dark-bg:#24292e;color:#24292e;--shiki-dark:#e1e4e8" tabindex="0"><code><span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">document.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">ariaNotify</span><span style="color:#24292E;--shiki-dark:#E1E4E8">( </span><span style="color:#032F62;--shiki-dark:#9ECBFF">'Jakiś komunikat'</span><span style="color:#24292E;--shiki-dark:#E1E4E8"> );</span></span>
<span class="line"></span></code></pre>

			</div>
		</figure><p>Dzięki drugiemu argumentowi można też określić priorytet komunikatu:</p>
<figure class="code" typeof="SoftwareSourceCode">
			<figcaption class="code__caption">
				<span class="code__title" property="programmingLanguage">JavaScript</span>
				
			</figcaption>
			<div class="code__code" translate="no" property="text">
				<pre class="shiki shiki-themes github-light github-dark" style="background-color:#fff;--shiki-dark-bg:#24292e;color:#24292e;--shiki-dark:#e1e4e8" tabindex="0"><code><span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">document.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">ariaNotify</span><span style="color:#24292E;--shiki-dark:#E1E4E8">( </span><span style="color:#032F62;--shiki-dark:#9ECBFF">'Komunikat'</span><span style="color:#24292E;--shiki-dark:#E1E4E8">. {</span></span>
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">	priority: </span><span style="color:#032F62;--shiki-dark:#9ECBFF">'normal'</span><span style="color:#6A737D;--shiki-dark:#6A737D"> // 1</span></span>
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">} );</span></span>
<span class="line"></span>
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">document.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">ariaNotify</span><span style="color:#24292E;--shiki-dark:#E1E4E8">( </span><span style="color:#032F62;--shiki-dark:#9ECBFF">'Komunikat'</span><span style="color:#24292E;--shiki-dark:#E1E4E8">. {</span></span>
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">	priority: </span><span style="color:#032F62;--shiki-dark:#9ECBFF">'high'</span><span style="color:#6A737D;--shiki-dark:#6A737D"> // 2</span></span>
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">} );</span></span>
<span class="line"></span></code></pre>

			</div>
		</figure><p>Normalny priorytet (1) odpowiada czytaniu uprzejmemu, podczas gdy wysoki (2) – asertywnemu.</p>
<p>Nowe API rozwiązuje też problem kolejkowania komunikatów. Nie trzeba się już dłużej samemu tym zajmować, robi to za nas przeglądarka.</p>
<p>Gdzie jest więc haczyk? To wciąż mocno eksperymentalna technologia, która nawet nie ma specyfikacji. Na ten moment jest tylko <a href="https://github.com/MicrosoftEdge/MSEdgeExplainers/blob/main/Accessibility/AriaNotify/explainer.md" rel="noreferrer noopener">propozycja ze strony Edge’a</a>. Samo API na ten moment <a href="https://caniuse.com/mdn-api_element_arianotify" rel="noreferrer noopener">działa wyłącznie w Chrome i Edge</a> – a i tam ma problemy poza Windowsem. Na razie zatem trzeba dalej męczyć się z żywymi regionami.</p>
<p>Bo dostępność nigdy nie może być za prosta, prawda?</p>
]]></content>
		</entry>
	
		<entry>
			<title type="html">Dostępność w nieoczekiwanych miejscach</title>
			
				<author>
					<name>Comandeer</name>
				</author>
			
			<link href="https://blog.comandeer.pl/dostepnosc-w-nieoczekiwanych-miejscach" rel="alternate" type="text/html"/>
			<published>2023-05-17T22:00:00.000Z</published>
			<updated>2023-05-17T22:00:00.000Z</updated>
			<id>https://blog.comandeer.pl/dostepnosc-w-nieoczekiwanych-miejscach</id>
			
				<summary><![CDATA[Dostępność można znaleźć w miejscach, w których byśmy się jej nie spodziewali.]]></summary>
			
			<content type="html"><![CDATA[<p>Dzisiaj, 18 maja 2023, obchodzimy kolejny <a href="https://accessibility.day/" rel="noreferrer noopener">Światowy Dzień Świadomości Dostępności (ang. <i lang="en">Global Accessibility Awareness Day</i>)</a>. Z tej okazji naszła mnie krótka refleksja o tym, jak postrzegana jest dostępność.</p>
<p>Gdyby zapytać przypadkową osobę webdeveloperską o to, czym jest dostępność, to jest duża szansa uzyskania odpowiedzi, że to dostosowanie strony tak, aby mogły z niej korzystać&nbsp;także osoby z niepełnosprawnościami. To prawda. Prawdopodobnie można by też usłyszeć o <a href="https://wcag21.lepszyweb.pl/" rel="noreferrer noopener">standardzie WCAG</a>. I to też jak najbardziej prawda. Problem polega na tym, że nie <em>cała</em> prawda.</p>
<p>Bo dostępność bardzo trudno zamknąć w obiektywnie weryfikowalny standard. Jasne, strona zgodna z WCAG ma zdecydowanie większe szanse być faktycznie dostępna, ale nawet <a href="https://wcag21.lepszyweb.pl/#background-on-wcag-2" rel="noreferrer noopener">wprowadzenie do tego standardu</a> zaznacza, że</p>
<blockquote>
<p>Chociaż wytyczne poruszają szereg zagadnień, nie jest możliwe, aby odpowiadały szczegółowo na potrzeby wszystkich możliwych rodzajów, stopni niepełnosprawności, czy też niepełnosprawności złożonych.</p>
</blockquote>
<p>WCAG to przede wszystkim zbiór dobrych, sprawdzonych w boju praktyk, których przestrzeganie pozwoli stworzyć podstawy dostępnego rozwiązania. Ale bardzo często, by stworzyć faktycznie dostępne rozwiązanie, trzeba pochylić się także nad innymi kwestiami – często takimi, które wcale nie są oczywiste.</p>
<p>Cofnijmy się nieco i spójrzmy, jak w ogóle definiowana jest dostępność. Bardzo ładną definicję znaleźć można na <a href="https://en.wikipedia.org/wiki/Web_accessibility" rel="noreferrer noopener">angielskiej Wiki</a>:</p>
<blockquote>
<p><strong>Web accessibility</strong>, or <strong>eAccessibility</strong>,[<a href="https://en.wikipedia.org/wiki/Web_accessibility#cite_note-sec1095-1" rel="noreferrer noopener">1]</a> is the <a href="https://en.wikipedia.org/wiki/Inclusion_(disability_rights)" rel="noreferrer noopener">inclusive practice</a> of ensuring there are no barriers that prevent interaction with, or access to, <a href="https://en.wikipedia.org/wiki/Website" rel="noreferrer noopener">websites</a> on the <a href="https://en.wikipedia.org/wiki/World_Wide_Web" rel="noreferrer noopener">World Wide Web</a> by people with physical <a href="https://en.wikipedia.org/wiki/Disabilities" rel="noreferrer noopener">disabilities</a>, situational disabilities, and socio-economic restrictions on bandwidth and speed.</p>
<p>[Dostępność stron WWW lub eDostępność to inkluzywna praktyka zapewniająca brak barier w dostępie i interakcji ze stronami WWW przez osoby z niepełnosprawnościami trwałymi i sytuacyjnymi oraz osoby z ograniczeniami socjo-ekonomicznymi dotyczącymi transferu i prędkości łącza.]</p>
</blockquote>
<p>W tej definicji pojawia się aspekt, którego zwykle nie łączy się z dostępnością: ograniczenia transferu i prędkości łącza. Innymi słowy – za dostępność uznać można także kwestie związane z wydajnością&nbsp;stron internetowych. Zwłaszcza, że <a href="https://www.smashingmagazine.com/2017/03/world-wide-web-not-wealthy-western-web-part-1/" rel="noreferrer noopener">Sieć to nie tylko szerokopasmowe łącza</a>. W chwili, gdy <a href="https://whatdoesmysitecost.com/" rel="noreferrer noopener">każdy bajt słono kosztuje</a>, rozmiar strony zaczyna ograniczać dostęp do niej w bardzo podobny sposób co niedostosowanie do osób z niepełnosprawnościami. I to wyłącznie od autora strony zależeć będzie, czy zapewni dostępność&nbsp;takim osobom, np. poprzez ograniczenie ilości wczytywanego JavaScriptu czy skorzystanie z dobrych praktyk (jak np. <a href="https://web.dev/vitals/" rel="noreferrer noopener">Web Vitals</a>).</p>
<p>Warto przy tym zauważyć, że WCAG nigdzie nie wspomina o wydajności. Stąd też ograniczenie się wyłącznie do spełniania wymogów standardu niekoniecznie uchroni nas przed odcięciem dostępu sporej liczbie użytkowników. I właśnie dlatego warto regularnie sprzątać&nbsp;pod metaforycznym łóżkiem naszej strony – bo możemy znaleźć&nbsp;problemy z dostępnością w naprawdę nieoczekiwanych miejscach.</p>
]]></content>
		</entry>
	
		<entry>
			<title type="html">Nie żyją nagłówki, niech żyją nagłówki!</title>
			
				<author>
					<name>Comandeer</name>
				</author>
			
			<link href="https://blog.comandeer.pl/nie-zyja-naglowki-niech-zyja-naglowki" rel="alternate" type="text/html"/>
			<published>2022-07-01T16:03:00.000Z</published>
			<updated>2022-07-01T16:03:00.000Z</updated>
			<id>https://blog.comandeer.pl/nie-zyja-naglowki-niech-zyja-naglowki</id>
			
				<summary><![CDATA[Algorytm outline'u w końcu wypada ze specyfikacji HTML.]]></summary>
			
			<content type="html"><![CDATA[<p>Stało się. <a href="https://html5accessibility.com/stuff/2022/04/05/12-years-beyond-a-html-joke/" rel="noreferrer noopener">Po ponad <strong>12 latach</strong> przepychanek</a>, w końcu <a href="https://github.com/whatwg/html/commit/6682bdeee6fb08f5972bea92064fe250f1b4ec9c" rel="noreferrer noopener">algorytm outline’u został usunięty ze specyfikacji HTML</a>.</p>
<p>W praktyce zmienia to niewiele, bo o tym, że ten algorytm nie działa, <a href="https://www.tpgi.com/html5-document-outline/" rel="noreferrer noopener">wiedziano od bardzo dawna</a>. Jedynym miejscem, w którym próbowano ten fakt ignorować, była właśnie specyfikacja. To się jednak dzisiaj zmieniło i algorytm przestał istnieć. A zatem tak naprawdę jedynym prawidłowym sposobem wykorzystania nagłówków jest ten jeszcze z czasów HTML 4 – czyli <a href="https://blog.comandeer.pl/o-naglowkach-slow-kilka.html#znaczenie-nag%C5%82%C3%B3wk%C3%B3w">tworzenie odpowiedniej hierarchii</a>.</p>
<p>Jedyna faktyczna zmiana względem najlepszych praktyk ustalonych lata temu to zmiana przeznaczenia <a href="https://html.spec.whatwg.org/multipage/sections.html#the-hgroup-element" rel="noreferrer noopener">elementu <code>hgroup</code></a>. Tak po prawdzie, było to nieuniknione, bo ten element był stworzony z myślą o starym algorytmie outline’u i czekało go albo usunięcie, albo zmiana semantyki. Wybrano tę drugą opcję i obecnie <code>hgroup</code> służy do grupowania nagłówków wraz z ich podtytułami lub tytułami alternatywnymi, np:</p>
<figure class="code" typeof="SoftwareSourceCode">
			<figcaption class="code__caption">
				<span class="code__title" property="programmingLanguage">HTML</span>
				
			</figcaption>
			<div class="code__code" translate="no" property="text">
				<pre class="shiki shiki-themes github-light github-dark" style="background-color:#fff;--shiki-dark-bg:#24292e;color:#24292e;--shiki-dark:#e1e4e8" tabindex="0"><code><span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">&lt;</span><span style="color:#22863A;--shiki-dark:#85E89D">hgroup</span><span style="color:#24292E;--shiki-dark:#E1E4E8">&gt;</span></span>
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">	&lt;</span><span style="color:#22863A;--shiki-dark:#85E89D">h1</span><span style="color:#24292E;--shiki-dark:#E1E4E8">&gt;HTML&lt;/</span><span style="color:#22863A;--shiki-dark:#85E89D">h1</span><span style="color:#24292E;--shiki-dark:#E1E4E8">&gt;</span></span>
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">	&lt;</span><span style="color:#22863A;--shiki-dark:#85E89D">p</span><span style="color:#24292E;--shiki-dark:#E1E4E8">&gt;Living standard&lt;/</span><span style="color:#22863A;--shiki-dark:#85E89D">p</span><span style="color:#24292E;--shiki-dark:#E1E4E8">&gt;</span></span>
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">&lt;/</span><span style="color:#22863A;--shiki-dark:#85E89D">hgroup</span><span style="color:#24292E;--shiki-dark:#E1E4E8">&gt;</span></span>
<span class="line"></span></code></pre>

			</div>
		</figure><p>Warto zwrócić uwagę, że nawet przy wykorzystaniu <code>hgroup</code> <a href="https://blog.comandeer.pl/o-naglowkach-slow-kilka.html#podtytu%C5%82y">podtytuł jest akapitem</a>.</p>
<p>I to w sumie tyle. 12 lat czekania na w dużej mierze formalną zmianę w specyfikacji.</p>
]]></content>
		</entry>
	
		<entry>
			<title type="html">Światowy Dzień Świadomości Dostępności 2021</title>
			
				<author>
					<name>Comandeer</name>
				</author>
			
			<link href="https://blog.comandeer.pl/swiatowy-dzien-swiadomosci-dostepnosci-2021" rel="alternate" type="text/html"/>
			<published>2021-05-20T14:53:00.000Z</published>
			<updated>2021-05-20T14:53:00.000Z</updated>
			<id>https://blog.comandeer.pl/swiatowy-dzien-swiadomosci-dostepnosci-2021</id>
			
				<summary><![CDATA[Świętujmy razem Dzień Świadomości Dostępności 2021 🎉!]]></summary>
			
			<content type="html"><![CDATA[<p>Dzisiaj obchodzimy <a href="https://globalaccessibilityawarenessday.org/" rel="noreferrer noopener">Światowy Dzień Świadomości Dostępności (Global Accessibility Awareness Day – GAAD)</a>! W tym roku jest on jubileuszowy, bo już dziesiąty. Od tylu lat to wydarzenie pomaga w krzewieniu wiedzy na temat dostępności w kontekście technologii i oprogramowania.</p>
<p>W tym roku też świętuję, tworząc artykuły. Chociaż na tę edycję przygotowałem się nieco skromniej, bo tylko jednym artykułem – ale też po angielsku jak ostatnio (z polskim akcentem!): <a href="https://ckeditor.com/blog/accessibility-availability-and-progressive-enhancement/" rel="noreferrer noopener">Accessibility, availability and Progressive Enhancement</a>. Miłego czytania!</p>
]]></content>
		</entry>
	
		<entry>
			<title type="html">Fałszywa dychotomia – estetyka a dostępność</title>
			
				<author>
					<name>Comandeer</name>
				</author>
			
			<link href="https://blog.comandeer.pl/falszywa-dychotomia-estetyka-a-dostepnosc" rel="alternate" type="text/html"/>
			<published>2021-02-27T22:33:00.000Z</published>
			<updated>2021-02-27T22:33:00.000Z</updated>
			<id>https://blog.comandeer.pl/falszywa-dychotomia-estetyka-a-dostepnosc</id>
			
				<summary><![CDATA[Wybór między dostępnością a estetyką jest fałszywy.]]></summary>
			
			<content type="html"><![CDATA[<p>W webdevie pokutuje przekonanie, że strona może być albo ładna, albo dostępna. Myślą tak nawet <a href="https://twitter.com/ericwbailey/status/1351243179060768778" rel="noreferrer noopener">laureaci Awwwards 2020</a>. Problem w tym, że przekonanie to jest całkowicie błędne i często drobne zmiany mogą sprawić, że ładna strona stanie się także o wiele bardziej dostępna.</p>
<h2 id="animacja-czyli-słoń-w-składzie-porcelany"><a class="header-anchor" href="https://blog.comandeer.pl/falszywa-dychotomia-estetyka-a-dostepnosc#animacja-czyli-słoń-w-składzie-porcelany">Animacja, czyli słoń w składzie porcelany</a></h2>
<p>Najczęściej pojawiającym się błędem jest nierespektowanie ustawień użytkownika w zakresie animacji – a dokładniej: animowanie elementów strony nawet wówczas, gdy <a href="https://support.apple.com/pl-pl/guide/mac-help/mchlc03f57a1/mac" rel="noreferrer noopener">na poziomie systemu użytkownik ustawił ograniczenie ruchu</a>. Strony internetowe mogą wykrywać tego typu ustawienie przy pomocy <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/@media/prefers-reduced-motion" rel="noreferrer noopener">media query <code>prefers-reduced-motion</code></a>. To w połączeniu z <a href="https://developer.mozilla.org/en-US/docs/Web/API/Window/matchMedia" rel="noreferrer noopener">funkcją <code>matchMedia</code></a> pozwala na choćby wczytanie alternatywnej, mniej wodotryskowej wersji witryny, gdy okaże się, ze użytkownik chce bardziej <em>statyczną</em> stronę.</p>
<p>Taka alternatywna wersja nie musi być jakoś mocno odmienna. Strona wciąż może wyglądać bardzo podobnie po usunięciu animacji. Weźmy taką <a href="https://activetheory.net/" rel="noreferrer noopener">stronę Active Theory</a>. W alternatywnej wersji na ekranie wyświetlałby się po prostu wybrany screen z projektu, najechanie myszką na przycisk nie powodowałoby efektu fali, a tło nie miałoby efektu paralaksy. I to w sumie tyle. Podbić jeszcze kontrast i dodać wyraźniejsze style dla focusu i mamy całkiem dostępną stronę.</p>
<p>Że niby traci się to specyficzne doświadczenie osiągnięte dzięki animacjom? Może – ale równocześnie niskim kosztem pozwalamy ze strony skorzystać o wiele większej liczbie osób, przy jednoczesnym zapewnieniu im <em>porównywalnego</em> doświadczenia (korzystania z takiej samej strony, tyle że bez animacji).</p>
<h2 id="accessible-first"><a class="header-anchor" href="https://blog.comandeer.pl/falszywa-dychotomia-estetyka-a-dostepnosc#accessible-first">Accessible First</a></h2>
<p>Niemniej myślę, że istnieje lepszy sposób, niż przygotowywanie alternatywnej, bardziej dostępnej wersji – podejście, które można by nazwać <i lang="en">Accessible First</i> (z ang. dostępność jako pierwsza). Tak, jak najczęściej zaleca się, by responsywność przygotowywać w podejściu [mobile/content first](mobile/content first), tak być może czas zalecać, by strony tak ogólnie tworzyło się w podejściu priorytetyzującym dostępność.</p>
<p>Założenie jest bardzo proste: zaczynamy od jak najprostszej wersji strony, która po prostu przekazuje treść w dostępny sposób (czyli tak naprawdę zaczynamy w tym samym miejscu, co w mobile/content first). Następnie dodajemy nowe funkcje, przez cały czas pozostając w zgodzie ze <a href="https://w3c.github.io/wcag/guidelines/22/" rel="noreferrer noopener">standardem WCAG</a>. Tego typu podejście sprawia, że sposób myślenia o stronie przez cały okres jej powstawania skupia się wokół jej dostępności, co pozwala w łatwiejszy sposób ominąć typowe problemy z nią związane. Przykładem mogą być animacje, które nie będą stanowić już niezbędnego elementu doświadczenia użytkownika, ale będą tylko opcjonalnym dodatkiem dla użytkowników, którzy sobie ich życzą. Znów: bardzo podobnie do mobile/content first, w którym <a href="https://www.webkrytyk.pl/2019/01/31/kurs-web-developer-od-podstaw-w-15-dni-od-samuraja-programowania/#dzien-13" rel="noreferrer noopener">poszczególne nowe elementy strony dodawane są w zależności od możliwości urządzenia użytkownika</a>. A w obydwu przypadkach bardzo podobnie do <a href="https://www.aaron-gustafson.com/notebook/insert-clickbait-headline-about-progressive-enhancement-here/" rel="noreferrer noopener">Progressive Enhancement</a>. Cebula w cebuli w cebuli. I z tego cebulowego gulaszu wychodzi <a href="https://responsibleweb.app/" rel="noreferrer noopener">pyszne danie</a>. Warte w sumie swojej własnej książki kucharskiej.</p>
]]></content>
		</entry>
	
		<entry>
			<title type="html">O semantyce słów kilka</title>
			
				<author>
					<name>Comandeer</name>
				</author>
			
			<link href="https://blog.comandeer.pl/o-semantyce-slow-kilka" rel="alternate" type="text/html"/>
			<published>2020-05-31T16:26:00.000Z</published>
			<updated>2020-05-31T16:26:00.000Z</updated>
			<id>https://blog.comandeer.pl/o-semantyce-slow-kilka</id>
			
				<summary><![CDATA[Czym jest semantyka i dlaczego jest tak istotna w HTML-u?]]></summary>
			
			<content type="html"><![CDATA[<p>W świecie webdevu semantyka to dość modne słowo. Tylko co to tak naprawdę jest i do czego służy?</p>
<h2 id="problem-semantyki"><a class="header-anchor" href="https://blog.comandeer.pl/o-semantyce-slow-kilka#problem-semantyki">Problem semantyki</a></h2>
<p>Najczęściej słowo to przejawia się w sformułowaniu “znaczniki/elementy semantyczne” lub “nowe znaczniki/elementy semantyczne w HTML5”. Przyznaję, że sam niejednokrotnie używałem tych zwrotów (zwłaszcza pierwszego), niemniej ostatnio staram się ich wystrzegać. A to dlatego, że są mocno nieprecyzyjne.</p>
<div class="note" role="note" aria-labelledby="note-54"><p class="note__label" id="note-54">Dygresja</p><div class="note__content"><p>Warto zwrócić uwagę na różnicę między elementami a znacznikami. W potocznym języku często te dwie nazwy używa się zamiennie, ale nie są one w pełni równoważne. Element oznacza znacznik początkowy (otwierający), znacznik końcowy (zamykający) oraz treść pomiędzy nimi. Z kolei znaczniki są niejako “ogranicznikami” elementu. <a href="https://developer.mozilla.org/en-US/docs/Glossary/HTML#concept_and_syntax" rel="noreferrer noopener">Infografika na MDN-ie</a> dobrze tłumaczy tę różnicę.</p></div></div>
<p>Nie istnieje coś takiego, jak elementy semantyczne. <strong>Każdy element w HTML-u jest semantyczny, bo ma określone znaczenie</strong>. Nawet ten nieszczęsny <code>div</code> jest semantyczny, bo <a href="https://html.spec.whatwg.org/multipage/grouping-content.html#the-div-element" rel="noreferrer noopener"><em>specyfikacja opisuje jego znaczenie</em></a>:</p>
<blockquote>
<p>The <code>div</code> element has no special meaning at all. It <a href="https://html.spec.whatwg.org/multipage/dom.html#represents" rel="noreferrer noopener">represents</a> its children. It can be used with the <code>class</code>, <code>lang</code>, and <code>title</code> attributes to mark up semantics common to a group of consecutive elements. It can also be used in a <code>dl</code> element, wrapping groups of <code>dt</code> and <code>dd</code> elements.</p>
<p>[Element <code>div</code> nie ma żadnego specjalnego znaczenia. Reprezentuje swoje dzieci. Może być użyty wraz z atrybutami <code>class</code>, <code>lang</code> i <code>title</code>, żeby przekazywać&nbsp;znaczenie (semantykę) typową dla grupy następujących po sobie elementów. Może być też użyty wewnątrz elementu <code>dl</code>, otaczając grupy elementów <code>dt</code> i <code>dd</code>.]</p>
</blockquote>
<p>Widzimy tutaj, że definicja znaczenia (semantyki) <code>div</code>a składa się tak naprawdę z dwóch części:</p>
<ul>
<li>określenia samego znaczenia,</li>
<li>zasugerowania sposobów <em>rozszerzenia</em> semantyki <code>div</code>a.</li>
</ul>
<p>Jeśli chodzi o samo znaczenie, to… <code>div</code> nic nie znaczy sam w sobie. Nie ukrywam, że nie jest to specjalnie intuicyjnie i zapewne to spowodowało powstanie sformułowania “znacznik semantyczny”. Ale równocześnie specyfikacja podaje sposób na dodanie do <code>div</code>a konkretnego znaczenia. I tutaj pojawia się kolejny problem: ta dodatkowa semantyka nie jest przeznaczona dla użytkowników.</p>
<p>Podsumowując: <code>div</code> jest elementem semantycznym, ponieważ ma znaczenie: nic nie znaczy, ale równocześnie może coś znaczyć, niemniej nie w sposób istotny dla użytkownika.</p>
<div><embed- src="https://giphy.com/embed/HfFccPJv7a9k4"><p class="embed-fallback"><a href="https://giphy.com/embed/HfFccPJv7a9k4" rel="noreferrer noopener">Przejdź bezpośrednio do osadzonej treści na Giphy.</a></p></embed-></div>
<p>Spróbujmy jednak połapać się w tym galimatiasie!</p>
<div class="note" role="note" aria-labelledby="note-55"><p class="note__label" id="note-55">Dygresja</p><div class="note__content"><p>Z “nowymi znacznikami semantycznymi w HTML5” istnieje jeszcze jeden problem: one nie są nowe. Można by wręcz powiedzieć, że jak na standardy Sieci są wręcz <em>antyczne</em>. Pierwsze wersje większości “nowych” elementów pojawiły się co najmniej w roku 2005, jeszcze w czasach, gdy HTML5 nawet się&nbsp;tak nie nazywał. Wówczas było to <a href="https://whatwg.org/specs/web-apps/2005-09-01/" rel="noreferrer noopener">Web Applications 1.0</a>. W tym standardzie można odnaleźć elementy takie jak <code>section</code>, <code>article</code>, <code>aside</code>, <code>header</code>, <code>footer</code>, <code>canvas</code>… Były też <a href="https://whatwg.org/specs/web-apps/2005-09-01/#other" rel="noreferrer noopener">inne elementy</a>, które nie przetrwały do dziś, np. <code>calendar</code>, <code>switch</code> czy <code>datagrid</code>. Ba, był już nawet <a href="https://whatwg.org/specs/web-apps/2005-09-01/#outlines" rel="noreferrer noopener">nieszczęsny algorytm outline’u</a>. Zatem “nowe” to dość odważne słowo w tym wypadku.</p><p>Zresztą część tych pomysłów jest jeszcze starsza i sięga wstecz co najmniej do 2002 roku, do czasów niesławnego XHTML 2.0 (dzięki któremu, nomen omen, powstało HTML5). Ta specyfikacja zawiera <a href="http://m.in" rel="noreferrer noopener">m.in</a>. <a href="https://www.w3.org/TR/2002/WD-xhtml2-20020805/mod-text.html#sec_8.18." rel="noreferrer noopener">element <code>section</code></a> czy… <a href="https://www.w3.org/TR/2002/WD-xhtml2-20020805/mod-text.html#sec_8.11." rel="noreferrer noopener">algorytm outline’u</a>. Część z tych pomysłów przekopiowano następnie do nowego HTML-a oraz dodano nowe. Więc tak po prawdzie “nowe znaczniki semantyczne w HTML5” nie są ani nowe, ani niekoniecznie są z HTML5.</p><p></p></div></div>
<h2 id="definicja-semantyki"><a class="header-anchor" href="https://blog.comandeer.pl/o-semantyce-slow-kilka#definicja-semantyki">Definicja semantyki</a></h2>
<p><strong>Semantyka elementu to jego znaczenie</strong>.</p>
<p>I to w sumie tyle. Mówiąc o semantycznym HTML-u, mówimy o HTML-u, który znaczy <em>to, co chcemy, żeby znaczył</em>. Zatem dobieramy odpowiednie elementy. Jeśli coś jest nagłówkiem, używamy <code>h1</code>–<code>h6</code>, jeśli coś jest linkiem, używamy <code>a</code>, jeśli coś jest po prostu kontenerem na inne elementy, używamy <code>div</code> itd.</p>
<p>Dla celów praktycznych można jednak tę definicję nieco rozszerzyć: semantyka elementu to jego znaczenie <strong>opisane w specyfikacji</strong>. Innymi słowy: źródłem semantyki jest <a href="https://html.spec.whatwg.org/multipage/" rel="noreferrer noopener">specyfikacja HTML</a>. Zresztą jest to <a href="https://html.spec.whatwg.org/multipage/dom.html#semantics-2" rel="noreferrer noopener">napisane w niej wprost</a>:</p>
<blockquote>
<p>Elements, attributes, and attribute values in HTML are defined (by this specification) to have certain meanings (semantics). For example, the <code>ol</code> element represents an ordered list, and the <code>lang</code> attribute represents the language of the content.</p>
<p>[Elementy, atrybuty i wartości atrybutów w HTML-u są zdefiniowane (przez tę specyfikację) jako posiadające konkretne znaczenia (semantykę). Na przykład element <code>ol</code> reprezentuje listę uporządkowaną, a atrybut <code>[lang]</code> reprezentuje język treści.]</p>
</blockquote>
<p>Specyfikacja też <a href="https://html.spec.whatwg.org/multipage/dom.html#element-definitions" rel="noreferrer noopener">wyraźnie zaznacza, w którym miejscu znajduje się dokładny opis znaczenia konkretnego elementu</a>:</p>
<blockquote>
<p>This is then followed by a description of what the element <a href="https://html.spec.whatwg.org/multipage/dom.html#represents" rel="noreferrer noopener">represents</a>, along with any additional normative conformance criteria that may apply to authors and implementations. Examples are sometimes also included.</p>
<p>[Po tym [pozostałych częściach definicji elementu] następuje opis, co reprezentuje dany element, łącznie z dodatkowymi formalnymi wymogami zachowania zgodności z tą specyfikacją, które mogą dotyczyć autorów i implementacji. W niektórych przypadkach są również dostępne przykłady.]</p>
</blockquote>
<p>Te definicje elementów znajdują się w rozdziale 4. specyfikacji, <cite>The elements of HTML</cite> (Elementy HTML-a). Jak widać, w tym rozdziale mamy zarówno elementy o mocno określonym znaczeniu (<a href="https://html.spec.whatwg.org/multipage/sections.html#the-h1,-h2,-h3,-h4,-h5,-and-h6-elements" rel="noreferrer noopener">nagłówki</a>, <a href="https://html.spec.whatwg.org/multipage/text-level-semantics.html#the-data-element" rel="noreferrer noopener"><code>data</code></a>, <a href="https://html.spec.whatwg.org/multipage/interactive-elements.html#the-details-element" rel="noreferrer noopener"><code>details</code></a>), jak i te, które <em>specjalnie</em> nic nie znaczą (<a href="https://html.spec.whatwg.org/multipage/grouping-content.html#the-div-element" rel="noreferrer noopener"><code>div</code></a>, <a href="https://html.spec.whatwg.org/multipage/text-level-semantics.html#the-span-element" rel="noreferrer noopener"><code>span</code></a>, <a href="https://html.spec.whatwg.org/multipage/scripting.html#the-template-element" rel="noreferrer noopener"><code>template</code></a>).</p>
<p>Stąd też <code>div</code> ma znaczenie – ponieważ jego opis znajduje się w specyfikacji HTML. Żeby wiedzieć, że <code>div</code> nic nie znaczy, trzeba się tego dowiedzieć ze specyfikacji. Choć brzmi to pokrętnie, to osobiście dla mnie ta sytuacja jest bardzo podobna do tego, w jaki sposób funkcjonuje zero. To liczba, która oznacza… nic. Jak się&nbsp;doda 0 do dowolnego działania, wynik się nie zmieni. A mimo to zero bywa przydatne – właśnie dlatego, że <em>nic nie robi</em>. Dokładnie tak samo jest z <code>div</code>em.</p>
<h3 id="problemy-językoznawcze"><a class="header-anchor" href="https://blog.comandeer.pl/o-semantyce-slow-kilka#problemy-językoznawcze">Problemy językoznawcze</a></h3>
<p>Taka jeszcze dygresja na koniec definiowania semantyki. Za to, że po polsku słowa “semantyka” i “znaczenie” są traktowane całkowicie osobno, wprowadzając tym samym pewne nieścisłości terminologiczne, obwiniłbym różnice, jakie istnieją między językiem angielskim i polskim. <a href="https://www.oxfordlearnersdictionaries.com/definition/english/semantics" rel="noreferrer noopener">W angielskim</a> semantyka oznacza zarówno naukę o znaczeniu slów, jak i samo ich znaczenie. <a href="https://sjp.pwn.pl/sjp/semantyka;2575165.html" rel="noreferrer noopener">W polskim</a> semantyka oznacza już&nbsp;tylko naukę.</p>
<p>Niemniej nawet mimo tej różnicy (a może właśnie dzięki niej) sformułowania typu “znaczenie semantyczne” czy “znaczniki semantyczne” są tym bardziej niezrozumiałe. Dlatego uważam, że mówiąc o semantyce elementów, należy pamiętać, że chodzi nam o nic innego, jak o <em>znaczenie</em> elementów. Być może byłoby o wiele lepiej, gdybyśmy po polsku używali właśnie takiego sformułowania, zamiast hermetycznej semantyki. Ale ten okręt już odpłynął…</p>
<h2 id="trzy-poziomy-semantyki"><a class="header-anchor" href="https://blog.comandeer.pl/o-semantyce-slow-kilka#trzy-poziomy-semantyki">Trzy poziomy semantyki</a></h2>
<p>Rozprawiliśmy się już z pierwszą&nbsp;częścią&nbsp;definicji elementu <code>div</code>. Zostaje jednak jeszcze druga, w której to nic nieznaczący <code>div</code> zdobywa znaczenie, ale wciąż nic nie znaczy… Nielogiczne? Bynajmniej, ponieważ trzeba zauważyć, że elementy mają tak naprawdę trzy poziomy semantyki (znaczenia):</p>
<ul>
<li>formalny, opisany w specyfikacji i przeznaczony <strong>dla użytkowników</strong>,</li>
<li>formalny, którego infrastruktura jest opisana w specyfikacjach, a który przeznaczony jest <strong>dla przeglądarek i innych programów</strong>,</li>
<li>nieformalny, oparty na konwencjach częściowo opisanych w specyfikacji i przeznaczony <strong>dla webdeveloperów</strong>.</li>
</ul>
<h3 id="dla-użytkowników"><a class="header-anchor" href="https://blog.comandeer.pl/o-semantyce-slow-kilka#dla-użytkowników">Dla użytkowników</a></h3>
<p>To najbardziej oczywisty poziom znaczenia elementów i ten, o którym dotąd najwięcej mówiliśmy. Dzięki doborze odpowiednich elementów mamy pewność, że każdy użytkownik Sieci zrozumie to, co chcemy przekazać – i to nawet, gdyby na naszej stronie nie zadziałał JS czy nawet CSS. Przeglądarki domyślnie prezentują określone elementy w konkretny sposób, np. nagłówki mają większy rozmiar i są pogrubione, linki są niebieskie i podkreślone, przyciski mają charakterystyczny kształt i kolor itd.</p>
<p>Co więcej, poszczególne elementy często powiązane są z konkretnymi, natywnymi zachowaniami. Weźmy znów taki przycisk: nie dość, że użytkownik bez problemu zrozumie, że ma do czynienia z przyciskiem, to dodatkowo będzie mógł go prosto obsłużyć z poziomu klawiatury. To samo dotyczy linków czy np. <code>details</code>. Znaczenie elementów jest wprost powiązane z tym, jak się zachowują i tym, jak użytkownicy <em>oczekują</em>, że dane elementy będą się&nbsp;zachowywać. Dlatego <a href="https://blog.comandeer.pl/czy-div-jest-dostepny.html">nie warto psuć tego, co Po Prostu Działa™</a>.</p>
<h3 id="dla-przeglądarek-i-innych-programów"><a class="header-anchor" href="https://blog.comandeer.pl/o-semantyce-slow-kilka#dla-przeglądarek-i-innych-programów">Dla przeglądarek i innych programów</a></h3>
<p>Jednak z HTML-a korzystają nie tylko użytkownicy, ale także programy. Najprostszym przykładem może być przeglądarka, która może udostępnić użytkownikowi dodatkowe funkcje, dzięki temu, że strona jest stworzona przy pomocy poprawnie dobranych elementów. Jedną z takich funkcji jest tzw. <a href="https://support.mozilla.org/en-US/kb/firefox-reader-view-clutter-free-web-pages" rel="noreferrer noopener"><span lang="en">reader view</span> (ang. tryb poprawionej czytelności)</a>, który wycina wszystkie dodatkowe elementy strony i zostawia samą treść, ostylowaną w sposób ułatwiający czytanie. W jaki sposób przeglądarka odnajduje treść? <a href="https://www.brucelawson.co.uk/2018/the-practical-value-of-semantic-html/" rel="noreferrer noopener">Przy pomocy odpowiednich elementów</a>, takich jak <code>main</code> czy <code>article</code>.</p>
<p>Niemniej czasami trzeba przekazać programom dodatkowe informacje. Można to zrobić przy pomocy atrybutów, takich jak <a href="https://html.spec.whatwg.org/multipage/dom.html#global-attributes" rel="noreferrer noopener"><code>[class]</code></a>, <a href="https://html.spec.whatwg.org/multipage/dom.html#embedding-custom-non-visible-data-with-the-data-*-attributes" rel="noreferrer noopener"><code>[data-*]</code></a> czy <a href="https://html.spec.whatwg.org/multipage/dom.html#the-lang-and-xml:lang-attributes" rel="noreferrer noopener"><code>[lang]</code></a>, elementów, takich jak <a href="https://html.spec.whatwg.org/multipage/semantics.html#the-link-element" rel="noreferrer noopener"><code>link</code></a> czy <a href="https://html.spec.whatwg.org/multipage/semantics.html#the-meta-element" rel="noreferrer noopener"><code>meta</code></a>, albo całych dodatkowych mechanizmów, takich jak <a href="https://html.spec.whatwg.org/multipage/microdata.html#microdata" rel="noreferrer noopener">mikrodane</a>, <a href="https://w3c.github.io/json-ld-syntax/" rel="noreferrer noopener">JSON-LD</a>, <a href="https://www.w3.org/TR/rdfa-primer/" rel="noreferrer noopener">RDFa</a>, <a href="https://w3c.github.io/aria/" rel="noreferrer noopener">ARIA</a> czy <a href="https://w3c.github.io/manifest/" rel="noreferrer noopener">manifest aplikacji sieciowej</a>. Te wszystkie sposoby nie są do końca opisane w specyfikacjach. Specyfikacje zawierają jedynie opis, jak takie mechanizmy działają i jak je implementować, natomiast to, co mają przekazywać, zależy już w pełni od tego, jak zostaną użyte. Myślę, że dobrą analogią będzie książka kucharska. Przepis pokazuje nam, jak zrobić suflet, ale to, co z tego sufletu wyjdzie, zależy już wyłącznie od nas. I dokładnie tak jest w tym wypadku: specyfikacja jest przepisem, a to, jak tych rzeczy użyjemy, to nasz suflet.</p>
<h3 id="dla-webdeveloperów"><a class="header-anchor" href="https://blog.comandeer.pl/o-semantyce-slow-kilka#dla-webdeveloperów">Dla webdeveloperów</a></h3>
<p>No i HTML-a używają w końcu także i webdeveloperzy. W sumie to dość oczywiste: jak inaczej mieliby robić strony internetowe? Niemniej “czysty” HTML może być dość trudny do szybkiego ogarnięcia i utrzymania. Trzeba przyznać, że <code>ul.menu</code> od razu mówi, do czego służy dany element, podczas gdy <code>ul</code> pozwala nam dowiedzieć się jedynie tego, że to <em>jakaś</em> lista. I to jest właśnie ostatni poziom semantyki, oparty na konwencjach, które różnią się między poszczególnymi projektami i które znaczą coś&nbsp;tylko dla osób pracujących z kodem. To po prostu semantyka pozwalająca na organizację i utrzymanie kodu strony internetowej.</p>
<p>Do tego poziomu semantyki zaliczyć też trzeba wszelkiego rodzaju metodyki, takie jak choćby <a href="https://en.bem.info/" rel="noreferrer noopener">BEM</a>. Z perspektywy HTML-a warstwa BEM jest właśnie tym: dodatkowym znaczeniem, przeznaczonym dla webdeveloperów.</p>
<h2 id="rozszerzanie-semantyki"><a class="header-anchor" href="https://blog.comandeer.pl/o-semantyce-slow-kilka#rozszerzanie-semantyki">Rozszerzanie semantyki</a></h2>
<p>Opis poszczególnych poziomów semantyki pokazuje, że podstawowe znaczenie każdego elementu można rozszerzać (a wręcz, do pewnego stopnia, <em>zmienić</em>) na wiele różnych sposobów, co daje wiele różnych rezultatów. Weźmy na tapet nagłówek <code>h2</code>:</p>
<figure class="code" typeof="SoftwareSourceCode">
			<figcaption class="code__caption">
				<span class="code__title" property="programmingLanguage">HTML</span>
				
			</figcaption>
			<div class="code__code" translate="no" property="text">
				<pre class="shiki shiki-themes github-light github-dark" style="background-color:#fff;--shiki-dark-bg:#24292e;color:#24292e;--shiki-dark:#e1e4e8" tabindex="0"><code><span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">&lt;</span><span style="color:#22863A;--shiki-dark:#85E89D">h2</span><span style="color:#24292E;--shiki-dark:#E1E4E8">&gt;Comandeer&lt;/</span><span style="color:#22863A;--shiki-dark:#85E89D">h2</span><span style="color:#24292E;--shiki-dark:#E1E4E8">&gt;</span></span>
<span class="line"></span></code></pre>

			</div>
		</figure><p>Ot, zwykły nagłówek. Ale dodajmy do niego odpowiednią klasę, żeby zaznaczyć, że to nagłówek sekcji:</p>
<figure class="code" typeof="SoftwareSourceCode">
			<figcaption class="code__caption">
				<span class="code__title" property="programmingLanguage">HTML</span>
				
			</figcaption>
			<div class="code__code" translate="no" property="text">
				<pre class="shiki shiki-themes github-light github-dark" style="background-color:#fff;--shiki-dark-bg:#24292e;color:#24292e;--shiki-dark:#e1e4e8" tabindex="0"><code><span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">&lt;</span><span style="color:#22863A;--shiki-dark:#85E89D">h2</span><span style="color:#6F42C1;--shiki-dark:#B392F0"> class</span><span style="color:#24292E;--shiki-dark:#E1E4E8">=</span><span style="color:#032F62;--shiki-dark:#9ECBFF">"section__heading"</span><span style="color:#24292E;--shiki-dark:#E1E4E8">&gt;Comandeer&lt;/</span><span style="color:#22863A;--shiki-dark:#85E89D">h2</span><span style="color:#24292E;--shiki-dark:#E1E4E8">&gt;</span></span>
<span class="line"></span></code></pre>

			</div>
		</figure><p>Chcielibyśmy także poinformować cały świat, że ta konkretna sekcja jest o pewnej osobie, a nagłówek zawiera jej imię. W tym celu użyjemy RDFa (będziemy musieli także zmienić nieco samą sekcję):</p>
<figure class="code" typeof="SoftwareSourceCode">
			<figcaption class="code__caption">
				<span class="code__title" property="programmingLanguage">HTML</span>
				
			</figcaption>
			<div class="code__code" translate="no" property="text">
				<pre class="shiki shiki-themes github-light github-dark" style="background-color:#fff;--shiki-dark-bg:#24292e;color:#24292e;--shiki-dark:#e1e4e8" tabindex="0"><code><span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">&lt;</span><span style="color:#22863A;--shiki-dark:#85E89D">section</span><span style="color:#6F42C1;--shiki-dark:#B392F0"> class</span><span style="color:#24292E;--shiki-dark:#E1E4E8">=</span><span style="color:#032F62;--shiki-dark:#9ECBFF">"section"</span><span style="color:#6F42C1;--shiki-dark:#B392F0"> vocab</span><span style="color:#24292E;--shiki-dark:#E1E4E8">=</span><span style="color:#032F62;--shiki-dark:#9ECBFF">"http://schema.org"</span><span style="color:#6F42C1;--shiki-dark:#B392F0"> typeof</span><span style="color:#24292E;--shiki-dark:#E1E4E8">=</span><span style="color:#032F62;--shiki-dark:#9ECBFF">"Person"</span><span style="color:#24292E;--shiki-dark:#E1E4E8">&gt;</span></span>
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">	&lt;</span><span style="color:#22863A;--shiki-dark:#85E89D">h2</span><span style="color:#6F42C1;--shiki-dark:#B392F0"> class</span><span style="color:#24292E;--shiki-dark:#E1E4E8">=</span><span style="color:#032F62;--shiki-dark:#9ECBFF">"section__heading"</span><span style="color:#6F42C1;--shiki-dark:#B392F0"> property</span><span style="color:#24292E;--shiki-dark:#E1E4E8">=</span><span style="color:#032F62;--shiki-dark:#9ECBFF">"name"</span><span style="color:#24292E;--shiki-dark:#E1E4E8">&gt;Comandeer&lt;/</span><span style="color:#22863A;--shiki-dark:#85E89D">h2</span><span style="color:#24292E;--shiki-dark:#E1E4E8">&gt;</span></span>
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">&lt;/</span><span style="color:#22863A;--shiki-dark:#85E89D">section</span><span style="color:#24292E;--shiki-dark:#E1E4E8">&gt;</span></span>
<span class="line"></span></code></pre>

			</div>
		</figure><p>Tym sposobem nasz nagłówek przekazuje informacje z wszystkich wymienionych wyżej poziomów semantyki:</p>
<ul>
<li>na najbardziej podstawowym poziomie to wciąż nagłówek, dzięki czemu użytkownik wie, że zaczyna się nowa sekcja,</li>
<li>dzięki RDFa wyszukiwarki internetowe i inne programy wiedzą, że to sekcja o osobie, która nazywa się “Comandeer”,</li>
<li>dzięki klasie webdeveloperzy wiedzą, że to nagłówek sekcji.</li>
</ul>
<p>W podobny sposób można rozszerzać znaczenie praktycznie każdego elementu HTML.</p>
<h2 id="semantyka-a-dostępność"><a class="header-anchor" href="https://blog.comandeer.pl/o-semantyce-slow-kilka#semantyka-a-dostępność">Semantyka a dostępność</a></h2>
<p>Ok, teoria teorią, ale czy ma to faktyczne przełożenie na cokolwiek? Jak najbardziej. Najprościej wykazać to, pokazując, jak semantyka wpływa na dostępność. Robiłem to już zresztą wcześniej, np. w <a href="https://blog.comandeer.pl/o-naglowkach-slow-kilka.html#nag%C5%82%C3%B3wki-a-dost%C4%99pno%C5%9B%C4%87">artykule o nagłówkach</a> czy <a href="https://blog.comandeer.pl/czy-div-jest-dostepny.html#dost%C4%99pno%C5%9B%C4%87-to-nie-tylko-czytniki-ekranowe">artykule o przyciskach w React Native</a>.</p>
<p>W skrócie: każdy element HTML jest prezentowany w określony sposób w <a href="https://developers.google.com/web/fundamentals/accessibility/semantics-builtin/the-accessibility-tree" rel="noreferrer noopener">drzewku dostępności</a>. To, jak dokładnie, wynika z jego <a href="https://w3c.github.io/html-aria/#docconformance" rel="noreferrer noopener">domyślnej roli ARIA</a>. Bardzo prosto to pokazać na przykładzie np. nagłówka i podrabianego nagłówka:</p>
<figure class="code" typeof="SoftwareSourceCode">
			<figcaption class="code__caption">
				<span class="code__title" property="programmingLanguage">HTML</span>
				
			</figcaption>
			<div class="code__code" translate="no" property="text">
				<pre class="shiki shiki-themes github-light github-dark" style="background-color:#fff;--shiki-dark-bg:#24292e;color:#24292e;--shiki-dark:#e1e4e8" tabindex="0"><code><span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">&lt;</span><span style="color:#22863A;--shiki-dark:#85E89D">style</span><span style="color:#24292E;--shiki-dark:#E1E4E8">&gt;</span></span>
<span class="line"><span style="color:#6F42C1;--shiki-dark:#B392F0">.heading</span><span style="color:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span class="line"><span style="color:#005CC5;--shiki-dark:#79B8FF">    all</span><span style="color:#24292E;--shiki-dark:#E1E4E8">: </span><span style="color:#005CC5;--shiki-dark:#79B8FF">unset</span><span style="color:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"><span style="color:#005CC5;--shiki-dark:#79B8FF">	display</span><span style="color:#24292E;--shiki-dark:#E1E4E8">: </span><span style="color:#005CC5;--shiki-dark:#79B8FF">block</span><span style="color:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"><span style="color:#005CC5;--shiki-dark:#79B8FF">	font-size</span><span style="color:#24292E;--shiki-dark:#E1E4E8">: </span><span style="color:#005CC5;--shiki-dark:#79B8FF">2</span><span style="color:#D73A49;--shiki-dark:#F97583">em</span><span style="color:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"><span style="color:#005CC5;--shiki-dark:#79B8FF">	line-height</span><span style="color:#24292E;--shiki-dark:#E1E4E8">: </span><span style="color:#005CC5;--shiki-dark:#79B8FF">2</span><span style="color:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"><span style="color:#005CC5;--shiki-dark:#79B8FF">	font-weight</span><span style="color:#24292E;--shiki-dark:#E1E4E8">: </span><span style="color:#005CC5;--shiki-dark:#79B8FF">bold</span><span style="color:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">}</span></span>
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">&lt;/</span><span style="color:#22863A;--shiki-dark:#85E89D">style</span><span style="color:#24292E;--shiki-dark:#E1E4E8">&gt;</span></span>
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">&lt;</span><span style="color:#22863A;--shiki-dark:#85E89D">h1</span><span style="color:#6F42C1;--shiki-dark:#B392F0"> class</span><span style="color:#24292E;--shiki-dark:#E1E4E8">=</span><span style="color:#032F62;--shiki-dark:#9ECBFF">"heading"</span><span style="color:#24292E;--shiki-dark:#E1E4E8">&gt;Nagłówek&lt;/</span><span style="color:#22863A;--shiki-dark:#85E89D">h1</span><span style="color:#24292E;--shiki-dark:#E1E4E8">&gt;</span></span>
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">&lt;</span><span style="color:#22863A;--shiki-dark:#85E89D">span</span><span style="color:#6F42C1;--shiki-dark:#B392F0"> class</span><span style="color:#24292E;--shiki-dark:#E1E4E8">=</span><span style="color:#032F62;--shiki-dark:#9ECBFF">"heading"</span><span style="color:#24292E;--shiki-dark:#E1E4E8">&gt;Nagłówek&lt;/</span><span style="color:#22863A;--shiki-dark:#85E89D">span</span><span style="color:#24292E;--shiki-dark:#E1E4E8">&gt;</span></span>
<span class="line"></span></code></pre>

			</div>
		</figure><p>Z punktu widzenia użytkownika, który posługuje się wizualną przeglądarką, obydwa elementy wyglądają tak samo i mogą pełnić role nagłówka. Ale gdy z jakiegoś powodu nie doczyta się&nbsp;CSS (bo np. padnie CDN), drugi z elementów przestanie pełnić swoją&nbsp;rolę. Dodatkowo w drzewku dostępności te obydwa elementy są prezentowane zupełnie inaczej:</p>
<figure class="figure"><a class="figure__link" href="/assets/images/o-semantyce-slow-kilka/accessibility-tree-864w.avif"><picture><source type="image/avif" srcset="/assets/images/o-semantyce-slow-kilka/accessibility-tree-440w.avif 440w, /assets/images/o-semantyce-slow-kilka/accessibility-tree-864w.avif 864w" sizes="90vw"><source type="image/webp" srcset="/assets/images/o-semantyce-slow-kilka/accessibility-tree-440w.webp 440w, /assets/images/o-semantyce-slow-kilka/accessibility-tree-864w.webp 864w" sizes="90vw"><source type="image/png" srcset="/assets/images/o-semantyce-slow-kilka/accessibility-tree-440w.png 440w, /assets/images/o-semantyce-slow-kilka/accessibility-tree-864w.png 864w" sizes="90vw"><img src="/assets/images/o-semantyce-slow-kilka/accessibility-tree-864w.png" width="864" height="387" style="aspect-ratio: 864 / 387" alt="Element h1 ma rolę heading, podczas gdy span – text container." loading="lazy" decoding="async"></picture></a><figcaption class="figure__caption"><p>Widok elementów w inspektorze dostępności Firefoksa</p></figcaption></figure>
<p>To oznacza, że np. użytkownicy czytników ekranowych nie będą w stanie wykorzystać drugiego z elementów do nawigacji po stronie, a przeglądarka lub inny program nie będzie w stanie wygenerować poprawnego spisu treści dla takiej strony.</p>
<p>Teoretycznie można to naprawić nadając elementowi <code>span</code> odpowiednią rolę przy pomocy ARIA (<code>[role=heading]</code>), ale to nie rozwiązuje wszystkich problemów. Pomijając już problem z CSS-em (który, faktycznie, nie jest najczęstszy), to jaką mamy pewność, że np. Google traktuje <code>span[role=heading]</code> tak samo jak <code>h1</code>? Nie bez powodu pierwsza zasada ARIA brzmi: <a href="https://w3c.github.io/using-aria/#rule1" rel="noreferrer noopener">nie używaj ARIA, jeśli istnieje natywny element HTML robiący daną rzecz</a>.</p>
<h2 id="semantyka-a-seo"><a class="header-anchor" href="https://blog.comandeer.pl/o-semantyce-slow-kilka#semantyka-a-seo">Semantyka a SEO</a></h2>
<p>A jak już jesteśmy przy Google, to warto wspomnieć o tym, w jaki sposób wykorzystuje dodatkowe informacje semantyczne, przekazywane przy pomocy RDFa czy JSON-LD. Dzięki nim możemy do pewnego stopnia wpływać na to, jak prezentowana będzie nasza strona w wynikach wyszukiwania. Najprostszym przykładem może być dodanie gwiazdek z oceną przy wyszukiwaniu produktu:</p>
<figure class="figure"><a class="figure__link" href="/assets/images/o-semantyce-slow-kilka/google-schema-851w.avif"><picture><source type="image/avif" srcset="/assets/images/o-semantyce-slow-kilka/google-schema-440w.avif 440w, /assets/images/o-semantyce-slow-kilka/google-schema-851w.avif 851w" sizes="90vw"><source type="image/webp" srcset="/assets/images/o-semantyce-slow-kilka/google-schema-440w.webp 440w, /assets/images/o-semantyce-slow-kilka/google-schema-851w.webp 851w" sizes="90vw"><source type="image/png" srcset="/assets/images/o-semantyce-slow-kilka/google-schema-440w.png 440w, /assets/images/o-semantyce-slow-kilka/google-schema-851w.png 851w" sizes="90vw"><img src="/assets/images/o-semantyce-slow-kilka/google-schema-851w.png" width="851" height="457" style="aspect-ratio: 851 / 457" alt="Moja książka w wynikach wyszukiwania ma ocenę 4.2/6 w Helionie oraz 6/10 w Lubimy czytać." loading="lazy" decoding="async"></picture></a><figcaption class="figure__caption"><p>Kliknij obrazek, aby go powiększyć</p></figcaption></figure>
<p>Tego typu gwiazdki można dodać przy pomocy <a href="https://schema.org/Review" rel="noreferrer noopener">odpowiedniego typu danych Schema.org</a>. Samo <a href="http://Schema.org" rel="noreferrer noopener">Schema.org</a> to wspólna inicjatywa Google, Microsoftu (Binga), Yahoo i Yandexu, która dostarcza wspólnego dla tych wyszukiwarek sposobu oznaczania dodatkowej semantyki. Dzięki temu wyszukiwarki te mogą w prosty sposób odczytywać różne dodatkowe informacje, jak <a href="http://m.in" rel="noreferrer noopener">m.in</a>. oceny produktów czy ich ceny. Ot, taka namiastka <a href="https://en.wikipedia.org/wiki/Semantic_Web#Web_3.0" rel="noreferrer noopener">Web 3.0</a>.</p>
<hr>
<p>Mam nadzieję, że ten <s>krótki</s> artykuł rozwiewa nieco wątpliwości, jakie przez lata narosły wokół semantyki, oraz pokazuje, dlaczego jest ona istotna – i to nie tylko ze względu na dostępność. A teraz przepraszam, bo widzę kilka źle użytych <code>div</code>ów…</p>
]]></content>
		</entry>
	
		<entry>
			<title type="html">Światowy Dzień Świadomości Dostępności</title>
			
				<author>
					<name>Comandeer</name>
				</author>
			
			<link href="https://blog.comandeer.pl/swiatowy-dzien-swiadomosci-dostepnosci" rel="alternate" type="text/html"/>
			<published>2019-05-16T16:10:00.000Z</published>
			<updated>2019-05-16T16:10:00.000Z</updated>
			<id>https://blog.comandeer.pl/swiatowy-dzien-swiadomosci-dostepnosci</id>
			
				<summary><![CDATA[Świętujmy razem Dzień Świadomości Dostępności 2019 🎉!]]></summary>
			
			<content type="html"><![CDATA[<p>Dzisiaj obchodzimy <a href="https://globalaccessibilityawarenessday.org/" rel="noreferrer noopener">Światowy Dzień Świadomości Dostępności (Global Accessibility Awareness Day – GAAD)</a>!</p>
<p>Jak sama nazwa wskazuje, dzień ten jest poświęcony krzewieniu wiedzy na temat problemu dostępności związanej z technologią i oprogramowaniem. Co prawda w ten dzień chyba najszerzej dyskutuje się o problemach związanych z dostępnością stron internetowych, ale poruszane są także inne aspekty dostępności cyfrowej, jak choćby ta związana z aplikacjami desktopowymi i mobilnymi.</p>
<p>Nie byłbym sobą, gdybym nie zdecydował się nieco uświetnić ten dzień. Dlatego też współstworzyłem 2 artykuły dotyczące dostępności stron internetowych (tym razem po angielsku): <a href="https://ckeditor.com/blog/Practical-web-accessibility-guide/" rel="noreferrer noopener">Practical web accessibility guide</a> oraz <a href="https://ckeditor.com/blog/Web-accessibility-testing-DIY/" rel="noreferrer noopener">Web accessibility testing - DIY!</a>. Myślę, że ten drugi jest nawet ciekawszy, bo jest luźno oparty na tym, w jaki sposób testuję strony na potrzeby <a href="https://www.webkrytyk.pl/" rel="noreferrer noopener">WebKrytyka</a>. Miłego czytania!</p>
]]></content>
		</entry>
	
		<entry>
			<title type="html">Czy div jest dostępny?</title>
			
				<author>
					<name>Comandeer</name>
				</author>
			
			<link href="https://blog.comandeer.pl/czy-div-jest-dostepny" rel="alternate" type="text/html"/>
			<published>2019-02-15T22:50:00.000Z</published>
			<updated>2019-02-15T22:50:00.000Z</updated>
			<id>https://blog.comandeer.pl/czy-div-jest-dostepny</id>
			
				<summary><![CDATA[Refleksja nad tym, czemu div zamiast przycisku nie jest dostępnym rozwiązaniem.]]></summary>
			
			<content type="html"><![CDATA[<p>14 lutego <a href="https://twitter.com/ryanflorence/status/1095884090484518914" rel="noreferrer noopener">Ryan Florence napisał na Twitterze, że przyciski w React Native Web (RNW) są&nbsp;dostępne</a>:</p>
<blockquote>
<p>Both true:</p>
<ol>
<li>
<p>Most devs should just use a <code>&lt;button&gt;</code>, not <code>&lt;a&gt;</code>, <code>&lt;div&gt;</code>, <code>&lt;span&gt;</code>, etc.</p>
</li>
<li>
<p>React Native Web’s div buttons are better buttons than <code>&lt;button&gt;</code></p>
</li>
</ol>
<ul>
<li>Still keyboard and AT accessible</li>
<li>Better touch event handling</li>
<li>Populate <code>e.relatedTarget</code> unlike <code>&lt;button&gt;</code></li>
<li>Easier to style</li>
</ul>
<p>I think a lot of HTML/CSS experts are being overly critical of React because they see the output of the new <a href="https://t.co/ogT1tMANTm" rel="noreferrer noopener">https://twitter.com </a> and <em>think</em> they know there are fundamental flaws when they see the div soup.<br>
That div soup is accessible.</p>
<figure class="code" typeof="SoftwareSourceCode">
			<figcaption class="code__caption">
				<span class="code__title" property="programmingLanguage">HTML</span>
				
			</figcaption>
			<div class="code__code" translate="no" property="text">
				<pre class="shiki shiki-themes github-light github-dark" style="background-color:#fff;--shiki-dark-bg:#24292e;color:#24292e;--shiki-dark:#e1e4e8" tabindex="0"><code><span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">&lt;</span><span style="color:#22863A;--shiki-dark:#85E89D">h2</span><span style="color:#B31D28;--shiki-light-font-style:italic;--shiki-dark:#FDAEB7;--shiki-dark-font-style:italic">/</span><span style="color:#24292E;--shiki-dark:#E1E4E8">&gt;</span></span>
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">&lt;</span><span style="color:#22863A;--shiki-dark:#85E89D">div</span><span style="color:#6F42C1;--shiki-dark:#B392F0"> role</span><span style="color:#24292E;--shiki-dark:#E1E4E8">=</span><span style="color:#032F62;--shiki-dark:#9ECBFF">"heading"</span><span style="color:#6F42C1;--shiki-dark:#B392F0"> aria-level</span><span style="color:#24292E;--shiki-dark:#E1E4E8">=</span><span style="color:#032F62;--shiki-dark:#9ECBFF">"2"</span><span style="color:#B31D28;--shiki-light-font-style:italic;--shiki-dark:#FDAEB7;--shiki-dark-font-style:italic">/</span><span style="color:#24292E;--shiki-dark:#E1E4E8">&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">&lt;</span><span style="color:#22863A;--shiki-dark:#85E89D">button</span><span style="color:#B31D28;--shiki-light-font-style:italic;--shiki-dark:#FDAEB7;--shiki-dark-font-style:italic">/</span><span style="color:#24292E;--shiki-dark:#E1E4E8">&gt;</span></span>
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">&lt;</span><span style="color:#22863A;--shiki-dark:#85E89D">div</span><span style="color:#6F42C1;--shiki-dark:#B392F0"> {...allTheRightAttributesAndEventHandlers}</span><span style="color:#B31D28;--shiki-light-font-style:italic;--shiki-dark:#FDAEB7;--shiki-dark-font-style:italic">/</span><span style="color:#24292E;--shiki-dark:#E1E4E8">&gt;</span></span>
<span class="line"></span></code></pre>

			</div>
		</figure><p>These are identical as far as accessibility is concerned when implemented correctly.</p>
<p>If you’re critical of this, you don’t actually care about a11y, you care about your niche</p>
<p>So yeah … just use a button, or a RNW button, but not your own div button.</p>
<p>[Obydwa stwierdzenia są&nbsp;prawdziwe:</p>
<ol>
<li>Większość&nbsp;devów powinna używać <code>&lt;button&gt;</code> zamiast <code>&lt;a&gt;</code>, <code>&lt;div&gt;</code>, <code>&lt;span&gt;</code> itd.</li>
<li>Przycisk z React Native Web oparty o div jest lepszy niż&nbsp;<code>&lt;button&gt;</code>:</li>
<li>Wciąż dostępny z poziomu klawiatury i technologii asystującej.</li>
<li>Lepsza obsługa dotyku.</li>
<li>Zawiera <code>e.relatedTarget</code> w przeciwieństwie do <code>&lt;button&gt;</code>.</li>
<li>Łatwiejszy do stylowania.</li>
</ol>
<p>Myślę, że wielu ekspertów HTML/CSS jest zbytnio krytycznych względem Reacta, ponieważ widzą oni kod nowego <a href="https://twitter.com" rel="noreferrer noopener">Twittera</a> i <em>myślą</em>, że wiedzą, żę są&nbsp;tam podstawowe błędy, gdy widzą divową zupę.</p>
<p>Ta divowa zupa jest dostępna.</p>
<figure class="code" typeof="SoftwareSourceCode">
			<figcaption class="code__caption">
				<span class="code__title" property="programmingLanguage">JavaScript</span>
				
			</figcaption>
			<div class="code__code" translate="no" property="text">
				<pre class="shiki shiki-themes github-light github-dark" style="background-color:#fff;--shiki-dark-bg:#24292e;color:#24292e;--shiki-dark:#e1e4e8" tabindex="0"><code><span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">&lt;</span><span style="color:#22863A;--shiki-dark:#85E89D">h2</span><span style="color:#24292E;--shiki-dark:#E1E4E8">/&gt;</span></span>
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">&lt;</span><span style="color:#22863A;--shiki-dark:#85E89D">div</span><span style="color:#6F42C1;--shiki-dark:#B392F0"> role</span><span style="color:#D73A49;--shiki-dark:#F97583">=</span><span style="color:#032F62;--shiki-dark:#9ECBFF">"heading"</span><span style="color:#6F42C1;--shiki-dark:#B392F0"> aria-level</span><span style="color:#D73A49;--shiki-dark:#F97583">=</span><span style="color:#032F62;--shiki-dark:#9ECBFF">"2"</span><span style="color:#24292E;--shiki-dark:#E1E4E8">/&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">&lt;</span><span style="color:#22863A;--shiki-dark:#85E89D">button</span><span style="color:#24292E;--shiki-dark:#E1E4E8">/&gt;</span></span>
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">&lt;</span><span style="color:#22863A;--shiki-dark:#85E89D">div</span><span style="color:#24292E;--shiki-dark:#E1E4E8"> {</span><span style="color:#D73A49;--shiki-dark:#F97583">...</span><span style="color:#24292E;--shiki-dark:#E1E4E8">allTheRightAttributesAndEventHandlers}</span><span style="color:#B31D28;--shiki-light-font-style:italic;--shiki-dark:#FDAEB7;--shiki-dark-font-style:italic">/</span></span>
<span class="line"></span></code></pre>

			</div>
		</figure><p>Te kody są identyczne, jeśli bierzemy pod uwagę poprawnie zaimplementowaną dostępność.</p>
<p>Jeśli jesteś krytyczny wobec tego, tak naprawdę nie dbasz o dostępność, ale o własną niszę.</p>
<p>Więc tak… po prostu użyj przycisku albo przycisku z RNW, ale nie swojego własnego przycisku na <code>div</code>.]</p>
</blockquote>
<p>Takie podejście jest nie tyle niewłaściwe, co szkodliwe. Postaram się pokrótce przybliżyć, czemu tak uważam.</p>
<h2 id="informacje-o-natywnym-przycisku-są-niepełne"><a class="header-anchor" href="https://blog.comandeer.pl/czy-div-jest-dostepny#informacje-o-natywnym-przycisku-są-niepełne">Informacje o natywnym przycisku są niepełne</a></h2>
<p>Przyciski po kliknięciu <em>mają</em> własność <code>event.relatedTarget</code>:</p>
<div><embed- src="https://jsfiddle.net/Comandeer/Lmuwj7eb"><p class="embed-fallback"><a href="https://jsfiddle.net/Comandeer/Lmuwj7eb" rel="noreferrer noopener">Przejdź bezpośrednio do osadzonej treści na JSFiddle.</a></p></embed-></div>
<p>Jeśli ponawigujemy po przykładzie klawiaturą (<kbd>Tab</kbd> oraz <kbd>Shift</kbd>+<kbd>Tab</kbd>), zauważymy, że wyświetla się poprawny identyfikator pola, z którego przeszliśmy do przycisku. Co prawda <a href="https://twitter.com/ryanflorence/status/1096067667570487297" rel="noreferrer noopener">Ryan uściśla następnie, że chodzi o Firefoksa i Safari</a>, ale wciąż nie pokrywa się to z moimi testami. Na moim macOS 10.14.3 zarówno w Firefoksie, jak i w Safari powyższy kod działa – <a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/button#Clicking_and_focus" rel="noreferrer noopener">wbrew informacji na MDN</a> . Być może zmienił się sposób obsługi focusowania na poziomie całego systemu. To równocześnie oznaczałoby, że problem nieprzekazywania <code>event.relatedTarget</code> przez przyciski jest już&nbsp;rozwiązany.</p>
<p>Inna rzecz, że po raz kolejny dostrzec tu można problem “makizacji” developmentu i <a href="https://www.smashingmagazine.com/2017/03/world-wide-web-not-wealthy-western-web-part-1/" rel="noreferrer noopener">zamykania go w bańce</a>. Fakt, że coś nie działa w dwóch przeglądarkach na macOS (lub inaczej: zachowuje się zgodnie z tym, jak zachowują się przyciski w tym systemie), nie oznacza równocześnie, że jest to problem globalny. Chrome, <a href="http://gs.statcounter.com/" rel="noreferrer noopener">mający 61% rynku</a>, tego problemu nie posiada, a sam jeden prezentuje już większość rynku. Oczywiście, użytkowników, którzy mogą natrafić na ten błąd, wciąż jest sporo, ale tutaj trzeba sobie zadać&nbsp;pytanie, czy warto jest rezygnować z natywnego <code>button</code> na rzecz własnego rozwiązania, by zadowolić ok. 15% użytkowników kosztem reszty? W tym wypadku wydaje mi się, że sensowniejszym pomysłem byłoby znalezienie alternatywnego sposobu rozwiązania problemu lub stworzenie jakiegoś obejścia dla przeglądarek na macOS.</p>
<p>Kolejną niepełną informacją jest ta, że przyciski w RNW są łatwiejsze do stylowania. Niemniej ta informacja nie wydaje się&nbsp;być aktualna. Obecnie usunięcie wszystkich stylów z przycisku sprowadza się do użycia w CSS <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/all" rel="noreferrer noopener">własności <code>all</code> z wartością <code>unset</code></a>. A jeśli musimy wspierać IE i Edge’a lub natrafimy na (wciąż, niestety, istniejące) bugi z <code>all: unset</code>, <a href="https://css-tricks.com/overriding-default-button-styles/" rel="noreferrer noopener">istnieją tradycyjne sposoby</a>.</p>
<p>Niepełna jest także informacja o lepszej obsłudze dotyku. Ryan nie podaje szczegółów i nie wiem do końca, o co chodzi. Zwłaszcza, że przecież natywne przyciski również działają normalnie ze zdarzeniami dotykowymi.</p>
<p>Mam także pewną&nbsp;wątpliwość co do źródła danych. <a href="https://twitter.com/ryanflorence/status/1095891544706473985" rel="noreferrer noopener">Ryan przy omawianiu zgodności ARIA-owych zamienników z czytnikami ekranowymi</a> powołuje się na <a href="https://www.powermapper.com/tests/screen-readers/headings/aria-role-heading/" rel="noreferrer noopener">statystyki obsługi ARIA przez czytniki ekranowe</a>. Widzę z nimi jeden podstawowy problem: nie ma w nich ani jednego czytnika głosowego dla Linuksa czy Androida. Być może okazałoby się wówczas, że wsparcie dla divowych nagłówków wcale nie jest takie świetne.</p>
<h2 id="dostępność-to-nie-tylko-czytniki-ekranowe"><a class="header-anchor" href="https://blog.comandeer.pl/czy-div-jest-dostepny#dostępność-to-nie-tylko-czytniki-ekranowe">Dostępność to nie tylko czytniki ekranowe</a></h2>
<p>Gdy weźmie się pod uwagę wyłącznie czytniki ekranowe, można dojść do wniosku, że faktycznie – <code>div[role=heading][aria-level=2]</code> jest równoznaczne z <code>h2</code>. Niemniej dostępność nie kończy się&nbsp;na czytnikach ekranowych – <a href="https://blog.comandeer.pl/refleksje/a11y/2017/06/09/to-tylko-niepelnosprawni.html">dostępność dotyczy absolutnie każdego</a>. I tak jak błędem dostępności jest fakt, że czytnik ekranowy nie potraktuje naszego nagłówka jako nagłówka, tak samo błędem dostępności jest fakt, że dodatek do przeglądarki widomego użytkownika nie będzie mógł stworzyć dla niego spisu treści, bo zamiast nagłówków użyliśmy pełno <code>div</code>.</p>
<p>I choć&nbsp;dodatek do przeglądarki opierający się na znacznikach HTML, by budować spis treści, nie jest specjalnie popularnym przypadkiem, to o wiele częściej można znaleźć przypadki związane z doborem odpowiednich stylów dla osób niedowidzących. Chyba najprostszym przykładem może być wykorzystanie przez takich użytkowników <a href="http://people.ds.cam.ac.uk/ssb22/css/" rel="noreferrer noopener">własnych stylów CSS</a>. Niestosowanie semantycznych znaczników lub używanie stylów inline (co zresztą RNW też robi, sądząc po <a href="https://necolas.github.io/react-native-web/storybook/?selectedKind=Components&amp;selectedStory=Button&amp;full=0&amp;addons=0&amp;stories=1&amp;panelRight=0" rel="noreferrer noopener">demo</a>) może znacząco wpłynąć na komfort przeglądania strony przez takich użytkowników, a w skrajnym wypadku im to uniemożliwić całkowicie.</p>
<p>Problem ten dotyczy nie tylko niestandardowych arkuszy stylów użytkownika, ale także <a href="https://www.scottohara.me/blog/2019/02/12/high-contrast-aria-and-images.html" rel="noreferrer noopener">wbudowanego w Windows trybu wysokiego kontrastu</a>. Usuwa on bowiem wszystkie style nadane elementom przez developera i na podstawie domyślnych arkuszy stylów przeglądarki oraz <em>semantyki</em> poszczególnych elementów wyświetla wszystkie elementy. W tym momencie przyciski oparte na <code>div</code> przestaną pełnić swoją funkcję. Dzieje się tak, ponieważ w ich przypadku dostępność jest ściśle połączona z ich prezentacją – tych dwóch aspektów nie da się rozdzielić.</p>
<figure class="figure"><a class="figure__link" href="/assets/images/czy-div-jest-dostepny/rnw-button-hc-650w.avif"><picture><source type="image/avif" srcset="/assets/images/czy-div-jest-dostepny/rnw-button-hc-440w.avif 440w, /assets/images/czy-div-jest-dostepny/rnw-button-hc-650w.avif 650w" sizes="90vw"><source type="image/webp" srcset="/assets/images/czy-div-jest-dostepny/rnw-button-hc-440w.webp 440w, /assets/images/czy-div-jest-dostepny/rnw-button-hc-650w.webp 650w" sizes="90vw"><source type="image/png" srcset="/assets/images/czy-div-jest-dostepny/rnw-button-hc-440w.png 440w, /assets/images/czy-div-jest-dostepny/rnw-button-hc-650w.png 650w" sizes="90vw"><img src="/assets/images/czy-div-jest-dostepny/rnw-button-hc-650w.png" width="650" height="271" style="aspect-ratio: 650 / 271" alt="Brak ramki i innych wyznaczników, że jest to przycisk; został sam tekst." loading="lazy" decoding="async"></picture></a><figcaption class="figure__caption"><p>Przycisk z RNW w trybie wysokiego kontrastu</p></figcaption></figure>
<figure class="figure"><a class="figure__link" href="/assets/images/czy-div-jest-dostepny/native-button-hc-109w.avif"><picture><source type="image/avif" srcset="/assets/images/czy-div-jest-dostepny/native-button-hc-109w.avif 109w" sizes="90vw"><source type="image/webp" srcset="/assets/images/czy-div-jest-dostepny/native-button-hc-109w.webp 109w" sizes="90vw"><source type="image/png" srcset="/assets/images/czy-div-jest-dostepny/native-button-hc-109w.png 109w" sizes="90vw"><img src="/assets/images/czy-div-jest-dostepny/native-button-hc-109w.png" width="109" height="62" style="aspect-ratio: 109 / 62" alt="Ramka wyraźnie wskazuje, w którym miejscu znajduje się przycisk." loading="lazy" decoding="async"></picture></a><figcaption class="figure__caption"><p>Natywny przycisk w trybie wysokiego kontrastu</p></figcaption></figure>
<p>Przycisk na <code>div</code> przestaje być przyciskiem w chwili, gdy przestaje wyglądać. Z kolei <code>button</code> ma przypisaną “przyciskowość” niejako do własnej tożsamości. Tak jak wilk przebrany za owcę nigdy nie stanie się prawdziwą owcą, tak przycisk na <code>div</code> nigdy nie stanie się&nbsp;tym samym co <code>button</code>. W wielu przypadkach może się&nbsp;sprawdzić, ale w wielu – spektakularnie się&nbsp;wyglebi.</p>
<p>Dodatkowo fakt, że część stylów jest umieszczana bezpośrednio w znaczniku, w tym te dotyczące animacji, może sprawiać problemy, gdy <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/@media/prefers-reduced-motion" rel="noreferrer noopener">pojawi się potrzeba wyłączenia animacji</a>. W przypadku całkowitego rozdziału elementu od prezentacji taka zmiana jest bardzo prosta do wprowadzenia.</p>
<h2 id="divowy-przycisk-nie-działa-bez-js"><a class="header-anchor" href="https://blog.comandeer.pl/czy-div-jest-dostepny#divowy-przycisk-nie-działa-bez-js">Divowy przycisk nie działa bez JS</a></h2>
<p>I zanim ktoś zdąży powiedzieć, że “przecież nikt nie wyłącza dzisiaj JS”: <a href="https://kryogenix.org/code/browser/everyonehasjs.html" rel="noreferrer noopener">JS może nie zadziałać</a>. Ba, wystarczy zadyszka naszego CDN-a, żeby zachowanie dla naszego przycisku wczytało się kilka sekund <em>za późno</em>. Przez ten czas użytkownik będzie wrzucony do doliny dziwów i będzie się&nbsp;zastanawiał, czemu przyciski wyglądające jak przyciski nic nie robią. W przypadku zastosowania <code>button</code> i podejścia <a href="https://webroad.pl/inne/3722-progressive-enhancement-zapomniany-fundament" rel="noreferrer noopener">Progressive Enhancement</a> można tak pokombinować z <a href="https://medium.freecodecamp.org/what-exactly-is-client-side-rendering-and-hows-it-different-from-server-side-rendering-bd5c786b340d" rel="noreferrer noopener">SSR</a>, żeby użytkownik dostał podstawową wersję produktu zanim JS się&nbsp;doczyta i był w stanie np. złożyć zamówienie w sklepie. A skoro <a href="https://adactio.com/notes/14815" rel="noreferrer noopener">da się&nbsp;zrobić&nbsp;nowoczesną stronę WWW, która odpala się na pierwszej przeglądarce internetowej w historii</a>, to da się <em>naprawdę dużo</em>.</p>
<h2 id="divowy-przycisk-łamie-pierwszą-zasadę-aria"><a class="header-anchor" href="https://blog.comandeer.pl/czy-div-jest-dostepny#divowy-przycisk-łamie-pierwszą-zasadę-aria">Divowy przycisk łamie pierwszą zasadę ARIA</a></h2>
<p><a href="https://w3c.github.io/using-aria/#firstrule" rel="noreferrer noopener">Pierwsza zasada ARIA</a> brzmi: nie używaj ARIA, jeśli istnieje odpowiedni element HTML, którego możesz użyć. Ta zasada nie wzięła się znikąd i mam nadzieję, że powyższe punkty to pokazują. Nie ma sensu wymyślać na nowo koła – zwłaszcza, że jest to koło z napędem odrzutowym i silnikiem jądrowym, które, źle skonstruowane, grozi zniszczeniem całej planety. Skoro nikt nie wpadłby na pomysł budowania takiego cuda w garażu, skoro geniusze z NASA zrobili to w tajnym laboratorium 50 metrów pod ziemią, nie widzę powodu, dla którego ktoś miałby implementować od podstaw przycisk.</p>
<p>Fakt, że divowy przycisk działa dobrze w czytnikach ekranowych, oparty jest na założeniu, że implementacja jest prawidłowa. Problem polega na tym, że to jest ten typ błędów, który wychodzi dopiero w praniu. Przeglądarki miały na to kilkanaście lat, RNW – zdecydowanie mniej. Dodatkowo jest dość niszową technologią, co zmniejsza ryzyko wystąpienia błędów. Tym samym na divowy przycisk czaić się mogą&nbsp;najróżniejsze przypadki brzegowe i inne monstra. Albo po prostu zmieni się&nbsp;standard ARIA lub zachowanie przycisków w przeglądarkach i divowy przycisk przestanie przystawać&nbsp;do rzeczywistości. A źle działający przycisk jest w stanie czasami wyrządzić&nbsp;więcej szkody niż całkowicie niedziałający.</p>
<h2 id="html-to-nie-tylko-dostępność"><a class="header-anchor" href="https://blog.comandeer.pl/czy-div-jest-dostepny#html-to-nie-tylko-dostępność">HTML to nie tylko dostępność</a></h2>
<p>Stwierdzić, że <code>div[role=button]</code> to to samo co <code>button</code>, to jak stwierdzić, że w sumie Słowacki to to samo co Mickiewicz… No nie, po prostu nie. Jeśli na gruncie czytników ekranowych jest to to samo, tak na gruncie semantyki są to całkowicie różne elementy. Fakt, że obecnie coraz większa część Sieci jest divową zupą, wynika z faktu, że <a href="https://christianheilmann.com/2019/01/28/html-is-and-always-was-a-compilation-target-can-we-deal-with-that/" rel="noreferrer noopener">HTML stał się formatem kompilacji</a>. To samo w sobie nie jest złe, ale równocześnie pokazuje problem: <a href="https://marcysutton.com/links-vs-buttons-in-modern-web-applications" rel="noreferrer noopener">współczesne aplikacje nie mają&nbsp;semantycznego HTML-a</a>, bo ich twórcy <em>nie muszą go znać</em>. W końcu z punktu widzenia developera RNW przycisk to po prostu <code>&lt;Button /&gt;</code>. Nikogo nie interesuje, że do przeglądarki trafia ostatecznie taki potwór:</p>
<figure class="code" typeof="SoftwareSourceCode">
			<figcaption class="code__caption">
				<span class="code__title" property="programmingLanguage">HTML</span>
				
			</figcaption>
			<div class="code__code" translate="no" property="text">
				<pre class="shiki shiki-themes github-light github-dark" style="background-color:#fff;--shiki-dark-bg:#24292e;color:#24292e;--shiki-dark:#e1e4e8" tabindex="0"><code><span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">&lt;</span><span style="color:#22863A;--shiki-dark:#85E89D">div</span><span style="color:#6F42C1;--shiki-dark:#B392F0"> role</span><span style="color:#24292E;--shiki-dark:#E1E4E8">=</span><span style="color:#032F62;--shiki-dark:#9ECBFF">"button"</span><span style="color:#6F42C1;--shiki-dark:#B392F0"> data-focusable</span><span style="color:#24292E;--shiki-dark:#E1E4E8">=</span><span style="color:#032F62;--shiki-dark:#9ECBFF">"true"</span><span style="color:#6F42C1;--shiki-dark:#B392F0"> tabindex</span><span style="color:#24292E;--shiki-dark:#E1E4E8">=</span><span style="color:#032F62;--shiki-dark:#9ECBFF">"0"</span><span style="color:#6F42C1;--shiki-dark:#B392F0"> class</span><span style="color:#24292E;--shiki-dark:#E1E4E8">=</span><span style="color:#032F62;--shiki-dark:#9ECBFF">"rn-1oszu61 rn-1iymjk7 rn-s2skl2 rn-l5bh9y rn-101sy47 rn-1efd50x rn-14skgim rn-rull8r rn-mm0ijv rn-13yce4e rn-fnigne rn-ndvcnb rn-gxnn5r rn-deolkf rn-1loqt21 rn-6koalj rn-1qe8dj5 rn-1mlwlqe rn-eqz5dr rn-1mnahxq rn-61z16t rn-p1pxzi rn-11wrixw rn-ifefl9 rn-bcqeeo rn-wk8lta rn-9aemit rn-1mdbw0j rn-gy4na3 rn-bnwqim rn-1otgn73 rn-eafdt9 rn-1i6wzkk rn-lrvibr rn-1lgpqti"</span><span style="color:#6F42C1;--shiki-dark:#B392F0"> style</span><span style="color:#24292E;--shiki-dark:#E1E4E8">=</span><span style="color:#032F62;--shiki-dark:#9ECBFF">"background-color: rgb(23, 191, 99);"</span><span style="color:#24292E;--shiki-dark:#E1E4E8">&gt;</span></span>
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">    &lt;</span><span style="color:#22863A;--shiki-dark:#85E89D">div</span><span style="color:#6F42C1;--shiki-dark:#B392F0"> dir</span><span style="color:#24292E;--shiki-dark:#E1E4E8">=</span><span style="color:#032F62;--shiki-dark:#9ECBFF">"auto"</span><span style="color:#6F42C1;--shiki-dark:#B392F0"> class</span><span style="color:#24292E;--shiki-dark:#E1E4E8">=</span><span style="color:#032F62;--shiki-dark:#9ECBFF">"rn-13yce4e rn-fnigne rn-ndvcnb rn-gxnn5r rn-deolkf rn-jwli3a rn-1471scf rn-14xgk7a rn-1b43r93 rn-o11vmf rn-ebii48 rn-majxgm rn-t9a87b rn-1mnahxq rn-61z16t rn-p1pxzi rn-11wrixw rn-tskmnb rn-1pyaxff rn-xd6kpl rn-1m04atk rn-q4m81j rn-bauka4 rn-tsynxw rn-q42fyq rn-qvutc0"</span><span style="color:#24292E;--shiki-dark:#E1E4E8">&gt;Press me&lt;/</span><span style="color:#22863A;--shiki-dark:#85E89D">div</span><span style="color:#24292E;--shiki-dark:#E1E4E8">&gt;</span></span>
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">&lt;/</span><span style="color:#22863A;--shiki-dark:#85E89D">div</span><span style="color:#24292E;--shiki-dark:#E1E4E8">&gt;</span></span>
<span class="line"></span></code></pre>

			</div>
		</figure><p>Nikogo, oprócz użytkowników końcowych, którzy – oprócz wszelkich innych opisanych problemów – muszą najzwyczajniej w świecie ściągnąć ten nadmiarowy kod HTML (albo wygenerować u siebie w przeglądarce, co również nie należy do najwydajniejszych rzeczy pod słońcem). W świecie, w którym walczy się o każdy bajt, <a href="https://meiert.com/en/blog/html-performance/" rel="noreferrer noopener">wycinając wszelkie niepotrzebne znaki z HTML-a</a>, taka rozrzutność jest po prostu niezrozumiała.</p>
<p>Niemniej to tylko fragment problemu. Wspomniane już utrudnienia w audytowaniu takiego kodu również są tylko wycinkiem. Nie można bowiem zapomnieć, że w obecnym świecie <a href="https://medium.com/content-uneditable/a-standard-for-rich-text-data-4b3a507af552" rel="noreferrer noopener">HTML jest uniwersalnym językiem wymiany informacji</a> – popularniejszym nawet od JSON. To język, na bazie którego zbudowano WWW. To język, na bazie którego <a href="https://twobithistory.org/2018/05/27/semantic-web.html" rel="noreferrer noopener">powoli powstaje Semantyczna Sieć</a>. W końcu to język, który traktuje się po macoszemu i odrzuca w pełni jego semantykę… Przez lata wypracowano rozwiązania pokroju <a href="https://www.w3.org/RDF/" rel="noreferrer noopener">RDF</a>, <a href="https://rdfa.info/" rel="noreferrer noopener">RDFa</a>, <a href="https://html.spec.whatwg.org/multipage/microdata.html#microdata" rel="noreferrer noopener">mikrodanych</a>, <a href="https://schema.org/" rel="noreferrer noopener">Schema.org</a>, <a href="https://microformats.io/" rel="noreferrer noopener">mikroformatów</a>, <a href="https://json-ld.org/" rel="noreferrer noopener">JSON-LD</a> i wielu innych, by teraz porzucić to wszystko na rzecz divowej zupy, niemającej jakiejkolwiek semantycznej wartości. Parsowanie tego typu dokumentów i próba wyciągnięcia z niej <em>znaczącej</em> treści jest niemal niemożliwa. A to oznacza, że z HTML-a pozostaje tylko T – tekst odarty z własnego znaczenia.</p>
<p>I dlatego twierdzenie, że obrona semantycznego HTML-a jest obroną&nbsp;pewnej niszy, jest z gruntu fałszywe. Obrona semantycznego HTML-a to obrona podstawowych wartości, na jakich zbudowano Sieć. A niszą w tym zestawieniu pozostaje RNW.</p>
]]></content>
		</entry>
	
		<entry>
			<title type="html">Zawieszenie broni</title>
			
				<author>
					<name>Comandeer</name>
				</author>
			
			<link href="https://blog.comandeer.pl/zawieszenie-broni" rel="alternate" type="text/html"/>
			<published>2018-01-23T22:30:00.000Z</published>
			<updated>2018-01-23T22:30:00.000Z</updated>
			<id>https://blog.comandeer.pl/zawieszenie-broni</id>
			
				<summary><![CDATA[O tym, jak WHATWG i W3C się dogadały.]]></summary>
			
			<content type="html"><![CDATA[<p>Ostatnio pisałem o <a href="https://blog.comandeer.pl/refleksje/a11y/2018/01/05/pyrrusowe-zwyciestwo.html">wieloletnim konflikcie pomiędzy WHATWG i W3C</a>. Nie spodziewałem się jednak, że przynajmniej częściowo zostanie zażegnany – i to tak pokojowo.</p>
<h2 id="ale-co-się-stało"><a class="header-anchor" href="https://blog.comandeer.pl/zawieszenie-broni#ale-co-się-stało">Ale co się stało?</a></h2>
<p>Dużo. Po pierwsze <a href="https://github.com/whatwg/html/pull/3326" rel="noreferrer noopener">wspomniany w poprzednim wpisie PR</a> został <a href="https://github.com/whatwg/html/pull/3326#event-1423841798" rel="noreferrer noopener">włączony do specyfikacji HTML LS</a>. To zdecydowanie upodobniło definicję <code>main</code> w HTML LS do tej w HTML 5.x. Na tym się jednak nie skończyło. Anne van Kesteren przygotował bowiem <a href="https://github.com/whatwg/html/pull/3354" rel="noreferrer noopener">drugi PR</a>, który <a href="https://github.com/whatwg/html/pull/3354#event-1436763140" rel="noreferrer noopener">został zmerge’owany dzisiaj (23 stycznia 2018)</a>, a który to usuwał ostatnią poważną różnicę pomiędzy definicjami: możliwość używania więcej niż jednego <em>widocznego</em> elementu <code>main</code>. Tym samym <a href="https://github.com/whatwg/html/issues/100#event-1436763021" rel="noreferrer noopener">słynne issue #100 zostało ostatecznie zamknięte</a>. Obydwie definicje, choć brzmiały inaczej, mówiły już&nbsp;to samo. Ba, po zmianach poczynionych przez WHATWG wersja definicji <code>main</code> w HTML LS stała się&nbsp;wręcz <em>lepsza</em> od tej w HTML 5.x. Dlatego też niemal od razu W3C zdobyło się na gest i <a href="https://github.com/w3c/html/issues/1153" rel="noreferrer noopener">postanowiło zmienić swoją&nbsp;definicję na tą z HTML LS</a>. I <a href="https://github.com/w3c/html/issues/1153#event-1437396048" rel="noreferrer noopener">zrobiło to</a>, raptem kilka godzin później.</p>
<p>Tym samym największa różnica pomiędzy HTML LS i HTML 5.x <strong>przestała istnieć</strong>.</p>
<h2 id="treść-porozumienia"><a class="header-anchor" href="https://blog.comandeer.pl/zawieszenie-broni#treść-porozumienia">Treść porozumienia</a></h2>
<p>Główne zmiany w stosunku do starszej wersji z HTML 5.x to zamiana sformułowania <q>main contents</q> na <q>dominant contents</q> a także wprowadzenie pojęcia “hierarchicznie poprawnego elementu <code>main</code>” (ang. <i lang="en">hierarchically correct <code>main</code> element</i>).</p>
<p>Pierwsza zmiana jest dość dyskusyjna. Główna treść a dominująca treść niby oznaczają to samo, niemniej pierwszy zwrot wydaje się bardziej jednoznaczny. No ale dobra, można to przeżyć.</p>
<p>Druga zmiana ogranicza kontekst występowania <code>main</code>. Wcześniej HTML 5.x pozwalało umieszczać <code>main</code> w wielu dziwnych miejscach, np. w <code>section</code>. Obecna wersja wymusza, żeby <code>main</code> było bezpośrednio w <code>body</code>, ewentualnie <code>div</code>, <code>form</code> bez dostępnej nazwy (z powodu <a href="https://github.com/whatwg/html/pull/3354#issuecomment-358898757" rel="noreferrer noopener">wymogów ASP .NET</a>) lub custom elemencie. Możliwe jest też umieszczenie <code>main</code> bezpośrednio w <code>html</code>, jeśli tworzona przez nas strona nie posiada ani <code>head</code>, ani <code>body</code> (co jest dozwolone przez specyfikację).</p>
<h2 id="i-co-teraz"><a class="header-anchor" href="https://blog.comandeer.pl/zawieszenie-broni#i-co-teraz">I co teraz?</a></h2>
<p>Nic. Choć definicje <em>w końcu</em> są takie same, specyfikacja HTML 5.x wciąż zawiera o wiele więcej przykładów, a także dodatkowych, pomocnych uwag, które wyjaśniają najczęstsze problemy z używaniem <code>main</code>. Z tego też powodu zdania nie zmieniam i wciąż uważam, że W3C umie lepiej w dostępność i semantykę. I WHATWG też to zauważyło, chociaż zajęło im to <em>prawie 3 lata</em>.</p>
<p>Niemniej dla mnie osobiście cała sytuacja jest bezprecedensowa i daje nadzieję, że w końcu dostępność stanie się integralną&nbsp;częścią procesów standaryzacyjnych, co wszystkim nam wyjdzie na dobre.</p>
]]></content>
		</entry>
	
</feed>
