Что происходит за кулисами и это правильный способ сделать это?(изменение DOM через Javascript) - PullRequest
1 голос
/ 17 декабря 2011

Не зная правильного пути, после долгих исследований в Интернете я нашел так много разных способов сделать что-то запутанное. То, как я пытался, и вроде как работал, заключается в следующем ...

Мой CSS

#Content {
left:0px;
top:1px;
width:988px;
z-index:1;
background-color: #FFFFFE;
}

Мой JS

function Gradients(id) //<- this id not used during testing, i hard coded it below
{
var getit = document.getElementById("Content");
getit.style.backgroundColor="#CCCCCC";
//alert(origcolor);
//var value = document.getElementById("Content").style.backgroundColor;
//var value = document.styleSheets[0].cssRules[0].style.backgroundColor;
}

Мой HTML (только тест)

<div onClick="Gradients("Content");">Gradients Test:<span>#XXXXXX</span></div>

Результаты Firebug - плохо?

<div id="Content" style="background-color: rgb(204, 204, 204);">

Чего я пытаюсь достичь

Моя цель состояла в том, чтобы прочитать фон поля ввода (у каждого есть идентификатор) и медленно изменить его на красный ОТ цвета ПО УМОЛЧАНИЮ в CSS, чтобы сообщить им, что поле неверно.

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

Я даже потратил пару часов на чтение jQuery, но я не хочу извлекать целую библиотеку для этой 1 крошечной вещи, которую я буду делать.

Другая информация

Это похоже на то, как ЭТОТ веб-сайт stackoverflow исчезает с желтого на белый, DIV моего вопроса, когда я прихожу сюда. Кроме моего будет в полях ввода. У меня есть некоторые комментарии в моем JS, потому что я пробовал разные вещи. Я удалил некоторые вещи, которые были ужасны. Он работает как есть, НО я не знаю, хороший ли это способ, потому что firebug показывает, что он добавил что-то в DIV.

Мне нравится чистый код ... и мой код там выглядит ужасно, потому что я что-то добавил в DIV. Не могу ли я изменить значение CSS или это правильный способ сделать это?

Пара вопросов ...

1) Правильный способ сделать это?

2) Если это правильный способ сделать это, как мне удалить это изменение и вернуть ли оно обратно в стиль CSS? Или уродливый способ - просто вставить исходное значение, которое я сохранил, перед выполнением градиента.

3) ВАШ намного лучше чистый способ сделать это:)

4) Есть ли элегантный способ ЧИТАТЬ значение в таблице стилей CSS?

Причина, по которой я не пошел с document.stylesheets, для меня ... это казалось уродливым ... что, если это не [0]. Откуда я знаю, это всегда будет [0]. Что если в разных браузерах все по-другому? Вздох . Я не полностью понимаю DOM. Я понимаю , что такое дочерние узлы и родительские узлы, но при просмотре Firebug это огромный беспорядок повсюду, и я понятия не имею, где искать вещи, как вставлять вещи, и мне не нравится изменять Во всяком случае, DOM - мне бы понравилась простая вещь, как эта (и да, я предполагаю, что в приведенном ниже коде - если бы это было так просто), лол ...

Хотелось бы, чтобы это было так просто в javascript ...

$original_color = getElementById("Content").style.backgroundColor;
// loop through starting AT the original_color and gradient to red somehow
//start loop here
getElementById("Content").style.backgroundColor = newcolor;
// end loop here

В ожидании вливания мудрости, пожалуйста:)

ЧТО Я ПОПРОБОВАЛ ПОСЛЕ ПОЛОЖЕНИЯ И ЧИТАЯ - My JS

var RGradient = 0;
var GGradient = 0;
var GStop = 0;
var BGradient = 0;
var BStop = 100;
var idGradient;

function Gradients(id)
{
var startcolor = "#FFFFFE";
RGradient = hexToR(startcolor);
GGradient = hexToG(startcolor);
BGradient = hexToB(startcolor);
idGradient = document.getElementById(id);

window.setTimeout("GradientIt()", 10);
}

function GradientIt()
{
if (GGradient == GStop && BGradient == BStop) return;
if (GGradient > GStop) GGradient--;
if (BGradient > BStop) BGradient--;
idGradient.style.backgroundColor="#"+(RGradient).toString(16)+(GGradient).toString(16)+(BGradient).toString(16);
document.getElementById('gtest').innerHTML = "#"+(RGradient).toString(16)+(GGradient).toString(16)+(BGradient).toString(16);
window.setTimeout("GradientIt()", 5);
}

function hexToR(h) { return parseInt((cutHex(h)).substring(0,2),16) }
function hexToG(h) { return parseInt((cutHex(h)).substring(2,4),16) }
function hexToB(h) { return parseInt((cutHex(h)).substring(4,6),16) }
function cutHex(h) { return (h.charAt(0)=="#") ? h.substring(1,7) : h}

ОШИБКА в IE

Я получаю сообщение об ошибке в IE ПОСЛЕ того, как фон становится красным ... - Недопустимое свойство в строке 29 - строка со всеми значениями toString (16) в нем выше.

Может кто-нибудь объяснить, почему он выдает ошибку в IE, пожалуйста? Я проверяю, нахожусь ли я выше 0, поэтому числа должны оставаться 0 или выше. Другие браузеры не выдают ошибку, которую я вижу. Как только он заработает, я буду его менять - это всего лишь «взломанный вместе» тест - я сделаю его более эффективным позже, когда он появится на странице, которую я хочу.

Я потратил около часа, пытаясь передать переменные в setTimeout, прежде чем понял, что не могу. UGH! лол. Globals :( Не могу дождаться полной совместимости CSS3 во ВСЕХ браузерах.

Ответы [ 2 ]

1 голос
/ 17 декабря 2011

Я бы предложил достичь этого с помощью css3 или jquery (библиотека javascript). Чтобы сделать это с помощью css3, достаточно просто, эта статья должна иметь всю необходимую информацию. http://net.tutsplus.com/tutorials/html-css-techniques/css-fundametals-css-3-transitions/

Чтобы сделать это с помощью jQuery, вынужно будет скачать jquery и, желательно, иметь небольшой опыт работы с javascript, хотя обычно не требуется использовать jQuery для простых вещей, подобных этой.Это функция jQuery, которую вы хотели бы использовать: http://api.jquery.com/animate/

0 голосов
/ 17 декабря 2011
#content {
    left:0px;
    top:1px;
    width:988px;
    z-index:1;
    background-color: #FFFFFE;
    transition: 0.3s;
    -moz-transition: 0.3s;
    -webkit-transition: 0.3s;
}

#content:focus {
    background-color: #f00;
    transition: 0.3s;
    -moz-transition: 0.3s;
    -webkit-transition: 0.3s;
}

Выше CSS3 и работает во многих браузерах.Однако поддержка IE (как всегда) отсутствует.

через javascript / jquery ....

function animate_bg(ele, from, to) {
from += from > to ? -1 : 1;
if(!$.support.opacity){
    if(from != to){
        var opStr = (Math.round(from * 25.5)).toString(16);
        //alert(opStr)
        ele.css({background:'transparent',filter:"progid:DXImageTransform.Microsoft.gradient(startColorstr=#" + opStr + "fffff0, endColorstr=#" + opStr + "f00000)"});   
    }else{
        ele.css({background:'transparent',filter:"none"});   
    }
}else{
    ele.css("backgroundColor", "rgba(255, 0, 0, " + (from) / 10 + ")"); 
}

if(from != to)  
    setTimeout(function() { animate_bg(ele, from, to) }, 60);
}

и использование ....

    animate_bg($('...'), 8, 0);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...