Как создать переключатель в стиле DIV? - PullRequest
1 голос
/ 12 июня 2009

Я хочу сделать переключатель стиля CSS в JavaScript, как это делает Digg

image from web archive, see summary for more details

У меня есть div, в котором я хочу изменить стиль блока div на основе выбора темы.

Я не хочу использовать jQuery, я хочу разработать этот код на чистом JavaScript.

Ответы [ 5 ]

10 голосов
/ 12 июня 2009

Проверка исходного кода и его изменений при смене темы, это действительно довольно просто. Digg использует потрясающий CSS, чтобы радикально изменить контент, просто изменив класс элемента. Все, что вам нужно сделать, это:

<div id="theme_viewer">
<!-- HTML code for your widget/thing to be styled -->
</div>

И тогда вы можете иметь свои темы:

<ul>
  <li><a href="#" onclick="return switchTheme('theme1');">theme 1</a></li>
  <li><a href="#" onclick="return switchTheme('theme2');">theme 2</a></li>
  <li><a href="#" onclick="return switchTheme('theme3');">theme 3</a></li>
  <li><a href="#" onclick="return switchTheme('theme4');">theme 4</a></li>
</ul>

Все, что нужно switchTheme, - это изменить класс theme_viewer на переданный класс:

function switchTheme(theclass) {
    var viewer = document.getElementById('theme_viewer');
    viewer.className = theclass;
    return false;
}

Ваши таблицы стилей CSS могут затем выполнять любые вызовы различных стилей:

#theme_viewer.theme1 {
    background-color: red;
}

#theme_viewer.theme2 {
    background-color: blue;
}

#theme_viewer.theme3 {
    background-color: black;
    color: white;
}

#theme_viewer.theme4 {
    background-color: orange;
}

вот пример этого на работе

Как уже упоминалось в комментариях J-P и в ответе Эдеверетта, не стоит вставлять ваши события так, как они есть в этом примере (то есть с атрибутом onclick). Я сделал это для простоты, но это не очень хорошая идея. Лучшая идея - дождаться загрузки вашего документа и динамически присоединить обработчики событий с помощью Javascript. Это известно как ненавязчивый Javascript, и это хорошая вещь TM .

Пример вышеприведенного примера, основанный на передовой практике, будет выглядеть так:

<ul id='theme_options'>
  <li><a href="#" id='theme1'>theme 1</a></li>
  <li><a href="#" id='theme2'>theme 2</a></li>
  <li><a href="#" id='theme3'>theme 3</a></li>
  <li><a href="#" id='theme4'>theme 4</a></li>
</ul>

И затем мы используем эту кросс-браузерную функцию addEvent (, написанную Джоном Резигом, автором jQuery):

function addEvent( obj, type, fn ) {
  if ( obj.attachEvent ) {
    obj['e'+type+fn] = fn;
    obj[type+fn] = function(){obj['e'+type+fn]( window.event );}
    obj.attachEvent( 'on'+type, obj[type+fn] );
  } else
    obj.addEventListener( type, fn, false );
}

Чтобы добавить обработчики событий:

addEvent(window, 'load', function() {
    var opts = document.getElementById('theme_options');
    var links = opts.getElementsByTagName('a');
    for(var x = 0; x < links.length; x++) {
        addEvent(links[x], 'click', function() {
            switchTheme(links[x].id);
        });
    }
});

Это может быть немного более многословно, чем встроенный Javascript, но оно того стоит. Я знаю, вы сказали, что хотели бы избежать jQuery, но что-то такое простое, как это, заставляет вас начать ценить библиотеку, как вы могли бы сделать это с jQuery с помощью чего-то такого простого:

$(function() {
    $('a','#theme_options').click(function() {
        switchTheme($(this).attr('id'));
        return false;
    });
});
1 голос
/ 12 июня 2009

Есть три части к этому:

1) Сам div Это остается почти одинаковым для всех стилей. Javascript только изменит атрибут класса, чтобы изменить стили, которые CSS применяет к div. Создайте элемент div, чтобы он имел стиль по умолчанию при создании страницы, и добавьте идентификатор, чтобы мы могли легко добиться этого с помощью Javascript позже:

<div class="style1" id="styleBox"></div>

2) CSS В вашем CSS вы должны иметь класс для каждого способа представления div. Сначала установите все общие атрибуты, такие как ширина и высота, в одном правиле стиля:

.style1,
.style2,
.style3 {widht:200px; height:400px; text-size:1em;}

Затем настройте правила для отдельных стилей:

.style1 {background-color: aqua;} .style2 {background-color: yellow;} .style3 {фоновый цвет: розовый;}

Обратите внимание, что все они находятся в одной таблице стилей, это облегчит управление.

3) Javascript Это где вы добавляете поведение. Вам также понадобятся ссылки для щелчка, в идеале они должны быть созданы с помощью JS, поскольку они не нужны пользователю без него, но сейчас давайте предположим, что они находятся на странице:

<div id="styleMenu">
  <a href="#" id="style1" >Style 1</a>
  <a href="#" id="style2" >Style 2</a>
  <a href="#" id="style3" >Style 3</a>
</div>

Вам понадобится функция JS, которая запускается при загрузке страницы (google "функция загрузки javascript"). В этой функции вам нужно получить ссылку на div, содержащий ссылки, и добавить событие onClick в in. Это событие будет вызываться при нажатии на ссылки - это называется делегированием событий (Google google it). В этой функции события вам нужно выяснить, по какой ссылке щелкнули, используя event.target (или event.srcElement для IE). Затем задайте для свойства className стилизованного элемента div идентификатор id ссылка, по которой щелкнули.

Я оставлю написание вам на самом деле JS, но если вы используете этот немного более длинный способ работы - и не используете встроенные стили или javascript - у вас есть чисто разделенные HTML, CSS и Javascript, которые сделают поддержание всего много проще.

0 голосов
/ 12 июня 2009

Это может помочь вам: " Динамическая загрузка внешнего файла JavaScript или CSS "

Поэтому, когда пользователь нажимает кнопку изменения темы, событие onclick загружает внешний файл CSS.

С jQuery все может быть проще / быстрее. Вам также необходимо сохранить переменную, чтобы указать, что пользователь выбрал другую тему.

0 голосов
/ 12 июня 2009

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

пример

0 голосов
/ 12 июня 2009

Это на самом деле довольно просто, пользователь выбирает цвет (# 544856), затем вы используете событие onchange или подобное и делаете:

 document.getElementById("myDiv").style.color = 
       document.getElementById("myColorTextBox").value;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...