Как создать расширяемый div для отображения первого элемента и переключения остальных

#jquery #html #onclick #expand

#jquery #HTML #onclick #Развернуть

Вопрос:

На моей веб-странице есть несколько разделов с новостями разного типа. Некоторые с изображениями, некоторые без (просто текст). Я хочу иметь возможность отображать первый абзац или первый div каждой истории, а затем по щелчку переключать все содержимое div (истории).

Я нашел этот фрагмент кода на веб-сайте CSS Tricks:

 var news = 2;

hidenews = "- Hide news archive";
shownews = "  Show news archive";

$(".archive").html( shownews );
$(".news:not(:lt(" news "))").hide();

$(".archive").click(function (e) {
   e.preventDefault();
       if ($(".news:eq(" news ")").is(":hidden")) {
           $(".news:hidden").show();
           $(".archive").html( hidenews );
       } else {
           $(".news:not(:lt(" news "))").hide();
           $(".archive").html( shownews );
       }
});

<div class="news">First news</div>
<div class="news">Second news</div>
<div class="news">Third news</div>
<a class="archive" href="#"></a>
  

Это отлично работает, но только с одним div. С несколькими на странице, когда я нажимаю кнопку «Показать», открываются все разделы.

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

Ответ №1:

вот измененная версия вашего кода

     $(document).ready(function(){
    var news = 0;

    hidenews = "- Hide news archive";
    shownews = "  Show news archive";

    $(".archive").html( shownews );
    $(".news").hide();
    $(".archive").click(function (e) {
       e.preventDefault();
    var $container = $(e.currentTarget).closest('.accordion-container');
           if ($container.find(".news:eq(" news ")").is(":hidden")) {
               $container.find(".news:not(:lt(" news "))").slideDown();
               $container.find(".archive").html( hidenews );
           } else {
               $container.find(".news:not(:lt(" news "))").slideUp();
               $container.find(".archive").html( shownews );
           }
    });

    });  
     <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <body>
    <div class="accordion-container">
    <div class="title">First news</div>
    <div class="news">Second news</div>
    <div class="news">Third news</div>


    <a class="archive" href="#"></a>
    </div>
    <div class="accordion-container">
    <div class="title">First news</div>
    <div class="news">Second news</div>
    <div class="news">Third news</div>


    <a class="archive" href="#"></a>
    </div>
    <div class="accordion-container">
    <div class="title">First news</div>
    <div class="news">Second news</div>
    <div class="news">Third news</div>


    <a class="archive" href="#"></a>
    </div>
    <div class="accordion-container">
    <div class="title">First news</div>
    <div class="news">Second news</div>
    <div class="news">Third news</div>


    <a class="archive" href="#"></a>
    </div>
    <div class="accordion-container">
    <div class="title">First news</div>
    <div class="news">Second news</div>
    <div class="news">Third news</div>


    <a class="archive" href="#"></a>
    </div>

    </body>  

Комментарии:

1. Это отлично работает! Спасибо. Возможно ли, чтобы он сворачивался при загрузке? Прямо сейчас, когда страница загружается, отображаются целые истории.

2. Также насколько сложно было бы добавить приятные плавные переходы?

3. @user7040259 пожалуйста, проверьте, что ответ отредактирован для переходов и по умолчанию свернут.

Ответ №2:

У вас должна быть toggle кнопка для каждого элемента.

 //Hide all content
$('.content').hide();
$('.archive').click(function(){
  //Get content DIV
  var content = $(this).parent('.news').find('.content');
  //Content toggle
  content.toggle();
  //Show / Hide adjusted
  $(this).text(content.is(":visible") ? 'Hide' : 'Show');
});
  

 $('.content').hide();
$('.archive').click(function(){
  var content = $(this).parent('.news').find('.content');
  content.toggle();
  $(this).text(content.is(":visible") ? 'Hide' : 'Show');
});  
 <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<div class="news">First news
 <div class="content">First news Content</div>
  <a class="archive" href="#">Show</a>
</div>
<div class="news">Second news
  <div class="content">Second news Content</div>
  <a class="archive" href="#">Show</a>
</div>
<div class="news">Third news
  <div class="content">Third news Content</div>
  <a class="archive" href="#">Show</a>
</div>  

Ответ №3:

Вы также можете использовать bootstrap accordian. Возможно, вам придется немного отредактировать.

 <!DOCTYPE html>
<html>
<head>
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
  <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
</head>
<body>

<div class="container">
  <h2>Accordion </h2>
 
  <div class="panel-group" id="accordion">
    <div class="panel panel-default">
      <div class="panel-heading">
        <h4 class="panel-title">
          <a data-toggle="collapse" data-parent="#accordion" href="#collapse1">Collapsible Group 1</a>
        </h4>
      </div>
      <div id="collapse1" class="panel-collapse collapse in">
        <div class="panel-body">Lorem ipsum dolor sit amet, consectetur adipisicing elit,
        </div>
      </div>
    </div>
    <div class="panel panel-default">
      <div class="panel-heading">
        <h4 class="panel-title">
          <a data-toggle="collapse" data-parent="#accordion" href="#collapse2">Collapsible Group 2</a>
        </h4>
      </div>
      <div id="collapse2" class="panel-collapse collapse">
        <div class="panel-body">Lorem ipsum dolor sit amet, consectetur adipisicing elit,
        </div>
      </div>
    </div>
    <div class="panel panel-default">
      <div class="panel-heading">
        <h4 class="panel-title">
          <a data-toggle="collapse" data-parent="#accordion" href="#collapse3">Collapsible Group 3</a>
        </h4>
      </div>
      <div id="collapse3" class="panel-collapse collapse">
        <div class="panel-body">Lorem ipsum dolor sit amet, consectetur adipisicing elit,
       </div>
      </div>
    </div>
  </div>
</div>
    
</body>
</html>  

Комментарии:

1. Спасибо за быстрый ответ. Аккордеон — это не совсем то, что мне нужно. Мне нужно, чтобы кнопка под историей была прочитана / просмотрена больше, и как только div будет расширен, измените его, чтобы читать / просматривать меньше.

Ответ №4:

Используйте функцию jQuery Accordion.Проверьте эту ссылку https://jqueryui.com/accordion /