
MediaWiki:Common.js: различия между версиями
| Строка 1: | Строка 1: | ||
| + | (function(){ // анонимная функция (function(){ })(), чтобы переменные "a" и "b" не стали глобальными | ||
| + | var a = document.querySelector('toc'), b = null; // селектор блока, который нужно закрепить | ||
| + | window.addEventListener('scroll', Ascroll, false); | ||
| + | document.body.addEventListener('scroll', Ascroll, false); // если у html и body высота равна 100% | ||
| + | function Ascroll() { | ||
| + | if (b == null) { // добавить потомка-обёртку, чтобы убрать зависимость с соседями | ||
| + | var Sa = getComputedStyle(a, ''), s = ''; | ||
| + | for (var i = 0; i < Sa.length; i++) { // перечислить стили CSS, которые нужно скопировать с родителя | ||
| + | if (Sa[i].indexOf('overflow') == 0 || Sa[i].indexOf('padding') == 0 || Sa[i].indexOf('border') == 0 || Sa[i].indexOf('outline') == 0 || Sa[i].indexOf('box-shadow') == 0 || Sa[i].indexOf('background') == 0) { | ||
| + | s += Sa[i] + ': ' +Sa.getPropertyValue(Sa[i]) + '; ' | ||
| + | } | ||
| + | } | ||
| + | b = document.createElement('div'); // создать потомка | ||
| + | b.style.cssText = s + ' box-sizing: border-box; width: ' + a.offsetWidth + 'px;'; | ||
| + | a.insertBefore(b, a.firstChild); // поместить потомка в цепляющийся блок первым | ||
| + | var l = a.childNodes.length; | ||
| + | for (var i = 1; i < l; i++) { // переместить во вновь созданного потомка всех остальных потомков (итого: создан потомок-обёртка, внутри которого по прежнему работают скрипты) | ||
| + | b.appendChild(a.childNodes[1]); | ||
| + | } | ||
| + | a.style.height = b.getBoundingClientRect().height + 'px'; // если под скользящим элементом есть другие блоки, можно своё значение | ||
| + | a.style.padding = '0'; | ||
| + | a.style.border = '0'; // если элементу присвоен padding или border | ||
| + | } | ||
| + | if (a.getBoundingClientRect().top <= 0) { // elem.getBoundingClientRect() возвращает в px координаты элемента относительно верхнего левого угла области просмотра окна браузера | ||
| + | b.className = 'sticky'; | ||
| + | } else { | ||
| + | b.className = ''; | ||
| + | } | ||
| + | window.addEventListener('resize', function() { | ||
| + | a.children[0].style.width = getComputedStyle(a, '').width | ||
| + | }, false); // если изменить размер окна браузера, измениться ширина элемента | ||
| + | } | ||
| + | })() | ||
| + | |||
/* Размещённый здесь JavaScript код будет загружаться всем пользователям при обращении к каждой странице */ | /* Размещённый здесь JavaScript код будет загружаться всем пользователям при обращении к каждой странице */ | ||
Версия 12:55, 26 сентября 2016
(function(){ // анонимная функция (function(){ })(), чтобы переменные "a" и "b" не стали глобальными
var a = document.querySelector('toc'), b = null; // селектор блока, который нужно закрепить
window.addEventListener('scroll', Ascroll, false);
document.body.addEventListener('scroll', Ascroll, false); // если у html и body высота равна 100%
function Ascroll() {
if (b == null) { // добавить потомка-обёртку, чтобы убрать зависимость с соседями
var Sa = getComputedStyle(a, ''), s = '';
for (var i = 0; i < Sa.length; i++) { // перечислить стили CSS, которые нужно скопировать с родителя
if (Sa[i].indexOf('overflow') == 0 || Sa[i].indexOf('padding') == 0 || Sa[i].indexOf('border') == 0 || Sa[i].indexOf('outline') == 0 || Sa[i].indexOf('box-shadow') == 0 || Sa[i].indexOf('background') == 0) {
s += Sa[i] + ': ' +Sa.getPropertyValue(Sa[i]) + '; '
}
}
b = document.createElement('div'); // создать потомка
b.style.cssText = s + ' box-sizing: border-box; width: ' + a.offsetWidth + 'px;';
a.insertBefore(b, a.firstChild); // поместить потомка в цепляющийся блок первым
var l = a.childNodes.length;
for (var i = 1; i < l; i++) { // переместить во вновь созданного потомка всех остальных потомков (итого: создан потомок-обёртка, внутри которого по прежнему работают скрипты)
b.appendChild(a.childNodes[1]);
}
a.style.height = b.getBoundingClientRect().height + 'px'; // если под скользящим элементом есть другие блоки, можно своё значение
a.style.padding = '0';
a.style.border = '0'; // если элементу присвоен padding или border
}
if (a.getBoundingClientRect().top <= 0) { // elem.getBoundingClientRect() возвращает в px координаты элемента относительно верхнего левого угла области просмотра окна браузера
b.className = 'sticky';
} else {
b.className = '';
}
window.addEventListener('resize', function() {
a.children[0].style.width = getComputedStyle(a, '').width
}, false); // если изменить размер окна браузера, измениться ширина элемента
}
})()
/* Размещённый здесь JavaScript код будет загружаться всем пользователям при обращении к каждой странице */
window.onload = function() { // после загрузки страницы
var scrollUp = document.getElementById('scrollup'); // найти элемент
scrollUp.onmouseover = function() { // добавить прозрачность
scrollUp.style.opacity=0.5;
scrollUp.style.filter = 'alpha(opacity=50)';
};
scrollUp.onmouseout = function() { //убрать прозрачность
scrollUp.style.opacity = 0.3;
scrollUp.style.filter = 'alpha(opacity=30)';
};
scrollUp.onclick = function() { //обработка клика
window.scrollTo(0,-100);
};
// show button
window.onscroll = function () { // при скролле показывать и прятать блок
if ( window.pageYOffset > 300 ) {
scrollUp.style.display = 'block';
} else {
scrollUp.style.display = 'none';
}
};
};
/** Collapsible tables *********************************************************
*
* Description: Allows tables to be collapsed, showing only the header. See
* http://www.mediawiki.org/wiki/Manual:Collapsible_tables.
* Maintainers: [[en:User:R. Koot]]
*/
var autoCollapse = 2;
var collapseCaption = '▼' // скрыть
var expandCaption = '►' // показать
function collapseTable( tableIndex ) {
var Button = document.getElementById( 'collapseButton' + tableIndex );
var Table = document.getElementById( 'collapsibleTable' + tableIndex );
if ( !Table || !Button ) {
return false;
}
var Rows = Table.rows;
if ( Button.firstChild.data == collapseCaption ) {
for ( var i = 1; i < Rows.length; i++ ) {
Rows[i].style.display = 'none';
}
Button.firstChild.data = expandCaption;
} else {
for ( var i = 1; i < Rows.length; i++ ) {
Rows[i].style.display = Rows[0].style.display;
}
Button.firstChild.data = collapseCaption;
}
}
function createCollapseButtons() {
var tableIndex = 0;
var NavigationBoxes = new Object();
var Tables = document.getElementsByTagName( 'table' );
for ( var i = 0; i < Tables.length; i++ ) {
if ( hasClass( Tables[i], 'collapsible' ) ) {
/* only add button and increment count if there is a header row to work with */
var HeaderRow = Tables[i].getElementsByTagName( 'tr' )[0];
if ( !HeaderRow ) {
continue;
}
var Header = HeaderRow.getElementsByTagName( 'th' )[0];
if ( !Header ) {
continue;
}
NavigationBoxes[tableIndex] = Tables[i];
Tables[i].setAttribute( 'id', 'collapsibleTable' + tableIndex );
var Button = document.createElement( 'span' );
var ButtonLink = document.createElement( 'a' );
var ButtonText = document.createTextNode( collapseCaption );
Button.className = 'collapseButton'; // Styles are declared in [[MediaWiki:Common.css]]
ButtonLink.style.color = Header.style.color;
ButtonLink.setAttribute( 'id', 'collapseButton' + tableIndex );
ButtonLink.setAttribute( 'href', "javascript:collapseTable(" + tableIndex + ");" );
ButtonLink.appendChild( ButtonText );
Button.appendChild( document.createTextNode( '[' ) );
Button.appendChild( ButtonLink );
Button.appendChild( document.createTextNode( ']' ) );
Header.insertBefore( Button, Header.childNodes[0] );
tableIndex++;
}
}
for ( var i = 0; i < tableIndex; i++ ) {
if ( hasClass( NavigationBoxes[i], 'collapsed' ) || ( tableIndex >= autoCollapse && hasClass( NavigationBoxes[i], 'autocollapse' ) ) ) {
collapseTable( i );
} else if ( hasClass( NavigationBoxes[i], 'innercollapse' ) ) {
var element = NavigationBoxes[i];
while ( element = element.parentNode ) {
if ( hasClass( element, 'outercollapse' ) ) {
collapseTable( i );
break;
}
}
}
}
}
addOnloadHook( createCollapseButtons );
/** Test if an element has a certain class **************************************
*
* Description: Uses regular expressions and caching for better performance.
* Maintainers: [[User:Mike Dillon]], [[User:R. Koot]], [[User:SG]]
*/
var hasClass = ( function() {
var reCache = {};
return function( element, className ) {
return ( reCache[className] ? reCache[className] : ( reCache[className] = new RegExp( "(?:\\s|^)" + className + "(?:\\s|$)" ) ) ).test( element.className );
};
})();
/*удалить*/
var site = function() {
this.navLi = $('#nav li').children('ul').hide().end();
this.init();
};
site.prototype = {
init : function() {
this.setMenu();
},
// Enables the slidedown menu, and adds support for IE6
setMenu : function() {
$.each(this.navLi, function() {
if ( $(this).children('ul')[0] ) {
$(this)
.append('<span />')
.children('span')
.addClass('hasChildren')
}
});
this.navLi.hover(function() {
// mouseover
$(this).find('> ul').stop(true, true).slideDown('slow', 'easeOutBounce');
}, function() {
// mouseout
$(this).find('> ul').stop(true, true).hide();
});
}
}
new site();
function DropDown(el) {
this.dd = el;
this.initEvents();
}
DropDown.prototype = {
initEvents : function() {
var obj = this;
obj.dd.on('click', function(event){
$(this).toggleClass('active');
event.stopPropagation();
});
}
}