Drag & Drop from scratch (return)

View Demo Download

หลายคนอาจคิดว่า Drag & Drop นั้นต้องทำยากแน่ๆ แต่ความจริงแล้วการ coding ไม่ยากเลย แต่ความยากมันอยู่ที่การนำไปใช้ บทความนี้จะบอกว่าทำอย่างไร ส่วนจะเอาไปใช้อย่างไรนั้น ต้องลองนำไปต่อยอดดูนะคับ ว่าแล้วก็มาจับกบกันเต๊อะ

Obbs & Basket

เริ่มแรกเราต้องสร้างเพจที่มีกบและตะกร้าก่อนนะคับ โดยสร้างไฟล์ html ไฟล์ obb.html ซึ่งจะทำหน้าที่เป็นหน้าเว็ปเพจของเรานะคับ และสร้าง style sheet ไฟล์ ชื่อ obb.css จากนั้นผูกทั้งสองไฟล์เข้าด้วยกัน เป็นอันเสร็จพิธี

<html>

<head>
<link media="screen" type="text/css" href="obb.css" rel="stylesheet">
</head>

<body>
<div class="obb" id="1"></div>
<div class="obb" id="2"></div>
<div class="basket"></div>
</body>

</html>

จะเห็นว่าเพจของเราจะมี กบ 2 ตัว และตะกร้า 1 ใบ
<div> คือ division ปกติเราจะใช้เพื่อเป็นตัวแทนของ section ที่เราสร้างขึ้นเอง เช่นในกรณีนี้ เราอยากทำกบ เราก็จะสร้าง <div> ซึ่งมี คลาสเป็น obb ส่วน id จะใช้ในการระบุว่าเป็นกบตัวใหน ซึ่งเดี๋ยวเราจะเขียน css ขึ้นมากำหนดว่า div ที่มีคลาสเป็น obb ให้แสดงเป็นรูปกบนะ นั่นเอง

ปกติเวลาเราเขียน css มันจะแบ่งได้เป็น 2 ส่วนคือ

  • style สำหรับ standard html tag เช่น <p> เป็นต้น
  • style สำหรับ custom tag ซึ่งเราจะใช้ <div> และ <span>

ดังนั้นตัวอย่างนี้ผมก็เลยใช้ <div> ครับ ความแตกต่างของ <div> และ <span> คือ <div> จะมีลักษณะเป็น “Block Element” คือมันจะไม่เรียงต่อๆ กัน จะอยู่กันคนละบรรทัด  ส่วน <span> นั้นเป็น “Inline Element” ถ้ามีหลายๆ อันมันก็จะเรียงต่อๆ กันไปจนสุด แล้วมันก็จะขึ้นบรรทัดใหม่ครับ

ต่อด้วย obb.css นะคับ

div.obb{
background-image: url(obb.gif);
width: 40px;
height: 30px;
float: left;
margin-right: 10px;
}

div.basket{
background-image: url(basket.gif);
width: 50px;
height: 35px;
float: right;
margin-right: 300px;
}

Let’s move

เราจะใช้ JQuery + JQuery UI ซึ่งเป็น Java library ซึ่งจะทำให้เราเขียน Java scripts ไ้ด้ง่ายขึ้น
พอโหลด JQuery และ JQuery UI เสร็จแล้ว เอาไฟล์ไปไว้ใน folder ที่ต้องการ แล้วก็แก้ไข obb.html ดังนี้คับ

<html>

<head>
<link media="screen" type="text/css" href="obb.css" rel="stylesheet">
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="jquery-ui.js"></script>

<script type="text/javascript">
$(document).ready(function() {
$('div.obb').draggable({revert: true});
});
</script>

</head>

<body>
<div class="obb" id="1"></div>
<div class="obb" id="2"></div>
<div class="basket"></div>
</body>

</html>

บรรทัดที่ 5: ขอใช้ jQuery library
บรรทัดที่ 6: ขอใช้ JQuery UI library
บรรทัดที่ 9-11: เป็นการบอก ถ้าเพจนี้โหลดเสร็จ ให้ทำคำสั่งนี้นะ ซึ่งก็คือ บรรทัดที่ 11 นั่นเอง
บรรทัดที่ 10: $(‘div.obb’) คือ select ซึ่งหมายถึง element div ที่มี class=”obb” นั่นเอง รายละเอียด

Catch them!

ขั้นนี้เราจะกำหนดจุดปล่อยกบ ซึ่งก็คือตะกร้า เพิ่มโค้ดเข้าไปใน obb.html

<html>

<head>
<link media="screen" type="text/css" href="obb.css" rel="stylesheet">
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="jquery-ui.js"></script>

<script type="text/javascript">
$(document).ready(function() {
$('div.obb').draggable({revert: true});
$('div.basket').droppable({
accept: 'div.obb',
drop: function(ev,ui){
ui.draggable.fadeOut();
}
});
});
</script>

</head>

<body>
<div class="obb" id="1"></div>
<div class="obb" id="2"></div>
<div class="basket"></div>
</body>

</html>
  • บรรทัดที่ 11: บอกว่า <div class=”basket”> เป็น drop zone
  • บรรทัดที่ 12: รับเฉพาะ <div class=”obb”>
  • บรรทัดที่ 13-14: เมื่อกบถูก drop ให้ทำตามนี้นะ

Conclusion

จะเห็นว่าไม่ยากเลย แต่ก็ยังเอาไปใช้จริงไม่ได้ ความยากมันอยู่ที่ว่าจะเอาไปใช้ยังไงให้เหมาะสม เพราะบางทีการใส่ลูกเล่นให้เว็บอย่างไม่เหมาะสมมันก็เป็นผลเสียได้

  • http://mindmidday.wordpress.com/ mindmidday

    ขอบคุณนะครับ พอดีกำลังดูเรื่อง drag&drop อยู่เลย

  • zeally

    ขอบคุณมากคับ ผมรอคอย comment มานานแสนนาน ในที่สุด วันนี้ก็มาถึง

  • zar

    แจ่มมาก กบน่ารัก … ต้องศึกษา jQuery เป็นเรื่องเป็นราวเลยสิเนี่ย

  • admin

    ขอบคุณคับ -/\-

  • yoyokung

    ขอบคุณนะครับ
    ชอบมาก เขียน สอนมาเยอะๆนะครับ
    เขียนสอนอ่านง่ายดี
    นานๆจะเจอคนสอนที่เข้าใจคนอ่าน

  • admin

    ขอบคุณมากครับ จะพยายามเขียนเพิ่มเรื่อยๆ ครับ
    ถ้ามีข้อสงสัยอะไร ถามได้เลยนะครับ ยินดีช่วยครับ

  • yoyokung

    รบกวนสอบถามหน่อยครับ
    จะใช้ Jquery
    ต้อง โหลดอะไรมาบ้าง
    ไม่มั่นใจเลยมาถามครับ
    เพราะทำแล้วมันลากไม่ไป
    T-T

  • admin

    โหลดตัวนี้ได้เลยครับ
    site url: http://blog.jqueryui.com/2009/08/jquery-ui-18a1/
    file url: http://jquery-ui.googlecode.com/files/jquery-ui-1.8a1.zip

    โหลดเสร็จแล้วแกะ zip แล้วดูตัวอย่างจากไฟล์ demos/index.html นะครับ
    ลอง view source แล้วดูลักษณะการ include ไฟล์ ซึ่งจะแตกต่างจากตัวอย่างนี้นะครับ เพราะการจัดรูปแบบแฟ้มข้อมูลมันแตกต่างกันครับ

  • yoyokung

    ขอบคุณมากๆๆๆๆๆๆๆเลยครับ

  • admin

    ยินดีครับ -/\-

  • GillBate

    ถ้าเราต้องการจะลากกบลงไปในตาราง 2×2 แบบว่าจะลงไปในช่องไหนก็ได้ล่ะครับ พอจะบอกวิธีได้มั้ยครับ

  • admin

    @GillBate
    จากตัวอย่างนี้ ให้เปลี่ยนมุมมองจากตาราง 2×2 เป็นตะกร้า 4 ใบเรียงกันแบบ 2×2 ครับ
    - การทำให้ตะกร้า 4 ใบเรียงกันแบบ 2×2 ทำได้โดยการใช้ css จัดการครับ
    - กำหนด id ของตะกร้าแต่ละใบให้แตกต่างกัน เวลาวางกบเราก็จะรู้ได้ว่ากบตัวใหน ถูกวางลงในตะกร้าใบใหน ครับ

    ลองดูตัวอย่างเพิ่มเติมที่นี่ครับ
    http://jqueryui.com/demos/droppable/#propagation

  • GillBate

    ถ้าจะให้กบสลับที่กับตะกร้านี่ทำยังไงครับ(หาฟังชั่นไม่เจอครับ ผมจะไปหาดูได้ที่ไหนล่ะครับเนี่ย)

  • admin

    @GillBate ดูตัวอย่าง obb.html ที่บรรทัดที่ 14-16 ตรงนี้แหละครับที่เป็นตัวกำหนดว่า ถ้ากบถูกวางลงในตะกร้าแล้วจะเกิดอะไรขึ้น

    ถ้าคุณอยากทำให้กบสลับที่กับตะกร้า คุณต้องคิดว่าจะใช้วิธีแบบใหนเพื่อให้เกิดผลแบบนั้น ลองศึกษา JQuery – Manipulation ดูนะครับ
    http://api.jquery.com/category/manipulation/

    ลองดูครับ ถ้าทำได้ครั้งหนึ่งแล้ว ต่อไปถ้าอยากทำอะไร ก็จะสามารถทำได้ครับผม

  • http://www.yo.in.th yoyokung

    แวะมา ขอบคุณนะครับ

    เดี๋ยวนี้ผมใช้ JQuery เป็นมากขึ้นมากๆๆๆๆๆแล้วครับ

    ทำให้ทำเว็บได้อย่างเมามันส์สุดๆ แถมประหยัดเวลาลงเยอะเลย

    จะลืม javascript ธรรมดาไปแล้ว ใช้ JQuery ตลอด

    ที่นี่เป็นอีกที่นึง ที่เคยให้ความรู้ความเข้าใจ

    แวะมาขอบคุณจากหัวใจครับ

  • http://wegrass.com Nutrawee

    ขอบคุณมากครับ yoyokung อ่านแล้วดีใจมากๆ ครับ
    ตั้งใจว่าภายในสิ้นปีนี้จะเริ่มปั่นบทความแบบจริงจังครับ เพราะที่ผ่านมารู้สึกว่าเขียนไปน้อยมากๆ มีข้อบกพร่องอะไรบอกได้เลยนะครับ ยินดีที่จะปรับปรุง

    ขอบคุณมากนะครับ