1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
| var CODE_MAX_HEIGHT = 200; var containers = [];
$('body').on('click', '.js_unfold_code_btn', function () { $(this).closest('.js_highlight_container').addClass('on'); });
$('body').on('click', '.js_retract_code_btn', function () { var $container = $(this).closest('.js_highlight_container').removeClass('on'); var winTop = $(window).scrollTop(); var offsetTop = $container.offset().top; $(this).css('top', 0); if (winTop > offsetTop) { $('body, html').animate({ scrollTop: $container.offset().top - CODE_MAX_HEIGHT }, 600); } });
$(window).on('scroll', function () { var scrollTop = $(window).scrollTop(); var temp = []; for (let i = 0; i < containers.length; i++) { var item = containers[i]; var { $container, height, $hide, hasHorizontalScrollbar } = item; if ($container.closest('body').length === 0) { continue; } temp.push(item); if (!$container.hasClass('on')) { continue; } var offsetTop = $container.offset().top; var hideBtnHeight = $hide.outerHeight(); var maxTop = parseInt(height - (hasHorizontalScrollbar ? 17 : 0) - hideBtnHeight); let top = parseInt( Math.min( Math.max(scrollTop - offsetTop, 0), maxTop, ) ); var halfHeight = parseInt($(window).height() / 2 * Math.sin((top / maxTop) * 90 * (2 * Math.PI / 360))); $hide.css('top', Math.min(top + halfHeight, maxTop)); } containers = temp; });
function addCodeWrap($node) { var $container = $node.wrap('<div class="js_highlight_container highlight-container"><div class="highlight-wrap"></div></div>').closest('.js_highlight_container');
var $btn = $(` <div class="highlight-footer"> <a class="js_unfold_code_btn show-btn" href="javascript:;">展开代码<i class="fa fa-angle-down" aria-hidden="true"></i></a> </div> <a class="js_retract_code_btn hide-btn" href="javascript:;"><i class="fa fa-angle-up" aria-hidden="true"></i>收起代码</a> `);
$container.append($btn); return $container; };
function codeUnfold() { $('.highlight').each(function () { if (this.__render__ === true) { return true; } this.__render__ = true; var $this = $(this); var height = $(this).outerHeight(); if (height > CODE_MAX_HEIGHT) { var $container = addCodeWrap($this, height); containers.push({ $container, height, $hide: $container.find('.js_retract_code_btn'), hasHorizontalScrollbar: this.scrollWidth > this.offsetWidth, }); } }); };
|