Під час перегляду великої таблиці заголовки HTML завжди видно у верхній частині вікна


169

Я хотів би мати змогу "налаштувати" презентацію таблиці HTML, щоб додати єдину функцію: коли прокручуєте сторінку вниз, щоб таблиця була на екрані, але рядки заголовків були поза екраном, я хотів би, щоб заголовки залишалися видно у верхній частині оглядової області.

Це концептуально схоже на функцію "заморожувати панелі" в Excel. Однак HTML-сторінка може містити кілька таблиць на ній, і я хотів би, щоб це сталося для таблиці, яка зараз переглядається, лише тоді, коли вона переглядається.

Примітка. Я бачив одне рішення, коли область даних таблиці робиться прокручуваною, поки заголовки не прокручуються. Це не рішення, яке я шукаю.


Ваша сторінка розроблена за допомогою таблиць? чи неможливо спершу перетворити його в divs і залишити табличні дані поодинці для таблиць?
замок

6
нещодавно я написав плагін, який робить це: програмуванняrudrunk.com
floatThead

1
Окрім рішення з голосовим бажанням та його похідних нижче, плагін @mkoryak також є непоганим. Обов’язково погляньте і на це, перш ніж закінчити "шопінг".
DanO

Дякую дан :) У мене також є заплановані наступні випуски
mkoryak

Я другий плагін @mkoryak floatThead - мені вдалося його швидко інтегрувати. Велике спасибі за плагін!
w5m

Відповіді:


67

Перевірте jQuery.floatThead ( демонстрації доступні ), який дуже класний, може працювати і з DataTables , і навіть може працювати в overflow: autoконтейнері.


так, це працює з горизонтальною прокруткою, прокруткою вікна, внутрішньою прокруткою та зміною розміру вікна.
mkoryak

Чи можете ви додати загадку з робочим кодом? (Я знаю, що є на сайті ...)
Мішель Айрес

12
я створив величезну сторінку демо / документів. Для чого потрібна скрипка?
мкоряк

5
@MustModify stackoverflow - не вдале місце, щоб задавати мені питання. повідомте про проблему на Github, навіть якщо це лише питання про те, як змусити його працювати. Я відповідаю там, як правило, менше ніж за день. Тут хворий, напевно, відгукнеться лише за рік :)
mkoryak

1
@MustModify для чого його варто, жоден з класів на таблицях у прикладах не має значення. Плагіну не потрібні ніякі css або класи для роботи, як кажуть мої документи.
mkoryak

135

Я вирішив перевірити концепцію за допомогою jQuery .

Переглянути зразок тут.

Зараз я отримав цей код у сховищі біткоїнів Mercurial . Основний файл - tables.html.

Мені відомо одне питання з цим: якщо таблиця містить якорі, і якщо ви відкриєте URL-адресу із зазначеним якорем у браузері, коли сторінка завантажується, рядок із якорем, ймовірно, буде затемнений плаваючим заголовком.

Оновлення 2017-12-11: я бачу, що це не працює з поточними Firefox (57) та Chrome (63). Не впевнені, коли і чому це перестало працювати, або як це виправити. Але зараз я вважаю, що прийнята відповідь Хенді Іраван вища.


Мені це було потрібно для чогось, що я роблю. Чудова допомога, дякую. З моїм я не використовував вікно, оскільки панель прокрутки була поділом у html. Так що мені довелося змінити , floatingHeaderRow.css("top", Math.min(scrollTop - offset.top, $(this).height() - floatingHeaderRow.height()) + "px");щоб , floatingHeaderRow.css("top", scrollTop + "px");як з кодом ви мали заголовок таблиці стрибав далі вниз сторінки , щоб в кінці кінців зникнути зі сторінки.
Nalum

1
Я намагаюся реалізувати це у своїй таблиці. У мене проблема з шириною заголовка. Дані у рядках - це значення, витягнуті з db, як такі - випадкова довжина. Перед тим, як прокручувати, заголовки мають розмір, який передається у спадок, але коли ви прокручуєте, вони змінюють розмір заголовків, щоб обернутись назви заголовків, і, таким чином, мають значно меншу ширину, щоб заголовки насправді не відстежували поверх відповідних стовпчик. Як я можу виправити це питання?
JonYork

Хм, я не впевнений, виходячи з вашого опису. Я пропоную 1), якщо можливо, покажіть приклад в Інтернеті; 2) задайте це як запитання на StackOverflow.
Крейг МакКуїн

@JonYork У мене було саме таке питання. Моєю проблемою було використання <td> у заголовку замість <th>, тому він не міг застосувати ширину кожного стовпця до неіснуючої <th> (див. // Copy cell widths from original headerЧастину коду). @Craig McQueen, будь ласка, відредагуйте свою відповідь, щоб ніхто більше не робив цієї помилки.
aexl

@CraigMcQueen Коли я використовую ваш дивовижний код (дякую), він переходить на другу таблицю, яку я маю за іншою вкладкою (плагін jQuery). Будь-які думки? Заголовок розміщується в крайній лівій частині, замість того, щоб слідкувати за стовпцями розташування. Але прекрасно працює на столі на першій вкладці jQuery.
Річард Żak

68

Крейг, я трохи уточнив ваш код (серед кількох інших речей, для яких зараз використовується позиція: фіксований) і завернув його як плагін jQuery.

Спробуйте тут: http://jsfiddle.net/jmosbech/stFcx/

І отримайте джерело тут: https://github.com/jmosbech/StickyTableHeaders


1
Гарна ідея зробити плагін jQuery. Пара питань: (1) Чи добре це працює з горизонтальним прокручуванням? (2) Як він поводиться під час прокрутки вниз, щоб нижня частина таблиці прокручувалася вгорі вікна? Приклад не дозволяє перевірити ці випадки.
Крейг МакКуїн

Ваш приклад jsfiddle чудово працює з tableorter, але код на github - ні. Чи доводилося вам змінювати код tableorter?
ericslaw

Крейг, горизонтальне прокручування не повинно бути проблемою, оскільки заголовок розміщується як горизонтально, так і вертикально на прокрутці та розмірі. Що стосується вашого другого питання: Заголовок приховано, коли таблиця залишає вікно перегляду.
jmosbech

Ерік, це дивно. Ви намагалися відкрити /demo/tablesorter.htm від Github? Я не змінив код tableorter, але для того, щоб він працював, потрібно застосувати плагін StickyTableHeader перед tableorter.
jmosbech

2
Горизонтальна прокрутка не спрацьовує, після прокручування досить відстані теда розташовується далі ліворуч при прокрутці поза екраном, ніж тоді, коли вона нормально розміщується як частина таблиці.
Натан Філіпс

16

Якщо ви орієнтуєтесь на сучасні веб-переглядачі, сумісні з css3 ( Підтримка веб- переглядачів: https://caniuse.com/#feat=css-sticky ), ви можете використовувати position:sticky, що не вимагає JS і не порушує макет таблиці. і td того ж стовпця. Також не потрібно фіксованої ширини стовпця для правильної роботи.

Приклад для одного рядка заголовка:

thead th
{
    position: sticky;
    top: 0px;
}

Для головок з 1 або 2 рядками ви можете використовувати щось подібне:

thead > :last-child th
{
    position: sticky;
    top: 30px; /* This is for all the the "th" elements in the second row, (in this casa is the last child element into the thead) */
}

thead > :first-child th
{
    position: sticky;
    top: 0px; /* This is for all the the "th" elements in the first child row */
}

Можливо, вам доведеться трохи пограти з верхньою властивістю останньої дитини, змінивши кількість пікселів, щоб відповідати висоті першого ряду (+ поле + рамка + оббивка, якщо така є), тому другий ряд стирчить просто вниз нижче першого.

Також обидва рішення працюють, навіть якщо у вас є одна таблиця на одній сторінці: thелемент кожного з них починає залишатися липким, коли його верхнє положення є тим, що вказано у визначенні css, і просто зникає, коли вся таблиця прокручується вниз. Тож якщо є більше таблиць, всі працюють прекрасно так само.

Чому в css використовувати останню дитину до та першу дитину після ?

Через те, що правила css відображаються браузером у тому ж порядку, коли ви записуєте їх у файл css, і через це, якщо у вас є лише 1 рядок в елементі thead, перший рядок є одночасно і останнім рядком, і потрібно правило першої дитини щоб перекрити останню дитину. Якщо ні, то у вас буде зміщення рядка 30 пікселів від верхнього поля, яке, я думаю, ви цього не хочете.

Відома проблема позиції: липкою є те, що вона не працює на елементи теда або рядки таблиці: ви повинні орієнтуватися на елементи. Перейти до цієї проблеми буде вирішено у майбутніх версіях браузера.


Перший приклад, здається, не працює у Firefox (61). Однак якщо позиція липкою встановлена ​​на теді, це і є.
ewh

1
Ви можете зробити thead tr+tr thнацілювання на другий ряд.
Teepeemm

5

Можливі альтернативи

js-заголовки з плаваючою таблицею

заголовки js-плаваючої таблиці (код Google)

У Друпалі

У мене є сайт Drupal 6. Я був на сторінці "модулів" адміністратора, і помітив, що таблиці мають цю точну особливість!

Дивлячись на код, здається, він реалізований файлом під назвою tableheader.js. Він застосовує цю функцію у всіх таблицях класу sticky-enabled.

Для сайту Drupal я хотів би мати можливість використовувати цей tableheader.jsмодуль як є для вмісту користувача. tableheader.jsСхоже, немає на сторінках вмісту користувачів у Drupal. Я розмістив повідомлення на форумі, щоб запитати, як змінити тему Drupal, щоб вона була доступною. Відповідно до відповіді, tableheader.jsможна додати до теми Drupal, використовуючи drupal_add_js()наступні теми template.php:

drupal_add_js('misc/tableheader.js', 'core');

Ваше посилання на код Google було для мене дуже корисним, танкси.
Vilius Gaidelis

5

Я стикався з цією проблемою зовсім недавно. На жаль, мені довелося зробити 2 таблиці, одну для заголовка і одну для тіла. Це, мабуть, не найкращий підхід коли-небудь, але ось що:

<html>
<head>
    <title>oh hai</title>
</head>
<body>
    <table id="tableHeader">
        <tr>
            <th style="width:100px; background-color:#CCCCCC">col header</th>
            <th style="width:100px; background-color:#CCCCCC">col header</th>
        </tr>
    </table>
    <div style="height:50px; overflow:auto; width:250px">
        <table>
            <tr>
                <td style="height:50px; width:100px; background-color:#DDDDDD">data1</td>
                <td style="height:50px; width:100px; background-color:#DDDDDD">data1</td>
            </tr>
            <tr>
                <td style="height:50px; width:100px; background-color:#DDDDDD">data2</td>
                <td style="height:50px; width:100px; background-color:#DDDDDD">data2</td>
            </tr>
        </table>
    </div>
</body>
</html>

Це працювало для мене, це, мабуть, не елегантний спосіб, але це працює. Я буду досліджувати, щоб побачити, чи можу я зробити щось краще, але це дозволяє кілька таблиць.

Перейдіть почитати про власність переповнення, щоб побачити, чи відповідає вашим потребам


Хм не працює, я спробую це виправити, але підхід залишається, вам доведеться використовувати перелив: auto proprety
Gab Royer

Я ціную ваше рішення та його простоту, проте у своєму запитанні я сказав: "Примітка. Я бачив одне рішення, де область даних таблиці робиться прокручуваною, поки заголовки не прокручуються. Це не рішення, яке я шукаю".
Крейг МакКуїн

@GabRoyer Сторінка w3school, на яку ви посилалися, не існує.
Фархан

Вони, здається, перенесли це. Виправлено
Gab Royer

Ще одна проблема такого підходу полягає в тому, що якщо вам потрібно адаптувати частину стовпців до іншого вмісту, ви ризикуєте порушити їх вирівнювання із відповідним заголовком стовпця. ІМХО краще зіткнутися з цією проблемою з підходом, який дозволяє своєрідно динамічно керувати вмістом, що забезпечує ідеальне вирівнювання стовпців та відносних заголовків. Тож позиція ІМХО = липкий - це шлях.
willy winka

3

Це справді хитра річ, щоб на столі був липкий заголовок. У мене була така ж вимога, але з asp: GridView, і тоді я виявив, що дійсно думав мати липкий заголовок на gridview. Існує багато рішень, і на це мені знадобилося 3 дні, але жодне з них не змогло задовольнити.

Основним питанням, з яким я стикався з більшістю цих рішень, була проблема вирівнювання. Коли ви намагаєтеся зробити заголовок плаваючим, якимось чином вирівнювання комірок заголовка та клітин тіла виходить з колії.

За допомогою деяких рішень у мене також виникла проблема із заголовком заголовка на перші кілька рядків тіла, що призводить до того, що рядки тіла ховаються за плаваючим заголовком.

Тож тепер мені довелося реалізувати власну логіку, щоб досягти цього, хоча я також не вважаю це ідеальним рішенням, але це також може бути корисним для когось,

Нижче наведена таблиця зразків.

<div class="table-holder">
        <table id="MyTable" cellpadding="4" cellspacing="0" border="1px" class="customerTable">
            <thead>
                <tr><th>ID</th><th>First Name</th><th>Last Name</th><th>DOB</th><th>Place</th></tr>
            </thead>
            <tbody>
                <tr><td>1</td><td>Customer1</td><td>LastName</td><td>1-1-1</td><td>SUN</td></tr>
                <tr><td>2</td><td>Customer2</td><td>LastName</td><td>2-2-2</td><td>Earth</td></tr>
                <tr><td>3</td><td>Customer3</td><td>LastName</td><td>3-3-3</td><td>Mars</td></tr>
                <tr><td>4</td><td>Customer4</td><td>LastName</td><td>4-4-4</td><td>Venus</td></tr>
                <tr><td>5</td><td>Customer5</td><td>LastName</td><td>5-5-5</td><td>Saturn</td></tr>
                <tr><td>6</td><td>Customer6</td><td>LastName</td><td>6-6-6</td><td>Jupitor</td></tr>
                <tr><td>7</td><td>Customer7</td><td>LastName</td><td>7-7-7</td><td>Mercury</td></tr>
                <tr><td>8</td><td>Customer8</td><td>LastName</td><td>8-8-8</td><td>Moon</td></tr>
                <tr><td>9</td><td>Customer9</td><td>LastName</td><td>9-9-9</td><td>Uranus</td></tr>
                <tr><td>10</td><td>Customer10</td><td>LastName</td><td>10-10-10</td><td>Neptune</td></tr>
            </tbody>
        </table>
    </div>

Примітка : Таблиця загорнута у DIV з атрибутом класу, рівним 'держателю таблиці'.

Нижче представлений сценарій JQuery, який я додав у свій заголовок html-сторінки.

<script src="../Scripts/jquery-1.7.2.min.js" type="text/javascript"></script>
<script src="../Scripts/jquery-ui.min.js" type="text/javascript"></script>
<script type="text/javascript">
    $(document).ready(function () {
        //create var for table holder
        var originalTableHolder = $(".table-holder");
        // set the table holder's with
        originalTableHolder.width($('table', originalTableHolder).width() + 17);
        // Create a clone of table holder DIV
        var clonedtableHolder = originalTableHolder.clone();

        // Calculate height of all header rows.
        var headerHeight = 0;
        $('thead', originalTableHolder).each(function (index, element) {
            headerHeight = headerHeight + $(element).height();
        });

        // Set the position of cloned table so that cloned table overlapped the original
        clonedtableHolder.css('position', 'relative');
        clonedtableHolder.css('top', headerHeight + 'px');

        // Set the height of cloned header equal to header height only so that body is not visible of cloned header
        clonedtableHolder.height(headerHeight);
        clonedtableHolder.css('overflow', 'hidden');

        // reset the ID attribute of each element in cloned table
        $('*', clonedtableHolder).each(function (index, element) {
            if ($(element).attr('id')) {
                $(element).attr('id', $(element).attr('id') + '_Cloned');
            }
        });

        originalTableHolder.css('border-bottom', '1px solid #aaa');

        // Place the cloned table holder before original one
        originalTableHolder.before(clonedtableHolder);
    });
</script>

і нарешті нижче - клас CSS для розрядки розмальовки.

.table-holder
{
    height:200px;
    overflow:auto;
    border-width:0px;    
}

.customerTable thead
{
    background: #4b6c9e;        
    color:White;
}

Отже, вся ідея цієї логіки полягає в тому, щоб помістити таблицю в розділ власника таблиці та створити клон цього власника на стороні клієнта при завантаженні сторінки. Тепер схойте тіло таблиці всередині утримувача клонів і розташуйте частину заголовка, що залишилася, над початковим заголовком.

Це ж рішення працює і для asp: gridview, для досягнення цього в gridview потрібно додати ще два кроки,

  1. У події OnPrerender об’єкта gridview на вашій веб-сторінці встановіть розділ таблиці рядка заголовка, рівний TableHeader.

    if (this.HeaderRow != null)
    {
        this.HeaderRow.TableSection = TableRowSection.TableHeader;
    }
  2. І загорніть свою сітку в <div class="table-holder"></div>.

Примітка : якщо у вашому заголовку є елементи, які можна натиснути, тоді вам може знадобитися додати ще якийсь сценарій jQuery, щоб передати події, підняті в клонованому заголовку, в оригінальний заголовок. Цей код уже доступний в плагіні jQuery sticky-header, створеному jmosbech


+1 для хороших зусиль, але для великих таблиць з великою кількістю даних досить погано клонувати всю справу ... Я думаю, що подвійний час завантаження подвійно
Хаверим

2

Використання display: fixedв цьому theadрозділі повинно працювати, але для того, щоб він працював лише на поточній таблиці, вам потрібна допомога JavaScript. І це буде складно, оскільки потрібно буде з’ясувати місця прокрутки та розташування елементів відносно вікна перегляду, що є однією з найважливіших областей несумісності браузера.

Погляньте на популярні рамки JavaScript (jQuery, MooTools, YUI тощо, тощо), щоб побачити, чи можуть вони робити те, що ви хочете, або полегшити робити те, що ви хочете.


1
Дякую за пораду. Я вирішив використовувати jQuery - дивіться мою відповідь.
Крейг МакКуїн

Я спробував це, і я думаю, що ти мав на увазі позицію, а не показ, але жоден не працював на теда в чоме.
ericslaw

@ericslaw Ack - так, я мав на увазі position: fixed. Вибачте, що це не працює в Chrome.
статик

переплутав мій заголовок, ігноруючи стилі ширини
pavel_kazlou

2

Якщо ви використовуєте повноекранну таблицю, можливо, ви зацікавлені в налаштуваннях для відображення: фіксований; і вгорі: 0; або спробуйте дуже подібний підхід через css.

Оновлення

Просто швидко створіть робоче рішення з iframes (html4.0). Цей приклад НЕ відповідає стандарту, проте ви легко зможете його виправити:

external.html

<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">   
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">     
    <head>      
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />   
        <title>Outer</title>
  <body>
    <iframe src="test.html" width="200" height="100"></iframe>
    </body>
</html> 

test.html

<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">   
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">     
    <head>      
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />   
        <title>Floating</title>
    <style type="text/css">
      .content{
        position:relative; 
      }

      thead{
        background-color:red;
        position:fixed; 
        top:0;
      }
    </style>
  <body>
    <div class="content">      
      <table>
        <thead>
          <tr class="top"><td>Title</td></tr>
        </head>
        <tbody>
          <tr><td>a</td></tr>
          <tr><td>b</td></tr>
          <tr><td>c</td></tr>
          <tr><td>d</td></tr>
          <tr><td>e</td></tr>
          <tr><td>e</td></tr>
          <tr><td>e</td></tr>
          <tr><td>e</td></tr>
          <tr><td>e</td></tr>
          <tr><td>e</td></tr>
        </tbody>
      </table>
    </div>
    </body>
</html> 

@ a_m0d, правда ... але запит звучить дуже заплутано. Або ми неправильно розуміємо це, або запитуючий не повністю розуміє, чого він хоче.
Сампсон

Ось ще одне рішення за допомогою деяких javascript imaputz.com/cssStuff/bigFourVersion.html
merkuro

2

Найпростіша відповідь лише за допомогою CSS: D !!!

table {
  /* Not required only for visualizing */
  border-collapse: collapse;
  width: 100%;
}

table thead tr th {
  /* you could also change td instead th depending your html code */
  background-color: green;
  position: sticky;
  z-index: 100;
  top: 0;
}

td {
  /* Not required only for visualizing */
  padding: 1em;
}
<table>
  <thead>
    <tr>
      <th>Col1</th>
      <th>Col2</th>
      <th>Col3</th>
    </tr>
  </thead>
  <tbody>
     <tr>
       <td>data</td>
       <td>data</td>
       <td>data</td>
     </tr>
     <tr>
       <td>data</td>
       <td>data</td>
       <td>data</td>
     </tr>
     <tr>
       <td>data</td>
       <td>data</td>
       <td>data</td>
     </tr>
     <tr>
       <td>data</td>
       <td>data</td>
       <td>data</td>
     </tr>
     <tr>
       <td>data</td>
       <td>data</td>
       <td>data</td>
     </tr>
     <tr>
       <td>data</td>
       <td>data</td>
       <td>data</td>
     </tr>
     <tr>
       <td>data</td>
       <td>data</td>
       <td>data</td>
     </tr>
     <tr>
       <td>data</td>
       <td>data</td>
       <td>data</td>
     </tr>
     <tr>
       <td>data</td>
       <td>data</td>
       <td>data</td>
     </tr>
     <tr>
       <td>data</td>
       <td>data</td>
       <td>data</td>
     </tr>
     <tr>
       <td>data</td>
       <td>data</td>
       <td>data</td>
     </tr>
     <tr>
       <td>data</td>
       <td>data</td>
       <td>data</td>
     </tr>
     <tr>
       <td>data</td>
       <td>data</td>
       <td>data</td>
     </tr>
     <tr>
       <td>data</td>
       <td>data</td>
       <td>data</td>
     </tr>
     <tr>
       <td>david</td>
       <td>castro</td>
       <td>rocks!</td>
     </tr>
  </tbody>
</table>


1
Дякую Давидові, це найприємніший підхід, який я знайшов у цьому питанні
Томаш Смиковський

0

Це доказ концепції, яку ви склали, було чудовим! Однак я також знайшов цей плагін jQuery, який, здається, працює дуже добре. Сподіваюся, це допомагає!


Це виглядає так, ніби він реалізує іншу особливість . Як я вже говорив у своєму первісному запитанні: "Примітка. Я бачив одне рішення, де область даних таблиці робиться прокручуваною, поки заголовки не прокручуються. Це не рішення, яке я шукаю".
Крейг МакКуїн

2
спробувавши плагін, ви згадали щойно зіпсований заголовок моєї таблиці. Не вдалося ним скористатися.
pavel_kazlou

0

Розчаровує те, що те, що чудово працює в одному браузері, не працює в інших. У Firefox працює таке, але не в Chrome або IE:

<table width="80%">

 <thead>

 <tr>
  <th>Column 1</th>
  <th>Column 2</th>
  <th>Column 3</th>
 </tr>

 </thead>

 <tbody style="height:50px; overflow:auto">

  <tr>
    <td>Cell A1</td>
    <td>Cell B1</td>
    <td>Cell C1</td>
  </tr>

  <tr>
    <td>Cell A2</td>
    <td>Cell B2</td>
    <td>Cell C2</td>
  </tr>

  <tr>
    <td>Cell A3</td>
    <td>Cell B3</td>
    <td>Cell C3</td>
  </tr>

 </tbody>

</table>

4
Я пробую це у Firefox 8.0, і він, здається, нічого не робить. Що це робить?
Крейг МакКуін

Що таке px? Це в тій спадщині, яку використовували люди 90-х років, коли на дисплеї використовувались 72 dpi?
припинення

Я погоджуюся: це дуже засмучує, на жаль, розробники браузерів не дотримуються стандартів у будь-якій ситуації ... а кілька років тому було ще гірше! Зараз деякі проблеми були вирішені, і більше браузерів веде себе більш стандартизовано, але ще потрібно зробити багато кроків: сподіваймось і помолимось :-)
willy winka
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.