ui.js 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. /**
  2. * @Author: Bachir Soussi Chiadmi <bach>
  3. * @Date: 12-09-2017
  4. * @Email: bachir@figureslibres.io
  5. * @Last modified by: bach
  6. * @Last modified time: 12-09-2017
  7. * @License: GPL-V3
  8. */
  9. // https://plainjs.com
  10. module.exports = {
  11. init(){
  12. // console.log('UI init');
  13. this.initStickyTitles();
  14. },
  15. initStickyTitles(){
  16. // _____ __ _ __ __ _ __ __
  17. // / ___// /_(_)____/ /____ __ / /_(_) /_/ /__
  18. // \__ \/ __/ / ___/ //_/ / / / / __/ / __/ / _ \
  19. // ___/ / /_/ / /__/ ,< / /_/ / / /_/ / /_/ / __/
  20. // /____/\__/_/\___/_/|_|\__, / \__/_/\__/_/\___/
  21. // /____/
  22. // https://codepen.io/chrissp26/pen/gBrdo?editors=0010
  23. // let header_height = $('header').height();
  24. let header_height = document.getElementsByTagName('header')[0].clientHeight;
  25. // console.log(header_height);
  26. // create the stkd titles wrapper block
  27. let stkd_wrapper = document.createElement('div');
  28. stkd_wrapper.classList.add('sticky-clone-wrapper');
  29. document.body.append(stkd_wrapper);
  30. // get all part title
  31. let part_titles = new Array();
  32. Array.from(document.querySelectorAll('h1.part-title')).forEach(function(e){
  33. e._part = e.getAttribute('part');
  34. part_titles.push(e)
  35. });
  36. console.log('part_titles', part_titles);
  37. var stkd_part,
  38. last_stkd_part = false,
  39. subparts,
  40. stkd_subpart,
  41. last_stkd_subpart = false,
  42. clone;
  43. let OnScroll = function(event){
  44. // console.log('on scrool', event);
  45. stkd_part = false;
  46. for (let i = part_titles.length-1; i >= 0; i--) {
  47. if(part_titles[i].getBoundingClientRect().top < header_height){
  48. stkd_part = part_titles[i];
  49. // console.log("stkd_part");
  50. break;
  51. }
  52. }
  53. if (stkd_part) {
  54. // console.log('got stkd_part', stkd_part._part);
  55. if(stkd_part._part !== last_stkd_part._part){
  56. console.log('new sticky', stkd_part.innerHTML);
  57. // clone only once
  58. clone = stkd_part.cloneNode(true);
  59. // stkd_wrapper.innerHTML = '';
  60. // fill stkd_wrapper
  61. stkd_wrapper.appendChild(clone);
  62. last_stkd_part = stkd_part;
  63. // // get all subpart title only once
  64. // let part_wrapper = stkd_part.parentNode;
  65. // subparts = new Array();
  66. // Array.from(part_wrapper.querySelectorAll('h2.title')).forEach(function(e){
  67. // subparts.push(e)
  68. // });
  69. // // console.log('subparts', subparts);
  70. }
  71. // // subtitle
  72. // stkd_subpart = false;
  73. // for (let i = subparts.length-1; i >= 0; i--) {
  74. // if(subparts[i].getBoundingClientRect().top < header_height + stkd_part.clientHeight){
  75. // stkd_subpart = subparts[i];
  76. // break;
  77. // }
  78. // }
  79. //
  80. // if (stkd_subpart){
  81. // if( stkd_subpart.innerHTML !== last_stkd_subpart.innerHTML ){
  82. // console.log("new stkd_subpart "+stkd_subpart.innerHTML);
  83. // clone = stkd_subpart.cloneNode(true);
  84. // // stkd_wrapper.lastChild.remove();
  85. // stkd_wrapper.appendChild(clone);
  86. // last_stkd_subpart = stkd_subpart;
  87. // }
  88. // }else{
  89. // // stkd_wrapper.lastChild.remove();
  90. // stkd_subpart = last_stkd_subpart = false;
  91. // }
  92. }else{
  93. // empty stkd_wrapper
  94. stkd_wrapper.innerHTML = '';
  95. stkd_part = last_stkd_part = false;
  96. }
  97. };
  98. //
  99. // $window.on('scroll', OnScroll);
  100. // console.log('window', window);
  101. window.onscroll = OnScroll;
  102. }
  103. }