rect-hittest-002.html (4376B)
1 <!DOCTYPE html> 2 <title>elementFromPoint(...) on <rect>s with simple strokes</title> 3 <link rel="help" href="https://svgwg.org/svg2-draft/interact.html#hit-testing"> 4 <script src="/resources/testharness.js"></script> 5 <script src="/resources/testharnessreport.js"></script> 6 <style> 7 #rect1:hover, 8 #rect2:hover, 9 #rect3:hover, 10 #rect4:hover, 11 #rect5:hover, 12 #rect6:hover { 13 stroke: #00f; 14 } 15 </style> 16 <svg id="svg" width="420" height="300" version="1.1"> 17 <rect id="border" x="0.5" y="0.5" width="419" height="299" stroke="#000" stroke-width="1" fill="none"/> 18 19 <rect id="rect1" x="70" y="30" width="100" height="80" stroke="#000" stroke-width="20" fill="none"/> 20 <rect id="rect2" x="40" y="150" width="50" height="120" stroke="#000" stroke-width="20" fill="none" transform="rotate(20 65 210)"/> 21 <rect id="rect3" x="140" y="200" width="150" height="70" stroke="#000" stroke-width="20" fill="none"/> 22 <rect id="rect4" x="220" y="50" width="60" height="10" stroke="#000" stroke-width="20" fill="none"/> 23 <rect id="rect5" x="230" y="100" width="10" height="60" stroke="#000" stroke-width="20" fill="none" transform="rotate(-45 235 130)"/> 24 <rect id="rect6" x="310" y="130" width="10" height="10" stroke="#000" stroke-width="20" fill="none"/> 25 </svg> 26 <script> 27 // Points are relative to the client rect of the <svg> root. 28 const tests = [ 29 { x: 30, y: 12, expectedElemId: "svg" }, 30 { x: 118, y: 10, expectedElemId: "svg" }, 31 { x: 197, y: 12, expectedElemId: "svg" }, 32 { x: 201, y: 28, expectedElemId: "svg" }, 33 { x: 15, y: 70, expectedElemId: "svg" }, 34 { x: 97, y: 52, expectedElemId: "svg" }, 35 { x: 149, y: 49, expectedElemId: "svg" }, 36 { x: 85, y: 82, expectedElemId: "svg" }, 37 { x: 122, y: 98, expectedElemId: "svg" }, 38 { x: 154, y: 75, expectedElemId: "svg" }, 39 { x: 72, y: 130, expectedElemId: "svg" }, 40 { x: 48, y: 145, expectedElemId: "svg" }, 41 { x: 31, y: 279, expectedElemId: "svg" }, 42 { x: 28, y: 201, expectedElemId: "svg" }, 43 { x: 71, y: 179, expectedElemId: "svg" }, 44 { x: 43, y: 244, expectedElemId: "svg" }, 45 { x: 74, y: 219, expectedElemId: "svg" }, 46 { x: 94, y: 261, expectedElemId: "svg" }, 47 { x: 126, y: 231, expectedElemId: "svg" }, 48 { x: 146, y: 185, expectedElemId: "svg" }, 49 { x: 173, y: 216, expectedElemId: "svg" }, 50 { x: 225, y: 258, expectedElemId: "svg" }, 51 { x: 247, y: 284, expectedElemId: "svg" }, 52 { x: 286, y: 174, expectedElemId: "svg" }, 53 { x: 254, y: 120, expectedElemId: "svg" }, 54 { x: 203, y: 96, expectedElemId: "svg" }, 55 { x: 244, y: 163, expectedElemId: "svg" }, 56 { x: 300, y: 37, expectedElemId: "svg" }, 57 { x: 335, y: 136, expectedElemId: "svg" }, 58 59 // Test all four outer corner points of #rect1 60 { x: 60, y: 20, expectedElemId: "rect1" }, 61 { x: 180, y: 20, expectedElemId: "rect1" }, 62 { x: 180, y: 120, expectedElemId: "rect1" }, 63 { x: 60, y: 120, expectedElemId: "rect1" }, 64 // Test all four interior corner points of #rect1 65 { x: 80, y: 40, expectedElemId: "rect1" }, 66 { x: 160, y: 40, expectedElemId: "rect1" }, 67 { x: 160, y: 100, expectedElemId: "rect1" }, 68 { x: 80, y: 100, expectedElemId: "rect1" }, 69 70 { x: 67, y: 56, expectedElemId: "rect1" }, 71 { x: 146, y: 27, expectedElemId: "rect1" }, 72 { x: 173, y: 111, expectedElemId: "rect1" }, 73 74 { x: 28, y: 242, expectedElemId: "rect2" }, 75 { x: 51, y: 182, expectedElemId: "rect2" }, 76 { x: 89, y: 155, expectedElemId: "rect2" }, 77 78 { x: 136, y: 198, expectedElemId: "rect3" }, 79 { x: 177, y: 270, expectedElemId: "rect3" }, 80 { x: 275, y: 197, expectedElemId: "rect3" }, 81 { x: 297, y: 233, expectedElemId: "rect3" }, 82 83 { x: 235, y: 47, expectedElemId: "rect4" }, 84 { x: 272, y: 61, expectedElemId: "rect4" }, 85 { x: 290, y: 70, expectedElemId: "rect4" }, 86 87 { x: 233, y: 140, expectedElemId: "rect5" }, 88 89 { x: 312, y: 128, expectedElemId: "rect6" }, 90 { x: 330, y: 150, expectedElemId: "rect6" } 91 ]; 92 93 setup(() => { 94 const svg = document.getElementById("svg"); 95 const svgBounds = svg.getBoundingClientRect(); 96 window.svgOrigin = { 97 x: svgBounds.left << 0, 98 y: svgBounds.top << 0, 99 }; 100 }); 101 102 tests.forEach(testcase => { 103 test(t => { 104 const expectedElem = document.getElementById(testcase.expectedElemId); 105 const hitElem = document.elementFromPoint(svgOrigin.x + testcase.x, svgOrigin.y + testcase.y); 106 assert_equals(hitElem, expectedElem); 107 }, `${document.title}, element at (${testcase.x}, ${testcase.y})`); 108 }); 109 </script>