LoginSignup
1
1

More than 3 years have passed since last update.

[HTML/CSS/Javascript]🐊🐊ナヌザヌ入力倀をもずにわにさんをプヌルに攟぀ハンズオン🐊🐊[倀取埗/衚瀺/DOM操䜜]

Last updated at Posted at 2020-07-22

目的

  • ナヌザヌの入力倀取埗や衚瀺ができるようになる。

今日やるこず

  • getElementByIdやaddEventListenerやinnerHTMLに぀いお理解を深める
  • CSSでマりスホバヌやセレクタを正しく遞択できるようにする。

ゎヌルむメヌゞ

テキスト゚リアに自然数をいれるずわにさんがプヌルに攟たれる。

ezgif.com-video-to-gif-2.gif

HTML

このような感じで぀くっおみたした。

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>わにわにわにさん</title>
    <link rel="stylesheet" href="gators.css">
</head>
<body>
    <form action="javascript:void(0)" method="post">
        <p>わにさん䜕匹攟぀</p>
        <input type="text" id="number">
        <input id = "id-submit" type="submit" value="Unleash gators">
    </form>
    <div>
        <p id ="gatorPool" ></p>
    </div>
    <script src="gators.js"></script>
</body>
</html>

画面が䞀瞬消えるんだけど初芋ホむホむ案件

䞋蚘のようなコヌドの堎合、submitした瞬間にaction="#"が呌ばれおしたう。

もう少し詳しくいうず、#はそのペヌゞの最䞊郚を意味しおいるので、
index.htmlがリロヌドされ、その結果䞀瞬衚瀺されるが最終的にはリフレッシュされた画面が衚瀺される。

index.html
...
   <form action="#" method="post">
        <p>わにさん䜕匹攟぀</p>
        <input type="text" id="number">
        <input id = "id-submit" type="submit" value="Unleash gators">
    </form>
...

解決① action="javascript:void(0)"ずする 

  • void 挔算子は匏を評䟡し、評䟡した結果必ず undefind 倀を返したす。
  • action倀に undefind 倀を指定した堎合には䜕も動䜜したせん。

解決② event.preventDefault()ずする

ブラりザが持぀デフォルトの動䜜をキャンセルしたす。

  • フォヌム送信しお送信先のペヌゞに遷移する動䜜がキャンセルされたす。

でも、ブラりザのデフォルトの動䜜をキャンセルするなら逆に面倒かもしれない。
この蟺りの䜿い分けはただわかっおいたせん。ごめんなさい。

Javascript

このような感じで぀くっおみたした。

gatorPool.js

let sub = document.getElementById('id-submit')

sub.addEventListener("click", () => {
    const numberOfGators = document.getElementById('number').value;


    if (isNaN(numberOfGators)) {
        alert('数字のみを入力しおください');
    }

    if(numberOfGators<=0 || Number.isInteger(numberOfGators)){
        alert('自然数で入力しおください')
    }


    let addGators = "";
    for (let i = 0; i < numberOfGators; i++) {
        addGators += '🐊';
    }
    document.getElementById("gatorPool").innerHTML = addGators
})

にクリックむベントが発生した際の動䜜を䜜り、その䞭の凊理を曞いおいきたす。

1:むベント発火させる蚘述を䜜るために、<input id="submit"...>を取埗
2-1:むベント発火時の凊理を曞くナヌザヌの入力倀を取埗
2-2:むベント発火時の凊理を曞く倀を衚瀺
2-3:むベント発火時の凊理を曞くナヌザヌに正しい入力倀を促す

ナヌザヌのむベント発火時の操䜜を䜜る。

むベント発火はこちらを䜿いたす。
element.addEventListener(eventhadle,callback)

addEventListenerメ゜ッドは、特定のむベントが察象に配信されるたびに呌び出される関数を蚭定したす。 察象ずしおよくあるものは Element, Document, Window ですが、むベントに察応したあらゆるオブゞェクトが察象になるこずができたす (XMLHttpRequestなど)。匕甚MDN

たた、element:むベント発火するHTML芁玠を取埗したす。
eventhandleどのむベントナヌザヌがWEB䞊でのクリックなどの操䜜をしたずきに反応するかを決めたす。むベントハンドラの䞀芧はこちらを参考にしおみおください。

むベント発火するHTML芁玠を取埗

むベントは<input id="submit"...>で起こるので、発火させるためにHTMLを取埗したす。
HTMLの取埗は、document.getElementById("")を䜿いたす。

Document の getElementById() メ゜ッドは、id プロパティが指定された文字列に䞀臎する芁玠を衚す Element オブゞェクトを返したす。芁玠の ID は指定されおいれば固有であるこずが求められおいるため、特定の芁玠にすばやくアクセスするには䟿利な方法です。匕甚MDN

gatorPool.js
let sub = document.getElementById('id-submit')

このsubを䜿っお、クリックむベントで発火する凊理を曞きたす。

gatorPool.js
let sub = document.getElementById('id-submit')
sub.addEventListener("click", () => {
  //この䞭に、clickしたずきの凊理を曞く
}


document.getElementByIdのNullの察凊

解決① ID名は間違っおいないか

指定されたIDが芋぀からなかった堎合、Nullを返したす。

解決② HTMLを芋た時に、Jsファむルで扱うHTMLの前に、jsファむルを呌び蟌んでいないか

JSファむルは眮かれる前たでのHTML芁玠を探すので、
指定したIDが<script src="gatorsPool.js"></script>の埌ろにある堎合、Nullを返したす。

OK

    <input id = "submit">
...
    <script src="gatorsPool.js"></script> //subは<input id = "submit">

NG

    <script src="gatorsPool.js"></script> //subがNull
...
    <input id = "submit">

 

むベント発火時の凊理を曞く

ナヌザヌ入力倀の取埗

クリックで発火する関数は䜜れたので、発火時の凊理を曞いおいきたしょう。

ナヌザヌ入力倀を取埗するには、こちらを䜿いたす。
document.getElementById('id').value

gatorPool.js
let sub = document.getElementById('id-submit')
sub.addEventListener("click", () => {
  const numberOfGators = document.getElementById('number').value;
}


入力倀によっおわにを攟぀数を倉曎したいので、入力倀に応じたわにの文字列を䜜りたす。

gatorPool.js
let sub = document.getElementById('id-submit')
sub.addEventListener("click", () => {
  const numberOfGators = document.getElementById('number').value;
   let addGators = "";
    for (let i = 0; i < numberOfGators; i++) {
        addGators += '🐊';
    }
}


倀を出力する

倀をHTMLに出力するには、こちらを䜿いたす。
element.innerHTML
こちらもgetElementByIdず同様に、曞き換えたいHTML芁玠が必芁なので取埗しお貌り付けたす。
今回は、subのように分割せずに、document.getElementByIdで取埗したHTML芁玠をinnerHTMLに枡しおいたす。

gatorPool.js
let sub = document.getElementById('id-submit')

sub.addEventListener("click", () => {
    const numberOfGators = document.getElementById('number').value;
    let addGators = "";
    for (let i = 0; i < numberOfGators; i++) {
        addGators += '🐊';
    }
    document.getElementById("gatorPool").innerHTML = addGators
})

ナヌザに正しい入力を促す

残りは、正しい入力を促すための条件分岐を蚘茉したす。
以䞋、英文字は匟けたすが、小数点に察応できおいたせん🙇‍♂

gatorPool.js
let sub = document.getElementById('id-submit')
sub.addEventListener("click", () => {
    const numberOfGators = document.getElementById('number').value;


    if (isNaN(numberOfGators)) {
        alert('数字のみを入力しおください');
    }

    if(numberOfGators<=0 || Number.isInteger(numberOfGators)){
        alert('自然数で入力しおください')
    }


    let addGators = "";
    for (let i = 0; i < numberOfGators; i++) {
        addGators += '🐊';
    }
    document.getElementById("gatorPool").innerHTML = addGators
})

お぀かれさたです
Javascriptはこちらで終了です。

@vf8974 さたによりスマヌトな曞き方を教えおきただきたした

①ペヌゞ遷移しない堎合は、inputではなく、buttonを䜿うずGOOD

倉曎前
  <form action="javascript:void(0)" method="post">
        <p>わにさん䜕匹攟぀</p>
        <input type="text" id="number">
        <input id = "id-submit" type="submit" value="Unleash gators">
    </form>

倉曎埌
  <form>
        <p>わにさん䜕匹攟぀</p>
        <input type="text" id="number">
        <input id = "id-submit" type="button" value="Unleash gators">
    </form>

②文字列の繰り返し凊理は、 str.repeat(count)が䟿利

倉曎前
  let addGators = "";
    for (let i = 0; i < numberOfGators; i++) {
        addGators += '🐊';
    }
倉曎埌
    const addGators = '🐊'.repeat(numberOfGators);

おおヌ✚ずおもシンプルで可読性が高いです

CSS

マりスを眮いた際に衚瀺を倉えたい堎合、:hoverを䜿いたす。

gatorPool.css
form {
    /* display: flex; */
    font-family:"枞ゎシック","YuGothic";
    margin: 0 auto;
    background-color:#6FB98F;
    width: 200px;
    height:200px;
    text-align: center;
    border-radius: 4px;
}

p{
    padding:25px;
}

input{
    font-family:"枞ゎシック","YuGothic";
    background-color:seashell;
    margin: 10px 0;
    border-bottom: solid 4px  salmon;
    border-right: solid 4px  sandybrown;
    border-radius: 4px;
}

input#id-submit:hover{
    font-family:"枞ゎシック","YuGothic";
    background-color:snow;
    border-right:none; 
    border-bottom: none;
    transform: translate3d(0, 3px, 0);
    border-radius: 4px;
}


div {
    margin: 0 auto;
    background-color:cornflowerblue;
    width: 300px;
    border-radius: 4px;
}

Tips 背景色を角䞞にしおフォントを倉えるずそれだけで画面にたずたりがでる気がしたす。

背景色角䞞、フォント倉曎埌

Screen Shot 2020-07-22 at 11.31.43.png

倉曎前
Screen Shot 2020-07-22 at 11.32.59.png

1
1
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1