/*
主站,子频道,定向站点共用
*/
(function() { scrollToAnchor(); toggleSearchForm(); scrollTop(); initScrollBar(); // 文档图片放大查看
imgZoom(); renderCodeBox(); dropdownClick(); fixAside(); // 侧边栏固定
function fixAside() {
if (SITE_SLUG === 'open') {
var headerHeight = $('.header').outerHeight() + $('.search-wrapper').outerHeight() + 32;
var offsetTop = $('.dropdown-menu-selector').height() || 0;
affixSidebar(headerHeight, offsetTop);
affix($('.breadcrumb'), headerHeight, 0);
} else {
var headerHeight = $('.header').outerHeight();
var offsetTop = 86;
affixSidebar(headerHeight, offsetTop);
}
} // 页面加载时的锚点定位
function initScrollBar() {
$(window).on('load', function() {
var hash = decodeURIComponent(window.location.hash);
if (!hash) return; // 兼容 toc 旧版本中的链接错误
if (hash.substr(0, 2) === '##') {
hash = hash.substr(1);
} if (hash !== '#' && $(hash).length) {
var top = $(hash).offset().top - $('.breadcrumb').outerHeight(); // 子站点需要计算头部高度
if (SITE_SLUG !== 'open') {
top -= $('.page-title').outerHeight();
}
setTimeout(function() {
$(window).scrollTop(top);
}, 0);
}
});
} function affix($el, headerHeight, offsetTop) {
$(window).on('load scroll resize', function () {
if (!$el.length) return; var scrollTop = window.scrollY || window.pageYOffset;
if (scrollTop > headerHeight) {
$el.css({
position: 'fixed',
top: offsetTop,
left: $el.offset().left,
right: $('body').width() - $el.offset().left - $el.width(),
})
} else {
$el.removeAttr('style')
}
});
} function affixSidebar(headerHeight, offsetTop) {
var footerHeight = $('.body-footer').outerHeight();
var $sidebar = $('.sidebar-wrapper');
var $breadcrumb = $('.breadcrumb'); $(window).on('load scroll resize', function () {
var scrollTop = window.scrollY || window.pageYOffset; // sidebar fixed 时跟底部保持的距离
var offsetBottom = document.body.scrollHeight - scrollTop - window.innerHeight - 32; var bottom = 0;
if (offsetBottom < footerHeight) {
bottom = footerHeight - offsetBottom;
} $sidebar.find('.sidebar').css({
'height': window.innerHeight - bottom - offsetTop,
}); // sidebar fixed
if (scrollTop > headerHeight) {
$sidebar.addClass('fixed');
} else {
$sidebar.removeClass('fixed');
}
});
} function dropdownClick() {
// dropdown trigger: click
$('body').on('click', '.dropdown .dropdown-trigger', function() {
var $dropdown = $(this).parent('.dropdown');
$dropdown.toggleClass('open'); if ($dropdown.hasClass('open') && $dropdown.hasClass('dropdown-menu-selector')) {
var $menu = $('#main-menu');
var $active = $menu.find('.menu-item .active');
if ($active.length) {
var top = $menu.scrollTop() + $active.position().top - 56;
if (top > 0) {
$menu.scrollTop(top);
}
}
}
});
$('html').on('click', function() {
$('.dropdown.open').removeClass('open');
});
$('html').on('click', '.dropdown', function(e) {
e.stopPropagation();
});
} function renderCodeBox() {
// copy code
var $codeBox = $('<div class="code-box" />');
var codeTemplate = '<span class="btn-copy-code">点击复制</span>';
$('code.language-js, code.language-javascript, code.language-jsx').each(function(index, item) {
$(item).parent('pre').wrap($codeBox).before(codeTemplate);
}) var clipboard = new Clipboard('.btn-copy-code', {
text: function(trigger) {
return trigger.nextElementSibling.textContent;
}
}); var clipboardTimer = null;
clipboard.on('success', (e) => {
$(e.trigger).text('复制成功!');
if (clipboardTimer) {
clearTimeout(clipboardTimer);
}
clipboardTimer = setTimeout(() => {
$(e.trigger).text('点击复制');
}, 1500);
});
} function imgZoom() {
var zoomDefaults = {
styles: {
zoomImage: {
cursor : 'zoom-out',
position : 'absolute',
transition : 'transform 300ms',
transform : 'translate3d(0, 0, 0) scale(1)',
transformOrigin : 'center center',
willChange : 'transform, top, left'
},
zoomContainer: {
position : 'fixed',
top : 0,
right : 0,
bottom : 0,
left : 0,
zIndex : 1024,
},
overlay: {
position : 'absolute',
top : 0,
right : 0,
bottom : 0,
left : 0,
backgroundColor : '#FFF',
opacity : 0,
transition : 'opacity 300ms',
},
btn: {
position : 'absolute',
bottom : 12,
right : 12,
padding : '4px 10px',
border : '1px solid #e9e9e9',
borderRadius : 2,
fontSize : 12,
color : '#999',
},
btnHover: {
color : '#666',
},
},
};
var zoomOriginImage = null;
var zoomTimer = null;
// zoom in
$('.markdown').on('click', 'img', function() {
zoomOriginImage = $(this).get(0); var $wrap = $('<div />');
$wrap.css(zoomDefaults.styles.zoomContainer); var $overlay = $('<div class="overlay" />');
$overlay.css(zoomDefaults.styles.overlay); var $img = $(this).clone();
$img.css(getImageStyle(zoomOriginImage, false)); var $btn = $('<a target="_blank" />');
$btn.attr('href', $img.attr('src')).text('查看原图');
$btn.css(zoomDefaults.styles.btn); $btn.hover(function() {
$(this).css(zoomDefaults.styles.btnHover);
}, function() {
$(this).css(zoomDefaults.styles.btn);
}); $wrap.append($overlay).append($img).append($btn);
$('#zoom-img').append($wrap); // transition
$overlay.css({
opacity: 1,
});
$img.css(getImageStyle($img.get(0), true));
}); // zoom out
$('#zoom-img').on('click', function() {
var $zoom = $(this);
$zoom.find('img').css(getImageStyle(zoomOriginImage, false));
$zoom.find('.overlay').css({
opacity: 0
}); if (zoomTimer) {
clearTimeout(zoomTimer);
}
zoomTimer = setTimeout(function() {
$zoom.html('');
zoomOriginImage = null;
}, 150);
}); $(window).on('scroll', function() {
$('#zoom-img').html('');
zoomOriginImage = null;
}); $(window).on('resize', function() {
if ($('#zoom-img img').length) {
$('#zoom-img img').css(getImageStyle(zoomOriginImage, true));
}
}); function getImageStyle(image, isZoom) {
var imageOffset = image.getBoundingClientRect();
var top = imageOffset.top;
var left = imageOffset.left;
var width = image.width;
var height = image.height; var style = {
top: top,
left: left,
width: width,
height: height
}; if (!isZoom) {
return Object.assign({}, zoomDefaults.styles.zoomImage, style);
} // Get the the coords for center of the viewport
var viewportX = window.innerWidth / 2;
var viewportY = window.innerHeight / 2; // Get the coords for center of the original image
var imageCenterX = imageOffset.left + image.width / 2;
var imageCenterY = imageOffset.top + image.height / 2; // Get offset amounts for image coords to be centered on screen
var translateX = viewportX - imageCenterX;
var translateY = viewportY - imageCenterY; // Figure out how much to scale the image so it doesn't overflow the screen
var scale = getScale(width, height); var zoomStyle = {
transform: 'translate3d(' + translateX + 'px, ' + translateY + 'px, 0) scale(' + scale + ')',
} return Object.assign({}, zoomDefaults.styles.zoomImage, style, zoomStyle);
} function getScale(width, height) {
var totalMargin = 40;
var scaleX = window.innerWidth / (width + totalMargin);
var scaleY = window.innerHeight / (height + totalMargin);
return Math.min(scaleX, scaleY);
}
} function scrollTop() {
// scroll top
$(window).on('load scroll', function() {
if ($(window).scrollTop() > 400) {
$('#scroll-top').addClass('visible');
} else {
$('#scroll-top').removeClass('visible');
}
})
$('#scroll-top').on('click', function(e) {
e.preventDefault();
$('html, body').animate({
scrollTop: 0
}, 150);
})
} function scrollToAnchor(offsetTop) {
// anchor click scroll to element
var breadcrumbHeight = $('.breadcrumb').outerHeight();
var offsetTop = 0;
if (SITE_SLUG === 'open') {
offsetTop = breadcrumbHeight;
} else {
offsetTop = $('.page-title').outerHeight() + breadcrumbHeight;
} // 锚点处理
$('.markdown').on('click', 'a', function(e) {
var href = $(this).attr('href');
if (/^#/.test(href)) {
e.preventDefault();
if ($(href).length) {
var top = $(href).offset().top - offsetTop;
$('html, body').scrollTop(top);
}
}
});
} function toggleSearchForm() {
// header search
$('.header').on('click', '.btn-search', function(e) {
e.preventDefault();
$('.header .user-menu').addClass('search-open');
$('.header .search-form input').focus();
})
$('html').on('click', function(e) {
$('.header .user-menu.search-open').removeClass('search-open');
})
$('html').on('click', '.header .search-form', function(e) {
e.stopPropagation();
})
}
}());

最新文章

  1. java学习之接口、多态和内部类
  2. javascript操作referer
  3. Microsoft.AspNet.SignalR 2.2
  4. 4412开发板升级4.2之后改了logo开机后屏幕闪解决办法
  5. linux命令(5):rm 命令
  6. WEB 业务测试中需要关注的问题
  7. am335x 1G nand 启动Linux qt
  8. 如何让AutoCAD自动加载Arx,比如ArxDbg.arx
  9. Handsontable 学习笔记-Methods
  10. mpi冒泡排序并行化
  11. 8款替代Dreamweaver的开源网页开发工具
  12. 阿里云服务器CentOS 5.7(64位)安装配置LAMP服务器(Apache+PHP5+MySQL)
  13. CCNP路由实验(1) -- EIGRP
  14. struts2 之 ServletAPI
  15. Echarts使用Ajax异步获得数据的前端json格式转化问题
  16. 【Gym 100971G】Repair
  17. tedu训练营day04
  18. sublime Text 正则表达式功能使用介绍
  19. java主线程等待所有子线程执行完毕在执行(常见面试题)
  20. 团队作业——Beta冲刺2

热门文章

  1. ORM for Net主流框架汇总与效率测试
  2. Training JTAG Interface
  3. 通过webbrowser控件获取验证码
  4. 无法打开物理文件 XXX.mdf&quot;,操作系统错误 5:&quot;5(拒绝访问。)&quot;的解决办法
  5. 在ASP.NET MVC中使用jQuery的Load方法加载静态页面的一个注意点
  6. 利用进程ID获取主线程ID
  7. NGINX前端代理TOMCAT取真实客户端IP
  8. java.lang.ClassCastException: android.widget.RelativeLayout$LayoutParams cannot be cast to android.widget.AbsListView$LayoutParams
  9. Winfrom固定Label宽度,根据文本动态改变Label的高度 z
  10. 抢票季:吐槽12306 &amp; 分享抢票经验