自定义上下文菜单按列拆分
Custom Context Menu splits on columns
我编写了一个简单的上下文菜单,该菜单在右键单击无序列表的 li
后出现。
它工作正常,但它看起来很奇怪并且随 html 浮动。
它应该看起来像这样:
我真的希望有人能帮助我理解发生了什么。我需要上下文菜单出现在 li
.
的正下方
请将此脚本添加到您的 tampermonkey
引擎并在 this page:
上试用
// ==UserScript==
// @name Burning Series
// @namespace http://bs.to/
// @version 1.0
// @description -
// @author Me
// @match https://bs.to/andere-serien
// @require https://code.jquery.com/jquery-3.3.1.min.js
// @grant GM_addStyle
// ==/UserScript==
GM_addStyle('.contextMenuParent { position: relative; }');
GM_addStyle('.contextMenuContainer { position: absolute; background: gray; z-index: 100; -webkit-box-shadow: 10px 10px 31px -1px rgba(0,0,0,0.75);-moz-box-shadow: 10px 10px 31px -1px rgba(0,0,0,0.75);box-shadow: 5px 5px 15px -1px rgba(0,0,0,0.75);}');
GM_addStyle('.contextMenu { display: grid; padding: 4px; width: 200px; border: 1px solid black; color: black; }');
GM_addStyle('.contextMenu li { border-bottom: 1px solid gray; }');
GM_addStyle('.contextMenu li:hover { cursor: pointer; color: red; }');
var contextMenuLinks =
"<li class='contextMenu01'>A</li>"+
"<li class='contextMenu02'>B</li>" +
"<li class='contextMenu03'>C</li>" +
"<li class='contextMenu04'>D</li>" +
"<li class='contextMenu05'>E</li>" +
"<li class='contextMenu06'>F</li>";
$(document).ready(function() {
$("div.genre > ul > li").each(function(i, obj) {
$(this).addClass("contextMenuParent");
$(this).contextmenu(function(e) {
e.preventDefault();
$(".contextMenuContainer").remove();
$(this).append("<div class='contextMenuContainer'><ul class='contextMenu'>" + contextMenuLinks + "</ul></div>");
});
});
$(document).on("click", ".contextMenu li", function() {
var c = $(this).attr("class");
alert("test:" + c);
var title = $(this).closest(".contextMenuParent").find("a").attr("title");
$(".contextMenuContainer").remove();
});
});
您应该使用fixed
定位并通过javascript计算坐标。 $(window)
我还添加了一个滚动事件,所以你可以重新计算坐标并移动固定元素。
fixed
表示文档 上的精确 x-y 坐标 因此您需要从该位置减去 $(window).scrollTop()
以获得屏幕坐标, 并添加 li
的 height
,使其正好位于元素下方(不与其重叠)。
这是代码,我用 Tampermonkey 测试了它,它工作正常。
// ==UserScript==
// @name Burning Series
// @namespace http://bs.to/
// @version 1.0
// @description -
// @author Me
// @match https://bs.to/andere-serien
// @require https://code.jquery.com/jquery-3.3.1.min.js
// @grant GM_addStyle
// ==/UserScript==
GM_addStyle('.contextMenuParent { position: relative; }');
GM_addStyle('.contextMenuContainer { position: absolute; background: gray; z-index: 100; -webkit-box-shadow: 10px 10px 31px -1px rgba(0,0,0,0.75);-moz-box-shadow: 10px 10px 31px -1px rgba(0,0,0,0.75);box-shadow: 5px 5px 15px -1px rgba(0,0,0,0.75);}');
GM_addStyle('.contextMenu { display: grid; padding: 4px; width: 200px; border: 1px solid black; color: black; }');
GM_addStyle('.contextMenu li { border-bottom: 1px solid gray; }');
GM_addStyle('.contextMenu li:hover { cursor: pointer; color: red; }');
var contextMenuLinks =
"<li class='contextMenu01'>A</li>"+
"<li class='contextMenu02'>B</li>" +
"<li class='contextMenu03'>C</li>" +
"<li class='contextMenu04'>D</li>" +
"<li class='contextMenu05'>E</li>" +
"<li class='contextMenu06'>F</li>";
$(document).ready(function() {
$("div.genre > ul > li").each(function(i, obj) {
$(this).addClass("contextMenuParent");
$(this).contextmenu(function(e) {
e.preventDefault();
$(".contextMenuContainer").remove();
$(this).append("<div class='contextMenuContainer'><ul class='contextMenu'>" + contextMenuLinks + "</ul></div>");
// Calculate the offset coordinates and set CSS rules
var off = $(this).offset();
var scroll = $(window).scrollTop();
$(this).find(".contextMenuContainer").css({
'position': 'fixed',
'left': off.left + 'px',
'top': (off.top + $(this).outerHeight() - scroll) + 'px'
});
});
});
// Move the menu with window scroll
$(window).on('scroll', function(){
if($(".contextMenuContainer").length) {
var $elem = $(".contextMenuContainer").parents(".contextMenuParent");
var off = $elem.offset();
var scroll = $(window).scrollTop();
$(".contextMenuContainer").css('top', (off.top + $elem.outerHeight() - scroll) + 'px');
}
});
$(document).on("click", ".contextMenu li", function() {
var c = $(this).attr("class");
var title = $(this).closest(".contextMenuParent").find("a").attr("title");
$(".contextMenuContainer").remove();
});
});
我编写了一个简单的上下文菜单,该菜单在右键单击无序列表的 li
后出现。
它工作正常,但它看起来很奇怪并且随 html 浮动。
它应该看起来像这样:
我真的希望有人能帮助我理解发生了什么。我需要上下文菜单出现在 li
.
请将此脚本添加到您的 tampermonkey
引擎并在 this page:
// ==UserScript==
// @name Burning Series
// @namespace http://bs.to/
// @version 1.0
// @description -
// @author Me
// @match https://bs.to/andere-serien
// @require https://code.jquery.com/jquery-3.3.1.min.js
// @grant GM_addStyle
// ==/UserScript==
GM_addStyle('.contextMenuParent { position: relative; }');
GM_addStyle('.contextMenuContainer { position: absolute; background: gray; z-index: 100; -webkit-box-shadow: 10px 10px 31px -1px rgba(0,0,0,0.75);-moz-box-shadow: 10px 10px 31px -1px rgba(0,0,0,0.75);box-shadow: 5px 5px 15px -1px rgba(0,0,0,0.75);}');
GM_addStyle('.contextMenu { display: grid; padding: 4px; width: 200px; border: 1px solid black; color: black; }');
GM_addStyle('.contextMenu li { border-bottom: 1px solid gray; }');
GM_addStyle('.contextMenu li:hover { cursor: pointer; color: red; }');
var contextMenuLinks =
"<li class='contextMenu01'>A</li>"+
"<li class='contextMenu02'>B</li>" +
"<li class='contextMenu03'>C</li>" +
"<li class='contextMenu04'>D</li>" +
"<li class='contextMenu05'>E</li>" +
"<li class='contextMenu06'>F</li>";
$(document).ready(function() {
$("div.genre > ul > li").each(function(i, obj) {
$(this).addClass("contextMenuParent");
$(this).contextmenu(function(e) {
e.preventDefault();
$(".contextMenuContainer").remove();
$(this).append("<div class='contextMenuContainer'><ul class='contextMenu'>" + contextMenuLinks + "</ul></div>");
});
});
$(document).on("click", ".contextMenu li", function() {
var c = $(this).attr("class");
alert("test:" + c);
var title = $(this).closest(".contextMenuParent").find("a").attr("title");
$(".contextMenuContainer").remove();
});
});
您应该使用fixed
定位并通过javascript计算坐标。 $(window)
我还添加了一个滚动事件,所以你可以重新计算坐标并移动固定元素。
fixed
表示文档 上的精确 x-y 坐标 因此您需要从该位置减去 $(window).scrollTop()
以获得屏幕坐标, 并添加 li
的 height
,使其正好位于元素下方(不与其重叠)。
这是代码,我用 Tampermonkey 测试了它,它工作正常。
// ==UserScript==
// @name Burning Series
// @namespace http://bs.to/
// @version 1.0
// @description -
// @author Me
// @match https://bs.to/andere-serien
// @require https://code.jquery.com/jquery-3.3.1.min.js
// @grant GM_addStyle
// ==/UserScript==
GM_addStyle('.contextMenuParent { position: relative; }');
GM_addStyle('.contextMenuContainer { position: absolute; background: gray; z-index: 100; -webkit-box-shadow: 10px 10px 31px -1px rgba(0,0,0,0.75);-moz-box-shadow: 10px 10px 31px -1px rgba(0,0,0,0.75);box-shadow: 5px 5px 15px -1px rgba(0,0,0,0.75);}');
GM_addStyle('.contextMenu { display: grid; padding: 4px; width: 200px; border: 1px solid black; color: black; }');
GM_addStyle('.contextMenu li { border-bottom: 1px solid gray; }');
GM_addStyle('.contextMenu li:hover { cursor: pointer; color: red; }');
var contextMenuLinks =
"<li class='contextMenu01'>A</li>"+
"<li class='contextMenu02'>B</li>" +
"<li class='contextMenu03'>C</li>" +
"<li class='contextMenu04'>D</li>" +
"<li class='contextMenu05'>E</li>" +
"<li class='contextMenu06'>F</li>";
$(document).ready(function() {
$("div.genre > ul > li").each(function(i, obj) {
$(this).addClass("contextMenuParent");
$(this).contextmenu(function(e) {
e.preventDefault();
$(".contextMenuContainer").remove();
$(this).append("<div class='contextMenuContainer'><ul class='contextMenu'>" + contextMenuLinks + "</ul></div>");
// Calculate the offset coordinates and set CSS rules
var off = $(this).offset();
var scroll = $(window).scrollTop();
$(this).find(".contextMenuContainer").css({
'position': 'fixed',
'left': off.left + 'px',
'top': (off.top + $(this).outerHeight() - scroll) + 'px'
});
});
});
// Move the menu with window scroll
$(window).on('scroll', function(){
if($(".contextMenuContainer").length) {
var $elem = $(".contextMenuContainer").parents(".contextMenuParent");
var off = $elem.offset();
var scroll = $(window).scrollTop();
$(".contextMenuContainer").css('top', (off.top + $elem.outerHeight() - scroll) + 'px');
}
});
$(document).on("click", ".contextMenu li", function() {
var c = $(this).attr("class");
var title = $(this).closest(".contextMenuParent").find("a").attr("title");
$(".contextMenuContainer").remove();
});
});