คำตอบสั้น ๆ :
ฉันทำมัน ฉันเขียนฟังก์ชันสำหรับการใช้งานแบบไดนามิกสำหรับคนตัวเล็ก ๆ ที่นั่น ...
ตัวอย่างการทำงานที่แสดงบนหน้า
ตัวอย่างการทำงานการบันทึกไปยังคอนโซล
คำตอบยาว:
... ยังทำอยู่
ฉันใช้เวลาสักครู่ในการทำเช่นนี้เนื่องจากองค์ประกอบ psuedo ไม่ได้อยู่บนหน้าจริงๆ ในขณะที่คำตอบบางข้อด้านบนใช้งานได้ในบางสถานการณ์พวกเขาทั้งหมดล้มเหลวในการเป็นแบบไดนามิกและทำงานในสถานการณ์ที่องค์ประกอบมีทั้งขนาดและตำแหน่งที่ไม่คาดคิด (เช่นองค์ประกอบตำแหน่งที่แน่นอนซ้อนทับส่วนหนึ่งขององค์ประกอบหลัก) ฉันไม่ได้
การใช้งาน:
//some element selector and a click event...plain js works here too
$("div").click(function() {
//returns an object {before: true/false, after: true/false}
psuedoClick(this);
//returns true/false
psuedoClick(this).before;
//returns true/false
psuedoClick(this).after;
});
มันทำงานอย่างไร:
มันคว้าตำแหน่งความสูงความกว้างด้านบนและด้านซ้าย (ขึ้นอยู่กับตำแหน่งที่อยู่ห่างจากขอบหน้าต่าง) ขององค์ประกอบหลักและคว้าความสูงความกว้างด้านบนและตำแหน่งด้านซ้าย (ขึ้นอยู่กับขอบของภาชนะบรรจุหลัก ) และเปรียบเทียบค่าเหล่านั้นเพื่อกำหนดตำแหน่งที่องค์ประกอบ psuedo อยู่บนหน้าจอ
จากนั้นจะเปรียบเทียบตำแหน่งของเมาส์ ตราบใดที่เมาส์อยู่ในช่วงตัวแปรที่สร้างขึ้นใหม่มันจะคืนค่าเป็นจริง
บันทึก:
ก็ควรที่จะทำให้องค์ประกอบหลักสัมพันธ์กัน หากคุณมีองค์ประกอบ psuedo ตำแหน่งแน่นอนฟังก์ชั่นนี้จะทำงานเฉพาะถ้ามันถูกวางตำแหน่งตามขนาดของผู้ปกครอง (ดังนั้นผู้ปกครองจะต้องเป็นญาติ ... อาจเหนียวหรือคงที่จะทำงานเกินไป .... ฉันไม่รู้)
รหัส:
function psuedoClick(parentElem) {
var beforeClicked,
afterClicked;
var parentLeft = parseInt(parentElem.getBoundingClientRect().left, 10),
parentTop = parseInt(parentElem.getBoundingClientRect().top, 10);
var parentWidth = parseInt(window.getComputedStyle(parentElem).width, 10),
parentHeight = parseInt(window.getComputedStyle(parentElem).height, 10);
var before = window.getComputedStyle(parentElem, ':before');
var beforeStart = parentLeft + (parseInt(before.getPropertyValue("left"), 10)),
beforeEnd = beforeStart + parseInt(before.width, 10);
var beforeYStart = parentTop + (parseInt(before.getPropertyValue("top"), 10)),
beforeYEnd = beforeYStart + parseInt(before.height, 10);
var after = window.getComputedStyle(parentElem, ':after');
var afterStart = parentLeft + (parseInt(after.getPropertyValue("left"), 10)),
afterEnd = afterStart + parseInt(after.width, 10);
var afterYStart = parentTop + (parseInt(after.getPropertyValue("top"), 10)),
afterYEnd = afterYStart + parseInt(after.height, 10);
var mouseX = event.clientX,
mouseY = event.clientY;
beforeClicked = (mouseX >= beforeStart && mouseX <= beforeEnd && mouseY >= beforeYStart && mouseY <= beforeYEnd ? true : false);
afterClicked = (mouseX >= afterStart && mouseX <= afterEnd && mouseY >= afterYStart && mouseY <= afterYEnd ? true : false);
return {
"before" : beforeClicked,
"after" : afterClicked
};
}
สนับสนุน:
ฉันไม่รู้ว่า .... มันดูเหมือนว่าเป็นคนโง่และชอบที่จะคืนค่ารถยนต์เป็นค่าที่คำนวณได้ในบางครั้ง มันดูเหมือนจะทำงานได้ดีในเบราว์เซอร์ทั้งหมดถ้าขนาดอยู่ใน CSS ดังนั้น ... ตั้งค่าความสูงและความกว้างของคุณบนองค์ประกอบ psuedo ของคุณและย้ายพวกเขาด้วยด้านบนและซ้าย ฉันแนะนำให้ใช้กับสิ่งที่คุณไม่เป็นไร เหมือนภาพเคลื่อนไหวหรือบางสิ่ง Chrome ใช้งานได้ ... ตามปกติ