Към съдържанието
wannacode

Текст, връзки, картинки, таблици

Накратко: Съдържанието на HTML страница е от заглавия h1–h6, абзаци, списъци, връзки с href, картинки с alt и таблици с данни с caption, th и scope.

Проблем

„Мляко“ води в нищото

Купувач пише, че от страницата на хляба връзката „Мляко“ води към „Няма такава страница“. От началната страница същото меню работи. Страницата е на адрес https://shop.example/bread/white/dobrudzha.

HTML, CSS, JS
index.html

Натисни „Мляко“. Пясъчникът е една страница и не отваря връзки, но конзолата казва какво пише в href: milk. Другите връзки започват с /, а тази не. Без / браузърът не отива на /milk. Той сглобява адреса от адреса на страницата, на която си, и получава друг.

Идеята

Пълен и относителен адрес

Връзката е <a> с атрибут href: къде води. Адресът в href (URL) е пълен или относителен.

Пълният адрес има всичко: схема (https://), хост (shop.example) и път (/bread/white/dobrudzha). Пътят е от папки, разделени с /, а последната част е страницата.

Относителният адрес е непълен, и браузърът го допълва от адреса на страницата, на която е връзката. Началото решава как:

  • milk (нищо отпред): от папката на страницата.
  • ../milk: една папка нагоре.
  • /milk: от корена на сайта, независимо от страницата.
  • #price: място в същата страница, елементът с id="price".

Затова менюто, което е на всяка страница, е с адреси от корена: /milk води на едно място отвсякъде. Пълен адрес слагаш само за друг сайт.

Виж го

Виж как се сглобява адресът

Пет връзки от една и съща страница. Гледай кои части от адреса горе браузърът пази и какво добавя.

<!-- адресът на страницата: https://shop.example/bread/white/dobrudzha -->
<a href="milk">Мляко</a>
<a href="../milk">Мляко</a>
<a href="/milk">Мляко</a>
<a href="#price">Цената</a>
<a href="https://recipes.example/bread">Рецепти</a>
Стъпка по стъпка, с думи
  1. Страницата е на https://shop.example/bread/white/dobrudzha. Браузърът дели адреса на части: схема, хост и път. Пътят е от папки, а последната част е самата страница.
  2. href="milk" няма нищо отпред. Браузърът пази папката на страницата, /bread/white/, и сменя само последната част. Получава /bread/white/milk: страница, която я няма.
  3. ../ значи „една папка нагоре“. От /bread/white/ браузърът се качва в /bread/ и добавя milk. Пак не е /milk.
  4. Наклонена черта отпред значи „от корена на сайта“. Браузърът пази само схемата и хоста. Този адрес работи от всяка страница на магазина.
  5. # е място в същата страница. Браузърът пази целия адрес и добавя #price. Страницата не се зарежда наново, а се превърта до елемента с id="price".
  6. Адрес със схема е пълен. Браузърът не взима нищо от страницата. Така се води към друг сайт.
  7. Началото на href решава: нищо или ../ е от папката, / е от корена, # е в същата страница, https:// е пълен адрес.

Браузърът не пита сървъра дали адресът съществува. Той сглобява адреса по правилата и тръгва натам. Затова грешка в href не се вижда в кода, а когато някой натисне връзката. В браузъра виждаш сглобения адрес, ако задържиш мишката над връзката: долу вляво на прозореца.

Пробвай

Поправи връзките

Поправи връзките: „Мляко“ и „Кошница“ трябва да работят от всяка страница на магазина (адрес от корена: /milk и /cart). „Към цената“ трябва да скача до абзаца с цената. „Рецепти с този хляб“ води към друг сайт: нека се отваря в нов раздел, без той да получава достъп до нашата страница.

HTML, CSS, JS

Пробвай

Попълни

Връзката трябва да скача до цената на същата страница. Какво пише в href?

<a href="">Към цената</a>
…
<p id="price">Цена: 1,80 €</p>

Идеята

Текстът: план, абзаци, списъци

Заглавията <h1> … <h6> не са шест размера шрифт. Те са планът на страницата, като съдържанието на книга. <h1> е заглавието на страницата, <h2> са разделите в нея, <h3> са части от раздел. Нивата не се прескачат: след <h2> идва <h3>, а не <h5>. Екранният четец показва този план като списък и човек скача от раздел на раздел. Размерът се сменя с CSS, без да се пипа планът.

Останалото:

  • <p> е абзац. <br> е нов ред вътре в абзац (адрес, стих), а не начин да се правят списъци.
  • <ul> е списък без ред (съставки), <ol> е с ред (стъпки). Всеки елемент е <li>.
  • <dl> е списък от двойки „име и стойност“: <dt> е името (Тегло), <dd> е стойността (650 г).
  • <strong> е важно („Съдържа глутен.“), а <em> е ударение, което сменя смисъла („в торба, не в найлон“). Ако искаш само удебелен вид без смисъл, това е CSS.
HTML, CSS, JS
index.html

Пробвай

Направи план

Колега е избрал заглавията по размер: името на хляба е <h4>, а промоцията е <h1>. Направи плана: името на продукта е заглавието на страницата, „Съставки“ и „Как да го пазиш“ са разделите. Промоцията не е заглавие: нека е важен текст в абзац. Съставките са списък.

HTML, CSS, JS
index.html

Идеята

Картинки

<img src="img/bread.svg" alt="Кръгъл бял хляб с хрупкава кора" width="240" height="240">
  • src е адресът на картинката. Той се сглобява като href.
  • alt е текстът вместо картинката. Екранният четец го чете, търсачката го индексира, а ако картинката не се зареди, браузърът го показва на мястото ѝ. Пиши какво показва картинката и защо е там.
  • Картинка, която е само украса или повтаря текста до нея, е с alt="". Тогава екранният четец я прескача. Без alt изобщо е грешка: четецът не знае, че е украса.
  • Картинка, която е единственото съдържание на връзка, дава името на връзката. alt е къде води връзката: „Магазинът“, а не „лого“.
  • width и height са размерите в пиксели. Докато картинката идва, браузърът не знае колко е голяма и ѝ дава 0 пиксела височина. Когато дойде, текстът под нея подскача надолу. С width и height браузърът пази мястото отнапред, дори когато CSS я смали.

Пробвай

Сложи alt и размери

Логото е единственото във връзката към началото: връзката трябва да се казва „Магазинът“. Снимката на хляба показва нещо: опиши го в alt. Иконата подарък повтаря текста до нея. Снимката е 240 × 240 пиксела: кажи го на браузъра.

HTML, CSS, JS
index.html

Екранният четец казва за една връзка само „връзка“. На кой ред е грешката?

Идеята

Таблици с данни

Таблицата е за данни в редове и колони: цени, поръчки, разписание. Екранният четец я чете като таблица: „ред 3, колона Цена, 7,90 €“. Затова тя е само за данни, а не за нареждане на страницата в колони. Това прави CSS.

<table>
<caption>Цени днес</caption>
<thead>
<tr><th scope="col">Продукт</th><th scope="col">Цена</th></tr>
</thead>
<tbody>
<tr><th scope="row">Сирене</th><td>7,90 €</td></tr>
</tbody>
</table>
  • <caption> е името на таблицата. То е в таблицата, а не заглавие над нея.
  • <tr> е ред. <td> е клетка с данни, а <th> е заглавна клетка.
  • scope="col" казва, че заглавието е за колоната под него, а scope="row" за реда вдясно.
  • <thead> са заглавните редове, <tbody> са данните, <tfoot> е сборът отдолу.

Пробвай

Ценоразписът

Ценоразписът е направен с клетки <td> и удебелен текст. Направи го таблица с данни: името „Цени днес“ е на таблицата, заглавният ред е в <thead>, а продуктите са в <tbody>. Заглавията на колоните и имената на продуктите са заглавни клетки; кажи със scope за какво е всяка.

HTML, CSS, JS
index.html
По-точно, за любопитните

Още за адресите. ./milk е същото като milk. ?page=2 пази пътя и сменя само заявката: /bread/white/dobrudzha?page=2. Адрес, който започва с //, пази само схемата: //cdn.example/x.js е https://cdn.example/x.js. ../ над корена не води никъде по-нагоре: ../../../milk от нашата страница е /milk. В JavaScript това сглобяване е new URL('../milk', 'https://shop.example/bread/white/dobrudzha').

target="_blank" и window.opener. Chromium вече дава на нов раздел от target="_blank" window.opener === null, както с rel="noopener", а rel="opener" връща връзката. Пишем rel="noopener", за да е ясно и в браузъри, които не го правят сами.

Картинки за различни екрани. srcset дава няколко размера на една картинка, а браузърът избира според екрана. loading="lazy" зарежда картинката, когато наближи екрана. И двете са за модула за CSS и бързината.

Слети клетки. colspan="3" слива три клетки в ред, а rowspan="2" две клетки в колона. Тогава scope е важен: без него браузърът гадае на кои клетки е заглавието.

<b>, <i> и <br>. Те съществуват и имат смисъл: <b> е текст, който се откроява без да е по-важен (ключова дума), <i> е друг глас (термин, заглавие на книга). За важно е <strong>, за ударение е <em>.

Упражнение

Поръчка 1042

Направи страницата на поръчка 1042 от празно. Меню с връзка „Моите поръчки“ към /orders. Заглавие „Поръчка 1042“, под него „Статус: изпратена“. После таблица „Продуктите в поръчката“ с колони Продукт, Количество, Цена, Сума: хляб „Добруджа“ 2 × 1,80 € = 3,60 €, прясно мляко 3% 1 × 2,40 € = 2,40 €, сирене 1 × 7,90 € = 7,90 €. Пред всяко име има картинка 32 × 32 (img/bread.svg, img/milk.svg, img/cheese.svg). Най-долу е редът „Общо“ с 13,90 € в последната колона.

HTML, CSS, JS
index.html

Тест

Провери се

1. Страницата е на https://shop.example/bread/white/dobrudzha. Къде води <a href="../milk">?
2. Името на продукта е твърде голямо като <h1>. Какво правиш?
3. До текста „Подарък при поръчка над 30 €“ има икона на подарък. Какъв alt ѝ трябва?
4. Защо на <img> се пишат width и height, когато картинката и без тях се вижда?
5. Кога е правилно да се ползва <table>?

Създаден от Иво Гергов като част от кампанията на Evo Tech за достъпно обучение по програмиране ·