Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 05.09.2015, 15:26
Аспирант
Отправить личное сообщение для makalet Посмотреть профиль Найти все сообщения от makalet
 
Регистрация: 25.05.2015
Сообщений: 76

Как исправить скрытие списка?
1. Как сделать, чтобы при клике на дочерний ul список скрывался также, как и при клике вне списка? Например, нажимаем на факториал в "Мат. выч", а список заново открывается. Хочется, чтобы при клике на факториал список не открывался, а открывался заново при нажатии на "Мат. выч".
2. Как можно оптимизировать еще код, а то получается немного быдловато?
http://jsfiddle.net/foxt4bu4/
3. Не обязательный пункт, но хочется узнать для себя. Как можно реализовать данный пример на чистом JS, без использования jquery.
Ответить с цитированием
  #2 (permalink)  
Старый 05.09.2015, 17:06
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,068

Открывашка 224 для горизонтального меню
makalet,
Сообщение от рони
поиск по форуму: открывашка
выберите из более 200 вариантов более вам подходящий
<!DOCTYPE HTML>

<html>

<head>
  <title>Untitled</title>
  <meta charset="utf-8">
  <style type="text/css">
  a { text-decoration: none; font-weight: bold; }
  #main {
      width: 602px;
      height: 300px;
      border: 1px solid #E0EBEB ;
      position: absolute;
      top: 50%;
      left: 50%;
      margin: -150px 0 0 -301px;
      background: #60a839;}
  #menu {
      padding: 0;
      margin: 0;
      font-family: Georgia;
  }
  #menu li {
    float: left;
    padding: 0;
    width: 200px;
    position: relative;
    transition:background 0.2s ease;
    border: 1px solid #333;
    border-left: none;
    border-right: none;
  }
  #menu li:hover{
    background: #B9D0D0
  }
  #menu li ul {
      list-style: none;
      padding: 0;
      margin: 0;
      width: 100%;
      display: none;
      position: absolute;
      left: 0;
      top: 31px;
      background: #E0EBEB;
    }

  #menu li ul li:hover{
   background: #B9D0D0;
   cursor: pointer;
  }

    #menu li ul li {
    height: 26px;
    margin: 0;
    text-align: left;
    border: 0;
  }

  #nav {
      position: relative;
      width: 100%;
      float: left;
      background: #E0EBEB;
  }

  #nav li {
      list-style: none;
      text-align: center;
  }
  #nav li a {
      display: block;
      padding: 0;
      border-left: none;
      border-right: none;
      line-height: 30px;
      font-size: 19px;
      font-family: Trebuchet MS;
      color: #000;
  }
  .active-menu-item {
    background: #B9D0D0;
  }

  </style>
  <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
  <script>
    $(function() {
    var $blocks = $("#menu ul");
    $blocks.each(function(i, elem) {
        var $el = $(elem),
            $but = $el.prev();
        $but.click(function() {
            $but.toggleClass("active-menu-item");
            $blocks.filter(function(j, el) {
                i == j && $(el).slideToggle();
                return i != j
            }).slideUp().prev().removeClass("active-menu-item");
        })
    });
    $('html').click(function (event) {
          if ($(event.target).closest('#nav' ).length) return;
          $('.active-menu-item').click()
      });
});

  </script>
</head>

<body>
<div id="main">
    <div id="nav">
      <ul id="menu">
        <li class="mat">
          <a href="#"><span>Мат. вычисления</span></a>
          <ul class="mat">
            <li id="mat-1">Степень</li>
            <li id="mat-2">Факториал</li>
          </ul>
        </li>
        <li class="pl">
          <a href="#"><span>Площадь</span></a>
          <ul>
            <li id="pl-1">Треугольник</li>
            <li id="pl-2">Квадрат</li>
            <li id="pl-3">Прямоугольник</li>
            <li id="pl-4">Эллипс</li>
            <li id="pl-5">Ромб</li>
          </ul>
        </li>
        <li class="ob">
          <a href="#"><span>Объем</span></a>
          <ul>
            <li id="ob-1">Куб</li>
            <li id="ob-2">Конус</li>
            <li id="ob-3">Пирамида</li>
            <li id="ob-4">Параллелепипед</li>
            <li id="ob-5">Цилиндр</li>
          </ul>
        </li>

      </ul>
    </div>
  </div>
</body>

</html>
Ответить с цитированием
  #3 (permalink)  
Старый 05.09.2015, 17:08
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,068

Сообщение от makalet
Как можно реализовать данный пример на чистом JS, без использования jquery.
Аккордеон меню. Затык в сворачивании
Ответить с цитированием
  #4 (permalink)  
Старый 05.09.2015, 19:03
Аспирант
Отправить личное сообщение для makalet Посмотреть профиль Найти все сообщения от makalet
 
Регистрация: 25.05.2015
Сообщений: 76

рони, уух, выше код, конечно, для меня сложноват(
Но вся та же проблема у вас. Я нажимаю на "Факториал" - список не сворачивается, хотя должен. Так должно работать не только при нажатии на "факториал", а на "Степень, круг и т.д"
Ответить с цитированием
  #5 (permalink)  
Старый 05.09.2015, 21:27
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,068

Сообщение от makalet
Я нажимаю на "Факториал" - список не сворачивается, хотя должен
... так?
<!DOCTYPE HTML>

<html>

<head>
  <title>Untitled</title>
  <meta charset="utf-8">
  <style type="text/css">
  a { text-decoration: none; font-weight: bold; }
  #main {
      width: 602px;
      height: 300px;
      border: 1px solid #E0EBEB ;
      position: absolute;
      top: 50%;
      left: 50%;
      margin: -150px 0 0 -301px;
      background: #60a839;}
  #menu {
      padding: 0;
      margin: 0;
      font-family: Georgia;
  }
  #menu li {
    float: left;
    padding: 0;
    width: 200px;
    position: relative;
    transition:background 0.2s ease;
    border: 1px solid #333;
    border-left: none;
    border-right: none;
  }
  #menu li:hover{
    background: #B9D0D0
  }
  #menu li ul {
      list-style: none;
      padding: 0;
      margin: 0;
      width: 100%;
      display: none;
      position: absolute;
      left: 0;
      top: 31px;
      background: #E0EBEB;
    }

  #menu li ul li:hover{
   background: #B9D0D0;
   cursor: pointer;
  }

    #menu li ul li {
    height: 26px;
    margin: 0;
    text-align: left;
    border: 0;
  }

  #nav {
      position: relative;
      width: 100%;
      float: left;
      background: #E0EBEB;
  }

  #nav li {
      list-style: none;
      text-align: center;
  }
  #nav li a {
      display: block;
      padding: 0;
      border-left: none;
      border-right: none;
      line-height: 30px;
      font-size: 19px;
      font-family: Trebuchet MS;
      color: #000;
  }
  .active-menu-item {
    background: #B9D0D0;
  }

  </style>
  <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
  <script>
$(function() {
    var $blocks = $("#menu li");
    $blocks.each(function(i, elem) {
        var $el = $(elem),
            $ul = $("ul", $el);
        $el.click(function(event) {
            $blocks.each(function(j, el) {
                $(event.target).closest($ul).length || i != j ? $("ul", el).slideUp().prev().removeClass("active-menu-item") : $("ul", el).slideToggle().prev().toggleClass("active-menu-item")
            })
        })
    });
    $("html").click(function(event) {
        if ($(event.target).closest("#nav").length) return;
        $("ul", $blocks).slideUp().prev().removeClass("active-menu-item")
    })
});

  </script>
</head>

<body>
<div id="main">
    <div id="nav">
      <ul id="menu">
        <li class="mat">
          <a href="#"><span>Мат. вычисления</span></a>
          <ul class="mat">
            <li id="mat-1">Степень</li>
            <li id="mat-2">Факториал</li>
          </ul>
        </li>
        <li class="pl">
          <a href="#"><span>Площадь</span></a>
          <ul>
            <li id="pl-1">Треугольник</li>
            <li id="pl-2">Квадрат</li>
            <li id="pl-3">Прямоугольник</li>
            <li id="pl-4">Эллипс</li>
            <li id="pl-5">Ромб</li>
          </ul>
        </li>
        <li class="ob">
          <a href="#"><span>Объем</span></a>
          <ul>
            <li id="ob-1">Куб</li>
            <li id="ob-2">Конус</li>
            <li id="ob-3">Пирамида</li>
            <li id="ob-4">Параллелепипед</li>
            <li id="ob-5">Цилиндр</li>
          </ul>
        </li>

      </ul>
    </div>
  </div>
</body>

</html>

Последний раз редактировалось рони, 05.09.2015 в 22:12.
Ответить с цитированием
  #6 (permalink)  
Старый 05.09.2015, 21:51
Аспирант
Отправить личное сообщение для makalet Посмотреть профиль Найти все сообщения от makalet
 
Регистрация: 25.05.2015
Сообщений: 76

рони, да. А мой вариант настолько убог, что нельзя его подправить, сделав функционал как у вас в последнем варианте со списком и предыдущем, когда мы нажимали на "Площадь, Мат. Выч", то появлялось выделение, т.е. активным он был.
Ответить с цитированием
  #7 (permalink)  
Старый 05.09.2015, 22:13
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,068

makalet,
смотрите 5 пост снова
Ответить с цитированием
  #8 (permalink)  
Старый 05.09.2015, 23:58
Аспирант
Отправить личное сообщение для makalet Посмотреть профиль Найти все сообщения от makalet
 
Регистрация: 25.05.2015
Сообщений: 76

рони, спасибо. Так что скажете на счет моего варианта? Очень и очень плохо?
Ответить с цитированием
  #9 (permalink)  
Старый 06.09.2015, 00:24
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,068

makalet,
вместо трёх классов для li может 1 использовать ? блоки же функционально одинаковы
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Статический элемент выше абсолютных. Как Исправить? ILL-JAH Internet Explorer 4 25.02.2015 19:23
Как правильно реализовать такой функционал? Julian Общие вопросы Javascript 3 16.01.2015 12:34
При мульти загрузке дублирует записи в базу. Как можно исправить? makarow.dmitry jQuery 0 20.12.2014 20:16
Sortable, два связанных списка. Как один из них сделать неизменяемым? kvecxjo jQuery 1 30.03.2010 03:15
Как заменить эл-ты одного списка эл-тами другого ? Mayar Элементы интерфейса 5 28.04.2009 11:21