├── README.md ├── index.html ├── puretabs.js └── puretabs.min.js /README.md: -------------------------------------------------------------------------------- 1 | # pureTabs 2 | Простые табы без зависимостей на чистом JavaScript. 3 | 4 | Работает во всех современных браузерах (IE9+). 5 | 6 | ## Примеры использования 7 | Простейший пример: 8 | 9 | ```html 10 | Первая секция 11 | Вторая секция 12 | 13 |
Содержимое первой секции
14 |
Содержимое второй секции
15 | 16 | 17 | 22 | ``` 23 | 24 | Ссылки и секции связаны идентификатором секции, который прописывается в атрибут `href` у ссылки. Каждая ссылка должна иметь общий класс (по умолчанию — `puretabs`). Чтобы задать секцию по умолчанию, следует добавить к ссылке на эту секцию класс `puretabs--active`. 25 | 26 | ### Пользовательские классы 27 | Чтобы задать ссылкам пользовательские классы, достаточно при инициализации скрипта передать их в качестве параметров: 28 | 29 | ```javascript 30 | var className = 'tab', // Общий класс ссылок 31 | activeClassName = 'tab--active' // Класс активной ссылки 32 | 33 | pureTabs.init(className, activeClassName); 34 | ``` 35 | 36 | ### Несколько табов на странице 37 | Если на странице требуется создать несколько блоков с табами, у ссылок в каждом из блоков должны быть разные общие классы. 38 | 39 | ```html 40 |
41 | Первая секция 42 | Вторая секция 43 | 44 |
Содержимое первой секции
45 |
Содержимое второй секции
46 |
47 | 48 |
49 | Секция 1 50 | Секция 2 51 | 52 |
Содержимое секции 1
53 |
Содержимое секции 2
54 |
55 | 56 | 57 | 63 | ``` -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | pureTabs — простые табы на чистом JavaScript 8 | 9 | 10 | 11 | 90 | 91 | 92 | 93 |
94 |
95 |

pureTabs

96 | github 97 |
98 |

Миниатюрные табы на чистом JavaScript (в сжатом виде ~1kb). Работает во всех современных браузерах (IE9+). Инструкции по использованию смотрите на гитхабе.

99 | 100 |
101 | 107 | 108 |

Умножение двух векторов (скалярное), конечно, непосредственно обуславливает интеграл по поверхности. Пустое подмножество, конечно, определяет абстрактный интеграл по бесконечной области. Лемма в принципе концентрирует параллельный детерминант. Система координат стремится к нулю.

109 | 110 |

Нормаль к поверхности, общеизвестно, концентрирует анормальный криволинейный интеграл. Неопределенный интеграл, в первом приближении, основан на тщательном анализе. Ортогональный определитель порождает косвенный график функции.

111 | 112 |

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

113 | 114 |

Подынтегральное выражение, очевидно, тривиально. Система координат в принципе масштабирует функциональный анализ, что несомненно приведет нас к истине. Первообразная функция искажает интеграл Гамильтона. Непрерывная функция, не вдаваясь в подробности, соответствует невероятный интеграл Фурье.

115 |
116 | 117 |

118 | <div class="tabs">
119 |   <nav class="tabs__navigation">
120 |     <a class="tabs__link tabs__link--active" href="#first">первая секция</a>
121 |     <a class="tabs__link" href="#second">вторая секция</a>
122 |     <a class="tabs__link" href="#third">третья секция</a>
123 |     <a class="tabs__link" href="#fourth">четвёртая секция</a>
124 |   </nav>
125 | 
126 |   <p class="tabs__section" id="first">Умножение двух векторов…</p>
127 |   <p class="tabs__section" id="second">Нормаль к поверхности…</p>
128 |   <p class="tabs__section" id="third">Математическое моделирование…</p>
129 |   <p class="tabs__section" id="fourth">Подынтегральное выражение…</p>
130 | </div>
131 | 
132 | <script>
133 |   pureTabs.init('tabs__link', 'tabs__link--active');
134 | </script>
135 | 
136 | 137 | 138 |
139 | 140 | 141 | 144 | 145 | 150 | 151 | -------------------------------------------------------------------------------- /puretabs.js: -------------------------------------------------------------------------------- 1 | (function(exports) { 2 | 3 | var $ = document.querySelectorAll.bind(document); 4 | 5 | exports.pureTabs = { 6 | 7 | toggle: function(e) { 8 | var activeClassName = this.activeClassName, 9 | oldSection = $('[data-puretabs]')[0], 10 | newSection = $(e.currentTarget.hash)[0]; 11 | 12 | removeClass($(activeClassName)[0], activeClassName.substr(1)); 13 | addClass(e.currentTarget, activeClassName.substr(1)); 14 | 15 | oldSection.style.display = 'none'; 16 | oldSection.removeAttribute('data-puretabs'); 17 | 18 | newSection.style.display = 'block'; 19 | newSection.setAttribute('data-puretabs', ''); 20 | }, 21 | 22 | init: function(className, activeClassName) { 23 | var self = this; 24 | 25 | self.className = '.' + className || '.puretabs'; 26 | self.activeClassName = '.' + activeClassName || '.puretabs--active'; 27 | 28 | var links = [].slice.call($(self.className)); 29 | 30 | links.forEach(function(link) { 31 | 32 | if (!containsClass(link, self.activeClassName.substr(1))) { 33 | $(link.hash)[0].style.display = 'none'; 34 | } else { 35 | $(link.hash)[0].setAttribute('data-puretabs', ''); 36 | } 37 | 38 | link.addEventListener('click', function(e) { 39 | e.preventDefault(); 40 | self.toggle.call(self, e) 41 | }); 42 | 43 | }); 44 | } 45 | 46 | }; 47 | 48 | 49 | // Helpers 50 | function addClass(e, c) { 51 | var re = new RegExp("(^|\\s)" + c + "(\\s|$)", "g"); 52 | if (re.test(e.className)) return; 53 | e.className = (e.className + " " + c).replace(/\s+/g, " ").replace(/(^ | $)/g, "") 54 | } 55 | 56 | function removeClass(e, c) { 57 | var re = new RegExp("(^|\\s)" + c + "(\\s|$)", "g"); 58 | e.className = e.className.replace(re, "$1").replace(/\s+/g, " ").replace(/(^ | $)/g, ""); 59 | } 60 | 61 | function containsClass(e, c) { 62 | var re = new RegExp("(^|\\s)" + c + "(\\s|$)", "g"); 63 | return re.test(e.className) ? true : false; 64 | } 65 | 66 | })(window); -------------------------------------------------------------------------------- /puretabs.min.js: -------------------------------------------------------------------------------- 1 | !function(e){function a(e,a){var s=new RegExp("(^|\\s)"+a+"(\\s|$)","g");s.test(e.className)||(e.className=(e.className+" "+a).replace(/\s+/g," ").replace(/(^ | $)/g,""))}function s(e,a){var s=new RegExp("(^|\\s)"+a+"(\\s|$)","g");e.className=e.className.replace(s,"$1").replace(/\s+/g," ").replace(/(^ | $)/g,"")}function t(e,a){var s=new RegExp("(^|\\s)"+a+"(\\s|$)","g");return s.test(e.className)?!0:!1}var r=document.querySelectorAll.bind(document);e.pureTabs={toggle:function(e){var t=this.activeClassName,c=r("[data-puretabs]")[0],l=r(e.currentTarget.hash)[0];s(r(t)[0],t.substr(1)),a(e.currentTarget,t.substr(1)),c.style.display="none",c.removeAttribute("data-puretabs"),l.style.display="block",l.setAttribute("data-puretabs","")},init:function(e,a){var s=this;s.className="."+e||".puretabs",s.activeClassName="."+a||".puretabs--active";var c=[].slice.call(r(s.className));c.forEach(function(e){t(e,s.activeClassName.substr(1))?r(e.hash)[0].setAttribute("data-puretabs",""):r(e.hash)[0].style.display="none",e.addEventListener("click",function(e){e.preventDefault(),s.toggle.call(s,e)})})}}}(window); --------------------------------------------------------------------------------