OrnaJS — свободная JavaScript библиотека для динамической стилизации HTML элементов без прямого написания JS или CSS кода. Стилизация осуществляется методом прибавления классов к HTML элементу, как и в привычных CSS-библиотеках. В отличие от СSS-библиотек, Orna не ограничена количеством ранее прописанных в ней классов, а работает как парсер, динамически обрабатывает класс и задает стиль. Стилизация в OrnaJS основана по принципу Atomic CSS, из чего следует, что вид элемента создается по частям (атомам), но не одним классом. Орну можно сравнить с атрибутом style в HTML, но с наследованием, сокращениями и событиями. Имя Orna сокращение от Ornament (украшение). В первые два месяца после публикации, хотя Орна предлагает нестандартный метод стилизации страниц, ее успели скачать более 2000 разработчиков, что говорит о растущей популярности динамической стилизации.

OrnaJS и Atomic CSS


Atomic CSS — методология написания CSS кода, которая соблюдает принцип «один класс = одно свойство». При написании стилей по методологии Atomic CSS, разработчик создает универсальные классы, которые в большинстве случаев несут только одно свойство и его значение. Она призвана убрать повторяемость, многословность, запутанность при работе CSS и также с CSS препроцессорах, Less, Sass. CSS является фундаментом для создания стилей он дает возможность сделать надстройки и разрабатывать удобные архитектуры для конкретных разработчиков, именно поэтому у него полная форма свойств и нет строгой архитектуры. архитектура Atomic CSS разрабатывается командой из Yahoo, OrnaOrg и всеми энтузиастами.

Проект OrnaJS начался в 2015 году и изначально разрабатывался как инструмент для удобной реализации Atomic CSS архитектуры, но потом был подвержен реформации и сейчас соблюдает от части правила из Atomic CSS и от части из React CSS.
React CSS — реактивный CSS, в отличие от методологии Atomic CSS работает с динамическими стилями, которые создаются в процессе работы с элементами. React CSS методология, которая широко используется при создании SPA, где элементы разметки создаются динамически и изначально их еще нет. Команда Orna создала отдельную библиотеку для полной реализации Atomic CSS, которая предполагает уже описание атомарные стили, а не их динамическое создание, Orna4Node. Orna4Node автоматически генерирует CSS файл на основе классов прописанных в элементах, в отличие от OrnaJS которая не создает CSS файл, а на прямую, методами JavaScript обращается к DOM дереву. Orna4Node похожа по работе на Atomizer от Yahoo!..

OrnaJS и jQuery


OrnaJS работает вместе с библиотекой jQuery, из которой вынесла основные селекторы и выборки по элементам. Orna работает с первой версией jQuery, со второй и с третьей, выбор поставлен на разработчика.

bgc_red_div:even — класс задает красный цвет фона всем четным, дочерним div элементам.

bgc_red_div:odd — класс задает красный цвет фона всем нечетным, дочерним div элементам.

bgc_red_div:first — класс задает красный цвет фона первому дочернему div элементу.

bgc_red_div:last — класс задает красный цвет фона последнему дочернему div элементу.

bgc_red_option:selected — класс задает красный цвет фона всем выбраним дочерним элементам option.

bgc_red_input[type=text] — класс задает красный цвет фона всем дочерним элементам input с типом текст.

bgc_red_#menu — класс задает красный цвет фона дочернему элементу с id menu.

bgc_red_.menu — класс задает красный цвет фона всем дочерним элементам с классом menu.

Основное предназначение


Основное предназначение библиотеки-парсера OrnaJS упростить работу при стилизации элементов разметки. Орна помогает избавиться от повторяемости стилей, чрезмерной многословности и что основное от работы над структуризацией СSS кода. Так как Орна переняла основные идеи от методологии Atomic CSS, при работе с ней все атомарно, то есть стиль собирается частицами и все стили ложатся независимо, чисто, без необходимости усердного рефакторинга. Также с использованием Орны больше нет необходимости задавать стили элементам при помощи jQuery или Native JavaScript, так как в Орне это гораздо проще, из-за уровня абстракции, что работает по принципу водопада html --> ornajs --> jquery --> native javascript.

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


Использовать Орну можно и для полной стилизации странниц или как дополнение к основным каркасным стилям. В современной тенденции веб-разработки, где много динамики и состояний, разработчики все больше и больше отходят от статической HTML и СSS разметки, в сторону их динамического создания в процессе взаимодействия пользователе с интерфейсом. OrnaJS может быть использована в контексте с react.js, riot.js, handlebars.js, angular.js, bootstrap.

Подключение библиотек:

<head>
<script src="jquery.js"></script>
<script src="orna.js"></script>
</head>

Структура классов в OrnaJS


property_value
color_red

property_value_event
color_red_click

property_value_childtagname
color_red_div

property_value_event_childtagname
color_red_click_div

property_value_childtagname_event
color_red_div_click

Стилизация


<div class="bgc_black c_yellow h_100px br_20px shadow_0_0_20px_0_red">Hello! I'm decorated by OrnaJS...</div>


<div class="bgc_black_a c_yellow_a h_30px_a br_20px_a">Hello! My (a)link decorated by OrnaJS...
<a href="#">1</a>
<a href="#">2</a>
<a href="#">3</a>
<a href="#">4</a>
</div>

DOM дерево


Если динамически изменить DOM дерево?


1. Все новые элементы автоматически следуют стилям, которые были указаны через родительские элементы для дочерних, без перезапуска Орны.

Пример:

<div class = "text-decoration_none_a border_none_button"> 
<a>link</a>
<button>Click</button>
</div>


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

Для этого запустить нужно функцию createatom(); Без аргумента функция стилизует все новые элементы, минуя старые, с аргументом конкретный новый элемент.

В OrnaJS подключаются любой font, который есть на компьютере в системных шрифтах, или загружен прямо в СSS и в его названии нет пробелов, так как пробел OrnaJS понимает, как конец класса. Два шрифта Arial и Times New Roman подключаются одним словом (arial, times) просто для быстрого доступа, а вообще нужно писать класс:

<span class="ff_Verdana">Text</span>
<span class="font-family_Verdana">Text</span>

Демо


codepen.io/DimaPopov/pen/dXyZQR
codepen.io/DimaPopov/pen/JKEaby
fiddle.jshell.net/dimapopov/hokLfqqo
www.youtube.com/watch?v=k4mkK_3YUk8

Ссылки


ornaorg.github.io
ornaorg.github.io/AtomicCSS.html
www.npmjs.com/package/ornajs
github.com/OrnaOrg
github.com/OrnaOrg/OrnaJS

Поделиться с друзьями
-->

Комментарии (19)


  1. greabock
    05.08.2016 17:14
    +19

    <div class="bgc_black c_yellow h_100px br_20px shadow_0_0_20px_0_red">...</div>

    хм… где-то я это видел… а, ну точно же!


    <div style="background-color:black;color:yellow;height:100px;border-radius:20px;box-shadow:0 0 20px 0 red;">...</div>


    1. Revertis
      05.08.2016 17:41
      +6

      Ну что вы хотите от человека, который пишет в заголовке вместо рАбота рОбота? :)


      1. shoomyst
        05.08.2016 18:46
        +2

        Я когда открывал статью, думал это игра слов, и речь будет идти об управлении роботами :)


      1. dimapopov
        08.08.2016 10:12

        =) Сорри


    1. dimapopov
      07.08.2016 22:07

      Привет, про inline стили все знают, только в них нет наследования, выборки, сортировки и событий.


  1. Zenitchik
    05.08.2016 19:10

     <div class="h_100px_click">Orna</div>

    Что-то в этом есть. Но как-то больно неуклюже.


    1. dimapopov
      07.08.2016 22:28

      Можно так

      <div class="h_100px_click">Orna</div> 
      <div class="height_100px_click">Orna</div>
      


      Если не устраивает underscore как разделитель, его очень просто заменить в коде библиотеки на другой символ, тем самым сделав custom версию под себя, буквально стереть один символ и написать новый.


      1. Zenitchik
        07.08.2016 23:06

        А как обрабатывается клик? Повторный клик как будет обрабатываться?


        1. dimapopov
          08.08.2016 10:09

          Events in OrnaJS

          mouseover or just over
          (color_red_mouseover)
          (color_red_over)


          mouseout or just out
          (color_red_mouseout)
          (color_red_out)


          mousedown or just down
          (color_red_mousedown)
          (color_red_down)


          mouseup or just up
          (color_red_mouseup)
          (color_red_up)


          blur
          (color_red_blur)

          focus
          (color_red_focus)

          click
          (color_red_click)

          Это все события в OrnaJS

          Они не предполагают решения всех задач, а только определенных, так сказать к месту. В CSS клика нету вообще, он эмулируется через метод «придумывания велосипедов» или :target, про инлайн стили вообще писать не буду. Если надо специфичную логику нужно JS пилить.


          1. Zenitchik
            08.08.2016 16:21

            <div class="h_100px_click">Orna</div>

            Нет, я имел в виду, что произойдёт в этом случае? При клике будет установлена высота? А повторный клик, соотвественно, обработан не будет?


            1. dimapopov
              09.08.2016 09:08

              Класс становится холостым, до сброса высоты или до перезагрузки страницы


  1. xGromMx
    05.08.2016 20:12
    +1

    А где часы? Там были еще раньше часы в либе. Не без часов не интересно.


    1. dimapopov
      07.08.2016 22:08

      Класс inTime — put time into element


      1. xGromMx
        08.08.2016 10:26

        Не, это не то. Там были часы аналоговые, со стрелками.


  1. ZloDeeV
    05.08.2016 22:49
    +1

    Цепочка из else в коде скрипта выглядит потрясающе. Особенно если представлять, что человек это написал ссылаясь на удобство, но тем самым добавив звено между html — link to css — обработка браузером. Теперь это html — jQuery — ornajs — inline css — обработка браузером.

    Хотя если бы это было как часть препроцессора для html. Если бы в jade в классы писались свойства, а css генерировался исходя из этих классов, то может быть что-то более-менее адекватное получилось бы, но верится, все равно, с трудом.


  1. Grawl
    06.08.2016 11:39

    Выглядит ещё хуже, чем Atomic CSS.


    1. dimapopov
      07.08.2016 22:11

      Atomic CSS, как по мне прекрасен, не везде конечно же


  1. dolphin4ik
    07.08.2016 14:40

    боюсь представить как бы это работало по БЭМу…


    1. dimapopov
      08.08.2016 10:11

      БЭМ, как и все на любителя