HTML5實(shí)現(xiàn)拖拽效果母谎,原理詳解及案例實(shí)現(xiàn)

image

如上圖所示,我們可以拖拽博客園網(wǎng)站里的圖片和超鏈接展懈。

在HTML5的規(guī)范中,我們可以通過(guò)為元素增加 draggable="true" 來(lái)設(shè)置此元素是否可以進(jìn)行拖拽操作供璧,其中圖片存崖、鏈接默認(rèn)是開(kāi)啟拖拽的。

1睡毒、拖拽元素

頁(yè)面中設(shè)置了 draggable="true" 屬性的元素来惧。

舉例如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link rel="stylesheet" href="css/font-awesome.min.css">
    <style>
    .box1{
        width: 200px;
        height: 200px;
        background-color: green;

    }
    </style>
</head>
<body>
    <!--給 box1 增加拖拽的屬性-->
    <div class="box1" draggable="true"></div>
</body>
</html>

效果如下:

image

上圖中,我們給 box1 增加了draggable="true" 屬性之后演顾,發(fā)現(xiàn) box1 是可以拖拽的供搀。但是拖拽之后要做什么事情呢?這就涉及到事件監(jiān)聽(tīng)钠至。

拖拽元素的事件監(jiān)聽(tīng):(應(yīng)用于拖拽元素)

  • ondragstart當(dāng)拖拽開(kāi)始時(shí)調(diào)用
  • ondragleave 當(dāng)鼠標(biāo)離開(kāi)拖拽元素時(shí)調(diào)用
  • ondragend 當(dāng)拖拽結(jié)束時(shí)調(diào)用
  • ondrag 整個(gè)拖拽過(guò)程都會(huì)調(diào)用

代碼演示:

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
    <style>
        .box {
            width: 200px;
            height: 200px;
            background-color: green;
        }
    </style>
</head>
<body>
<div class="box" draggable="true"></div>

<script>
    var box = document.querySelector('.box');

    //  綁定拖拽事件

    //  拖拽開(kāi)始
    box.ondragstart = function () {
        console.log('拖拽開(kāi)始.');
    }

    //  拖拽離開(kāi):鼠標(biāo)拖拽時(shí)離開(kāi)被拖拽的元素時(shí)觸發(fā)
    box.ondragleave = function () {
        console.log('拖拽離開(kāi)..');
    }

    //  拖拽結(jié)束
    box.ondragend = function () {
        console.log('拖拽結(jié)束...');
        console.log("---------------");
    }

    box.ondrag = function () {
        console.log('拖拽');
    }

</script>
</body>
</html>

效果如下:

image

打印結(jié)果:

image.png

2葛虐、目標(biāo)元素

比如說(shuō),你想把元素A拖拽到元素B里棉钧,那么元素B就是目標(biāo)元素屿脐。

頁(yè)面中任何一個(gè)元素都可以成為目標(biāo)元素。

目標(biāo)元素的事件監(jiān)聽(tīng):(應(yīng)用于目標(biāo)元素)

  • ondragenter 當(dāng)拖拽元素進(jìn)入時(shí)調(diào)用
  • ondragover 當(dāng)拖拽元素停留在目標(biāo)元素上時(shí),就會(huì)連續(xù)一直觸發(fā)(不管拖拽元素此時(shí)是移動(dòng)還是不動(dòng)的狀態(tài))
  • ondrop 當(dāng)在目標(biāo)元素上松開(kāi)鼠標(biāo)時(shí)調(diào)用
  • ondragleave 當(dāng)鼠標(biāo)離開(kāi)目標(biāo)元素時(shí)調(diào)用

代碼演示:

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
    <style>
        .one {
            width: 100px;
            height: 100px;
            border: 1px solid #000;
            background-color: green;
        }

        .two {
            position: relative;
            width: 200px;
            height: 200px;
            left: 300px;
            top: 100px;
            border: 1px solid #000;
            background-color: red;
        }
    </style>
</head>
<body>
<div class="one" draggable="true"></div>
<div class="two"></div>

<script>
    var two = document.querySelector('.two');

    //目標(biāo)元素的拖拽事件

    // 當(dāng)被拖拽元素進(jìn)入時(shí)觸發(fā)
    two.ondragenter = function () {
        console.log("來(lái)了.");
    }

    // 當(dāng)被拖拽元素離開(kāi)時(shí)觸發(fā)
    two.ondragleave = function () {

        console.log("走了..");
    }

    // 當(dāng)拖拽元素在 目標(biāo)元素上時(shí)的诵,連續(xù)觸發(fā)
    two.ondragover = function (e) {
        //阻止拖拽事件的默認(rèn)行為
        e.preventDefault(); //【重要】一定要加這一行代碼万栅,否則,后面的方法 ondrop() 無(wú)法觸發(fā)西疤。

        console.log("over...");
    }

    // 當(dāng)在目標(biāo)元素上松開(kāi)鼠標(biāo)是觸發(fā)
    two.ondrop = function () {
        console.log("松開(kāi)鼠標(biāo)了....");
    }
</script>
</body>
</html>

效果演示:

image

注意烦粒,上方代碼中,我們加了event.preventDefault()這個(gè)方法代赁。如果沒(méi)有這個(gè)方法扰她,后面ondrop()方法無(wú)法觸發(fā)。如下圖所示:

image

如上圖所示管跺,連光標(biāo)的形狀都提示我們义黎,無(wú)法在目標(biāo)元素里繼續(xù)操作了。

總結(jié):如果想讓拖拽元素在目標(biāo)元素里做點(diǎn)事情豁跑,就必須要在 ondragover() 里加event.preventDefault()這一行代碼廉涕。

案例:拖拽練習(xí)

完整版代碼:

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
    <style>
        .one {
            width: 400px;
            height: 400px;
            border: 1px solid #000;
        }

        .one > div, .two > div {
            width: 98px;
            height: 98px;
            border: 1px solid #000;
            border-radius: 50%;
            background-color: red;
            float: left;
            text-align: center;
            line-height: 98px;
        }

        .two {
            width: 400px;
            height: 400px;
            border: 1px solid #000;
            position: absolute;
            left: 600px;
            top: 200px;
        }
    </style>
</head>
<body>
<div class="one">
    <div draggable="true">1</div>
    <div draggable="true">2</div>
    <div draggable="true">3</div>
    <div draggable="true">4</div>
    <div draggable="true">5</div>
    <div draggable="true">6</div>
    <div draggable="true">7</div>
    <div draggable="true">8</div>
</div>
<div class="two"></div>

<script>
    var boxs = document.querySelectorAll('.one div');
    //        臨時(shí)的盒子 用于存放當(dāng)前拖拽的元素

    var two = document.querySelector('.two');

    var temp = null;
    //         給8個(gè)小盒子分別綁定拖拽事件
    for (var i = 0; i < boxs.length; i++) {
        boxs[i].ondragstart = function () {
//                保持當(dāng)前拖拽的元素
            temp = this;
            console.log(temp);
        }

        boxs[i].ondragend = function () {
//               當(dāng)拖拽結(jié)束 ,清空temp
            temp = null;
            console.log(temp);
        }
    }

    //        目標(biāo)元素的拖拽事件
    two.ondragover = function (e) {
//            阻止拖拽的默認(rèn)行為
        e.preventDefault();
    }
    //        當(dāng)在目標(biāo)元素上松開(kāi)鼠標(biāo)是觸發(fā)
    two.ondrop = function () {
//            將拖拽的元素追加到 two里面來(lái)
        this.appendChild(temp);
    }
</script>
</body>
</html>

效果如下:

image
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末艇拍,一起剝皮案震驚了整個(gè)濱河市狐蜕,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌卸夕,老刑警劉巖层释,帶你破解...
    沈念sama閱讀 211,123評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異快集,居然都是意外死亡贡羔,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門(mén)个初,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)乖寒,“玉大人,你說(shuō)我怎么就攤上這事院溺¢灌遥” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,723評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵珍逸,是天一觀的道長(zhǎng)逐虚。 經(jīng)常有香客問(wèn)我,道長(zhǎng)谆膳,這世上最難降的妖魔是什么叭爱? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,357評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮漱病,結(jié)果婚禮上涤伐,老公的妹妹穿的比我還像新娘馒胆。我一直安慰自己,他們只是感情好凝果,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布祝迂。 她就那樣靜靜地躺著,像睡著了一般器净。 火紅的嫁衣襯著肌膚如雪型雳。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,760評(píng)論 1 289
  • 那天山害,我揣著相機(jī)與錄音纠俭,去河邊找鬼。 笑死浪慌,一個(gè)胖子當(dāng)著我的面吹牛冤荆,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播权纤,決...
    沈念sama閱讀 38,904評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼钓简,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了汹想?” 一聲冷哼從身側(cè)響起外邓,我...
    開(kāi)封第一講書(shū)人閱讀 37,672評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎古掏,沒(méi)想到半個(gè)月后损话,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,118評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡槽唾,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評(píng)論 2 325
  • 正文 我和宋清朗相戀三年丧枪,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片庞萍。...
    茶點(diǎn)故事閱讀 38,599評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡拧烦,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出挂绰,到底是詐尸還是另有隱情屎篱,我是刑警寧澤服赎,帶...
    沈念sama閱讀 34,264評(píng)論 4 328
  • 正文 年R本政府宣布葵蒂,位于F島的核電站,受9級(jí)特大地震影響重虑,放射性物質(zhì)發(fā)生泄漏践付。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評(píng)論 3 312
  • 文/蒙蒙 一缺厉、第九天 我趴在偏房一處隱蔽的房頂上張望永高。 院中可真熱鬧隧土,春花似錦、人聲如沸命爬。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,731評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)饲宛。三九已至皆愉,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間艇抠,已是汗流浹背幕庐。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,956評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留家淤,地道東北人异剥。 一個(gè)月前我還...
    沈念sama閱讀 46,286評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像絮重,于是被迫代替她去往敵國(guó)和親冤寿。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評(píng)論 2 348

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

  • 在此之前绿鸣,實(shí)現(xiàn)拖拽操作都是開(kāi)發(fā)人員自定義邏輯實(shí)現(xiàn)的疚沐,但是HTML5提供了拖拽API ,使得拖拽操作的實(shí)現(xiàn)變得簡(jiǎn)單潮模。...
    你期待的花開(kāi)閱讀 4,424評(píng)論 2 13
  • 拖拽接口 學(xué)習(xí)拖拽亮蛔,主要是學(xué)習(xí)拖拽事件,根據(jù)應(yīng)用于被拖拽元素和應(yīng)用于目標(biāo)元素的不同擎厢,我們一般可以將拖拽事件分類(lèi): ...
    深度剖析JavaScript閱讀 532評(píng)論 0 6
  • 1究流、HTML5:HTML4.1網(wǎng)頁(yè)開(kāi)發(fā):結(jié)構(gòu): html4.0樣式:css css2行為:jsHTML5:是HTM...
    Yuann閱讀 879評(píng)論 0 2
  • HTML5新特性 拖拽使用心得 本文主要介紹了拖拽和拖放的幾個(gè)屬性 先構(gòu)建一個(gè)框架 draggable 為了使元素...
    三井豆閱讀 1,105評(píng)論 0 4
  • 標(biāo)簽語(yǔ)義化 語(yǔ)義標(biāo)簽對(duì)于我們并不陌生,如 表示一個(gè)段落动遭、 表示一個(gè)無(wú)序列表 ~ 表示一系列標(biāo)題等芬探,在此基礎(chǔ)上H...