CSS в помощь JavaScript программисту пятница
29 Февраля
С помощью JavaScript можно без проблем манипулировать всеми характеристиками узлов на
Возможности CSS позволяют большую часть этой задачи переложить на верстальщика, а программисту останется лишь реализовать манипуляцию состояниями этих узлов. Такой подход к решению задачи позволяет обойти большую часть «подводных камней» и решить многие задачи без особых трудностей.
Самый простейший пример —
<script>
function hide(nodeId)
{
var node = document.getElementById(nodeId);
if (node)
{
node.style.display = 'none';
}
}
function show(nodeId)
{
var node = document.getElementById(nodeId);
if (node)
{
node.style.display = 'block';
}
}
</script>
<input type="button" value="Скрыть" onclick="hide('test')" />
<input type="button" value="Показать" onclick="show('test')" />
<div id="test">Аллюзийно-полистилистическая композиция продолжает сет, и здесь мы видим ту самую каноническую секвенцию с разнонаправленным шагом отдельных звеньев.</div>
Вот что получилось:
Тут все отлично работает, и придраться не к чему. Возьмем другой пример:
<p>Мама мыла <span id="lie">раму. Сын любит</span> папу.</p>
<input type="button" value="Показать всю правду" />
<input type="button" value="Вернуть, как было" />
Допустим, по клику на кнопке «Показать всю правду» нам нужно скрыть узел span#lie (тег span c идентификатором lie). А при клике на кнопке «Вернуть, как было» показать этот узел снова. Попробуем применить ту же самую функциональность для реализации этой задачи:
<script>
function hide(nodeId)
{
var node = document.getElementById(nodeId);
if (node)
{
node.style.display = 'none';
}
}
function show(nodeId)
{
var node = document.getElementById(nodeId);
if (node)
{
node.style.display = 'block';
}
}
</script>
<p>Мама мыла <span id="lie">раму. Сын любит </span>папу.</p>
<input type="button" value="Показать всю правду" onclick="hide('lie')" />
<input type="button" value="Вернуть, как было" onclick="show('lie')" />
Результат работы проверим в действии:
Мама мыла раму. Сын любит папу.
Как видно из примера, кнопка «Показать всю правду» выполняет свою задачу так, как и хотелось. А вот при клике на кнопку «Вернуть, как было»текст появляется вновь, но с некоторыми искажениями — появляются совершенно ненужные переносы строк.
В чем причина? Те, кто немного знают CSS уже давно поняли, куда я клоню. Все дело в том что, если свойству display любого узла установить значение block, то узел становится блочным элементом, который занимает по умолчанию 100% ширины. В нашем случае необходимо устанавливать значение inline, а не block. И зачем программисту знать такие тонкости? В данном случае вовсе не обязательно.
Можно пойти другим путем — например, изменить код функции hide, добавив сохранение исходного значения в промежуточную переменнную. Но есть способ лучше.
Повернем возможности CSS в нашу сторону. Создадим специальный
<style>
.hidden {display: none;}
</style>
<script>
function hide(nodeId)
{
var node = document.getElementById(nodeId);
if (node)
{
node.className = 'hidden';
}
}
function show(nodeId)
{
var node = document.getElementById(nodeId);
if (node)
{
node.className = '';
}
}
</script>
<p>Мама мыла <span id="lie">раму. Сын любит </span>папу.</p>
<input type="button" value="Показать всю правду" onclick="hide('lie')" />
<input type="button" value="Вернуть, как было" onclick="show('lie')" />
Вот теперь все работает так, как нужно:
Мама мыла раму. Сын любит папу.
Остается, правда, еще одна проблема — не учитывается случай, при котором узел уже имеет
В общем случае данный подход можно охарактеризовать так: нужно стремиться манипулировать не характеристиками узлов, а их состояниями. Наличие того или иного класса у узла и есть то самое состояние. Учитывая что узел может сочитать несколько классов, можно даже довольно сложные манипуляции свести к простой схеме переключения состояний. А потом попросить верстальщика подготовить в таблице стилей специальные правила для этих состояний.
Постараюсь в следующий раз дать примеры реализации более сложных задач с использованием такого подхода.
- allatone
4 марта - Пример не очень. Такое делается как раз «явно». Это эффективно в том случае, когда надо менять несколько свойств у элемента (цвет, размер шрифта... и т.п.) одновременно. Тогда, действительно удобно, то, что эти свойства определяются сначала на этапе разработки дизайна, а затем классами/индификаторами в CSS.
- Владимир Вашурин
12 марта - Лучше работать с CSS классами и, соответственно, управлять ими в динамике. Так будет проще, быстрее и дешевле в плане разработки и поддержке кода. Опять же принцип разделения кода от его представления.
Было б интересно почитать про управления CSS классами из JS (т.е. через className).
- Владимир Вашурин
12 марта - Но тут не было примера, как поступать, в случае если у HTML объекта несколько CSS классов или уже есть какой то класс (был необходим для верстальщика), а удалять/добавлять необходимо не все, а один или два.
- cmd
30 августа - Спасибо, пригодилось. Я нуб, так что критиковать нечего. Работает быстро и правильно.
- B~Vladi
5 мая В нашем случае необходимо устанавливать значение inline, а не block. И зачем программисту знать такие тонкости? В данном случае вовсе не обязательно.
В топку такого программиста! Бред.
- B~Vladi
12 мая - Имхо, кто верстает, тот пусть и пишет скритп, т.к. знаю по себе - бывает такое наверстаешь (дизайнеры - зло), то простейшие вещи (например, выезжающая панель) нереально сделать, не зная хорошо кода вёрстки. Получается, что всё равно нада вникать во всё это и, возможно, дописывать своих стилей чтобы не сгореть в аду. А для всего этого необходимо занть чем отличается display:inline от display:block и видеть с чем ты работаешь (в этом примере текст (или inline)). Конечно в большинстве случаев бывает просто что-либо докрутить к сайту, но этот пример с display не прокатил. Детский сад.
29 Февраля