Advertisement
Guest User

Untitled

a guest
Jun 25th, 2019
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.56 KB | None | 0 0
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8" />
  5. <title>webcomponents test</title>
  6. <link
  7. href="data:image/x-icon;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQEAYAAABPYyMiAAAABmJLR0T///////8JWPfcAAAACXBIWXMAAABIAAAASABGyWs+AAAAF0lEQVRIx2NgGAWjYBSMglEwCkbBSAcACBAAAeaR9cIAAAAASUVORK5CYII="
  8. rel="icon"
  9. type="image/x-icon"
  10. />
  11.  
  12. <style>
  13. ui-tab-toggle {
  14. border: 1px solid #222;
  15. }
  16.  
  17. ui-tab-toggle a {
  18. text-decoration: none;
  19. display: inline-block;
  20. padding: 2px 4px;
  21. }
  22.  
  23. ui-tab-toggle .selected {
  24. color: red;
  25. font-weight: bold;
  26. }
  27.  
  28. ui-tab-content {
  29. display: block;
  30. border: 1px solid gray;
  31. }
  32. </style>
  33. </head>
  34. <body>
  35. <script>
  36. class UiTabToggle extends HTMLElement {
  37. update(idx) {
  38. const els = Array.prototype.slice.apply(this.children);
  39. els.forEach((el, i) => {
  40. el.className = idx === i ? 'selected' : '';
  41. });
  42.  
  43. const contentEl = this.parentNode.querySelector('ui-tab-content');
  44. contentEl && contentEl.setAttribute('chosen', idx);
  45. }
  46.  
  47. connectedCallback() {
  48. const items = this.getAttribute('data').split(',');
  49. items.forEach((it, idx) => {
  50. const aEl = document.createElement('a');
  51. aEl.setAttribute('href', '#' + idx);
  52. aEl.appendChild(document.createTextNode(it));
  53. this.appendChild(aEl);
  54. });
  55.  
  56. this.addEventListener('click', (ev) => {
  57. ev.preventDefault();
  58. ev.stopPropagation();
  59. const el = ev.target;
  60. const idx = parseInt(el.getAttribute('href').substring(1), 10);
  61. this.update(idx);
  62. });
  63. this.update(0);
  64. }
  65. }
  66.  
  67. customElements.define('ui-tab-toggle', UiTabToggle);
  68.  
  69. class UiTabContent extends HTMLElement {
  70. static get observedAttributes() {
  71. return ['chosen'];
  72. }
  73.  
  74. get chosen() {
  75. return parseInt(this.getAttribute('chosen'), 10);
  76. }
  77.  
  78. set chosen(idx) {
  79. this.setAttribute('chosen', idx);
  80. }
  81.  
  82. update() {
  83. let idx = this.chosen;
  84. //console.log('update', idx);
  85. if (isNaN(idx)) {
  86. idx = 0;
  87. }
  88.  
  89. const els = Array.prototype.slice.apply(this.children);
  90. els.forEach((el, i) => {
  91. el.style.display = idx === i ? '' : 'none';
  92. });
  93. }
  94.  
  95. connectedCallback() {
  96. this.update();
  97. }
  98.  
  99. attributeChangedCallback(attr, v0, v1) {
  100. if (attr === 'chosen' && this.isConnected) {
  101. this.update();
  102. }
  103. }
  104. }
  105.  
  106. customElements.define('ui-tab-content', UiTabContent);
  107. </script>
  108.  
  109. <ui-tab-toggle data="A,B"></ui-tab-toggle>
  110. <ui-tab-content>
  111. <div>ONE</div>
  112. <div>TWO</div>
  113. </ui-tab>
  114. </body>
  115. </html>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement