2010-01-13 3 views
4

Я совершенно новый для javascript и jQuery, поэтому этот вопрос может показаться немым, но я не смог найти какой-либо пример или документ на нем.Состояние jQuery для анимации

Я получил эту функцию немного цвета анимации опрокидывания и выкатную, который работает отлично:

$(".box_nav").hover(function(){ 
      jQuery(this).stop(true, false); 
      $(this).animate({ backgroundColor: "#fff"}, 300); }, 
     function() { 
      jQuery(this).stop(true, false); 
      $(this).animate({ backgroundColor: "#000"}, 300); } 
); 

Дело в том, если я renctly добавил кнопку изменения таблицы стилей, которая также работает отлично:

$(".black-white").click(function(){ 
     $("link").attr("href", "<?php bloginfo("template_url"); ?>/css/styles-black-white.css"); 
     $(".wp-polls-loading").css({ display:"none"}); 
     return false; 
    }); 

    $(".grey-white").click(function(){ 
     $("link").attr("href", "<?php bloginfo("template_url"); ?>/css/styles-grey-white.css"); 
     $(".wp-polls-loading").css({ display:"none"}); 
     return false; 
    }); 

Дело в том, что я хотел бы создать условие в моем перевернутом меню, чтобы я мог изменить цвет этого тоже.

Так я попробовал несколько вещей, как это:

///////////////////////////////////////////////////////////////////////////// 
    //Stylesheet change 
    $(".black-white").click(function(){ 
     $("link").attr("href", "<?php bloginfo("template_url"); ?>/css/styles-black-white.css"); 
     $(".wp-polls-loading").css({ display:"none"}); 
     var tt = "black"; 
     return false; 
    }); 

    $(".grey-white").click(function(){ 
     $("link").attr("href", "<?php bloginfo("template_url"); ?>/css/styles-grey-white.css"); 
     $(".wp-polls-loading").css({ display:"none"}); 
     var tt = "grey"; 
     return false; 
    }); 

    ///////////////////////////////////////////////////////////////////////////// 
    //Over menu 
    if (tt == "black"){ 
     $(".box_nav").hover(function(){ 
      jQuery(this).stop(true, false); 
      $(this).animate({ backgroundColor: "#fff"}, 300); }, 
     function() { 
      jQuery(this).stop(true, false); 
      $(this).animate({ backgroundColor: "#000"}, 300); } 
     ); 
    }else { 
     $(".box_nav").hover(function(){ 
      jQuery(this).stop(true, false); 
      $(this).animate({ backgroundColor: "#000"}, 300); }, 
     function() { 
      jQuery(this).stop(true, false); 
      $(this).animate({ backgroundColor: "#e2e2e2"}, 300); } 
     ); 
    } 

Но конечно оленья кожа идти. Единственное, что немного работает, это если я изменил «черный» в if() sor, то все, что он делает хорошо, второй стиль roll-over.

Любая идея?

+0

Я не пробовал, но я вполне определенную изменяющуюся таблицу стилей на лету не будет вызывать страницу, которую нужно переделать с новыми стилями. –

+0

Да, это то, о чем говорил Ахилл. Не знал об этом. – kevin

ответ

2

Вы объявляете переменную «tt» локально, а затем пытаетесь получить к ней доступ по всему миру. Не можете быть уверены, что мы не можем видеть всю структуру кода, но если вы измените:

var tt = .... 

в

window.tt = .... 

Это вероятно, будет работать. Я не рекомендую сделать эту глобальную переменную, если вы можете ее охватить в рамках метода или закрытия, но выполнение вышеописанного, по крайней мере, докажет, является ли это проблемой.

+0

Вы имеете в виду объявление переменной? – kevin

+0

Да. Объявление переменной с помощью окна. 'вместо' var 'дает ему глобальную область. Как бы то ни было, 'tt' является только локальным, и поэтому, когда вы ссылаетесь на него в другом месте, вы на самом деле не ссылаетесь на одну и ту же переменную – Graza

+0

Пробовал, но не работает. Похоже, это проблема повторного рендеринга, как говорят другие. – kevin

1

Проблема заключается в том, что переменная tt существует только в пределах функций щелчка. То, что вы могли бы сделать, это объявить tt раньше, а затем установить его внутри действий щелчка.

var tt = 'black'; // Default to black 

$(".black-white").click(function(){ 
    $("link").attr("href", "<?php bloginfo("template_url"); ?>/css/styles-black-white.css"); 
    $(".wp-polls-loading").css({ display:"none"}); 
    tt = "black"; 
    return false; 
}); 

$(".grey-white").click(function(){ 
    $("link").attr("href", "<?php bloginfo("template_url"); ?>/css/styles-grey-white.css"); 
    $(".wp-polls-loading").css({ display:"none"}); 
    tt = "grey"; 
    return false; 
}); 

На данный момент, tt будет либо «черный» или «серый» и будет существовать в пределах, что вы проверяете его с if заявление.

Кроме того, $ является псевдонимом jQuery, поэтому нет необходимости переключаться между ними. Вы можете просто использовать $, когда вы пытаетесь остановить анимацию, чтобы все было согласовано.


UPDATE: Я думаю, что вопрос (я не могу увидеть весь код, так что я не могу быть уверен), что вы объявляете событие парения, когда документ загружается. В этом случае он всегда будет использовать черное зависание. Что вам нужно сделать, это разместить код наведения внутри функций изменения таблиц стилей, чтобы наведение обновлялось при изменении таблицы стилей. Вот пример:

$(".black-white").click(function(){ 
    $("link").attr("href", "<?php bloginfo("template_url"); ?>/css/styles-black- white.css"); 
    $(".wp-polls-loading").css({ display:"none"}); 

    // First unbind old hover 
    $('.box_nav').unbind('mouseover').unbind('mouseout'); 

    $(".box_nav").hover(function(){ 
     $(this).stop(true, false).animate({ backgroundColor: "#fff"}, 300); }, 
    function() { 
     $(this).stop(true, false).animate({ backgroundColor: "#000"}, 300); } 
    ); 

    return false; 
}); 

$(".grey-white").click(function(){ 
    $("link").attr("href", "<?php bloginfo("template_url"); ?>/css/styles-grey-white.css"); 
    $(".wp-polls-loading").css({ display:"none"}); 

    // First unbind old hover 
    $('.box_nav').unbind('mouseover').unbind('mouseout'); 

    $(".box_nav").hover(function(){ 
     $(this).stop(true, false).animate({ backgroundColor: "#000"}, 300); }, 
    function() { 
     $(this).stop(true, false).animate({ backgroundColor: "#e2e2e2"}, 300); } 
    ); 

    return false; 
}); 
+0

Да, моя переменная уже была объявлена ​​вне функции, извините, я забыл ее записать. Весь мой код находится внутри дома: И все еще не работает. – kevin

+0

Тем не менее, добавив в эти анонимные методы 'var tt = ...', вы создаете переменную * new *, называемую 'tt', и это изменение не меняет« внешнюю »переменную области. Удалите 'var' из обработчиков кликов и просто назовите его как' tt', а не 'var tt' – Graza

+0

Просто попробовал, не меняет стиль цвета в if(): var tt =" black "; // Изменение таблицы стилей $ (". Black-white"). Click (function() { $ ("ссылка"). Attr ("href", " /css/styles-black-white.css "); $ (". wp-polls-loading "). hide(); tt =" black "; return false; }); \t \t $ (". Серый-белый"). Click (function() { $ ("ссылка"). Attr ("href", "/Css/style-gray-white.css "); $ (". wp-polls-loading "). hide(); tt =" серый "; return false; }); – kevin

0

Ну, например, вы используете tt вар вне сферы его функции. Если вы объявите его внутри этой функции щелчка, вы не сможете увидеть ее за пределами этого блока. Сначала вы должны объявить его глобально.

+0

Извините, как сказано выше, это уже было указано выше, но в скопируйте/вставьте: var tt = "black"; // затем функции – kevin

+0

Посмотрите мои комментарии по ответам Джамала. У вас на самом деле есть три разные переменные 'tt', и это, безусловно, вас смущает! – Graza

3

Несколько вещей, чтобы прокомментировать, но не обязательно ответ на ваш вопрос.

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

$("link").attr("href", "<?php bloginfo("template_url"); ?>/css/styles-black-white.css"); 

(И даже если это так, это изменило бы все ваши <link> теги!)

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

$(".wp-polls-loading").css({ display:"none"}); 

Если вы можете просто использовать метод hide().

$(".wp-polls-loading").hide(); 

Ваш область видимости переменной tt не может помочь вам. Делайте это менее локально, т. Е. Вне ваших анонимных функций

Помните также, что ваши селекторы классов сравнительно медленны. Если вы можете использовать их, мы выбираем элемент, например.

$("div.box_nav") 

Или даже добавить идентификатор атрибута для них в использовании, что:

$("#MyNav") 
+0

Спасибо за подсказку о методе hide(), отлично работает и выглядит лучше. – kevin

0

Изменение файла CSS не заставит страницу быть повторно вынесено. Вам нужно будет вызвать обновление, чтобы отобразить новые стили.

Вы не можете использовать анимацию для управления значениями цвета css, если вы не используете color plug-In для цветов. Причина этого в том, что реализация JQuery по умолчанию для функции Animate только увеличивает десятичные значения css-свойств. Цвет, представляемый как шестнадцатеричное или строковое значение, не будет анимировать правильно.

+0

Как я могу получить страницу для повторной обработки после события click() для загрузки нового стиля? Да, я использую плагин цветов для цветных анимаций. – kevin

1

Что другие говорили об изменении CSS-файла после загрузки страницы. A Лучшее решение должно заключаться в том, чтобы поместить все CSS в один и тот же файл с разными именами классов и динамически добавлять/удалять имена классов, а не пытаться самим изменять классы (которые не будут работать)

Редактировать - добавлен пример. Что-то вроде:

<html> 
    <head> 
    <link href='<?php bloginfo("template_url"); ?>/css/styles-black-white.css' type="text/css" rel="stylesheet"> 
    <link href='<?php bloginfo("template_url"); ?>/css/styles-grey-white.css' type="text/css" rel="stylesheet">   
    </head> 
    <body class=gw> 
    </body> 
</html> 

и в JavaScript:

$("body").removeClass("gw").addClass("bw"); 

и в вашем CSS

/* for example you had a class for anchors */ 
body.gw a { ... } /* was: a { ... } in styles-grey-white.css */ 
body.bw a { ... } /* was: a { ... } in styles-black-white.css */ 
/* for example you had a class called "hilite" */ 
body.gw .hilite { ... } /* was: .hilite { ... } in styles-grey-white.css */ 
body.bw .hilite { ... } /* was: .hilite { ... } in styles-black-white.css */ 
+0

Это было бы действительно решением, но довольно большим с точки зрения кода! – kevin

+0

Это не должно быть огромное количество кода. Все, что вам нужно сделать, это переключиться между двумя классами в теге '' (одна строка кода jQuery). Модификации ваших файлов css были бы самой трудоемкой частью, но вам нужно было бы добавить «body.classA» ко всем классам, определенным в одном файле, и «body.classB» для классов во втором файле – Graza

+0

True ! Но это не решает в конце моей проблемы с анимацией. – kevin