102 votes

Comment développer et réduire une <div> à l'aide de javascript ?

J'ai créé une liste sur mon site. Cette liste est créée par une boucle foreach qui construit avec les informations de ma base de données. Chaque élément est un conteneur avec différentes sections, il ne s'agit donc pas d'une liste du type 1, 2, 3... etc. Il s'agit d'une liste de sections répétitives contenant des informations. Dans chaque section, il y a une sous-section. La construction générale est la suivante :

<div>
    <fieldset class="majorpoints" onclick="majorpointsexpand($(this).find('legend').innerHTML)">
    <legend class="majorpointslegend">Expand</legend>
    <div style="display:none" >
        <ul>
            <li></li>
            <li></li>
        </ul>
    </div>
</div>

J'essaie donc d'appeler une fonction avec onclick="majorpointsexpand($(this).find('legend').innerHTML)".

La division que j'essaie de manipuler est style="display:none" par défaut, et je veux utiliser le javascript pour la rendre visible au clic.

Le "$(this).find('legend').innerHTML" tente de passer, dans ce cas, "Expand" comme argument dans la fonction.

Voici le javascript :

function majorpointsexpand(expand)
    {
        if (expand == "Expand")
            {
                document.write.$(this).find('div').style = "display:inherit";
                document.write.$(this).find('legend').innerHTML = "Collapse";
            }
        else
            {
                document.write.$(this).find('div').style = "display:none";
                document.write.$(this).find('legend').innerHTML = "Expand";
            }
    }

Je suis presque sûr à 100% que mon problème est la syntaxe, et je n'ai pas beaucoup de connaissances sur le fonctionnement de javascript.

JQuery est lié au document avec :

<script src="http://code.jquery.com/jquery-1.9.1.min.js"></script>

Dans le <head></head> section.

1voto

Du pur javascript ne permettant qu'une seule div étendue à la fois. Il permet des sous-expansions à plusieurs niveaux. Le html n'a besoin que du contenu des expanseurs. Le javascript créera les en-têtes des expanseurs avec les titres de l'attribut content data et une flèche svg.

<style>
    /* expanders headers divs */
    .expanderHead {
        color: white;
        background-color: #1E9D8B;
        border: 2px solid #1E9D8B;
        margin-top: 9px;
        border-radius: 6px;
        padding: 3px;
        padding-left: 9px;
        cursor: default;
        font-family: Verdana;
        font-size: 14px;
    }

    .expanderHead:first-child {
        margin-top: 0 !important;
    }

    .expanderBody:last-child {
        margin-bottom: 0 !important;
    }

    /* expanders svg arrows */
    .expanderHead svg > g > path {
        fill: none;
        stroke: white;
        stroke-width: 2;
        stroke-miterlimit: 5;
        pointer-events: stroke;
    }

    /* expanders contents divs */
    .expanderBody {
        border: 2px solid #1E9D8B;
        border-top: 0;
        background-color: white;
        border-top-left-radius: 0;
        border-top-right-radius: 0;
        border-bottom-left-radius: 6px;
        border-bottom-right-radius: 6px;
        padding: 6px;
        font-family: Verdana;
        font-size: 12px;
    }

    /* widget window */
    .widget {
        width: 400px;
        background-color: white;
        padding: 9px;
        border: 2px solid #1E9D8B;
        border-top-left-radius: 6px;
        border-top-right-radius: 6px;
        border-bottom-left-radius: 6px;
        border-bottom-right-radius: 6px;
    }

</style>

<div class="widget">

    <div data-title="expander 1" class="expanderBody">
        expander 1 content
    </div>

    <div data-title="expander 2" class="expanderBody">
        expander 2 content
    </div>

    <div data-title="expander 3" class="expanderBody">

        <div>
            expander 3 content
        </div>

        <div data-title="expander 3.1" class="expanderBody">
            expander 3.1 content
        </div>

        <div data-title="expander 3.2" class="expanderBody">
            expander 3.2 content
        </div>

        <div data-title="expander 3.3" class="expanderBody">
            expander 3.3 content
        </div>

    </div>

</div>

<script>
    document.querySelectorAll(".expanderBody").forEach(item => {
        if (item.dataset.title) {
            // create expander header
            let divHeader = document.createElement("div");
            divHeader.className = "expanderHead";
            divHeader.innerHTML = "<svg width='14px' height='8px' viewBox='0 0 12 6'><g><path d='M 5 5 L 10 1'/><path d='M 1 1 L 5 5'/></g></svg>&nbsp;<span>" + item.dataset.title + "</span>";
            // expander click event
            divHeader.addEventListener("click", function () {
                // open / close expander
                for (let i = 0; i < this.parentNode.children.length; i++) {
                    let expander = this.parentNode.children[i];
                    // check if it's expander header
                    if (expander.className == "expanderHead") {
                        if (expander == this && expander.nextElementSibling.style.display == "none") {
                            // open expander body
                            expander.nextElementSibling.style.display = "";
                            expander.innerHTML = "<svg width='14px' height='8px' viewBox='0 0 12 6'><g><path d='M 1 5 L 5 1'/><path d='M 5 1 L 10 5'/></g></svg>&nbsp;<span>" + expander.nextElementSibling.dataset.title + "</span>";
                            expander.style.borderBottomLeftRadius = "0";
                            expander.style.borderBottomRightRadius = "0";
                        }
                        else {
                            // close expander body
                            expander.nextElementSibling.style.display = "none";
                            expander.innerHTML = "<svg width='14px' height='8px' viewBox='0 0 12 6'><g><path d='M 5 5 L 10 1'/><path d='M 1 1 L 5 5'/></g></svg>&nbsp;<span>" + expander.nextElementSibling.dataset.title + "</span>";
                            expander.style.borderBottomLeftRadius = "6px";
                            expander.style.borderBottomRightRadius = "6px";
                        }
                    }
                }
            }, true);
            item.parentNode.insertBefore(divHeader, item);
            item.style.display = "none";
        }
    });
</script>

0voto

Heitor Althmann Points 137

Consultez le site de Jed Foster Readmore.js bibliothèque.

Son utilisation est aussi simple que :

$(document).ready(function() {
  $('article').readmore({collapsedHeight: 100});
});

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.10.0/jquery.min.js"></script>
<script src="https://fastcdn.org/Readmore.js/2.1.0/readmore.min.js" type="text/javascript"></script>

<article>
  <p>From this distant vantage point, the Earth might not seem of any particular interest. But for us, it's different. Consider again that dot. That's here. That's home. That's us. On it everyone you love, everyone you know, everyone you ever heard of, every human being who ever was, lived out their lives. The aggregate of our joy and suffering, thousands of confident religions, ideologies, and economic doctrines, every hunter and forager, every hero and coward, every creator and destroyer of civilization, every king and peasant, every young couple in love, every mother and father, hopeful child, inventor and explorer, every teacher of morals, every corrupt politician, every "superstar," every "supreme leader," every saint and sinner in the history of our species lived there – on a mote of dust suspended in a sunbeam.</p>

  <p>Space, the final frontier. These are the voyages of the starship Enterprise. Its five year mission: to explore strange new worlds, to seek out new life and new civilizations, to boldly go where no man has gone before!</p>

  <p>Here's how it is: Earth got used up, so we terraformed a whole new galaxy of Earths, some rich and flush with the new technologies, some not so much. Central Planets, them was formed the Alliance, waged war to bring everyone under their rule; a few idiots tried to fight it, among them myself. I'm Malcolm Reynolds, captain of Serenity. Got a good crew: fighters, pilot, mechanic. We even picked up a preacher, and a bona fide companion. There's a doctor, too, took his genius sister out of some Alliance camp, so they're keeping a low profile. You got a job, we can do it, don't much care what it is.</p>

  <p>Space, the final frontier. These are the voyages of the starship Enterprise. Its five year mission: to explore strange new worlds, to seek out new life and new civilizations, to boldly go where no man has gone before!</p>
</article>

Voici les options disponibles pour configurer votre widget :

{
  speed: 100,
  collapsedHeight: 200,
  heightMargin: 16,
  moreLink: '<a href="#">Read More</a>',
  lessLink: '<a href="#">Close</a>',
  embedCSS: true,
  blockCSS: 'display: block; width: 100%;',
  startOpen: false,

  // callbacks
  blockProcessed: function() {},
  beforeToggle: function() {},
  afterToggle: function() {}
},

On peut l'utiliser comme ça :

$('article').readmore({
  collapsedHeight: 100,
  moreLink: '<a href="#" class="you-can-also-add-classes-here">Continue reading...</a>',
});

J'espère que cela vous aidera.

0voto

Owaiz Yusufi Points 335

Utilisation de Pure Javascript

const collapsableBtn = document.querySelectorAll('.collapsable-toggle');

for (let index = 0; index < collapsableBtn.length; index++) {
    collapsableBtn[index].addEventListener('click', function(e) {
        // e.preventDefault();
        e.stopImmediatePropagation();

        iterateElement = this;

        getCollapsableParent = iterateElement.parentElement;

        if(getCollapsableParent.classList.contains('show')) {
            getCollapsableParent.classList.remove('show')
            iterateElement.innerText = iterateElement.getAttribute('data-onCloseText');

        } else {
            getCollapsableParent.classList.add('show');
            iterateElement.innerText = iterateElement.getAttribute('data-onOpenText');
        }
    })
}

.collapsable-container #expand {
   display:none;
}
.collapsable-container.show #expand {
    display:block;
}

<div class="collapsable-container">
    <a href="javascript:void(0);" class="collapsable-toggle" data-onOpenText="Hide First Content" data-onCloseText="Show First Content">Show First Content</a>
    <div id="expand">
        This is some Content
    </div>
 </div>

 <div class="collapsable-container">
    <a href="javascript:void(0);" class="collapsable-toggle" data-onOpenText="Hide Second Content" data-onCloseText="Show Second Content">Show Second Content</a>
    <div id="expand">
        This is some Content
    </div>
 </div>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X