|
1 | 1 |
|
2 |
| -首先我们需要选择一种定位球的方法。 |
| 2 | +首先,我们需要选择一种定位球的方法。 |
3 | 3 |
|
4 |
| -我们不能使用 `position:fixed`,因为滑动页面会让球在球场上移动。 |
| 4 | +我们不能使用 `position:fixed`,因为滚动页面会造成球被移出球场。 |
5 | 5 |
|
6 |
| -因此我们应该使用 `position:absolute`,并使定位稳定,让 `field` 自身定位。 |
| 6 | +所以我们应该使用 `position:absolute`,并且要使定位真正可靠,应该使 `field` 自身具有 `position:absolute`。 |
7 | 7 |
|
8 |
| -然后球会相对于球场定位: |
| 8 | +然后,球将相对于球场定位: |
9 | 9 |
|
10 | 10 | ```css
|
11 | 11 | #field {
|
|
16 | 16 |
|
17 | 17 | #ball {
|
18 | 18 | position: absolute;
|
19 |
| - left: 0; /* 相对于最近位置的祖先(字段) */ |
| 19 | + left: 0; /* 相对于最接近的祖先(field) */ |
20 | 20 | top: 0;
|
21 |
| - transition: 1s all; /* 在左上方的 CSS 特效会让球飞起来 */ |
| 21 | + transition: 1s all; /* left/top 的 CSS 动画,使球飞起来 */ |
22 | 22 | }
|
23 | 23 | ```
|
24 | 24 |
|
25 |
| -接下来我们需要指定正确的 `ball.style.position.left/top`。它们现在包含球场的相对坐标。 |
| 25 | +接下来我们需要指定正确的 `ball.style.left/top`。它们现在包含相对于球场的坐标。 |
26 | 26 |
|
27 |
| -这是图片: |
| 27 | +这是示意图: |
28 | 28 |
|
29 | 29 | 
|
30 | 30 |
|
31 |
| -我们有 `event.clientX/clientY`—— 单击窗口时的相对坐标。 |
| 31 | +我们有 `event.clientX/clientY` —— 单击位置的窗口相对坐标。 |
32 | 32 |
|
33 |
| -要获取单击字段的相对 `left` 坐标,我们可以减去字段的左边缘和边框宽度: |
| 33 | +要获取单击位置的球场相对坐标 `left`,我们可以减去球场左边缘和边框的宽度: |
34 | 34 |
|
35 | 35 | ```js
|
36 |
| -let left = event.clientX - fieldInnerCoords.left - field.clientLeft; |
| 36 | +let left = event.clientX - fieldCoords.left - field.clientLeft; |
37 | 37 | ```
|
38 | 38 |
|
39 |
| -通常情况下,`ball.style.position.left` 是指“元素的左边缘”(球)。因此,如果我们指定 `left`,那么球的边缘就会在鼠标光标下面。 |
| 39 | +通常情况下,`ball.style.left` 表示“元素的左边缘”(球)。因此,如果我们将其指定为 `left`,那么球的边缘而非球的中心将位于鼠标光标下方。 |
40 | 40 |
|
41 |
| -我们需要将球向左移动宽度的一半,向上移动高度的一半,使其居中。 |
| 41 | +我们需要将球向左移动球宽度的一半,向上移动球高度的一半,以使其居中。 |
42 | 42 |
|
43 |
| -因此,最后 `left` 是: |
| 43 | +所以,最后的 `left` 将是: |
44 | 44 |
|
45 | 45 | ```js
|
46 |
| -let left = event.clientX - fieldInnerCoords.left - field.clientLeft - ball.offsetWidth/2; |
| 46 | +let left = event.clientX - fieldCoords.left - field.clientLeft - ball.offsetWidth/2; |
47 | 47 | ```
|
48 | 48 |
|
49 |
| -使用相同的逻辑计算垂直坐标。 |
| 49 | +使用相同的逻辑来计算垂直坐标。 |
50 | 50 |
|
51 |
| -请注意,球的宽度/高度必须在我们设置 `ball.offsetWidth` 时就已知。应该在 HTML 或 CSS 中指定。 |
| 51 | +请注意,球的宽度/高度必须在我们访问 `ball.offsetWidth` 时就已知。应该在 HTML 或 CSS 中指定。 |
0 commit comments