AngularJS:让元素跟随光标

Posted

技术标签:

【中文标题】AngularJS:让元素跟随光标【英文标题】:AngularJS: Have element follow the cursor 【发布时间】:2016-05-06 12:27:42 【问题描述】:

jsfiddle 在这里:https://jsfiddle.net/Flignats/jzrzo56u/3/

我的页面上有一个最初隐藏的元素(弹出框)。当页面上的另一个元素悬停时,我希望弹出框显示在光标旁边。

在我的小提琴中,我有 3 个段落和弹出框。当用户的光标进入段落​​时,会显示弹出框。当用户的光标离开元素时,弹出框不再显示。

我无法检索光标坐标并将弹出框定位在光标附近。

任何帮助表示赞赏:)

角度代码:

var app = angular.module('myApp', []);

app.controller('Ctrl',['$scope',function($scope) 
$scope.name = 'Ray';
$scope.popover = false;

//Method to show popover
$scope.showPopover = function() 
return $scope.popover = !$scope.popover;
;


]);

html 代码:

<div ng-app="myApp" ng-controller="Ctrl">
  <div id="container">
    <p ng-mouseenter="showPopover()" ng-mouseleave="showPopover()">Square 1</p>
    <p ng-mouseenter="showPopover()" ng-mouseleave="showPopover()">Square 2</p>
    <p ng-mouseenter="showPopover()" ng-mouseleave="showPopover()">Square 3</p>
  </div>
  <div class="pop-availability" ng-show="popover">
    <div class="pop-title">
        <p>Title Content Goes Here</p>
    </div>
    <div class="pop-content">
        <table class="pop-table">
            <thead>
                <tr>
                    <th></th>
                    <th ng-repeat='name in data.record'>name.name</th>
                </tr>
            </thead>
            <tbody>
                <tr>
                    <td>Row 1</td>
                    <td ng-repeat='available in data.record'>available.number</td>
                </tr>
                <tr>
                    <td>Row 2</td>
                    <td ng-repeat='unavailable in data.record'>unavailable.number</td>
                </tr>
                <tr>
                    <td>Row 3</td>
                    <td ng-repeat='unassigned in data.record'>unassigned.number</td>
                </tr>
            </tbody>
        </table>
    </div>
</div>
</div>

编辑:更新了捕获鼠标坐标的 jsfiddle。仍然无法让弹出框移动到光标处:https://jsfiddle.net/Flignats/jzrzo56u/4/

编辑:越来越近了,但有点马车! https://jsfiddle.net/Flignats/jzrzo56u/5/

解决方案:https://jsfiddle.net/Flignats/jzrzo56u/6/

【问题讨论】:

看看angularjshub.com/examples/eventhandlers/mouseevents - 你会找到一种获取光标位置的方法。 【参考方案1】:

JSFiddle

HTML - 将 $event 参数添加到 showPopover 函数

<p ng-mouseenter="showPopover($event)" ng-mouseleave="showPopover()">Square 1</p>
<p ng-mouseenter="showPopover($event)" ng-mouseleave="showPopover()">Square 2</p>
<p ng-mouseenter="showPopover($event)" ng-mouseleave="showPopover()">Square 3</p>

使用 ng-style 你可以改变位置Source

<div class="pop-availability" ng-show="popover"
       ng-style="left:field.left,
                   top:field.top" > 

javascript

//Method to show popover
$scope.showPopover = function(mouseEvent) 
if (!mouseEvent)
  
    mouseEvent = window.event;
  
  $scope.field.left = mouseEvent.pageX + 'px';
  $scope.field.top = mouseEvent.pageY+ 'px';
return $scope.popover = !$scope.popover;
;

CSS 更改 - 添加 position:absolute

.pop-availability 
    border-radius: 8px;
    box-shadow: 0 0 10px 0 #969696;
    display: inline-block;
    min-width: 375px;
    position:absolute;

【讨论】:

很好的建议,这让我找到了最终的解决方案;这仍然有点错误,但回答了我原来的问题。谢谢! !mouseEvent 条件语句的目的是什么? 这是一个检查鼠标事件是否没有设置它会去从window.event获取值【参考方案2】:

如果你不介意一点 jQuery,这看起来会对你有所帮助:http://jsfiddle.net/strangeline/jxqpv/light/

代码:

function getMousePos(evt) 
    var doc = document.documentElement || document.body;
    var pos = 
        x: evt ? evt.pageX : window.event.clientX + doc.scrollLeft - doc.clientLeft,
        y: evt ? evt.pageY : window.event.clientY + doc.scrollTop - doc.clientTop
    ;
    return pos;


document.onmousemove = moveMouse;

function moveMouse(evt) 
    var pos = getMousePos(evt),
        cood = document.getElementById("showCood");
    cood.style.display = 'block';
    cood.style.left = pos.x + 50 + "px";
    cood.style.top = pos.y + 50 + "px";
    document.getElementById('posX').innerHTML = "X: " + pos.x;
    document.getElementById('posY').innerHTML = "Y: " + pos.y;



$(document).mousemove(function(e) 
    $("#jQueryPos").text(e.pageX + "," + e.pageY).show().css(
        'left': e.pageX - 50,
        "top": e.pageY - 50
    )
)

【讨论】:

感谢环顾四周,我看到了这个回复,它帮助我获取了鼠标坐标。但是,我想使用角度解决方案,但这并不能帮助我得到我想要的。

以上是关于AngularJS:让元素跟随光标的主要内容,如果未能解决你的问题,请参考以下文章

让 div 跟随光标在特定的 div 父级中

angularJS中如何写自定义指令

angularJS中如何写自定义指令

Angularjs使用的一些特点

AngularJS

精通AngularJS 读书笔记