メニューバーの切り替え
6434 ワード
HTMLコードCSSは省略しています。
-
-
-
JSコードJquery利用mousetern mouseout時間イベント依頼 $( () => {
$(() => {
//
let sub = $('#sub');
//
let activeRow;
//
let activeMenu;
//
let timer;
// li ,
//
let mouseTrack = []
// document
mouseHandler = (e) => {
mouseTrack.push({
x: e.pageX,
y: e.pageY
})
//
if (mouseTrack.length > 3) {
mouseTrack.shift();
}
}
$('#test')
.on("mouseenter", () => {
sub.removeClass('none');
$(document).bind("mousemove", mouseHandler)
})
.on("mouseleave", () => {
sub.addClass('none');
//
$(document).unbind("mousemove", mouseHandler);
})
//
.on('mouseenter', 'li', (e) => {
// li li menu
if (timer) {
clearTimeout(timer);
}
//
if (!activeRow) {
activeRow = $(e.target).addClass('active');
activeMenu = $("#" + activeRow.data("id"));
activeMenu.removeClass("none");
}
let currenMouse = mouseTrack[2];
//
let leftCorner = mouseTrack[1];
let delay = needDealy(sub,leftCorner,currenMouse) ;
//
if(delay) {
timer = setTimeout(() => {
// li
activeRow.removeClass('active');
activeMenu.addClass('none');
// li
activeRow = $(e.target);
activeMenu = $("#" + activeRow.data("id"));
activeRow.addClass("active");
activeMenu.removeClass("none");
timer = null;
}, 300);
}else{
var perActiveRow = activeRow;
var perActiveMenu = activeMenu;
activeRow = $(e.target);
activeMenu = $('#' + activeRow.data('id'));
perActiveRow.removeClass('active');
perActiveMenu.addClass('none');
activeRow.addClass('active');
activeMenu.removeClass('none')
}
});
// li menu 0
//
// 2
function vector(a, b) {
return {
x: a.x - b.x,
y: a.y - b.y
}
}
//
function vectorProduct(a, b) {
return a.x * b.y - a.y * b.x;
}
//
function isPositionInAngle(p, a, b, c) {
let pa = vector(p, a);
let pb = vector(p, b);
let pc = vector(p, c);
let t1 = vectorProduct(pa, pb);
let t2 = vectorProduct(pa, pc);
let t3 = vectorProduct(pb, pc);
return t1 * t2 * t3 > 0;
// 0
}
// li
// ele leftCorner currenMouse
function needDealy(ele, leftCorner, currenMouse) {
//
let offset = ele.offset();
//
let topLeft = {
x: offset.left,
y: offset.top
}
//
let bottomLeft = {
x: offset.left,
y: offset.top + ele.height
}
return isPositionInAngle(currenMouse,leftCorner,topLeft,bottomLeft) ;
}
})
これで完璧なメニューバーの遅延のない切り替えができます.インテリジェントポイントイベント依頼ユーザ行動の事前判断
-
-
-
$( () => {
$(() => {
//
let sub = $('#sub');
//
let activeRow;
//
let activeMenu;
//
let timer;
// li ,
//
let mouseTrack = []
// document
mouseHandler = (e) => {
mouseTrack.push({
x: e.pageX,
y: e.pageY
})
//
if (mouseTrack.length > 3) {
mouseTrack.shift();
}
}
$('#test')
.on("mouseenter", () => {
sub.removeClass('none');
$(document).bind("mousemove", mouseHandler)
})
.on("mouseleave", () => {
sub.addClass('none');
//
$(document).unbind("mousemove", mouseHandler);
})
//
.on('mouseenter', 'li', (e) => {
// li li menu
if (timer) {
clearTimeout(timer);
}
//
if (!activeRow) {
activeRow = $(e.target).addClass('active');
activeMenu = $("#" + activeRow.data("id"));
activeMenu.removeClass("none");
}
let currenMouse = mouseTrack[2];
//
let leftCorner = mouseTrack[1];
let delay = needDealy(sub,leftCorner,currenMouse) ;
//
if(delay) {
timer = setTimeout(() => {
// li
activeRow.removeClass('active');
activeMenu.addClass('none');
// li
activeRow = $(e.target);
activeMenu = $("#" + activeRow.data("id"));
activeRow.addClass("active");
activeMenu.removeClass("none");
timer = null;
}, 300);
}else{
var perActiveRow = activeRow;
var perActiveMenu = activeMenu;
activeRow = $(e.target);
activeMenu = $('#' + activeRow.data('id'));
perActiveRow.removeClass('active');
perActiveMenu.addClass('none');
activeRow.addClass('active');
activeMenu.removeClass('none')
}
});
// li menu 0
//
// 2
function vector(a, b) {
return {
x: a.x - b.x,
y: a.y - b.y
}
}
//
function vectorProduct(a, b) {
return a.x * b.y - a.y * b.x;
}
//
function isPositionInAngle(p, a, b, c) {
let pa = vector(p, a);
let pb = vector(p, b);
let pc = vector(p, c);
let t1 = vectorProduct(pa, pb);
let t2 = vectorProduct(pa, pc);
let t3 = vectorProduct(pb, pc);
return t1 * t2 * t3 > 0;
// 0
}
// li
// ele leftCorner currenMouse
function needDealy(ele, leftCorner, currenMouse) {
//
let offset = ele.offset();
//
let topLeft = {
x: offset.left,
y: offset.top
}
//
let bottomLeft = {
x: offset.left,
y: offset.top + ele.height
}
return isPositionInAngle(currenMouse,leftCorner,topLeft,bottomLeft) ;
}
})
これで完璧なメニューバーの遅延のない切り替えができます.インテリジェントポイントイベント依頼ユーザ行動の事前判断