< divclass = " draggable-wrap" > < divclass = " draggable-box" draggable = " true" data-json = ' {" name" : " Lee" }' > < h1> </ h1> < divclass = " drop-box" data-json = ' {" name" : " Lee" }' > < svgclass = " icon" viewBox = " 0 0 1024 1024" version = " 1.1" xmlns = " http://www.w3.org/2000/svg" width = " 64" height = " 64" > < pathd = " M639.996 1023.988H384.002l42.656-512.582h170.684z" fill = " #ED5564" > </ path> < pathd = " M939.552 310.66l-295.43-42.936L512 0.012l-132.124 267.712L84.448 310.66l213.774 208.402-50.466 294.242L512 674.372l264.244 138.932-50.468-294.242z" fill = " #FFCE54" > </ path> < pathd = " M939.552 310.66L512 469.312l213.776 49.75z" fill = " #F6BB42" > </ path> < pathd = " M512 874.648c-11.782 0-21.344 9.562-21.344 21.344v127.996h42.686v-127.996c0-11.782-9.562-21.344-21.342-21.344z" fill = " #DA4453" > </ path> < pathd = " M512 469.312v205.06l264.244 138.932zM298.222 519.062l-50.466 294.242L512 469.312zM379.876 267.724L84.448 310.66 512 469.312zM512 0.012v469.3l132.122-201.588z" fill = " #F6BB42" > </ path> </ svg> </ div> </ div> < divclass = " draggable-box" draggable = " true" data-json = ' {" name" : " Tom" }' > < h1> </ h1> < divclass = " drop-box" data-json = ' {" name" : " Tom" }' > < svgclass = " icon" viewBox = " 0 0 1024 1024" version = " 1.1" xmlns = " http://www.w3.org/2000/svg" width = " 64" height = " 64" > < pathd = " M639.996 1023.988H384.002l42.656-512.582h170.684z" fill = " #ED5564" > </ path> < pathd = " M939.552 310.66l-295.43-42.936L512 0.012l-132.124 267.712L84.448 310.66l213.774 208.402-50.466 294.242L512 674.372l264.244 138.932-50.468-294.242z" fill = " #FFCE54" > </ path> < pathd = " M939.552 310.66L512 469.312l213.776 49.75z" fill = " #F6BB42" > </ path> < pathd = " M512 874.648c-11.782 0-21.344 9.562-21.344 21.344v127.996h42.686v-127.996c0-11.782-9.562-21.344-21.342-21.344z" fill = " #DA4453" > </ path> < pathd = " M512 469.312v205.06l264.244 138.932zM298.222 519.062l-50.466 294.242L512 469.312zM379.876 267.724L84.448 310.66 512 469.312zM512 0.012v469.3l132.122-201.588z" fill = " #F6BB42" > </ path> </ svg> </ div> </ div> < divclass = " draggable-box" draggable = " true" data-json = ' {" name" : " Jerry" }' > < h1> </ h1> < divclass = " drop-box" data-json = ' {" name" : " Jerry" }' > < svgclass = " icon" viewBox = " 0 0 1024 1024" version = " 1.1" xmlns = " http://www.w3.org/2000/svg" width = " 64" height = " 64" > < pathd = " M639.996 1023.988H384.002l42.656-512.582h170.684z" fill = " #ED5564" > </ path> < pathd = " M939.552 310.66l-295.43-42.936L512 0.012l-132.124 267.712L84.448 310.66l213.774 208.402-50.466 294.242L512 674.372l264.244 138.932-50.468-294.242z" fill = " #FFCE54" > </ path> < pathd = " M939.552 310.66L512 469.312l213.776 49.75z" fill = " #F6BB42" > </ path> < pathd = " M512 874.648c-11.782 0-21.344 9.562-21.344 21.344v127.996h42.686v-127.996c0-11.782-9.562-21.344-21.342-21.344z" fill = " #DA4453" > </ path> < pathd = " M512 469.312v205.06l264.244 138.932zM298.222 519.062l-50.466 294.242L512 469.312zM379.876 267.724L84.448 310.66 512 469.312zM512 0.012v469.3l132.122-201.588z" fill = " #F6BB42" > </ path> </ svg> </ div> </ div> </ div> body  { 
    margin :  0; 
    user-select :  none; 
} 
.draggable-wrap  { 
    height :  100vh; 
    display :  flex; 
    justify-content :  center; 
    align-items :  center; 
    gap :  80px;
    .draggable-box  { 
        position :  relative; 
        width :  240px; 
        height :  140px; 
        border :  3px solid black; 
        scale :  1.2;
        h1  { 
            text-align :  center; 
        } 
        &:nth-child(1)  { 
            background-color :  red; 
        } 
        &:nth-child(2)  { 
            background-color :  green; 
        } 
        &:nth-child(3)  { 
            background-color :  blue; 
        } 
        &[drag="start"]  { 
            opacity :  .2; 
        } 
        &[drag="end"]  { 
            opacity :  1; 
        } 
        .drop-box  { 
            opacity :  0; 
            position :  absolute; 
            top :  0; 
            right :  0; 
            bottom :  0; 
            left :  0; 
            border :  3px dashed black; 
            background-color :  rgba ( 0,  0,  0,  .5) ; 
            transition :  1s; 
            display :  flex; 
            justify-content :  center; 
            align-items :  center; 
            gap :  20px;
            .icon  { 
                display :  none; 
                width :  80px; 
                height :  80px; 
            } 
            &[drag="enter"]  { 
                opacity :  1;
                &::after  { 
                    content :  '' ; 
                    display :  block; 
                    position :  absolute; 
                    top :  0; 
                    right :  0; 
                    bottom :  0; 
                    left :  0; 
                } 
                .icon  { 
                    display :  block; 
                } 
            } 
            &[drag="leave"]  { 
                opacity :  0;
                .icon  { 
                    display :  none; 
                } 
            } 
            &[drag="drop"]  { 
                opacity :  1;
                .icon  { 
                    display :  block; 
                } 
            } 
        } 
    } 
} 
const  draggables =  document. querySelectorAll ( '.draggable-box' ) ; 
const  drops =  document. querySelectorAll ( '.drop-box' ) ; 
draggables. forEach ( el  =>  { 
    el. addEventListener ( 'dragstart' ,  e  =>  { 
        e. target. setAttribute ( 'drag' ,  'start' ) ; 
        e. dataTransfer. setData ( 'data' ,  e. target. getAttribute ( 'data-json' ) ) ; 
    } ) ; 
    el. addEventListener ( 'dragend' ,  e  =>  { 
        e. target. setAttribute ( 'drag' ,  'end' ) ; 
    } ) ; 
} ) ; 
drops. forEach ( el  =>  { 
    el. addEventListener ( 'dragenter' ,  e  =>  { 
        e. stopPropagation ( ) ; 
        e. target. setAttribute ( 'drag' ,  'enter' ) ; 
    } ) ; 
    el. addEventListener ( 'dragover' ,  e  =>  e. preventDefault ( ) ) ; 
    el. addEventListener ( 'dragleave' ,  e  =>  { 
        e. stopPropagation ( ) ; 
        e. target. setAttribute ( 'drag' ,  'leave' ) ; 
    } ) ; 
    el. addEventListener ( 'drop' ,  e  =>  { 
        e. target. setAttribute ( 'drag' ,  'drop' ) ; 
        const  source =  JSON . parse ( e. dataTransfer. getData ( 'data' ) ) ; 
        const  target =  JSON . parse ( e. target. getAttribute ( 'data-json' ) ) ; 
        console. log ( source,  target) ; 
    } ) ; 
} ) ;