Rumah hujung hadapan web tutorial js JavaScript melaksanakan kesan seret dan lepas dalam kemahiran javascript halaman web PC

JavaScript melaksanakan kesan seret dan lepas dalam kemahiran javascript halaman web PC

May 16, 2016 pm 03:10 PM
javascript pc seret

Beberapa tahun yang lalu, saya telah mengambil bahagian dalam reka bentuk dan pembangunan projek laman web hartanah laman web dan ingin mengumpul reka bentuk dan idea orang lain yang sangat baik Apabila kami berkumpul, draf reka bentuk dan pelaksanaan fungsi pada masa itu hanya diubah lagi dan sekali lagi itu, mari kita tidak bercakap mengenainya. Mari kita bercakap tentang kes yang akan kita jelaskan hari ini. beberapa yuran pengiklanan?), terdapat satu fungsi yang paling disukai oleh pengurus produk, iaitu yang berikut Ini:

Ini adalah kesan semasa, mungkin beberapa perubahan Kesan asal ialah gambar di dalam boleh diseret ke atas, ke bawah, ke kiri, dan ke kanan, dan kemudian nombor bangunan yang dipaparkan di rumah juga bergerak dengan gambar time, js Keupayaan tidak cukup baik, dan keperluan pengurus projek tidak tercapai, tetapi kemudian pengurus projek menolak kesan ini dan menggantikannya dengan kesan lain

Walaupun pengurus projek tidak mahu kesan ini, ia meninggalkan simpulan di hati saya pada masa itu, dan saya tidak dapat melupakannya sehingga hari ini.

Baiklah, ini niat asal saya menulis blog ini pada hari ini saya harap ia dapat memberi idea kepada pelajar yang ingin mencapai kesan seretan seperti ini, tetapi tidak tahu bagaimana untuk mencapainya, supaya tidak meninggalkannya. apa-apa penyesalan untuk remaja mereka Sudah tentu, terdapat banyak cara untuk melaksanakan seret dan lepas Di sini saya hanya akan memperkenalkan satu kaedah dalam JavaScript, dan perlahan-lahan memahami prinsipnya.

Baiklah, jenaka sudah berakhir, mari kita mula-mula memahami apa itu seretan, dan saya tahu itu, tetapi saya masih mahu menerangkannya:

Seret dan lepas adalah bekas Anda boleh menggunakan tetikus untuk menyeretnya di halaman, penerangan yang tepat sepatutnya, gerakkan tetikus ke bekas, kemudian tekan tetikus, berhati-hati untuk tidak melepaskannya. dan kemudian seret Tetikus dan bekas boleh mengikut tetikus Apabila anda melepaskan tetikus, bekas itu akan berhenti di situ kotak itu apabila tangan saya berhenti, kotak itu berhenti, kotak itu tidak bergerak, saya faham!

Jangan anggap perkara di atas adalah karut, banyak maklumat yang boleh kita perolehi, ringkasannya adalah seperti berikut:

Seret = tetikus ke bawah + pergerakan tetikus + tetikus ke atas

Ini menyelesaikan tugas seret dan lepas Nah, ternyata ini adalah prinsip seret dan lepas Jika anda ingin melaksanakan seret dan lepas, anda boleh melaksanakan tiga tindakan di atas untuk mensimulasikan kesan seret dan lepas. . Nah, ia sepadan dengan sintaks dalam JavaScript Hanya perlu melaksanakan 3 tindakan ini:

onmousedown, onmouseup, onmouseup

Kod yang dilaksanakan hendaklah:

obj.onmousedown = function(ev){
   obj.onmousemove = function(ev){
 
   } ;
   obj.onmouseup = function(ev){
   
   };
   
}
Salin selepas log masuk

Mengapa dua tindakan seterusnya perlu ditulis di dalamnya. Ideanya mungkin seperti ini:

Pertama sekali, objek perlu diposisikan, kerana kita perlu memanipulasi nilai kiri dan atasnya untuk membuatnya bergerak tahu bahawa tetikus telah bergerak Sejauh mana jaraknya? Haha, saya ada idea sikit, dan rasa comel~ Masalahnya sekarang adalah bagaimana untuk mendapatkan jarak tetikus Jika anda perlu tahu lebih lanjut, sila semak model kotak saya tidak akan masuk ke sini. Banyak tuan juga mempunyai blog yang berkaitan. Saya menggunakan satu gambar untuk menunjukkannya:

Penjelasan: Kotak biru ialah lebar dan ketinggian skrin, kotak hitam tebal ialah lebar dan ketinggian kawasan yang boleh dilihat pelayar (kesan pengurangan pelayar), kotak hitam nipis adalah objek yang akan diseret oleh tetikus , seperti yang ditunjukkan dalam rajah, dapatkan koordinat tetikus , anda boleh menggunakan event.clientX, event.clientY untuk mendapatkannya, oh;

Prinsip umum pengiraan boleh merujuk kepada rajah di bawah:

Penjelasan: Kiri adalah kedudukan awal, kanan ialah kedudukan sasaran, asal adalah kedudukan tetikus, kotak hitam besar adalah lebar pelayar yang boleh dilihat, kotak hitam kecil adalah objek seret, lihat status daripada objek seret ke kedudukan sasaran, dan dapatkan tetikus Kedudukan akhir tetikus, kemudian tolak perbezaan antara tetikus dan objek, dan kemudian tetapkan pada nilai atas dan kiri objek Anda juga boleh mendapatkan perbezaan kedudukan tetikus, dan kemudian menambah perbezaan pada nilai atas dan kiri awal Kami menggunakan yang pertama Jenis kedua juga boleh, cuba sendiri:

 obj.onmousedown = function(ev){
  var ev = ev || event;
  var disX = ev.clientX - this.offsetLeft,disY = ev.clientY - this.offsetTop;
 
  document.onmousemove = function(ev){
    var ev = ev || event;
    obj.style.left = ev.clientX - disX + 'px';
    obj.style.top = ev.clientY - disY + 'px';
  };
  document.onmouseup = function(ev){
    var ev = ev || event;
    document.onmousemove = document.onmouseup = null;
  };
}
Salin selepas log masuk

这里说明一下:onmousemove和onmouseup之所以用document对象而不用obj对象,是因为如果用obj对象,鼠标在obj内部还好,如果在obj外面的话,拖拽会很怪异,你也可以改成obj体会一下,最后我们在鼠标弹起的时候将事件都清空;

上面的基本拖拽就算完成了,但是细心的同学一定会问,如果页面上有文字的话,拖拽物体会将文字选中,这效果岂不是怪怪的,没错,这是因为拖拽的时候触发了浏览器的默认选择事件,所以,在拖拽的时候,我们要清除这个默认事件,那怎么清除呢?

下面给一个兼容性写法:

if(ev.stopPropagation){
   ev.stopPropagation();
}else{
  ev.cancelBubble = true; //兼容IE
}
//简写成
ev.stopPropagation ? ev.stopPropagation() : ev.cancelBubble = true;
Salin selepas log masuk

将上面的代码放在onmousedown下,鼠标按下就清除浏览器默认事件,文字就不会被选中了,好了,一个简单的拖拽效果就完成了,当然你现在是看不到效果,之所以不给demo链接是为了让你自己试着写一写,这样印象更深刻,

好了,那问题又来了,到这里就这样完了吗?。。。。。。按本人的风格,当然没有,干货还在后面!

如果我想实现这样一个效果,就是这一个大的容器里面(可以是box,也可以是document),怎么样能让我们的拖拽对象不跑出去呢,换句话说,拖到边缘就拖不动了,耶,是不是很多人想要实现的效果,哈哈,我们看看实现的原理是什么:

现实生活中,一个物体在一个盒子里跑不出去,是因为有堵墙,那我们只要能模拟出这堵墙,就可以把物体框起来,那这堵墙要怎么做呢?我们可以换个思路,当拖拽对象拖到边缘的时候,比如说拖到右边,我们将它的left固定住,是不是就不能再往右了,因为left值不能再加了,那么拖到底部,同理我们将top值固定住,就不能再往下拖了,理解吗?

最终的结果就是如下:

//左侧
if(obj.offsetLeft <=0){
  obj.style.left = 0;
};
//右侧
if(obj.offsetLeft >= pWidth - oWidth){
  obj.style.left = pWidth - oWidth + 'px'; 
};
//上面
if(obj.offsetTop <= 0){
  obj.style.top = 0; 
};
//下面
if(obj.offsetTop >= pHeight - oHeight){
  obj.style.top = pHeight - oHeight + 'px'; 
};
Salin selepas log masuk

说明:pWidth,pHeight 表示父级元素的宽高(这里是表示相对于父级的宽高限制),oWidth,oHeigt表示拖拽元素的宽高

最后,我将整个拖拽代码整理了一下:

/*
      参数说明:
      元素绝对定位,父级相对定位,如果父级为window,则可以不用
      传一个参数,表示父级为window,物体相对于window范围拖动
      传2个参数,则父级为第二个参数,物体相对于父级范围拖动
      参数为id值
    */
    function drag(obj,parentNode){
      var obj = document.getElementById(obj);
      if(arguments.length == 1){
        var parentNode = window.self; 
        var pWidth = parentNode.innerWidth,pHeight = parentNode.innerHeight;  
      }else{
        var parentNode = document.getElementById(parentNode);
        var pWidth = parentNode.offsetWidth,pHeight = parentNode.offsetHeight;
      }
      obj.onmousedown = function(ev){
        var ev = ev || event;
        var disX = ev.clientX - this.offsetLeft,disY = ev.clientY - this.offsetTop;
        var oWidth = obj.offsetWidth,oHeight = obj.offsetHeight;
         
        //阻止冒泡时间
        ev.stopPropagation &#63; ev.stopPropagation() : ev.cancelBubble = true;
       
         
        document.onmousemove = function(ev){
          var ev = ev || event;
          obj.style.left = ev.clientX - disX + 'px';
          obj.style.top = ev.clientY - disY + 'px';
           
          //左侧
          if(obj.offsetLeft <=0){
            obj.style.left = 0;
          };
          //右侧
          if(obj.offsetLeft >= pWidth - oWidth){
            obj.style.left = pWidth - oWidth + 'px'; 
          };
          //上面
          if(obj.offsetTop <= 0){
            obj.style.top = 0; 
          };
          //下面
          if(obj.offsetTop >= pHeight - oHeight){
            obj.style.top = pHeight - oHeight + 'px'; 
          };
        };
        document.onmouseup = function(ev){
          var ev = ev || event;
          document.onmousemove = document.onmouseup = null;
        };
      }
         
    }
Salin selepas log masuk

说明:我这里处理的效果是,如果传一个参数,表示相对的对象是window对象,如果传2个参数,第一个是拖拽对象,第二个为相对父级

开篇就说了,搜房网的那个图片拖拽效果是我的一个心结,我写了一个类似的效果,供大家参考,因为自己没有买服务器,所以效果我就不展示了,直接把代码贴出来,供大家参考:

css:

<style>
.box{
  width:600px;
  height:400px;
  margin:50px auto;
  position:relative;
  overflow:hidden;
}
#box{
  width:1000px;
  height:800px;
  position:absolute;
  left:50%;
  top:50%;
  margin:-400px 0 0 -500px;
}
#pic{ width:800px; height:600px; background:url(images/pic1.jpg) no-repeat; position:absolute; left:100px; top:100px; }
#pic:hover{
  cursor:move;
}
</style>
Salin selepas log masuk

html:

<div class="box">
    <div id="box">
      <div id="pic"></div>
    </div>
  </div>
Salin selepas log masuk

javascript:

window.onload = function(){
     
    drag("pic","box");
    function drag(obj,parentNode){
      var obj = document.getElementById(obj);
      if(arguments.length == 1){
        var parentNode = window.self; 
        var pWidth = parentNode.innerWidth,pHeight = parentNode.innerHeight;  
      }else{
        var parentNode = document.getElementById(parentNode);
        var pWidth = parentNode.offsetWidth,pHeight = parentNode.offsetHeight;
      }
      obj.onmousedown = function(ev){
        var ev = ev || event;
        var disX = ev.clientX - this.offsetLeft,disY = ev.clientY - this.offsetTop;
        var oWidth = obj.offsetWidth,oHeight = obj.offsetHeight;
         
        //阻止冒泡时间
        ev.stopPropagation &#63; ev.stopPropagation() : ev.cancelBubble = true;
       
         
        document.onmousemove = function(ev){
          var ev = ev || event;
          obj.style.left = ev.clientX - disX + 'px';
          obj.style.top = ev.clientY - disY + 'px';
           
          //左侧
          if(obj.offsetLeft <=0){
            obj.style.left = 0;
          };
          //右侧
          if(obj.offsetLeft >= pWidth - oWidth){
            obj.style.left = pWidth - oWidth + 'px'; 
          };
          //上面
          if(obj.offsetTop <= 0){
            obj.style.top = 0; 
          };
          //下面
          if(obj.offsetTop >= pHeight - oHeight){
            obj.style.top = pHeight - oHeight + 'px'; 
          };
        };
        document.onmouseup = function(ev){
          var ev = ev || event;
          document.onmousemove = document.onmouseup = null;
        };
      }
         
    }
     
     
  }
Salin selepas log masuk

效果完全是用的那个封装代码块,引用起来也挺方便,有人会问了,你这用的id获取DOM元素,一个页面只能用一次啊,如果页面多次使用呢,有道理,解决方案之一,那就命名不同的id呗,又不犯法,方案二,获取id的地方改成获取class,但是要注意的是,getElementsByClassName是获取的class集合,需要改写一下,这里我就不写了,有兴趣的同学自行改写一下,好了,到这里真的结束了!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Cara Membetulkan Ralat Penuh Sementara Titik Akses pada PC Windows Cara Membetulkan Ralat Penuh Sementara Titik Akses pada PC Windows Mar 16, 2024 pm 03:19 PM

Jika anda menghadapi ralat "Titik akses penuh buat sementara waktu" semasa menyambung ke penghala Wi-Fi atau tempat liputan mudah alih pada PC Windows 11/10 anda, ini biasanya disebabkan oleh beban rangkaian atau terlalu banyak peranti yang disambungkan. Untuk menyelesaikan masalah ini dan berjaya menyambung ke Internet, anda boleh mencuba kaedah berikut: 1. Tunggu seketika untuk peranti lain memutuskan sambungan sebelum cuba menyambung semula. 2. Mulakan semula penghala Wi-Fi atau tempat liputan mudah alih anda untuk mengosongkan cache rangkaian dan menetapkan semula alamat IP. 3. Pastikan pemacu penyesuai Wi-Fi PC anda dikemas kini, semak kemas kini melalui Pengurus Peranti. 4. Cuba untuk menyambung pada masa yang berbeza Mengelakkan waktu sibuk mungkin mempunyai peluang sambungan yang lebih baik. 5. Pertimbangkan untuk menambah AccessP

Windows PC terus but ke dalam BIOS [Betulkan] Windows PC terus but ke dalam BIOS [Betulkan] Mar 11, 2024 am 09:40 AM

Jika PC Windows anda kerap memasuki antara muka BIOS, ini boleh menyebabkan kesukaran untuk digunakan. Saya tersekat dengan skrin BIOS setiap kali saya menghidupkan komputer saya, dan memulakan semula tidak membantu. Jika anda menghadapi masalah ini, maka penyelesaian yang disediakan dalam artikel ini akan membantu anda. Mengapa komputer saya terus but dalam BIOS? Komputer anda dimulakan semula secara kerap dalam mod BIOS mungkin disebabkan oleh pelbagai sebab, seperti tetapan jujukan but yang tidak betul, kabel SATA yang rosak, sambungan longgar, ralat konfigurasi BIOS atau kegagalan cakera keras, dsb. Betulkan Windows PC Terus Buta ke BIOS Jika PC Windows anda terus but masuk ke BIOS, gunakan pembaikan di bawah. Semak pesanan but anda dan palamkan semula

Cara menggunakan Samsung Flow pada PC Windows Cara menggunakan Samsung Flow pada PC Windows Feb 19, 2024 pm 07:54 PM

SamsungFlow ialah alat mudah dan praktikal yang membolehkan anda menyambungkan telefon Galaxy anda ke PC Windows anda dengan mudah. Dengan SamsungFlow, anda boleh berkongsi kandungan dengan mudah antara peranti, pemberitahuan penyegerakan, cermin telefon pintar dan banyak lagi. Artikel ini akan memperkenalkan cara menggunakan SamsungFlow pada komputer Windows. Cara menggunakan Penstriman Telefon Pintar pada Windows PC Untuk menggunakan SamsungFlow untuk menyambungkan Windows PC dan Galaxy Phone anda, anda perlu memastikan bahawa telefon pintar dan tablet Galaxy anda menjalankan Android 7.0 atau lebih tinggi dan Windows PC anda menjalankan Windows 10 atau lebih tinggi.

Cara memuat turun semua fail OneDrive ke PC sekaligus Cara memuat turun semua fail OneDrive ke PC sekaligus Feb 19, 2024 pm 06:51 PM

Artikel ini akan mengajar anda cara memuat turun semua fail OneDrive ke PC anda sekaligus. OneDrive ialah platform storan awan yang berkuasa yang membolehkan pengguna mengakses fail mereka pada bila-bila masa, di mana-mana sahaja. Kadangkala, pengguna mungkin perlu menyandarkan fail secara setempat atau mengaksesnya di luar talian. Teruskan membaca untuk mengetahui cara melakukan ini dengan mudah. Bagaimana untuk memuat turun semua fail OneDrive ke PC sekaligus? Ikuti langkah ini untuk memuat turun semua fail OneDrive ke PC Windows anda sekaligus: Lancarkan Onedrive dan navigasi ke Fail Saya. Semua fail yang dimuat naik pada OneDrive akan tersedia di sini. Tekan CTRL+A untuk memilih semua fail, atau tandai kotak semak untuk menogol pemilihan semua item. Klik pada pilihan muat turun di bahagian atas,

Pengembaraan Hos Chrome Kos Rendah: Ia Tidak Dapat Memasang Epal Hitam, tetapi Ia Boleh Dianggap sebagai PC yang Layak Pengembaraan Hos Chrome Kos Rendah: Ia Tidak Dapat Memasang Epal Hitam, tetapi Ia Boleh Dianggap sebagai PC yang Layak Jul 11, 2024 pm 04:38 PM

Bercakap mengenainya, kami telah menghasilkan banyak keluaran siri sampah asing, tetapi sebelum itu, kebanyakannya adalah telefon mudah alih dan PC dipasang yang pertama mempunyai kebolehmainan biasa, manakala yang kedua penuh dengan ketidakpastian. Sebagai contoh, komputer yang kami belanjakan 300 untuk memasang kali terakhir kini telah memasuki keadaan pengalihan keluar pemandu tanpa henti. Walau bagaimanapun, "mengambil kain buruk" adalah apa itu, dan kewujudan bersama risiko dan faedah adalah norma. Sebagai contoh, saya "mengambil" ASUS ChromeBox kali ini saya pada asalnya ingin menjadikannya Macmini (palsu), tetapi saya menghadapi banyak masalah yang tidak dijangka semasa proses dan gagal mencapai matlamat yang dimaksudkan. Akhirnya, saya terpaksa berpuas hati dengan perkara terbaik seterusnya dan memilih untuk menyalakan Windows padanya. Walaupun percubaan untuk menghitamkan epal jatuh ke langkah terakhir, saya berasa sangat seronok sepanjang proses itu. Dan sebagai

Komputer yang saya belanjakan 300 yuan untuk memasang berjaya dijalankan melalui model besar tempatan Komputer yang saya belanjakan 300 yuan untuk memasang berjaya dijalankan melalui model besar tempatan Apr 12, 2024 am 08:07 AM

Jika 2023 diiktiraf sebagai tahun pertama AI, maka 2024 berkemungkinan menjadi tahun penting untuk mempopularkan model AI yang besar. Pada tahun lalu, sejumlah besar model AI yang besar dan sejumlah besar aplikasi AI telah muncul Pengeluar seperti Meta dan Google juga telah mula melancarkan model besar dalam talian/tempatan mereka sendiri kepada orang ramai, serupa dengan "kecerdasan buatan AI. " itu di luar jangkauan. Konsep itu tiba-tiba datang kepada orang ramai. Pada masa kini, orang ramai semakin terdedah kepada kecerdasan buatan dalam kehidupan mereka Jika anda melihat dengan teliti, anda akan mendapati bahawa hampir semua pelbagai aplikasi AI yang anda boleh akses digunakan pada "awan". Jika anda ingin membina peranti yang boleh menjalankan model besar secara tempatan, maka perkakasan itu adalah AIPC serba baharu berharga lebih daripada 5,000 yuan Untuk orang biasa,

Permainan aksi seni mempertahankan diri tegar gaya Cina 'Yi Wen Lu: Reinkarnasi' memulakan percubaan dalam talian hari ini Permainan aksi seni mempertahankan diri tegar gaya Cina 'Yi Wen Lu: Reinkarnasi' memulakan percubaan dalam talian hari ini Feb 06, 2024 pm 06:00 PM

Permainan aksi seni mempertahankan diri tegar gaya Cina "Yi Wen Lu: Samsara" memulakan permainan percubaan dalam talian hari ini. Ini ialah permainan berdiri sendiri aksi seni mempertahankan diri tegar berbilang platform yang menyepadukan unsur budaya tradisional Cina Dalam permainan, pemain memainkan watak seni mempertahankan diri yang menghalang bencana dunia dan memulihkan kestabilan dan keamanan. Pegawai mendakwa bahawa pemain boleh menerangkan nilai budaya seni mempertahankan diri melalui adegan seni yang indah dan cerita yang jelas, meneroka dan memaparkan konotasi dan semangat budaya seni mempertahankan diri, dan mengalami perjalanan yang indah pada masa yang sama. Menurut pembangun, niat reka bentuk asal pasukan itu adalah untuk membolehkan pemain mengalami keanggunan seni mempertahankan diri dengan lebih baik Pasukan ini mempelajari kebanyakan sekolah dan teknik seni mempertahankan diri Cina dan mempersembahkannya secara realistik dalam permainan. Pemain boleh belajar atau menghadapi musuh menggunakan pelbagai kemahiran dan pergerakan, seperti Tai Chi, kemahiran pedang, dan

Tutorial JavaScript Mudah: Cara Mendapatkan Kod Status HTTP Tutorial JavaScript Mudah: Cara Mendapatkan Kod Status HTTP Jan 05, 2024 pm 06:08 PM

Tutorial JavaScript: Bagaimana untuk mendapatkan kod status HTTP, contoh kod khusus diperlukan: Dalam pembangunan web, interaksi data dengan pelayan sering terlibat. Apabila berkomunikasi dengan pelayan, kami selalunya perlu mendapatkan kod status HTTP yang dikembalikan untuk menentukan sama ada operasi itu berjaya dan melaksanakan pemprosesan yang sepadan berdasarkan kod status yang berbeza. Artikel ini akan mengajar anda cara menggunakan JavaScript untuk mendapatkan kod status HTTP dan menyediakan beberapa contoh kod praktikal. Menggunakan XMLHttpRequest

See all articles