Как они делают раскрывающийся список в стиле аккордеона на следующем веб-сайте?

Я смотрел http://www.zenfolio.com/zf/features.aspx, и я не могу понять, как они делают, что стиль аккордеона расширяется и сворачивается, когда вы нажимаете на оранжевые ссылки. Я использовал надстройку панели инструментов веб-разработчика для firefox, но мне не удалось найти что-либо в источнике страницы, например JavaScript, который бы делал следующее. Если кто-нибудь знает, как они это делают, это было бы очень полезно.

На самом деле это не связано, но если все ваши ответы хороши, кому я тоже могу дать ответ?

Проверьте StackPanel в GWT ...

Sathish 05.01.2009 22:30
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
3
1
1 515
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

Ответ принят как подходящий

Они устанавливают свойство CSS .display во внутреннем DIV с 'none' на '', которое отображает его.

Это немного сложно, поскольку, похоже, здесь находится JS, который это делает:

http://www.zenfolio.com/zf/script/en-US/mozilla5/windows/5AN2EHZJSZSGS/sitehome.js

Но в основном так все и делают. Он где-то там.

Обновлено: Вот, похоже:

//... (bunch of junk)
 zf_Features.prototype._entry_onclick = function(e, index) 
{
    var cellNode = this.dom().getElementsByTagName("H3")[index].parentNode;
    while (cellNode.tagName != "TD") cellNode = cellNode.parentNode; 
    if (this._current != null) this.dom(this._current).className = "desc";
    if ("i" + index != this._current) 
    {
        cellNode.className = "desc open";
        cellNode.id = this.id + "-i" + index;
        this._current = "i" + index;
    } 
    else this._current = null;
    zf_frame.recalcLayout();
    return false;
};

По сути, то, что они делают, - это действительно обходной и запутанный способ сделать div внутри TD с заменой класса «desc» на класс «desc open», который раскрывает его содержимое. Так что это действительно тупой обходной способ делать то же самое, что и все (то есть обрабатывать onclick для изменения свойства display скрытого div на не-скрытый).

Обновлено еще раз:

lol, пока я пытался его отформатировать, другие тоже нашли. =) Ты быстрее меня;)

В их основном JS-файле содержится много обфусцированных / минифицированных JS. Похоже, они очищают DOM в поисках H3 и проверяют ячейки таблицы с помощью class desc, а затем обрабатывают теги A. (или, возможно, в другом порядке), а затем динамически добавляя обработчики onclick.

if (this._current != null) this.dom(this._current).className
= "desc"; if ("i" + index != this._current) { cellNode.className = "desc open"; cellNode.id = this.id
+ "-i" + index; this._current = "i" + index; }

http://www.zenfolio.com/zf/script/en-US/safari3/windows/5AN2EHZJSZSGS/sitehome.js

Да, я только что взглянул на это, и это похоже на беспорядок.

Xaisoft 05.01.2009 22:26

Скрипт - здесь.

Соответствующий раздел выглядит (заново выложен):

// This script seems over-complicated... I wouldn't recommend it!

zf_Features.prototype._init = function()
{
    // Get a list of the H3 elements
    var nodeList = this.dom().getElementsByTagName("H3");

    // For each one... 
    for (var i = 0; i < nodeList.length; i++)
    {
        // ... set the onclick to be the function below
        var onclick = this.eventHandler(this._entry_onclick, i);

        // Get the first <a> within the H3 and do the same
        var node = nodeList[i].getElementsByTagName("A")[0];
        node.href = "#";
        node.onclick = onclick;

        // And again for the first <span>
        node = nodeList[i].getElementsByTagName("SPAN")[0];
        node.onclick = onclick;
    }
};

zf_Features.prototype._entry_onclick = function(e, index)
{
    // Get the parent node of the cell that was clicked on
    var cellNode = this.dom().getElementsByTagName("H3")[index].parentNode;

    // Keep going up the DOM tree until we find a <td>
    while (cellNode.tagName != "TD")
        cellNode = cellNode.parentNode;

    // Collapse the currently open section if there is one
    if (this._current != null)
        this.dom(this._current).className = "desc";

    if ("i" + index != this._current)
    {
        // Open the section we clicked on by changing its class
        cellNode.className = "desc open";
        cellNode.id = this.id + "-i" + index;

        // Record this as the current one so we can close it later
        this._current = "i" + index;
    }
    else
        this._current = null;

    // ???
    zf_frame.recalcLayout();

    return false;
};

Обновлено: добавил несколько комментариев

Я не совсем сторонник javascript, так что сложно даже уследить за этим?

Xaisoft 05.01.2009 22:32

Кому я тоже должен дать ответ, вроде все были правы?

Xaisoft 05.01.2009 22:38

Я, потому что я приложил максимум усилий: p

Greg 05.01.2009 22:39

Это делается с помощью JavaScript.

Когда вы щелкаете ссылку, класс родительского td изменяется с desc на desc open. По сути, расширенный текст всегда есть, но скрыт (display: none;). Когда он получает класс css «open», текст больше не скрывается (display: block;).

Если вы посмотрите файлы sitehome.js и sitehome.css, вы сможете понять, как они это делают.

Кстати, я использовал FireBug, чтобы получить эту информацию. Несмотря на то, что в Панели инструментов веб-разработчика есть некоторые дублирующие функции, ее стоит установить.

Они используют javascript. Вы тоже можете это сделать:

<div id = "feature">
    <a href = "javascript:toggle();">Feature Name</a>

    <div id = "desc" style= = "display:none;">
     description here...
    </div>
</div>

<script type = "text/javascript">
function toggle()
{
   var el=document.getElementById('desc');
   if (el.style.display=='none')
      el.style.display='block'; //show if currently hidden
   else
      el.style.display='none'; //Hide if currently displayed
}
</script>

Вышеупомянутая функция может быть написана с использованием JQuery для плавного появления / исчезновения анимации при отображении / расширении описаний. Он также имеет эффект SlideUp и Slidedown.

Да, похоже, с JQuery было бы намного проще.

Xaisoft 05.01.2009 22:30

К сожалению, их код встроен и его трудно читать (http://www.zenfolio.com/zf/script/en-US/mozilla5/windows/5AN2EHZJSZSGS/sitehome.js), но это выглядит довольно просто для реализации ... что-то в этом роде (с использованием prototypejs):

<script>
var showHide = {
    cachedExpandable: null
    ,init: function() {
        var containers = $$(".container"); 
        for(var i=0, clickable; i<containers.length; i++) {
            clickable = containers[i].getElementsByClassName("clickable")[0];
            Event.observe(clickable, "click", function(e) {
                Event.stop(e);
                showHide.doIt(containers[i]);
            });
        }
    }
    ,doIt: function(container) {
        if (this.cachedExpandable) this.cachedExpandable.hide();
        var expandable = container.getElementsByClassName("expandable")[0];
        if (expandable.style.display == "none") {
            expandable.show();
        } else {
            expandable.hide();
        }
        this.cachedExpandable = expandable;
    }

};

window.onload = function() {
    showHide.init();
};
</script>

<div class = "container">
    <div class = "clickable">
        Storage Space
    </div>
    <div class = "expandable" style = "display: none;">
        Description for storage space
    </div>
</div>

<div class = "container">
    <div class = "clickable">
        Galleries
    </div>
    <div class = "expandable" style = "display: none;">
        Description for galleries
    </div>
</div>

Он также кеширует более ранний расширяемый элемент, поэтому он скрывает его, когда вы нажимаете на новый.

Используя jQuery, можно построить этот эффект очень легко:

$('.titleToggle').click(function() {
    $(this).next().toggle();
});

Если вы выполните этот код при загрузке страницы, он будет работать с любой разметкой, которая выглядит следующим образом:

<span class = "titleToggle">Show me</span>
<div style = "display:none">This is hidden</div>

Обратите внимание, что этот код будет работать для любого количества элементов, поэтому даже для всей таблицы / списка, заполненного этими элементами, код JavaScript не требует повторения или адаптации нет каким-либо образом. Имена тегов (здесь span и div) также не имеют значения. Используйте то, что вам больше всего подходит.

Между прочим, это отличный пример того, насколько глупо нет использовать фреймворк JavaScript в настоящее время.

Konrad Rudolph 05.01.2009 22:38

Конрад, раз уж у тебя хорошая репутация, здесь все дали хорошие ответы, как мне решить, кому дать ответ?

Xaisoft 05.01.2009 22:40

Другие вопросы по теме