Não pode escolher mais do que 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.
 
 
 

131 linhas
3.1 KiB

  1. export function $(expr, con) {
  2. return typeof expr === "string"? (con || document).querySelector(expr) : expr || null;
  3. }
  4. export function findNodeIndex(node)
  5. {
  6. var i = 0;
  7. while (node.previousSibling) {
  8. node = node.previousSibling;
  9. i++;
  10. }
  11. return i;
  12. }
  13. $.create = (tag, o) => {
  14. var element = document.createElement(tag);
  15. for (var i in o) {
  16. var val = o[i];
  17. if (i === "inside") {
  18. $(val).appendChild(element);
  19. }
  20. else if (i === "around") {
  21. var ref = $(val);
  22. ref.parentNode.insertBefore(element, ref);
  23. element.appendChild(ref);
  24. } else if (i === "styles") {
  25. if(typeof val === "object") {
  26. Object.keys(val).map(prop => {
  27. element.style[prop] = val[prop];
  28. });
  29. }
  30. } else if (i in element ) {
  31. element[i] = val;
  32. }
  33. else {
  34. element.setAttribute(i, val);
  35. }
  36. }
  37. return element;
  38. };
  39. export function getOffset(element) {
  40. let rect = element.getBoundingClientRect();
  41. return {
  42. // https://stackoverflow.com/a/7436602/6495043
  43. // rect.top varies with scroll, so we add whatever has been
  44. // scrolled to it to get absolute distance from actual page top
  45. top: rect.top + (document.documentElement.scrollTop || document.body.scrollTop),
  46. left: rect.left + (document.documentElement.scrollLeft || document.body.scrollLeft)
  47. };
  48. }
  49. export function isElementInViewport(el) {
  50. // Although straightforward: https://stackoverflow.com/a/7557433/6495043
  51. var rect = el.getBoundingClientRect();
  52. return (
  53. rect.top >= 0 &&
  54. rect.left >= 0 &&
  55. rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) && /*or $(window).height() */
  56. rect.right <= (window.innerWidth || document.documentElement.clientWidth) /*or $(window).width() */
  57. );
  58. }
  59. export function getElementContentWidth(element) {
  60. var styles = window.getComputedStyle(element);
  61. var padding = parseFloat(styles.paddingLeft) +
  62. parseFloat(styles.paddingRight);
  63. return element.clientWidth - padding;
  64. }
  65. export function bind(element, o){
  66. if (element) {
  67. for (var event in o) {
  68. var callback = o[event];
  69. event.split(/\s+/).forEach(function (event) {
  70. element.addEventListener(event, callback);
  71. });
  72. }
  73. }
  74. }
  75. export function unbind(element, o){
  76. if (element) {
  77. for (var event in o) {
  78. var callback = o[event];
  79. event.split(/\s+/).forEach(function(event) {
  80. element.removeEventListener(event, callback);
  81. });
  82. }
  83. }
  84. }
  85. export function fire(target, type, properties) {
  86. var evt = document.createEvent("HTMLEvents");
  87. evt.initEvent(type, true, true );
  88. for (var j in properties) {
  89. evt[j] = properties[j];
  90. }
  91. return target.dispatchEvent(evt);
  92. }
  93. // https://css-tricks.com/snippets/javascript/loop-queryselectorall-matches/
  94. export function forEachNode(nodeList, callback, scope) {
  95. if(!nodeList) return;
  96. for (var i = 0; i < nodeList.length; i++) {
  97. callback.call(scope, nodeList[i], i);
  98. }
  99. }
  100. export function activate($parent, $child, commonClass, activeClass='active', index = -1) {
  101. let $children = $parent.querySelectorAll(`.${commonClass}.${activeClass}`);
  102. forEachNode($children, (node, i) => {
  103. if(index >= 0 && i <= index) return;
  104. node.classList.remove(activeClass);
  105. })
  106. $child.classList.add(activeClass);
  107. }