Як я можу розгорнути та згорнути <div> за допомогою JavaScript?


96

Я створив список на своєму сайті. Цей список створюється за допомогою циклу foreach, який складається з інформацією з моєї бази даних. Кожен елемент - це контейнер з різними розділами, тому це не список, як 1, 2, 3 ... тощо. Я перелічую повторювані розділи з інформацією. У кожному розділі є підрозділ. Загальна збірка така:

<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>

Отже, я намагаюся викликати функцію з onclick = "majorpointsexpand ($ (this) .find ('legend'). InnerHTML)"

Div, яким я намагаюся маніпулювати, за замовчуванням є style = "display: none", і я хочу використовувати javascript, щоб зробити його видимим при натисканні.

"$ (This) .find ('legend'). InnerHTML" намагається передати, в даному випадку, "Розгорнути" як аргумент у функції.

Ось 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";
            }
    }

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

У мене jQuery пов'язаний з документом за допомогою:

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

У <head></head>розділі.


2
Я думаю, що ви намагаєтесь досягти - це акордеон jqueryui.com/accordion
Марк

1
$ це я намагаюся сказати "стосовно" елемента HTML, який функція запускається всередині.
Ryan Mortensen,

1
@hungerpain - Я думаю, що запитувач може бути новим для jQuery і просто забув дужки навколо $(this). Сподіваюся, це допомагає.
jmort253

2
Думаю, спочатку слід вивчити більше про jQuery. Очевидно, ви мало що знаєте про різницю між jQuery та JavaScript
tom10271

1
@aokaddaoc ти був абсолютно правий;)
Райан Мортенсен,

Відповіді:


183

Добре, отже, у вас тут є два варіанти:

  1. Використовуйте акордеон jQuery UI - це приємно, легко та швидко. Більше інформації дивіться тут
  2. Або, якщо ви все-таки хочете зробити це самостійно, ви можете видалити fieldset(в будь-якому випадку не має семантичного права використовувати його для цього) і створити структуру самостійно.

Ось як ви це робите. Створіть таку структуру HTML:

<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>

За допомогою цього CSS: (Це приховує .contentматеріали під час завантаження сторінки.

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

Потім, використовуючи jQuery, напишіть clickподію для заголовка.

$(".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";
        });
    });

});

Ось демо: http://jsfiddle.net/hungerpain/eK8X5/7/


9
+1, оскільки це дозволить вирішити проблему, якщо на сторінці буде більше одного елемента DIV. Іншими словами, оскільки ви націлюєтесь на вміст у натиснутому заголовку, це добре масштабується.
jmort253

2
Набір полів не є обов'язковим. Я позбудуся цього і просто скористаюся бордюром. Це чудово, оскільки він вибирає div для розгортання щодо заголовка, який я натиснув, що важливо, оскільки у мене може бути кілька різних номерів перелічених елементів, залежно від налаштувань користувача та інших факторів.
Райан Мортенсен,

1
@Unipartisandev подивіться на це: jsfiddle.net/hungerpain/476Nq повноцінний приклад :)
krishwader

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

Чудово, дякую. Заощаджено багато часу!
Василь Муса

21

як щодо:

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>

Скрипка

Таким чином ви прив'язуєте подію click до .majorpointsкласу, і вам не потрібно кожного разу писати її в HTML.


Привіт, raam86, я зробив би цей крок далі і зробив би пошук. Div у div, використовуючи клас замість ідентифікатора. Якщо запитувач має декілька з цих наборів полів на сторінці, він захоче націлити на приховану групу, пов’язану з певним набором полів, на який клацнули. Сподіваюся, це допомагає! :) Наприклад, ви можете використовувати .closest, щоб отримати посилання на батьківський div, а потім скористатися .find, щоб знайти div з class = "hider".
jmort253

1
Я знаю, що зараз 3:00;), але я просто помітив, що ви все ще використовуєте ідентифікатори у своєму jsFiddle. Це може призвести до невизначеної поведінки, оскільки специфікація W3C говорить, що кожен ідентифікатор повинен бути унікальним. Якщо ви зміните приховану програму на клас, то це буде більш захищеним від помилок або дивної, незрозумілої поведінки в інших браузерах. Сподіваюся, це допомагає!
jmort253

насправді це має бути $ ('. majorpointslegend'). click (function () {$ (this) .parent (). find ('. hider'). toggle ();}); АБО інакше, коли клацне будь-яке місце в наборі полів, воно згорнуться.
Awatatah

7

Отже, перш за все, ваш Javascript навіть не використовує jQuery. Є кілька способів зробити це. Наприклад:

Перший спосіб, використовуючи toggleметод 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/

Інший спосіб - просто використовувати showметод 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/

Все-таки третім способом є використання slideToggleметоду jQuery, який дозволяє отримати деякі ефекти. Такі, $('#showMe').slideToggle('slow');які повільно відображатимуть прихований div.


Припустимо, у нього є більше одного з цих елементів showMe на сторінці? Пам'ятайте, що він використовує цикл for для побудови їх списку, тому націлювання class = "showMe" вплине лише на перший екземпляр цього елемента. Моя пропозиція полягає у посиланні на елемент showMe щодо натиснутого. Тоді це було б хорошим рішенням. Сподіваюся, це допомагає! :)
jmort253

Правильно, але він використовує цикл для побудови списку з низки <li>елементів, а не div. У будь-якому випадку, він міг просто використати ідентифікатор елемента, щоб потім приховати його.
Michael Hawkins

Ви думаєте про підрозділи і забуваєте, що таких буде більше. Кожен розділ заповнено елементами li у підрозділі . "Цей список створений за допомогою циклу foreach, який будується з інформацією з моєї бази даних. Кожен елемент є контейнером з різними розділами, тому це не список, як 1, 2, 3 ... і т. Д. Я перелічую повторювані розділи з інформацією . У кожному розділі є підрозділ ". коротше, він просто показав вам лише один розділ, хоча їх буде більше.
jmort253

6

Можливо, ви захочете поглянути на цей простий метод Javascript, який буде викликаний при натисканні на посилання, щоб зробити панель / 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>

Ви можете передати div-ідентифікатор, і він буде перемикатися між відображенням 'none' або 'block'.

Першоджерело на snip2code - Як згорнути div у html


6

Тут багато проблем

Я створив скрипку, яка вам підходить: http://jsfiddle.net/w9kSU/

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

3

спробуйте 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");
            }
    }

3

Ось мій приклад анімації - список співробітників з розширеним описом.

<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>

Скрипка


3

Погляньте на функцію toggle() jQuery :

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

Крім того, функція innerHTML jQuery є .html().


1
Привіт, ласкаво просимо до Stack Overflow! Ви повинні показати приклад, щоб відповідь була повнішою. Якщо посилання обірветься, ваша відповідь все одно буде корисна майбутнім відвідувачам. Удачі! :)
jmort253

Ви можете редагувати, щоб додати приклад, або додати це як коментар. Дякую.
JGallardo

2

Оскільки на сторінці є jQuery, ви можете видалити цей onclickатрибут та majorpointsexpandфункцію. Додайте наступний сценарій унизу сторінки або, бажано, до зовнішнього файлу .js:

$(function(){

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

});

Ці рішення повинні працювати з вашим HTML як є, але насправді це не дуже надійна відповідь. Якщо ви зміните fieldsetмакет, він може його зламати. Я пропоную вам помістити classатрибут у цей прихований div, наприклад, class="majorpointsdetail"і використовувати замість цього цей код:

$(function(){

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

});

Obs: </fieldset>у вашому запитанні немає закриваючого тегу, тому я припускаю, що прихований div знаходиться всередині набору полів.


Ви маєте рацію. Є завершальний набір полів, але я пропустив це у своєму питанні. Це відбувається відразу після закриття внутрішнього </div> та перед закриттям зовнішнього </div>
Ryan Mortensen

1

Якщо ви використовували розбірну роль даних, наприклад

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

тоді він закриє розгорнутий div

    $("#selector").collapsible().collapsible("collapse");   

1

Перегляньте бібліотеку Readmore.js Джеда Фостера .

Його використання настільки просто, як:

$(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>

Ось доступні варіанти налаштування віджета:

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

Використання може використовувати його як:

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

Сподіваюся, це допоможе.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.