{"id":203,"date":"2024-08-13T15:38:52","date_gmt":"2024-08-13T15:38:52","guid":{"rendered":"https:\/\/www.accessibilita.digital\/?p=203"},"modified":"2024-08-20T13:57:38","modified_gmt":"2024-08-20T13:57:38","slug":"come-realizzare-un-componente-di-paginazione-accessibile","status":"publish","type":"post","link":"https:\/\/www.accessibilita.digital\/come-realizzare-un-componente-di-paginazione-accessibile\/","title":{"rendered":"Come realizzare un componente di paginazione accessibile"},"content":{"rendered":"<p>Quando abbiamo un <b>elenco di prodotti o news<\/b>, oppure una lista di <b>risultati di ricerca<\/b>, pu\u00f2 essere molto utile inserire un componente per la paginazione, cio\u00e8 per <b>dividere la visualizzazione in pi\u00f9 pagine numeriche che l\u2019utente pu\u00f2 scorrere<\/b>. Per l\u2019accessibilit\u00e0, suggerirei di <b>evitare lo scroll infinito<\/b> o il \u201ccarica altri\u201d che aggiunge tramite AJAX elementi in tempo reale, che diventano molto difficili per l\u2019utente da consultare e possono creare confusione.<\/p>\n\n<h2>Esempio dimostrativo<\/h2>\n<p>Il W3C Design System offre un <a href=\"https:\/\/design-system.w3.org\/components\/pagination.html\" rel=\"nofollow noopener\">esempio di paginazione<\/a> che possiamo analizzare.<\/p>\n<pre class=\"language-markup\"><code>&lt;nav aria-label=\"pagination\" class=\"l-cluster pagination\"&gt;\r\n\t&lt;ul class=\"pagination__list\"&gt;\r\n\t\t&lt;li&gt;&lt;a href=\"path\/to\/page\"&gt;Previous &lt;span class=\"visuallyhidden\"&gt;page&lt;\/span&gt;&lt;\/a&gt;&lt;\/li&gt;\r\n\t\t&lt;li&gt;&lt;a class=\"pagination__list__first\" href=\"path\/to\/page\"&gt;&lt;span class=\"visuallyhidden\"&gt;page&lt;\/span&gt; 1&lt;span class=\"visuallyhidden\"&gt; (first page)&lt;\/span&gt;&lt;\/a&gt;&lt;\/li&gt;\r\n\t\t&lt;li&gt;&lt;a class=\"ellipsis\"&gt;&amp;#8230;&lt;\/a&gt;&lt;\/li&gt;\r\n\t\t&lt;li&gt;&lt;a href=\"path\/to\/page\"&gt;&lt;span class=\"visuallyhidden\"&gt;page&lt;\/span&gt; 6&lt;\/a&gt;&lt;\/li&gt;\r\n\t\t&lt;li&gt;&lt;a href=\"path\/to\/page\"&gt;&lt;span class=\"visuallyhidden\"&gt;page&lt;\/span&gt; 7&lt;\/a&gt;&lt;\/li&gt;\r\n\t\t&lt;li&gt;&lt;a href=\"#\" aria-label=\"page 8\" aria-current=\"page\"&gt;8&lt;\/a&gt;&lt;\/li&gt;\r\n\t\t&lt;li&gt;&lt;a href=\"path\/to\/page\"&gt;&lt;span class=\"visuallyhidden\"&gt;page&lt;\/span&gt; 9&lt;\/a&gt;&lt;\/li&gt;\r\n\t\t&lt;li&gt;&lt;a href=\"path\/to\/page\"&gt;&lt;span class=\"visuallyhidden\"&gt;page&lt;\/span&gt; 10&lt;\/a&gt;&lt;\/li&gt;\r\n\t\t&lt;li&gt;&lt;a class=\"ellipsis\"&gt;&amp;#8230;&lt;\/a&gt;&lt;\/li&gt;\r\n\t\t&lt;li&gt;&lt;a class=\"pagination__list__last\" href=\"path\/to\/page\"&gt;&lt;span class=\"visuallyhidden\"&gt;page&lt;\/span&gt; 20&lt;span class=\"visuallyhidden\"&gt; (last page)&lt;\/span&gt;&lt;\/a&gt;&lt;\/li&gt;\r\n\t\t&lt;li&gt;&lt;a href=\"path\/to\/page\"&gt;Next &lt;span class=\"visuallyhidden\"&gt;page&lt;\/span&gt;&lt;\/a&gt;&lt;\/li&gt;\r\n\t&lt;\/ul&gt;\r\n&lt;\/nav&gt;<\/code><\/pre>\n<p>Vediamo gli aspetti principali:<\/p>\n<ul>\n<li>La paginazione \u00e8 contenuta dentro un <b>&lt;<\/b><b>nav&gt;<\/b> con aria-label<\/li>\n<li>Gli elementi sono composti da un <b>&lt;ul&gt;<\/b> con i relativi <b>&lt;<\/b><b>li&gt;<\/b><\/li>\n<li>La singola pagina \u00e8 un <b>&lt;<\/b><b>a&gt;<\/b>, dove la pagina corrente usa <b>aria-label<\/b> e <b>aria-current<\/b><\/li>\n<\/ul>\n<h2>Esempio reale con WordPress e Bootstrap Italia<\/h2>\n<p>Proviamo invece a vedere un esempio di un caso pratico, che ho sviluppato in <strong>WordPress<\/strong> e <strong>Bootstrap Italia<\/strong>:<\/p>\n<pre class=\"language-markup\"><code>&lt;nav class=\"navigation pagination\" aria-label=\"Paginazione\"&gt;\r\n    &lt;h2 class=\"screen-reader-text\"&gt;Navigazione elementi&lt;\/h2&gt;\r\n    &lt;div class=\"nav-links\"&gt;\r\n        &lt;ul class=\"page-numbers\"&gt;\r\n            &lt;li&gt;&lt;span aria-current=\"page\" class=\"page-numbers current\"&gt;1&lt;\/span&gt;&lt;\/li&gt;\r\n            &lt;li&gt;&lt;a class=\"page-numbers\" href=\"\/news\/page\/2\/\"&gt;2&lt;\/a&gt;&lt;\/li&gt;\r\n            &lt;li&gt;&lt;a class=\"page-numbers\" href=\"\/news\/page\/3\/\"&gt;3&lt;\/a&gt;&lt;\/li&gt;\r\n            &lt;li&gt;&lt;span class=\"page-numbers dots\"&gt;\u2026&lt;\/span&gt;&lt;\/li&gt;\r\n            &lt;li&gt;&lt;a class=\"page-numbers\" href=\"\/news\/page\/28\/\"&gt;28&lt;\/a&gt;&lt;\/li&gt;\r\n            &lt;li&gt;&lt;a class=\"page-numbers\" href=\"\/news\/page\/29\/\"&gt;29&lt;\/a&gt;&lt;\/li&gt;\r\n            &lt;li&gt;&lt;a class=\"page-numbers\" href=\"\/news\/page\/30\/\"&gt;30&lt;\/a&gt;&lt;\/li&gt;\r\n            &lt;li&gt;&lt;a class=\"next page-numbers\" href=\"\/news\/page\/2\/\"&gt;&lt;span class=\"visually-hidden\"&gt;Elementi successivi&lt;\/span&gt;&lt;\/a&gt;&lt;\/li&gt;\r\n        &lt;\/ul&gt;\r\n    &lt;\/div&gt;\r\n&lt;\/nav&gt;<\/code><\/pre>\n<p>Anche in questo caso troviamo l\u2019uso degli elementi <b>&lt;nav&gt;<\/b>, <b>&lt;ul&gt;<\/b>, <b>&lt;li&gt;<\/b>, e degli attributi <b>aria-current<\/b> e <b>aria-label<\/b>. L\u2019ultimo &lt;li&gt; contiene il link per la <b>pagina successiva<\/b>, generalmente indicata da una freccia verso destra.<\/p>\n<h3>Codice PHP<\/h3>\n<p>Questo \u00e8 il <b>codice PHP<\/b> che richiama la paginazione tramite le funzioni di <b>WordPress<\/b>:<\/p>\n<pre class=\"language-php\"><code>&lt;?php\r\nthe_posts_pagination([\r\n'screen_reader_text' =&gt; __('Navigazione elementi', 'acme'),\r\n'aria_label' =&gt; __('Paginazione', 'acme'),\r\n'mid_size' =&gt; 2,\r\n'end_size' =&gt; 3,\r\n\/* translators: %s here are html tags *\/\r\n'prev_text' =&gt; __(sprintf('%sElementi precedenti%s', '&lt;span class=\"visually-hidden\"&gt;', '&lt;\/span&gt;'), 'acme'),\r\n\/* translators: %s here are html tags *\/\r\n'next_text' =&gt; __(sprintf('%sElementi successivi%s', '&lt;span class=\"visually-hidden\"&gt;', '&lt;\/span&gt;'), 'acme'),\r\n'type' =&gt; 'list'\r\n]);\r\n?&gt;<\/code><\/pre>\n<p>Questa funzione <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/the_posts_pagination\/\" rel=\"nofollow noopener\">the_posts_pagination<\/a> si occupa di generare gi\u00e0 l\u2019HTML necessario, possiamo comunque intervenire per <b>migliorare l\u2019accessibilit\u00e0<\/b>.<\/p>\n<h2>Link utili<\/h2>\n<ul>\n<li><a href=\"https:\/\/www.digitala11y.com\/infinite-scroll-accessibility-is-it-any-good\/\" rel=\"nofollow noopener\">Infinite Scroll &amp; Accessibility! Is It Any Good?<\/a><\/li>\n<li><a href=\"https:\/\/www.boia.org\/blog\/is-infinite-scrolling-accessible\" rel=\"nofollow noopener\">Is Infinite Scrolling Accessible?<\/a><\/li>\n<li><a href=\"https:\/\/design-system.w3.org\/components\/pagination.html\" rel=\"nofollow noopener\">W3C Design System: Pagination<\/a><\/li>\n<li>WordPress: <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/the_posts_pagination\/\" rel=\"nofollow noopener\">the_posts_pagination<\/a><\/li>\n<\/ul>\n<h2>Leggi anche<\/h2>\n<ul>\n<li><a href=\"https:\/\/www.accessibilita.digital\/come-sviluppare-un-sito-web-accessibile\/\">Come sviluppare un sito web accessibile<\/a><\/li>\n<li><a href=\"https:\/\/www.accessibilita.digital\/come-realizzare-caroselli-e-slider-accessibili\/\">Come realizzare caroselli e slider accessibili<\/a><\/li>\n<li><a href=\"https:\/\/www.accessibilita.digital\/come-realizzare-un-componente-leggi-di-piu-read-more-accessibile\/\">Come realizzare un componente Leggi di pi\u00f9 (read more) accessibile<\/a><\/li>\n<li><a href=\"https:\/\/www.accessibilita.digital\/come-realizzare-gallerie-fotografiche-e-lightbox-accessibili\/\">Come realizzare gallerie fotografiche e lightbox accessibili<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Quando abbiamo un elenco di prodotti o news, oppure una lista di risultati di ricerca, pu\u00f2 essere molto utile inserire un componente per la paginazione, cio\u00e8 per dividere la visualizzazione in pi\u00f9 pagine numeriche che l\u2019utente pu\u00f2 scorrere. Per l\u2019accessibilit\u00e0, suggerirei di evitare lo scroll infinito o il \u201ccarica altri\u201d che aggiunge tramite AJAX elementi [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":228,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1],"tags":[],"class_list":["post-203","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized"],"acf":[],"_links":{"self":[{"href":"https:\/\/www.accessibilita.digital\/wp-json\/wp\/v2\/posts\/203"}],"collection":[{"href":"https:\/\/www.accessibilita.digital\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.accessibilita.digital\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.accessibilita.digital\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.accessibilita.digital\/wp-json\/wp\/v2\/comments?post=203"}],"version-history":[{"count":3,"href":"https:\/\/www.accessibilita.digital\/wp-json\/wp\/v2\/posts\/203\/revisions"}],"predecessor-version":[{"id":218,"href":"https:\/\/www.accessibilita.digital\/wp-json\/wp\/v2\/posts\/203\/revisions\/218"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.accessibilita.digital\/wp-json\/wp\/v2\/media\/228"}],"wp:attachment":[{"href":"https:\/\/www.accessibilita.digital\/wp-json\/wp\/v2\/media?parent=203"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.accessibilita.digital\/wp-json\/wp\/v2\/categories?post=203"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.accessibilita.digital\/wp-json\/wp\/v2\/tags?post=203"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}