Comment puis-je développer et réduire une <div> en utilisant javascript?

96

J'ai créé une liste sur mon site. Cette liste est créée par une boucle foreach qui se construit avec les informations de ma base de données. Chaque élément est un conteneur avec différentes sections, donc ce n'est pas une liste comme 1, 2, 3 ... etc. Je liste des sections répétitives avec des informations. Dans chaque section, il y a une sous-section. La version 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>

Donc, j'essaye d'appeler une fonction avec onclick = "majorpointsexpand ($ (this) .find ('legend'). InnerHTML)"

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

"$ (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 ne sais pas trop comment fonctionne javascript.

J'ai jQuery lié au document avec:

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

Dans la <head></head>section.

Ryan Mortensen
la source
2
Je pense que ce que vous essayez de réaliser est un accordéon jqueryui.com/accordion
Marc
1
$ c'est moi qui essaie de dire "par rapport à" l'élément HTML dans lequel la fonction est déclenchée.
Ryan Mortensen
1
@hungerpain - Je pense que le demandeur est peut-être nouveau dans jQuery et vient d'oublier la parenthèse $(this). J'espère que cela t'aides.
jmort253
2
Je pense que vous devriez d'abord étudier davantage jQuery. Apparemment, vous ne savez pas grand-chose sur la différence entre jQuery et JavaScript
tom10271
1
@aokaddaoc vous aviez absolument raison;)
Ryan Mortensen

Réponses:

183

D'accord, vous avez donc deux options ici:

  1. Utilisez l'accordéon de jQuery UI - c'est agréable, facile et rapide. Voir plus d'informations ici
  2. Ou, si vous voulez toujours faire cela par vous-même, vous pouvez supprimer le fieldset(ce n'est pas sémantiquement correct de l'utiliser pour cela de toute façon) et créer une structure par vous-même.

Voici comment procéder. Créez une structure HTML comme celle-ci:

<div class="container">
    <div class="header"><span>Expand</span>

    </div>
    <div class="content">
        <ul>
            <li>This is just some random content.</li>
            <li>This is just some random content.</li>
            <li>This is just some random content.</li>
            <li>This is just some random content.</li>
        </ul>
    </div>
</div>

Avec ce CSS: (Ceci est pour cacher le .contenttruc lorsque la page se charge.

.container .content {
    display: none;
    padding : 5px;
}

Ensuite, à l'aide de jQuery, écrivez un clickévénement pour l'en-tête.

$(".header").click(function () {

    $header = $(this);
    //getting the next element
    $content = $header.next();
    //open up the content needed - toggle the slide- if visible, slide up, if not slidedown.
    $content.slideToggle(500, function () {
        //execute this after slideToggle is done
        //change text of header based on visibility of content div
        $header.text(function () {
            //change text based on condition
            return $content.is(":visible") ? "Collapse" : "Expand";
        });
    });

});

Voici une démo: http://jsfiddle.net/hungerpain/eK8X5/7/

Krishwader
la source
9
+1 car cela résoudrait le problème s'il y avait plus d'un élément DIV sur la page. En d'autres termes, puisque vous ciblez le contenu dans l'en-tête cliqué, cela s'adapte bien.
jmort253
2
Le fieldset n'est pas impératif. Je vais m'en débarrasser et utiliser simplement une bordure. C'est excellent car il sélectionne le div à développer par rapport à l'en-tête sur lequel j'ai cliqué, ce qui est important en raison du fait que je peux avoir plusieurs nombres différents d'éléments répertoriés en fonction des paramètres de l'utilisateur et d'autres facteurs.
Ryan Mortensen
1
@Unipartisandev regardez ceci: jsfiddle.net/hungerpain/476Nq exemple à part entière :)
krishwader
J'apprécie vraiment l'aide. Il y aura d'autres parties du site qui devront sans aucun doute utiliser un accordéon même si cette chose en particulier est plus un exemple d'affichage tout ou rien. J'ai toujours des problèmes. Mon jQuery était obsolète et ne se chargeait pas. C'est corrigé, mais je ne le fais toujours pas. Ça fait une bonne heure que je me moque dessus, je vais dormir dessus. Peut-être que demain ça me frappera.
Ryan Mortensen
Merveilleux, merci. Gain de temps!
Basil Musa
21

que diriez-vous:

jQuery:

$('.majorpoints').click(function(){
    $(this).find('.hider').toggle();
});

HTML

<div>
  <fieldset class="majorpoints">
    <legend class="majorpointslegend">Expand</legend>
    <div class="hider" style="display:none" >
        <ul>
            <li>cccc</li>
            <li></li>
        </ul>
    </div>
</div>

Violon

De cette façon, vous liez l'événement click à la .majorpointsclasse et vous n'avez pas à l'écrire dans le HTML à chaque fois.

raam86
la source
Salut raam86, je vais aller plus loin et faire un .find sur le div en utilisant une classe au lieu d'un id. Si le demandeur a plusieurs de ces jeux de champs sur la page, il voudra cibler le masque pour celui lié au jeu de champs spécifique sur lequel vous avez cliqué. J'espère que cela t'aides! :) Par exemple, vous pouvez utiliser .closest pour obtenir une référence au div parent, puis utiliser .find pour localiser le div avec un class = "hider" à la place.
jmort253
1
Je sais qu'il est 3 heures du matin;), mais je viens de remarquer que vous utilisez toujours les identifiants dans votre jsFiddle. Cela peut entraîner un comportement indéfini car la spécification W3C indique que chaque identifiant doit être unique. Si vous changez le masque en classe, cela sera plus immunisé contre les bogues ou les comportements étranges et inexpliqués dans d'autres navigateurs. J'espère que cela t'aides!
jmort253
il devrait en fait être $ ('. majorpointslegend'). click (function () {$ (this) .parent (). find ('. hider'). toggle ();}); OU sinon, lorsque l'utilisateur clique à un endroit quelconque du jeu de champs, il se réduira.
Awatatah
7

Donc, tout d'abord, votre Javascript n'utilise même pas jQuery. Il y a plusieurs façons de procéder. Par exemple:

Première façon, en utilisant la toggleméthode jQuery :

<div class="expandContent">
        <a href="#">Click Here to Display More Content</a>
 </div>
<div class="showMe" style="display:none">
        This content was hidden, but now shows up
</div>

<script>  
    $('.expandContent').click(function(){
        $('.showMe').toggle();
    });
</script>

jsFiddle: http://jsfiddle.net/pM3DF/

Une autre façon consiste simplement à utiliser la showméthode jQuery :

<div class="expandContent">
        <a href="#">Click Here to Display More Content</a>
 </div>
<div class="showMe" style="display:none">
        This content was hidden, but now shows up
</div>

<script>
    $('.expandContent').click(function(){
        $('.showMe').show();
    });
</script>

jsFiddle: http://jsfiddle.net/Q2wfM/

Pourtant, une troisième façon consiste à utiliser la slideToggleméthode de jQuery qui permet certains effets. Tels que $('#showMe').slideToggle('slow');qui affichera lentement le div caché.

Michael Hawkins
la source
Supposons qu'il ait plus d'un de ces éléments showMe sur la page? Rappelez-vous, il utilise une boucle for pour construire une liste de ceux-ci, donc le ciblage de class = "showMe" n'affecterait que la première instance de cet élément. Ma suggestion est de référencer l'élément showMe par rapport à celui sur lequel vous avez cliqué. Alors ce serait une bonne solution. J'espère que cela t'aides! :)
jmort253
Oui, mais il utilise la boucle pour construire la liste en une série d' <li>éléments, pas en divs. Dans tous les cas, il pourrait simplement utiliser l'ID d'élément pour le masquer.
Michael Hawkins
Vous pensez aux sous-sections et oubliez qu'il y en aura plus. Chaque section contient des éléments li dans une sous - section . "Cette liste est créée par une boucle foreach qui se construit avec les informations de ma base de données. Chaque élément est un conteneur avec différentes sections, donc ce n'est pas une liste comme 1, 2, 3 ... etc. Je liste des sections répétitives avec des informations . Dans chaque section, il y a une sous-section. " en bref, il ne vous a montré qu'une seule section, même s'il y en aura plus.
jmort253
6

Vous voudrez peut-être jeter un œil à cette méthode Javascript simple à invoquer lorsque vous cliquez sur un lien pour agrandir ou réduire un panneau / div.

<script language="javascript"> 
function toggle(elementId) {
    var ele = document.getElementById(elementId);
    if(ele.style.display == "block") {
            ele.style.display = "none";
    }
    else {
        ele.style.display = "block";
    }
} 
</script>

Vous pouvez transmettre l'ID div et il basculera entre l'affichage «aucun» ou «bloc».

Source originale sur snip2code - Comment réduire un div en html

Mike Scattoni
la source
6

Beaucoup de problèmes ici

J'ai mis en place un violon qui fonctionne pour vous: http://jsfiddle.net/w9kSU/

$('.majorpointslegend').click(function(){
    if($(this).text()=='Expand'){
        $('#mylist').show();
        $(this).text('Colapse');
    }else{
        $('#mylist').hide();
        $(this).text('Expand');
    }
});
David Lin
la source
3

essayez jquery,

  <div>
        <a href="#" class="majorpoints" onclick="majorpointsexpand(" + $('.majorpointslegend').html() + ")"/>
        <legend class="majorpointslegend">Expand</legend>
        <div id="data" style="display:none" >
            <ul>
                <li></li>
                <li></li>
            </ul>
        </div>
    </div>


function majorpointsexpand(expand)
    {
        if (expand == "Expand")
            {
                $('#data').css("display","inherit");
                $(".majorpointslegend").html("Collapse");
            }
        else
            {
                $('#data').css("display","none");
                $(".majorpointslegend").html("Expand");
            }
    }
nmanandhan
la source
3

Voici mon exemple d'animation d'une liste de personnel avec développer une description.

<html>
  <head>
    <style>
      .staff {            margin:10px 0;}
      .staff-block{       float: left; width:48%; padding-left: 10px; padding-bottom: 10px;}
      .staff-title{       font-family: Verdana, Tahoma, Arial, Serif; background-color: #1162c5; color: white; padding:4px; border: solid 1px #2e3d7a; border-top-left-radius:3px; border-top-right-radius: 6px; font-weight: bold;}
      .staff-name {       font-family: Myriad Web Pro; font-size: 11pt; line-height:30px; padding: 0 10px;}
      .staff-name:hover { background-color: silver !important; cursor: pointer;}
      .staff-section {    display:inline-block; padding-left: 10px;}
      .staff-desc {       font-family: Myriad Web Pro; height: 0px; padding: 3px; overflow:hidden; background-color:#def; display: block; border: solid 1px silver;}
      .staff-desc p {     text-align: justify; margin-top: 5px;}
      .staff-desc img {   margin: 5px 10px 5px 5px; float:left; height: 185px; }
    </style>
  </head>
<body>
<!-- START STAFF SECTION -->
<div class="staff">
  <div class="staff-block">
    <div  class="staff-title">Staff</div>
    <div class="staff-section">
        <div class="staff-name">Maria Beavis</div>
        <div class="staff-desc">
          <p><img src="http://www.craigmarlatt.com/canada/images/security&defence/coulombe.jpg" />Maria earned a Bachelor of Commerce degree from McGill University in 2006 with concentrations in Finance and International Business. She has completed her wealth Management Essentials course with the Canadian Securities Institute and has worked in the industry since 2007.</p>
        </div>
        <div class="staff-name">Diana Smitt</div>
        <div class="staff-desc">
          <p><img src="http://www.craigmarlatt.com/canada/images/security&defence/coulombe.jpg" />Diana joined the Diana Smitt Group to help contribute to its ongoing commitment to provide superior investement advice and exceptional service. She has a Bachelor of Commerce degree from the John Molson School of Business with a major in Finance and has been continuing her education by completing courses.</p>
        </div>
        <div class="staff-name">Mike Ford</div>
        <div class="staff-desc">
          <p><img src="http://www.craigmarlatt.com/canada/images/security&defence/coulombe.jpg" />Mike: A graduate of École des hautes études commerciales (HEC Montreal), Guillaume holds the Chartered Investment Management designation (CIM). After having been active in the financial services industry for 4 years at a leading competitor he joined the Mike Ford Group.</p>
        </div>
    </div>
  </div>

  <div class="staff-block">
    <div  class="staff-title">Technical Advisors</div>
    <div class="staff-section">
        <div class="staff-name">TA Elvira Bett</div>
        <div class="staff-desc">
          <p><img src="http://www.craigmarlatt.com/canada/images/security&defence/coulombe.jpg" />Elvira has completed her wealth Management Essentials course with the Canadian Securities Institute and has worked in the industry since 2007. Laura works directly with Caroline Hild, aiding in revising client portfolios, maintaining investment objectives, and executing client trades.</p>
        </div>
        <div class="staff-name">TA Sonya Rosman</div>
        <div class="staff-desc">
          <p><img src="http://www.craigmarlatt.com/canada/images/security&defence/coulombe.jpg" />Sonya has a Bachelor of Commerce degree from the John Molson School of Business with a major in Finance and has been continuing her education by completing courses through the Canadian Securities Institute. She recently completed her Wealth Management Essentials course and became an Investment Associate.</p>
        </div>
        <div class="staff-name">TA Tim Herson</div>
        <div class="staff-desc">
          <p><img src="http://www.craigmarlatt.com/canada/images/security&defence/coulombe.jpg" />Tim joined his father&#8217;s group in order to continue advising affluent families in Quebec. He is currently President of the Mike Ford Professionals Association and a member of various other organisations.</p>
        </div>
    </div>
  </div>
</div>
<!-- STOP STAFF SECTION -->

<script src="http://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 

<script language="javascript"><!--
//<![CDATA[
$('.staff-name').hover(function() {
    $(this).toggleClass('hover');
});
var lastItem;
    $('.staff-name').click(function(currentItem) {
        var currentItem = $(this);
      if ($(this).next().height() == 0) {
          $(lastItem).css({'font-weight':'normal'});
          $(lastItem).next().animate({height: '0px'},400,'swing');
          $(this).css({'font-weight':'bold'});
          $(this).next().animate({height: '300px',opacity: 1},400,'swing');
      } else {
          $(this).css({'font-weight':'normal'});
          $(this).next().animate({height: '0px',opacity: 1},400,'swing');
      }
      lastItem = $(this);
    });
//]]>
--></script>

</body></html>

Violon

Intacto
la source
3

Jetez un œil à la fonction toggle() jQuery :

http://api.jquery.com/toggle/

En outre, la fonction innerHTML jQuery est .html().

est-ce l'amour
la source
1
Bonjour, bienvenue dans Stack Overflow! Vous devriez montrer un exemple pour que votre réponse soit plus complète. Si le lien venait à se rompre, votre réponse serait toujours utile aux futurs visiteurs. Bonne chance! :)
jmort253
Pourriez-vous modifier pour ajouter un exemple ou ajouter ceci en tant que commentaire. Merci.
JGallardo
2

Puisque vous avez jQuery sur la page, vous pouvez supprimer cet onclickattribut et la majorpointsexpandfonction. Ajoutez le script suivant au bas de votre page ou, de préférence, dans un fichier .js externe:

$(function(){

  $('.majorpointslegend').click(function(){
    $(this).next().toggle().text( $(this).is(':visible')?'Collapse':'Expand' );
  });

});

Cette solution devrait fonctionner avec votre HTML tel quel, mais ce n'est pas vraiment une réponse très robuste. Si vous modifiez votre fieldsetmise en page, cela pourrait la casser. Je vous suggère de mettre un classattribut dans ce div caché, comme class="majorpointsdetail"et d'utiliser ce code à la place:

$(function(){

  $('.majorpoints').on('click', '.majorpointslegend', function(event){
    $(event.currentTarget).find('.majorpointsdetail').toggle();
    $(this).text( $(this).is(':visible')?'Collapse':'Expand' );
  });

});

Obs: il n'y a pas de </fieldset>balise de fermeture dans votre question, donc je suppose que le div caché est à l'intérieur du fieldset.

Sergiopereira
la source
Vous avez raison. Il y a un champ de clôture, mais je l'ai manqué dans ma question. Il vient immédiatement après la clôture intérieure </div> et avant la clôture extérieure </div>
Ryan Mortensen
1

Si vous avez utilisé le rôle de données réductible, par exemple

    <div id="selector" data-role="collapsible" data-collapsed="true">
    html......
    </div>

puis il fermera le div développé

    $("#selector").collapsible().collapsible("collapse");   
Atif Hussain
la source
1

Consultez la bibliothèque Readmore.js de Jed Foster .

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() {}
},

L'utilisation peut l'utiliser comme:

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

J'espère que cela aide.

Heitor Althmann
la source