Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 18.02.2014, 01:49
Интересующийся
Отправить личное сообщение для Aligatro Посмотреть профиль Найти все сообщения от Aligatro
 
Регистрация: 03.12.2013
Сообщений: 15

slidetoggle без использования jquery
Добрый день дорогие форумчане, нужна ваша помощь.

Для мобильной версии сайта, мне надо сделать выпадающее меню (при клике на ссылку, slidedown или slidetoggle) но только без использования jquery. Я перелопатил уже весь интернет в поисках нужного скрипта, но то что я нахожу, либо не становится на сайт, либо вообще не работает. Может кто-то сможет помочь выковырять slidetoogle из библиотеки jquery или расскажет как можно и вовсе обойтись без него используя нативный js.

Заранее большое спасибо за помощь -)

P.s эту тему - видел. Но скрипт который там представлен, чрезвычайно долго выезжает (чем это вызвано - не знаю) =(
Ответить с цитированием
  #2 (permalink)  
Старый 18.02.2014, 02:29
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,072

Aligatro,
Основы программной анимации на JavaScript
или тут
http://learn.javascript.ru/js-animation#основы-анимации
а уж на форуме этих slidetoogle без jquery вагон и маленькая тележка
Ответить с цитированием
  #3 (permalink)  
Старый 18.02.2014, 03:43
Аватар для ruslan_mart
Профессор
Отправить личное сообщение для ruslan_mart Посмотреть профиль Найти все сообщения от ruslan_mart
 
Регистрация: 30.04.2012
Сообщений: 3,018

Aligatro, на CSS3 подойдёт?
Ответить с цитированием
  #4 (permalink)  
Старый 18.02.2014, 19:33
Интересующийся
Отправить личное сообщение для Aligatro Посмотреть профиль Найти все сообщения от Aligatro
 
Регистрация: 03.12.2013
Сообщений: 15

Мне на чем угодно подойдет =) Даже с фиксированной высотой (а не display:block - display:none). Я просто почти закончил пилить мобильную версию сайта и на slidedown/slidetoggle застопорился, не хочу подгружать 100кб ради 1 анимации =)

Мне нужно реализовать простое выезжающее моб меню - не более -)

P.s рони, спасибо за материал. А не могли бы Вы пожалуйста подсказать, какие настройки в последнем приведенном скрипте необходимо сменить, дабы блок по умолчанию был скрыт и только при клике открывался. Просто я полный профан в js, сам - не разберусь. Спасибо.

P.s.s А вырезать из jquery slidetoggle реально? Или придется половину библиотеки переносить и получится пирова победа?
Ответить с цитированием
  #5 (permalink)  
Старый 18.02.2014, 20:28
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,072

Aligatro,
строка 100--- var n = 1;
строка 131 ---- <ul id='right_menu' style="height: 0px; display: none">
Ответить с цитированием
  #6 (permalink)  
Старый 18.02.2014, 20:31
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

<style>
    div{
        height: 100px;
        background: red;
        overflow: hidden;
        transition: height 2s;
    }
    div.collapsed{
        height: 0;
    }
</style>
<button id="button">Toggle</button>
<div id="sample"></div>
<script>
    button.onclick = function() {
        sample.classList.toggle('collapsed');
    }
</script>


classList может быть не во всех браузерах - смотри на caniuse.com и если что подключай костыль или пиши свои функции работы с классами.

transition дублируй с префиксами -webkit, -moz, -ms.

Вобще, с animation возможносей больше.
__________________
В личку только с интересными предложениями
Ответить с цитированием
  #7 (permalink)  
Старый 18.02.2014, 20:32
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Сообщение от Aligatro
P.s.s А вырезать из jquery slidetoggle реально? Или придется половину библиотеки переносить и получится пирова победа?
Тогда тебе стоит обратить внимание на zepto.js
__________________
В личку только с интересными предложениями
Ответить с цитированием
  #8 (permalink)  
Старый 18.02.2014, 20:36
Интересующийся
Отправить личное сообщение для Aligatro Посмотреть профиль Найти все сообщения от Aligatro
 
Регистрация: 03.12.2013
Сообщений: 15

Рони, спасибо огромное. Не пойму почему, сделал в точности так же, но не сработало (первая идея которая пришла мне в голову кстати), наверное где-то ошибся.

danik, спасибо что откликнулись, сейчас опробую Ваш вариант. А по поводу костылей, это явно не в моих силах. Я только еле-еле начинаю понимать что из себя js представляет. Еще даже синтаксис не до конца выучил.

Всем огромнейшее спасибо за помощь, даже не знаю сколько бы я еще времени потратил в поисках ответа если бы не вы. Благодарю.

Последний раз редактировалось Aligatro, 18.02.2014 в 20:45.
Ответить с цитированием
  #9 (permalink)  
Старый 18.02.2014, 20:47
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,072

Aligatro,
<!DOCTYPE HTML>

<html>

<head>

<title> </title>
<meta charset='utf-8'>
<style>
	html, body{
		height:100%;
		margin:0;
		padding:0;
	}
	#right_menu, li{
		margin:0;
		padding:0;
		display:block;
	}
	#right_menu{
        overflow: hidden;
		width:70px;
		height:125px;
		background-color:#cccccc;
		border:2px solid;
		border-color: #dddddd #bbbbbb #bbbbbb #dddddd;
		padding-left:50px;
	}
	li{
		width:65px;

		margin:5px;

		font-family:arial, sans-serif;
		font-size:10pt;
		text-indent:5px;
	}
	li:hover{
		background-color:navy;
		color:white;
	}
	#b{
	top:50px;
	left:10px;
	}

</style>
<script>
   function animate(opts) {
  clearInterval(opts.el.timer);
  var start = new Date;
  var delta = opts.delta || linear;
  var height = parseFloat(opts.el.style.height);
  opts.el.timer = setInterval(function() {
    var progress = (new Date - start) / opts.duration;

    if (progress > 1) progress = 1;

    opts.step( delta(progress),height );

    if (progress == 1) {
      clearInterval(opts.el.timer);
      opts.complete && opts.complete();
    }
  }, opts.delay || 20);


}
function elastic(progress) {
  return Math.pow(2, 10 * (progress-1)) * Math.cos(20*Math.PI*1.5/3*progress)
}
function linear(progress) {
  return progress
}
function quad(progress) {
  return Math.pow(progress, 2)
}

function quint(progress) {
  return Math.pow(progress, 5)
}
function makeEaseInOut(delta) {
  return function(progress) {
    if (progress < .5)
      return delta(2*progress) / 2
    else
      return (2 - delta(2*(1-progress))) / 2
  }
}
function makeEaseOut(delta) {
  return function(progress) {
    return 1 - delta(1 - progress)
  }
}

window.onload = function() {
var input = document.getElementById("b");
var menu = document.getElementById("right_menu");
var body =  document.body;
var n = 1;
				input.onclick = function(){
				    n ^= 1;
                    var to = n ? 0 : 125,
                        display = n ? "none" : "block";
                     !n &&   (menu.style.display = display)
					animate({
					    el : menu,
						duration: 1000,
						delta: makeEaseInOut(linear),
						step: function(delta,height) {
							menu.style.height = delta*(to-height)+height+"px";
						},
                        complete :  function() {menu.style.display = display}
					})

				};

               body.onclick = function(event){
                 var event = event || window.event;
                 var target = event.target || event.srcElement;
                 if(target!=input && target!=menu &&!n && target.tagName != 'LI') input.onclick()

               }
}

</script>
</head>

<body>
<input type='button' id='b' value = 'Click'>
<ul id='right_menu' style="height: 0px; display:  none">
	<li>Effect 1</li>
	<li>Effect 2</li>
	<li>Effect 3</li>
	<li>Effect 4</li>
</ul>

</body>

</html>
Ответить с цитированием
  #10 (permalink)  
Старый 18.02.2014, 21:11
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

рони, на мобилу самый лучший вариант - это css3.
И кто же для анимации setInterval использует, в наши то дни..
Есь же requestAnimationFrame...
__________________
В личку только с интересными предложениями
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
jQuery не выполняет сценарий ! haacki jQuery 7 05.02.2014 19:43
Jquery ui-slider & Jquery selectbox, Слайдер срабатывает всего 1 раз Micher jQuery 4 31.01.2014 13:07
как правильно прочесть xml без подключения jQuery BorodinKO Общие вопросы Javascript 1 03.04.2011 23:23
Загрузка файла без использования формы Slavenin AJAX и COMET 20 12.12.2010 12:41
Автоматическая отправка формы через JavaScript без использования body onload pavluxa09 Общие вопросы Javascript 0 17.11.2009 15:55