Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Раскрывающийся и сворачивающийся по клику div (https://javascript.ru/forum/dom-window/46783-raskryvayushhijjsya-i-svorachivayushhijjsya-po-kliku-div.html)

kefalia 23.04.2014 23:40

Раскрывающийся и сворачивающийся по клику div
 
Добрый вечер! Прошу найти решение задачи.

Есть несколько div, при клике на которые разворачивается скрытый текст:

<div class="view-source"><a href="#></a>
<div class="hide">Спрятанный текст</div>
</div>
<div class="view-source"><a href="#></a>
<div class="hide">Спрятанный текст</div>
</div>
<div class="view-source"><a href="#></a>
<div class="hide">Спрятанный текст</div>
</div>


$(document).ready(function(){                                                  
    $('.view-source .hide').hide();
    $('.view-source a').toggle(
      function(){
        $(this).siblings('.hide').stop(false, true).slideDown(500);
      },
     function(){
        $(this).siblings('.hide').stop(false, true).slideUp(500);
     }
   );
});


Как сделать так, чтобы развернутый div сворачивался при клике на любой из других div'ов - оберток (с классом view-source)? То есть, на один момент времени должен быть открыт только 1 скрытый div.

jsnb 24.04.2014 06:05

Кавычки у атрибутов надо закрывать...
<!DOCTYPE HTML>
<html>
  <head>
  <meta charset="utf-8">
  <script src="http://code.jquery.com/jquery-1.11.0.min.js"></script>
  </head>
  <body>
<div class="view-source">
  <a href="#">111</a>
  <div class="hide">Спрятанный текст</div>
</div>
<div class="view-source">
  <a href="#">222</a>
  <div class="hide">Спрятанный текст</div>
</div>
<div class="view-source">
  <a href="#">333</a>
  <div class="hide">Спрятанный текст</div>
</div>

<script>
$(document).ready(function(){                                                  
    $('.view-source .hide').hide();
    $('.view-source a').on('click', function() {
      $('.view-source .hide').slideUp(500);
      $(this).parent().find('.hide').slideDown(500);
    });
});
</script>

  </body>
</html>

kefalia 24.04.2014 09:19

Спасибо! :)

рони 24.04.2014 09:53

jsnb,
нажмите 111 второй раз или поместите дивы в конец длинной страницы ...

Вариант
<!DOCTYPE HTML>
<html>
  <head>
  <meta charset="utf-8">
  <script src="http://code.jquery.com/jquery-1.11.0.min.js"></script>
  </head>
  <body>
<div class="view-source">
  <a href="#">111</a>
  <div class="hide">Спрятанный текст</div>
</div>
<div class="view-source">
  <a href="#">222</a>
  <div class="hide">Спрятанный текст</div>
</div>
<div class="view-source">
  <a href="#">333</a>
  <div class="hide">Спрятанный текст</div>
</div>

<script>
$(function(){
    $('.view-source .hide').hide();
    $a = $('.view-source a');
    $a.on('click', function(event) {
      event.preventDefault();
      $a.not(this).next().slideUp(500);
      $(this).next().slideToggle(500);
    });
});
</script>

  </body>
</html>

jsnb 24.04.2014 12:23

Цитата:

Сообщение от рони (Сообщение 309027)
jsnb,
нажмите 111 второй раз или поместите дивы в конец длинной страницы ...

Да, спасибо за замечание.

Александр77 25.04.2016 14:44

Перекидывает на самый верх сайта
 
Здравствуйте, сделал отдельно все работает. Переношу на сайт, при нажатии выбрасывает на верх страницы и div не раскрывается. Думаю дело в ссылке "#" может можно чем-то заменить.Спасибо!

рони 25.04.2016 15:25

Александр77,
может забыли
function(event) {
event.preventDefault(); добавить?

Александр77 25.04.2016 16:35

не работает код
 
проблема в том что у меня на этой странице подключен слайдер и когда я подключаю библиотеку слайдер перестает работать

рони 25.04.2016 16:43

Александр77,
ненадо грузить много версий jquery достаточно одной

Александр77 25.04.2016 16:46

я их заменил и слайдер перестал работать? с чем это может быть связанно

рони 25.04.2016 17:17

Александр77,
c тем что слайдер устарел и не работает с новой версией jquery , так не ставьте новую оставьте с которой работал слайдер.

Николай_777 06.06.2016 22:36

рони,
привет помоги со скриптом

Николай_777 06.06.2016 22:38

<!DOCTYPE HTML>
<html>
  <head>
  <meta charset="utf-8">
  <script src="http://code.jquery.com/jquery-1.11.0.min.js"></script>
  </head>
  <body>
<div class="view-source">
  <a href="#">111</a>
  <div class="hide">Спрятанный текст</div>
</div>
<div class="view-source">
  <a href="#">222</a>
  <div class="hide">Спрятанный текст</div>
</div>
<div class="view-source">
  <a href="#">333</a>
  <div class="hide">Спрятанный текст</div>
</div>

<script>
$(function(){
    $('.view-source .hide').hide();
    $a = $('.view-source a');
    $a.on('click', function(event) {
      event.preventDefault();
      $a.not(this).next().slideUp(500);
      $(this).next().slideToggle(500);
    });
});
</script>

  </body>
</html>

скрипт твой
дело в том что работает он не много не так как надо а именно мне на до чтобы внутри открывающего блока была ссылка а когда я ее добавляю блок закрывается

рони 06.06.2016 23:04

Цитата:

Сообщение от Николай_777
именно мне на до чтобы внутри открывающего блока была ссылка а когда я ее добавляю блок закрывается

не понял ничего
$a = $('.view-source > a'); добавьте красное

Николай_777 06.06.2016 23:19

спасибо

Ust 17.07.2016 22:33

Спасибо, скажите, а как сделать, чтобы первый пунт был развернут по умолчани при загрузке страницы?

рони 17.07.2016 22:46

Ust,
$('.view-source .hide').hide().eq(0).show();

Paul12345 25.02.2017 20:43

Ребята, привет. Спасибо за подробное решение, поставил себе все работает, но хотелось бы уточнить. Можно ли сделать так, чтобы при обновлении страницы блок не раскрывался? А то сейчас, когда обновляешь страницу или заходишь по новой, блок сначала раскрывается, а потом закрывается как и должно быть. Буду рад помощи. Спасибо!:help:

рони 25.02.2017 21:10

Paul12345, в css добавить
.view-source .hide{
      display: none;
    }

из js убрать
$('.view-source .hide').hide();

Paul12345 25.02.2017 21:17

Цитата:

Сообщение от рони (Сообщение 445471)
Paul12345, в css добавить
.view-source .hide{
      display: none;
    }

из js убрать
$('.view-source .hide').hide();

Супер, спасибо большое!!!

Paul12345 15.04.2017 12:12

Рони, возник еще вопрос, помогите, пожалуйста, какой должна быть структура кода и js, чтобы список был в одну линию, а раскрывался контент каждого элемента в одном диве под списком.

рони 15.04.2017 15:14

Paul12345,
искать примеры tabs

http://javascript.ru/forum/dom-window/67121-pereklyuchatel-tabov-v-samikh-vkladkakh-2.html#post442719


http://javascript.ru/forum/misc/6666...tml#post439388

Paul12345 15.04.2017 15:40

Цитата:

Сообщение от рони (Сообщение 450082)

Да, чего-то я затупил, это же обычные табы! )) sorry! Спасибо все равно за ссылки!

Paul12345 15.04.2017 17:52

Использовал вот такую конструкцию:
<!-- Tab -->  
  <span class='tab'>Ссылка 1</span>
  <span class='tab'>Ссылка 2</span>
  <span class='tab'>Ссылка 3</span>

<div class="tab-content">
  <div class="c">Текст 1</div>
  <div class="c none">Текст 2</div>
  <div class="c none">Текст 3</div>
</div> 
            <!-- End Tab -->

<script type="text/javascript">
var tabs = document.querySelectorAll(".tab");
var con = document.querySelectorAll(".c");
var temp = con[0];
[].forEach.call(tabs, function(item, i) {
    item.addEventListener("click", function() {
        temp.classList.add("none");
        temp = con[i];
        temp.classList.remove("none")
    })
});
</script>

Подскажите, как можно задать отдельный фон активной вкладке? Через CSS не получается.
Можно потом перенести сообщение в другую ветку, если здесь не в тему. Спасибо!

рони 15.04.2017 18:04

Цитата:

Сообщение от Paul12345
как можно задать отдельный фон активной вкладке

не могли бы вы пояснить? и чем класс c не устраивает?

Paul12345 15.04.2017 18:06

Я наверно не правильно выразился, фон самого таба

рони 15.04.2017 18:13

Paul12345,
<!DOCTYPE html>

<html>
<head>
  <title>Untitled</title>
  <meta charset="utf-8">
  <style type="text/css">
  .none  {
    display: none;
  }
  .active {
      background-color: hsla(240, 100%, 40%, 1);
       color: hsla(0, 0%, 100%, 1);
  }

  </style>


</head>

<body>
<!-- Tab -->
  <span class='tab active'>Ссылка 1</span>
  <span class='tab'>Ссылка 2</span>
  <span class='tab'>Ссылка 3</span>

<div class="tab-content">
  <div class="c">Текст 1</div>
  <div class="c none">Текст 2</div>
  <div class="c none">Текст 3</div>
</div>
            <!-- End Tab -->

<script type="text/javascript">
var tabs = document.querySelectorAll(".tab");
var con = document.querySelectorAll(".c");
var temp = 0;
[].forEach.call(tabs, function(item, i) {
    item.addEventListener("click", function() {
        item.classList.add("active");
        tabs[temp].classList.remove("active")
        con[temp].classList.add("none");
        temp = i;
        con[temp].classList.remove("none")
    })
});
</script>


</body>
</html>

Paul12345 15.04.2017 18:18

Да, именно, спасибо огромное!!!

Batyabest 07.07.2017 10:18

Цитата:

Сообщение от рони (Сообщение 309027)
jsnb,
нажмите 111 второй раз или поместите дивы в конец длинной страницы ...

Вариант
<!DOCTYPE HTML>
<html>
  <head>
  <meta charset="utf-8">
  <script src="http://code.jquery.com/jquery-1.11.0.min.js"></script>
  </head>
  <body>
<div class="view-source">
  <a href="#">111</a>
  <div class="hide">Спрятанный текст</div>
</div>
<div class="view-source">
  <a href="#">222</a>
  <div class="hide">Спрятанный текст</div>
</div>
<div class="view-source">
  <a href="#">333</a>
  <div class="hide">Спрятанный текст</div>
</div>

<script>
$(function(){
    $('.view-source .hide').hide();
    $a = $('.view-source a');
    $a.on('click', function(event) {
      event.preventDefault();
      $a.not(this).next().slideUp(500);
      $(this).next().slideToggle(500);
    });
});
</script>

  </body>
</html>

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

рони 07.07.2017 11:03

открывашка и смена текста на кнопке
 
Batyabest,
<!DOCTYPE HTML>
<html>
  <head>
  <meta charset="utf-8">
  <style type="text/css">
  .view-source .hide{
    display: none;
  }
  </style>
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
  </head>
  <body>
<div class="view-source">
  <a href="#">развернуть </a>
  <div class="hide">Спрятанный текст</div>
</div>
<div class="view-source">
  <a href="#">развернуть </a>
  <div class="hide">Спрятанный текст</div>
</div>
<div class="view-source">
  <a href="#">развернуть</a>
  <div class="hide">Спрятанный текст</div>
</div>

<script>
$(function(){
    $('.view-source .hide');
    var $a = $('.view-source a');
    $a.on('click', function(event) {
      event.preventDefault();
      $a.text("развернуть").not(this).next().slideUp(500);
      var $hidden = $(this).next().is(":hidden");
      $(this).next().slideToggle(500);
      $hidden && $(this).text("свернуть");
    });
});
</script>

  </body>
</html>

Dilettante_Pro 07.07.2017 11:24

Вариант
<!DOCTYPE HTML>
<html>
  <head>
  <meta charset="utf-8">
  <script src="https://code.jquery.com/jquery-1.11.0.min.js"></script>
  </head>
  <body>
<div class="view-source">
  <a href="#">Развернуть</a>
  <div class="hide">Спрятанный текст</div>
</div>
<div class="view-source">
  <a href="#">Развернуть</a>
  <div class="hide">Спрятанный текст</div>
</div>
<div class="view-source">
  <a href="#">Развернуть</a>
  <div class="hide">Спрятанный текст</div>
</div>

<script>
$(function(){
    $('.view-source .hide').hide();
    $a = $('.view-source a');
    $a.on('click', function(event) {
      event.preventDefault();
      $a.not(this).next().slideUp(500);
       $a.not(this).text('Развернуть');
      $(this).next().slideToggle(500);
       $(this).text($(this).text()=='Свернуть'?'Развернуть':'Свернуть'); 
    });
});
</script>

  </body>
</html>

mikeac 10.10.2017 05:57

Dilettante_Pro,
А подскажите, пожалуйста, вариант, где "свернуть/развернуть" были бы в каждом случае оригинальные для каждого спойлера.
Т.е., например:
Развернуть 1 / Свернуть 1
Спрятанный текст 1
Развернуть 2 / Свернуть 2
Спрятанный текст 2

рони 10.10.2017 09:19

mikeac,
сложно придумать такую открывашку, которой ещё нет на форуме :lol:
Открывашка 250 открытие/закрытие блоков со сменой текста на кнопке

Nexus 10.10.2017 09:46

рони, вы кинули ссылку с https протоколом, а в коде, что расположен на той странице jq подключается по http протоколу, поэтому ваш код будет нерабочим.
У некоторых пользователей могут возникнуть сложности с воспроизведением вашего кода.

рони 10.10.2017 09:54

Nexus,
добавил s :thanks:


Часовой пояс GMT +3, время: 21:08.