- •1.1. Основные понятия приложений
- •1.2. Html-элементы div и span и каскадные таблицы стилей (css) – основа построения Web-страниц
- •1.3. Разработка компонента «Аккордеон»
- •1.4. «Аккордеон» начинает играть в браузере
- •1.5. «Аккордеон» заиграл на сервере
- •1.6. Размещение компонента «Аккордеон»
- •1.2. Основные понятия Пролога
- •1.3. Факты и правила
- •1.4. Пролог-программа. Цель
- •1.5. Начало работы на swi-Пролог
- •1.5.1 Написание, запуск и отладка пролог-программы
- •1.5.2 Предикаты ввода и вывода
- •1.5.3 Первая программа на Прологе
- •1.6. Механизм логического вывода: унификация
- •1.6.1 Как Пролог отвечает на вопросы
- •1.7. Списки в Прологе
- •Логическое программирование. Основы языка Пролог
- •Поиск решений Пролог-системой
1.3. Разработка компонента «Аккордеон»
Описание …
Пример
См. мой локальный репозиторий Ajax: файлы accordion_style.css и accordion1.html.
Листинг 1.3a. Каскадные таблицы стилей CSS компонента «Аккордеон» (accordion_style.css) |
body{ margin: 5px; border: 0px; padding: 0px }
H1, .header1{ color: indigo; font: italic bold 28pt/150% sans-serif; }
.accordionComponent{ width: 30%; margin: 10px; border: solid indigo; border-width: 2px 2px 2px 2px; overflow: visible; height: 500px }
.accordionCurrentTitle{ background: indigo; color: white; font: italic bold 12pt/150% sans-serif; border: outset 2px }
.accordionOtherTitle{ background: indigo; color: white; font: italic bold 12pt/150% sans-serif; border: outset 2px }
.accordionCurrentPane{ border: none; overflow: scroll; display: block; height:90% }
.accordionOtherPane{ display: none }
|
Листинг 1.3b. HTML-документ компонента «Аккордеон» (accordion1.html) |
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <title>Ajax: accordion</title> <link rel="stylesheet" type="text/css" href="accordion_style.css"> </head> <body>
<h1>Компонент "Аккордеон"</h1>
<div class="accordionComponent">
<div class="accordionCurrentTitle"> Заголовок первого раздела </div>
<div class="accordionCurrentPane"> Первый раздел компонента "Аккордеон" будет отображен при первоначальной загрузке страницы. </div>
<div class="accordionOtherTitle"> Заголовок второго раздела (click me) </div>
<div class="accordionOtherPane"> Второй и последующие разделы компонента "Аккордеон" срыты при первоначальной загрузке страницы. </div>
<div class="accordionOtherTitle"> Заголовок тртьего раздела </div>
<div class="accordionOtherPane"> Для того, чтобы раскрылся очередной раздел компонента "Аккордеон" необходимо кликнуть левой кнопкой мыши по заголовку раздела. </div>
<div class="accordionOtherTitle"> Заголовок четвертого раздела </div>
<div class="accordionOtherPane"> Раздел может быть коротким и помещаться текущей панели. А может ... <br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br> <br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br> <br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br> ... и не помещаться в текущей панели без скроллинга. Как этот раздел.
</div>
</div>
</body> </html>
|
Рис.1.3. Компонент «Аккордеон» (пока в статике)
1.4. «Аккордеон» начинает играть в браузере
Описание …
Пример
См. мой локальный репозиторий Ajax: файлы accordion.js и accordion3.html.
Листинг 1.4a. Файл JavaScript компонента «Аккордеон» (accordion.js) |
function accordionTitleOnClick() { var accordion = this.parentNode; var childs = accordion.childNodes; var div = [];
for (var i = 0; i < childs.length; i++) if (childs[i].tagName == "DIV") div[div.length] = childs[i];
var currentTitle = null; var currentPane = null; var nextTitle = this; var nextPane = null;
for (var i = 0; i < div.length; i ++) if (div[i] == nextTitle) nextPane = div[i+1]
for (var i = 0; i < div.length; i ++) if (div[i].className == "accordionCurrentTitle") currentTitle = div[i]; else if (div[i].className == "accordionCurrentPane") currentPane = div[i];
currentTitle.className = "accordionOtherTitle"; nextTitle.className = "accordionCurrentTitle"; currentPane.className = "accordionOtherPane"; nextPane.className = "accordionCurrentPane"; nextPane.style.height = calculatePaneHeight(accordion)+"px"; }
function accordionAddBehivior(accordion) { var accordion = document.getElementById(accordion); accordion.className = "accordionComponent"; var childs = accordion.childNodes; var div = [];
for (var i = 0; i < childs.length; i++) if (childs[i].tagName == "DIV") div[div.length] = childs[i];
for (var i = 0; i < div.length; i += 2){ div[i].onclick = accordionTitleOnClick; if (i == 0){ div[i].className = "accordionCurrentTitle"; div[i+1].className = "accordionCurrentPane";
} else{ div[i].className = "accordionOtherTitle"; div[i+1].className = "accordionOtherPane"; } }
div[1].style.height = calculatePaneHeight(accordion)+"px"; }
function calculatePaneHeight(accordion){
var childs = accordion.childNodes; var div = [];
for (var i = 0; i < childs.length; i++) if (childs[i].tagName == "DIV") div[div.length] = childs[i];
var paneHeight = accordion.clientHeight;
for (var i = 0; i < div.length; i += 2) paneHeight -= div[i].offsetHeight;
return paneHeight; }
|
Листинг 1.4b. HTML-файл компонента «Аккордеон» (accordion3.html) |
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <title>Ajax: accordion</title> <link rel="stylesheet" type="text/css" href="accordion_style.css">
<script type="text/javascript" src="accordion.js"></script>
</head> <body onload='accordionAddBehivior("accordion1");'>
<h1>Компонент "Аккордеон"</h1>
<div id="accordion1">
<div>Заголовок первого раздела</div>
<div> Первый раздел компонента "Аккордеон" будет отображен при первоначальной загрузке страницы. </div>
<div>Заголовок второго раздела (click me)</div>
<div> Второй и последующие разделы компонента "Аккордеон" срыты при первоначальной загрузке страницы. </div>
<div>Заголовок третьего раздела</div>
<div> Для того, чтобы раскрылся очередной раздел компонента "Аккордеон" необходимо кликнуть левой кнопкой мыши по заголовку раздела. </div>
<div>Заголовок четвертого раздела</div>
<div> Раздел может быть коротким и помещаться текущей панели. А может ... <br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br> <br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br> <br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br> ... и не помещаться в текущей панели без скроллинга. Как этот раздел. </div>
</div>
</body> </html>
|
Рис.1.4. «Аккордеон» играет