< meta charset ="utf-8" /> < meta name ="viewport" content ="width=device-width, initial-scale=1" /> < title > 实现div拖拽时出现辅助线,以方便和其它div很容易的对齐,实现简单布局器 </ title > < link rel ="stylesheet" href ="./jquery-ui-1.12.1/jquery-ui.min.css" /> </ head > <!-- 网格线 --> < div id ="grid-line" ></ div > < div class ="container" > <!-- 拖动辅助线 --> < div id ="guide-h" class ="guide" ></ div > < div id ="guide-v" class ="guide" ></ div > < div class ="draggable" ></ div > < div class ="draggable" style ="background-color: blanchedalmond;" ></ div > </ div > < script src ="./jquery-ui-1.12.1/external/jquery/jquery.js" ></ script > < script src ="./jquery-ui-1.12.1/jquery-ui.min.js" ></ script > < script > const gridSpace = 50 // 拖拽部件选项 const draggableOption = { // 约束在指定元素或区域的边界内拖拽 containment: ' .container ' , // 鼠标按下后拖拽开始前必须移动的距离,以像素计。该选项可以防止点击在某个元素上时不必要的拖拽 distance: 10 , // 当被拖拽时助手(helper)的不透明度 opacity: 0.5 , // 如果设置为 true,当拖拽时容器会自动滚动 scroll: true , // 从要滚动的视区边缘起的距离,以像素计。距离是相对于指针的,不是相对于 draggable。如果 scroll 选项是 false 则忽略 scrollSensitivity: 20 , // 当鼠标指针获取到在 scrollSensitivity 距离内时,窗体滚动的速度。如果 scroll 选项是 false 则忽略 scrollSpeed: 100 , // 对齐拖拽助手(helper)到网格,每个 x 和 y 像素。数组形式必须是 [ x, y ] grid: [gridSpace, gridSpace], // 如果设置为 true,在每次鼠标移动(mousemove)时都会计算所有可放置的位置。注意:这解决了高度动态的问题,但是明显降低了性能 // refreshPositions: true, // 拖拽操作期间的 CSS 光标 cursor: ' move ' , // 元素是否对齐到其他元素 snap: true , // 从要发生对齐的对齐元素边缘起的距离,以像素计。如果 snap 选项是 false 则忽略 snapTolerance: 20 // 缩放部件选项 const resizeableOption = { // 约束在指定元素或区域的边界内拖拽 containment: ' .container ' , // 当用户鼠标没有悬浮在元素上时是否隐藏手柄 autoHide: true , // 把可调整尺寸元素对齐到网格,每个 x 和 y 像素。数组形式必须是 [ x, y ] grid: [gridSpace, gridSpace], // 如果设置为 true,则为调整尺寸显示一个半透明的辅助元素 // ghost: true // grid: 50 // resizable 允许被调整到的最小宽度 minWidth: 50 , // resizable 允许被调整到的最小高度 minHeight: 50 $( function () { // 初始化组件拖拽、缩放 initComponent( ' .draggable ' ) // 初始化组件拖拽、缩放 function initComponent(selector) { $(selector) // 拖拽部件文档:https://www.jqueryui.org.cn/api/3722.html .draggable( Object.assign(draggableOption, { * 在拖拽期间当鼠标移动时触发 drag: function (event, ui) { const x = ui.position.left const y = ui.position.top const containerHeight = $( ' .container ' ).height() + $( ' .container ' ).scrollTop() const containerWidth = $( ' .container ' ).width() + $( ' .container ' ).scrollLeft() initGrid() $( ' #guide-v ' ).css({ height: containerHeight + ' px ' , left: x }) $( ' #guide-h ' ).css({ width: containerWidth + ' px ' , top: y }) $( ' #guide-v,#guide-h ' ).show() * 当拖拽停止时触发 stop: function (event, ui) { $( ' .container .grid-line ' ).remove() $( ' #guide-v,#guide-h ' ).hide() // 缩放部件文档:https://www.jqueryui.org.cn/api/3725.html .resizable( Object.assign(resizeableOption, { * 在调整尺寸期间当调整手柄拖拽时触发 * @param {Event} event 事件对象 * @param {Object} ui 拖拽 ui 元素 * helper - jQuery 对象,表示被调整尺寸的助手(helper) * originalElement - jQuery 对象,表示被包裹之前的原始元素 * originalPosition - resizable 调整前的位置,表示为 { top, left } * originalSize - resizable 调整前的尺寸,表示为 { width, height } * position - 助手(helper)的当前 CSS 位置,比如 { top, left } 对象 * size - 助手(helper)的当前大小,比如 { top, left } 对象 resize: function (event, ui) { initGrid() * 当调整尺寸操作停止时触发 stop: function (event, ui) { $( ' .container .grid-line ' ).remove() function initGrid() { const containerHeight = $( ' .container ' ).height() + $( ' .container ' ).scrollTop() const containerWidth = $( ' .container ' ).width() + $( ' .container ' ).scrollLeft() $( ' .container .grid-line ' ).remove() let lineTop = 0 while (lineTop < containerHeight) { let gridLine = $( ' #grid-line ' ).clone() gridLine.removeAttr( ' id ' ) gridLine.addClass( ' grid-line ' ) gridLine.addClass( ' grid-line-h ' ) gridLine.attr( ' top ' , lineTop) gridLine = gridLine[ 0 ] lineTop += gridSpace gridLine.style.top = lineTop + ' px ' gridLine.style.left = ' 0px ' gridLine.style.width = containerWidth + ' px ' gridLine.style.height = ' 1px ' $( ' .container ' ).append(gridLine) let lineLeft = 0 while (lineLeft < containerWidth) { let gridLine = $( ' #grid-line ' ).clone() gridLine.removeAttr( ' id ' ) gridLine.addClass( ' grid-line ' ) gridLine.addClass( ' grid-line-v ' ) gridLine.attr( ' left ' , lineLeft) gridLine = gridLine[ 0 ] lineLeft += gridSpace gridLine.style.top = ' 0px ' gridLine.style.left = lineLeft + ' px ' gridLine.style.width = ' 1px ' gridLine.style.height = containerHeight + ' px ' $( ' .container ' ).append(gridLine) </ script > < style > .container { /* margin-top: 100px; */ top : 20px ; min-height : 700px ; /* padding-bottom: 100px; */ position : relative ; /* 修复拖拽元素吸附到其他元素时超出容器区域 */ overflow : scroll ; /* background-color: gray; */ border : 1px #c0c0c0 solid ; z-index : 0 ; .container .grid-line { position : absolute ; z-index : 0 ; /* border: 1px red solid; */ .container .grid-line-h { border-top : 1px dashed rgb(236, 236, 236) ; /* border-top: 1px dashed rgb(255, 0, 0); */ width : 100% ; .container .grid-line-v { border-left : 1px dashed rgb(236, 236, 236) ; /* border-left: 1px dashed rgb(255, 0, 0); */ height : 100% ; .draggable { width : 150px ; height : 150px ; background-color : gray ; position : absolute ; top : 0px ; left : 0px ; z-index : 1 ; .guide { display : none ; position : absolute ; left : 0 ; top : 0 ; /* 水平 */ #guide-h { border-top : 1px red solid ; width : 100% ; /* 垂直 */ #guide-v { border-left : 1px red solid ; height : 100% ; </ style > </ body > </ html >