プロが教える店舗&オフィスのセキュリティ対策術

決まった文字を入れるとBOXに入り違う文字が入ると元の位置に戻る、というようなページを作成したいです。
例えばドラッグ可能な選択肢が”上”、”下”、”中”、”右”、”左”とあり。
5つのBOXを用意しそれぞれ決まった文字しかドロップできないようにする。
例えばBOX1は”上”しかドロップできない、BOX2は”下”しかドロップできない、等
jQueryとUIを使用すれば可能かと思い、色々調べていたところ以下のサイトを見つけました。

https://plnkr.co/edit/Huo1VGFFC8xH7A9XkQWQ?p=pre …

上記ページは数字を決まった箇所に入れ、すべて正解するとウィンドウが表示されるのですが
日本語にしようとすると上手く動きませんでした。

①日本語でも動作するようにしたい
②ドロップ先のBOXの位置をそれぞれバラバラに動かせるようにしたい

上記の要件を満たすにはどのように修正すればいいでしょうか。
作成したコードは以下となります。

<!doctype html>
<html lang="en">
<head>

<title>Drag-and-Drop Number Cards Game</title>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8">
<link rel="stylesheet" type="text/css" href="style.css">

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.5. …
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jqueryui/1. …
<script type="text/javascript">

var correctCards = 0;
$( init );

function init() {

// Hide the success message
$('#successMessage').hide();
$('#successMessage').css( {
left: '580px',
top: '250px',
width: 0,
height: 0
} );

// Reset the game
correctCards = 0;
$('#cardPile').html( '' );
$('#cardSlots').html( '' );

// Create the pile of shuffled cards
var numbers = [ '上', '下', '中', '右', '左' ];
numbers.sort( function() { return Math.random() - .5 } );

for ( var i=0; i<5; i++ ) {
$('<div>' + numbers[i] + '</div>').data( 'number', numbers[i] ).attr( 'id', 'card'+numbers[i] ).appendTo( '#cardPile' ).draggable( {
containment: '#content',
stack: '#cardPile div',
cursor: 'move',
revert: true
} );
}

// Create the card slots
var words = [ '上', '下', '中', '右', '左' ];
for ( var i=1; i<=5; i++ ) {
$('<div>' + words[i-1] + '</div>').data( 'number', i ).appendTo( '#cardSlots' ).droppable( {
accept: '#cardPile div',
hoverClass: 'hovered',
drop: handleCardDrop
} );
}

}

function handleCardDrop( event, ui ) {
var slotNumber = $(this).data( 'number' );
var cardNumber = ui.draggable.data( 'number' );




// If the card was dropped to the correct slot,
// change the card colour, position it directly
// on top of the slot, and prevent it being dragged
// again

if ( slotNumber == cardNumber ) {
ui.draggable.addClass( 'correct' );
ui.draggable.draggable( 'disable' );
$(this).droppable( 'disable' );
ui.draggable.position( { of: $(this), my: 'left top', at: 'left top' } );
ui.draggable.draggable( 'option', 'revert', false );
correctCards++;
}

var all_ingredients = [];
$('#cardSlots > div').each(function(i){
if($(this).hasClass('ui-droppable-disabled')){
var ingredient = $(this).text();
all_ingredients.push(ingredient);
}
});
console.log(all_ingredients);

// If all the cards have been placed correctly then display a message
// and reset the cards for another go

if ( correctCards == 5 ) {
$('#successMessage').show();
$('#successMessage').animate( {
left: '380px',
top: '200px',
width: '400px',
height: '100px',
opacity: 1
} );
}



}

</script>

</head>
<body>

<div id="content">

<div id="cardPile"> </div>
<div id="cardSlots"> </div>

<div id="successMessage">
<h2>正解!</h2>
<button onclick="init()">もう1回</button>
</div>

</div>



</body>
</html>

質問者からの補足コメント

  • ①については解決しました。
    ②についてですが、cssのソースを一部ですが補足します。

    /* Slots for final card positions */

    #cardSlots {
    margin: 50px auto 0 auto;
    background: #ddf;
    }

      補足日時:2022/07/08 14:46
  • /* The initial pile of unsorted cards */

    #cardPile {
    margin: 0 auto;
    background: #ffd;
    }

    #cardSlots, #cardPile {
    width: 500px;
    height: 120px;
    padding: 20px;
    border: 2px solid #333;
    -moz-border-radius: 10px;
    -webkit-border-radius: 10px;
    border-radius: 10px;
    }

      補足日時:2022/07/08 14:47
  • /* Individual cards and slots */

    #cardSlots div, #cardPile div {
    float: left;
    width: 50px;
    height: 50px;
    padding: 10px;
    padding-top: 40px;
    padding-bottom: 0;
    border: 2px solid #333;
    border-radius: 10px;
    margin: 0 0 0 10px;
    background: #fff;
    text-align: center;
    }

      補足日時:2022/07/08 14:47
  • #cardSlots div:first-child, #cardPile div:first-child {
    margin-left: 0;
    }

    #cardSlots div.hovered {
    background: #aaa;
    }

    #cardSlots div {
    border-style: dashed;
    }

    #cardPile div {
    background: #666;
    color: #fff;
    font-size: 50px;
    text-shadow: 0 0 3px #000;
    }

      補足日時:2022/07/08 14:47
  • #cardPile div.ui-draggable-dragging {
    -moz-box-shadow: 0 0 .5em rgba(0, 0, 0, .8);
    -webkit-box-shadow: 0 0 .5em rgba(0, 0, 0, .8);
    box-shadow: 0 0 .5em rgba(0, 0, 0, .8);
    }

      補足日時:2022/07/08 14:48

A 回答 (1件)

こんばんは



>①については解決しました。
とのことなので・・

>②ドロップ先のBOXの位置をそれぞれバラバラに動かせるようにしたい
点線表示のカード状のものを、ドラッグできるようにしたいという意味でしょうか?

であるなら、①のカードと同様にdraggable()を設定しておけば良いです。
要素を生成して、droppable()設定の後に
 .draggable({containment: '#cardSlots' });
などと続けておけば、ドラッグ可能になります。

ただし、上位要素を広げておかないと、ほとんど横移動しかできないかもしれませんけれど・・
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!