1. はじめに
マウスドラッグ要素を実装する最初の目的は、ページ上で多数の小さな点をドラッグして位置を固定し、HTMLをコピーしてページの開発コードに貼り付けることです。これはそのような機能であり、それを実現しています。あちこちでやりましたが、jQuery.fn.draggable プラグインを使用するしかありませんでした。いくつかの情報や他の人のアイデアを参考にして、今日はこのドラッグ機能を完成させました。実装時
2. デザインアイデア
マウスダウンイベントをドラッグ要素にバインドし、マウス移動イベントとマウスアップイベントをドキュメントオブジェクトにバインドします。
なぜ 3 つのイベントすべてをドラッグ要素にバインドしないのでしょうか。これは、マウス移動イベントとポップアップイベントのハンドラーが原因です。マウスの動きが速すぎると実行されません
$(document)
.bind('mousemove', fn)
.bind('mouseup', fn);
3. ソースコード実装の詳細
実装のソース コードには注目すべき点が数多くあります:
1. まず、マウス プレス イベントで、要素をクリックしてドラッグすると、領域のテキストが選択されることがあります。これは、次のとおりです。
これはブラウザーのメッセージです。デフォルトの動作なので、ブラウザのデフォルトの動作をブロックするだけです
最初に実装されたコードは次のとおりです:
したがって、コードには次のことが必要です。次のように処理されます:
function _initOptions() {
var noop = function(){}, defaultOptions;
defaultOptions = { // 默认配置项
boundaryElem: 'body' // 边界容器
};
options = $.extend( defaultOptions, options || {} );
$boundaryElem = $(options.boundaryElem);
dragStart = options.dragStart || noop,
dragMove = options.dragMove || noop,
dragEnd = options.dragEnd || noop;
}
function _drag(e) {
var clientX, clientY, offsetLeft, offsetTop,
$target = $(this), self = this;
limitObj = {
_left: 0,
_top: 0,
_right: ($boundaryElem.innerWidth() || $(window).width()) - $target.outerWidth(),
_bottom: ($boundaryElem.innerHeight() || $(window).height()) - $target.outerHeight()
};
// 记录鼠标按下时的位置及拖动元素的相对位置
clientX = e.clientX;
clientY = e.clientY;
offsetLeft = this.offsetLeft;
offsetTop = this.offsetTop;
dragStart.apply(this, arguments);
$(document).bind('mousemove', moveHandle)
.bind('mouseup', upHandle);
// 鼠标移动事件处理
function moveHandle(e) {
var x = e.clientX - clientX + offsetLeft;
var y = e.clientY - clientY + offsetTop;
$target.css({
left: Math.max( Math.min(x, limitObj._right), limitObj._left) + 'px',
top: Math.max( Math.min(y, limitObj._bottom), limitObj._top) + 'px'
});
ragMove.apply(self, argument);
// 浏览器默认行範囲(ネズミ标在拖動图片一小段距離、会出一禁止小提案、すなわち:图片は再実行できません)
e.preventDefault();
);
}
_initOptions(); // 構成オブジェクトを初期化します
$(this)
.css({position: 'absolute' })
$(this).bind('mousedown', function(e){
_drag.apply(this, [e]); // ie9 未満の場合
window.getSelection? window.getSelection(). AllRanges(): document.selection.empty( ); 🎜> });
インスタンス呼び出し:
コードをコピー
コードは次のとおりです:
// インスタンスの呼び出し
(関数(){$('.drag-elem').drag({