如何實(shí)現(xiàn)拖動框效果

<!DOCTYPE html>

<html>

<head>

? ? <meta charset="UTF-8">

? ? <meta http-equiv="X-UA-Compatible" content="IE=edge">

? ? <meta name="viewport" content="width=device-width, initial-scale=1.0">

? ? <title>拖動框效果</title>

? ? <style>

? ? ? ? *{

? ? ? ? ? ? margin: 0;

? ? ? ? ? ? padding: 0;

? ? ? ? }

? ? ? ? #box{

? ? ? ? ? ? width: 200px;

? ? ? ? ? ? height: 200px;

? ? ? ? ? ? border: 1px solid #ccc;

? ? ? ? ? ? position: absolute;

? ? ? ? ? ? left: 100px;

? ? ? ? ? ? top: 100px;

? ? ? ? }

? ? ? ? #title{

? ? ? ? ? ? height: 30px;

? ? ? ? ? ? line-height: 30px;

? ? ? ? ? ? display: flex;

? ? ? ? ? ? justify-content: space-between;

? ? ? ? ? ? align-items: center;

? ? ? ? ? ? background-color: skyblue;

? ? ? ? ? ? color: white;

? ? ? ? ? ? user-select: none;

? ? ? ? }

? ? ? ? #title .text{

? ? ? ? ? ? padding-left: 5px;

? ? ? ? ? ? flex: 1;

? ? ? ? }

? ? ? ? #title .close{

? ? ? ? ? ? width: 25px;

? ? ? ? ? ? height: 25px;

? ? ? ? ? ? line-height: 25px;

? ? ? ? ? ? border: 1px solid lightpink;

? ? ? ? ? ? text-align: center;

? ? ? ? ? ? border-radius: 50%;

? ? ? ? ? ? background-color: lightsalmon;

? ? ? ? ? ? margin-right: 2px;

? ? ? ? }

? ? </style>

</head>

<body>

? ? <div id="box">

? ? ? ? <div id="title">

? ? ? ? ? ? <span class="text">標(biāo)題</span>

? ? ? ? ? ? <span class="close">X</span>

? ? ? ? </div>

? ? </div>

? ? <script>

? ? ? ? /*

? ? ? ? ? ? dom.offsetLeft 獲取元素的默認(rèn)左邊距

? ? ? ? ? ? dom.offsetTop 獲取元素的默認(rèn)上邊距

? ? ? ? ? ? window.innerWidth 視口寬度

? ? ? ? ? ? window.innerHeight 視口高度

? ? ? ? ? ? dom.offsetWidth 獲取元素可見寬度(width+border+padding)

? ? ? ? ? ? dom.offsetHeight 獲取元素可見高度(height+border+padding)

? ? ? ? ? ? e.pageX 鼠標(biāo)指針到X軸坐標(biāo)

? ? ? ? ? ? e.pageY 鼠標(biāo)指針到Y(jié)軸坐標(biāo)

? ? ? ? */

? ? ? ? /* // 查看鼠標(biāo)點(diǎn)擊事件默認(rèn)參數(shù)

? ? ? ? window.onclick = function(event) {

? ? ? ? ? ? console.log(event); ?// PointerEvent{...}

? ? ? ? } */

? ? ? ? let box = document.querySelector('#box')

? ? ? ? let title = document.querySelector('#title')

? ? ? ? // 單擊叉刪除盒子

? ? ? ? let delBox = document.querySelector('.close')

? ? ? ? delBox.onclick = function() {

? ? ? ? ? ? box.remove()

? ? ? ? }

? ? ? ? // 定義一個變量判斷盒子是否能夠移動,初值為false

? ? ? ? let ismove = false

? ? ? ? console.log('移動狀態(tài)初始值' + ismove);

? ? ? ? // 獲取標(biāo)題盒子在視口中的位置(邊距)

? ? ? ? // 獲取標(biāo)題盒子的默認(rèn)左邊距

? ? ? ? let box_left = box.offsetLeft

? ? ? ? // 獲取標(biāo)題盒子的默認(rèn)上邊距

? ? ? ? let box_top = box.offsetTop

? ? ? ? console.log('默認(rèn)左邊距' + box_left, '默認(rèn)上邊距' + box_top); ?// 100 100

? ? ? ? // console.log(top); ?// Window

? ? ? ? // window.innerWidth 返回視口寬度

? ? ? ? // window.innerHeight 返回視口高度

? ? ? ? // box.offsetWidth 返回盒子的可見寬度(width+border+padding)

? ? ? ? // box.offsetHeight 返回盒子的可見寬度(height+border+padding)

? ? ? ? // 定義可移動距離的最大值

? ? ? ? // 定義盒子的最大左邊距 = 視口的寬度 - 盒子的寬度

? ? ? ? let letfMax = window.innerWidth - box.offsetWidth

? ? ? ? // 定義盒子的最大上邊距 = 視口的高度 - 盒子的高度

? ? ? ? let topfMax = window.innerHeight - box.offsetHeight

? ? ? ? // 鼠標(biāo)按下處到box左邊框的距離

? ? ? ? let left_x = 0

? ? ? ? // 鼠標(biāo)按下處到box上邊框的距離

? ? ? ? let top_y = 0


? ? ? ? // 給title對象注冊鼠標(biāo)按下事件

? ? ? ? title.onmousedown = function(event) {

? ? ? ? ? ? // 每個方法里面的第一個參數(shù)是當(dāng)前事件的事件對象,通過該對象可以獲取當(dāng)前事件的相關(guān)信息

? ? ? ? ? ? // 解構(gòu)出對象中pageX, pageY屬性

? ? ? ? ? ? let {pageX, pageY} = event

? ? ? ? ? ? // console.log(pageX, pageY);

? ? ? ? ? ? // 獲取鼠標(biāo)在標(biāo)題盒子中的位置

? ? ? ? ? ? // 鼠標(biāo)在視口中的x軸坐標(biāo)值 減去 標(biāo)題盒子的左邊距 等于 鼠標(biāo)按下的位置在盒子中的左邊距

? ? ? ? ? ? left_x = pageX - box_left

? ? ? ? ? ? // 鼠標(biāo)在視口中的y軸坐標(biāo)值 減去 標(biāo)題盒子的上邊距 等于 鼠標(biāo)按下的位置在盒子中的上邊距

? ? ? ? ? ? top_y = pageY - box_top

? ? ? ? ? ? console.log(`鼠標(biāo)當(dāng)前在box中的位置${left_x}, ${top_y}`);

? ? ? ? ? ? console.log(pageX, pageY);


? ? ? ? ? ? // 當(dāng)鼠標(biāo)按下時未桥,賦值為true鼓黔,表示可以移動

? ? ? ? ? ? ismove = true

? ? ? ? ? ? console.log('按下事件移動狀態(tài)' + ismove);

? ? ? ? ? ? /* // 如果你想這樣進(jìn)行賦值页畦,可以使用解構(gòu)賦值將對象解構(gòu)出來糊余,解構(gòu)多個屬性時簡化代碼

? ? ? ? ? ? let pageX = e.pageX

? ? ? ? ? ? let pageY = e.pagey

? ? ? ? ? ? let {pageX, pageY} = e */

? ? ? ? }

? ? ? ? // 給window對象注冊鼠標(biāo)移動事件

? ? ? ? window.onmousemove = function(event) {

? ? ? ? ? ? if(ismove){

? ? ? ? ? ? ? ? // 獲取鼠標(biāo)最新的位置坐標(biāo)

? ? ? ? ? ? ? ? let {pageX, pageY} = event


? ? ? ? ? ? ? ? // 更新box的最新位置

? ? ? ? ? ? ? ? // 先獲取最新左邊距和上邊距

? ? ? ? ? ? ? ? box_left = pageX - left_x

? ? ? ? ? ? ? ? box_top = pageY - top_y

? ? ? ? ? ? ? ? // 最新位置不能超出屏幕空間

? ? ? ? ? ? ? ? // 再判斷是否為可移動距離纳本,如果不在范圍內(nèi)則不可再移動

? ? ? ? ? ? ? ? if(box_left < 0){

? ? ? ? ? ? ? ? ? ? box_left = 0

? ? ? ? ? ? ? ? ? ? // 賦值為false,表示不能再移動

? ? ? ? ? ? ? ? ? ? ismove = false ?

? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? if(box_left > letfMax){

? ? ? ? ? ? ? ? ? ? box_left = letfMax

? ? ? ? ? ? ? ? ? ? ismove = false ?

? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? if(box_top < 0){

? ? ? ? ? ? ? ? ? ? box_top = 0

? ? ? ? ? ? ? ? ? ? ismove = false ?

? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? if(box_top > topfMax){

? ? ? ? ? ? ? ? ? ? box_top = topfMax

? ? ? ? ? ? ? ? ? ? ismove = false ?

? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? // console.log(`最新左邊距${box_left},上邊距${box_top}`);


? ? ? ? ? ? ? ? // 最后賦值給box.style

? ? ? ? ? ? ? ? box.style.left = box_left + 'px'

? ? ? ? ? ? ? ? box.style.top = box_top + 'px'

? ? ? ? ? ? }

? ? ? ? }

? ? ? ? // 給window對象注冊鼠標(biāo)彈起事件

? ? ? ? window.onmouseup = function(event) {

? ? ? ? ? ? let {pageX, pageY} = event

? ? ? ? ? ? // 當(dāng)鼠標(biāo)彈起時土思,賦值為false,表示不能再移動

? ? ? ? ? ? ismove = false ?

? ? ? ? ? ? console.log('彈起事件移動狀態(tài)' + ismove);

? ? ? ? ? ? console.log(pageX, pageY);

? ? ? ? }

? ? ? ? /*

? ? ? ? ? ? 焦點(diǎn)事件:

? ? ? ? ? ? 獲得焦點(diǎn)事件

? ? ? ? ? ? onfocus

? ? ? ? ? ? 失去焦點(diǎn)事件

? ? ? ? ? ? onblur

? ? ? ? */

? ? ? ? // 給window對象注冊失去焦點(diǎn)事件

? ? ? ? window.onblur = function() {

? ? ? ? ? ? // 當(dāng)切出瀏覽器時忆嗜,瀏覽器會失去焦點(diǎn)

? ? ? ? ? ? // 此時再賦值為false己儒,表示不可再移動

? ? ? ? ? ? ismove = false

? ? ? ? ? ? console.log('失去焦點(diǎn)');

? ? ? ? }

? ? </script>

</body>

</html>

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市捆毫,隨后出現(xiàn)的幾起案子闪湾,更是在濱河造成了極大的恐慌,老刑警劉巖绩卤,帶你破解...
    沈念sama閱讀 219,110評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件途样,死亡現(xiàn)場離奇詭異,居然都是意外死亡濒憋,警方通過查閱死者的電腦和手機(jī)何暇,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來凛驮,“玉大人裆站,你說我怎么就攤上這事∏玻” “怎么了宏胯?”我有些...
    開封第一講書人閱讀 165,474評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長本姥。 經(jīng)常有香客問我肩袍,道長,這世上最難降的妖魔是什么婚惫? 我笑而不...
    開封第一講書人閱讀 58,881評論 1 295
  • 正文 為了忘掉前任氛赐,我火速辦了婚禮魂爪,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘鹰祸。我一直安慰自己甫窟,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,902評論 6 392
  • 文/花漫 我一把揭開白布蛙婴。 她就那樣靜靜地躺著粗井,像睡著了一般。 火紅的嫁衣襯著肌膚如雪街图。 梳的紋絲不亂的頭發(fā)上浇衬,一...
    開封第一講書人閱讀 51,698評論 1 305
  • 那天,我揣著相機(jī)與錄音餐济,去河邊找鬼耘擂。 笑死,一個胖子當(dāng)著我的面吹牛絮姆,可吹牛的內(nèi)容都是我干的醉冤。 我是一名探鬼主播,決...
    沈念sama閱讀 40,418評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼篙悯,長吁一口氣:“原來是場噩夢啊……” “哼蚁阳!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起鸽照,我...
    開封第一講書人閱讀 39,332評論 0 276
  • 序言:老撾萬榮一對情侶失蹤螺捐,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后矮燎,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體定血,經(jīng)...
    沈念sama閱讀 45,796評論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,968評論 3 337
  • 正文 我和宋清朗相戀三年诞外,在試婚紗的時候發(fā)現(xiàn)自己被綠了澜沟。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,110評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡峡谊,死狀恐怖倔喂,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情靖苇,我是刑警寧澤席噩,帶...
    沈念sama閱讀 35,792評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站贤壁,受9級特大地震影響悼枢,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜脾拆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,455評論 3 331
  • 文/蒙蒙 一馒索、第九天 我趴在偏房一處隱蔽的房頂上張望莹妒。 院中可真熱鬧,春花似錦绰上、人聲如沸旨怠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,003評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽鉴腻。三九已至,卻和暖如春百揭,著一層夾襖步出監(jiān)牢的瞬間爽哎,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,130評論 1 272
  • 我被黑心中介騙來泰國打工器一, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留课锌,地道東北人。 一個月前我還...
    沈念sama閱讀 48,348評論 3 373
  • 正文 我出身青樓祈秕,卻偏偏與公主長得像渺贤,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子请毛,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,047評論 2 355

推薦閱讀更多精彩內(nèi)容