(と DOMの扱い HTML5 jQueryも)
ブラウザ→コンソール に入力
ブラウザを開く(とりあえずは適当なページを表示していればいい)。
開発ツールを出す(多くのブラウザで F12キーで出現する。再度F12で非表示に戻る)。
タブ(を使って機能を切り替え、「コンソール」表示に。
プロンプト( おそらく >
の字)の右に、javascriptの式を入力し Enter。
=> その式を評価した値が表示される。
ページ上に何か画像が置いてある… という状態を作る。そのために、
HTMLファイルを1つ作成する。(実習)
div
タグを作り、CSSの属性として height
、width‘、
background-color` を指定してもいい。(練習なので次項のほぼ解答を見る前に自分で調べながら作って見て下さい)
この画像(リンク先)を使った例:
<!doctype html>
<div id='a'><img src="ball.png"></div>
<style>
#a {position: absolute;
left: 20%; top: 30%;
}
body {background: #aaccdd;}
</style>
画像に属性を与えるためのセレクタとして、タグ名 img
を使ってもいいし、 上記例のように div
要素で囲んでもいい。
セレクタの与え方として、div#a
とも書けるが、 タグ名を省略して id名だけ(id名に #
を前置して)与えてもいい。
また、<img src='ball.png' id='a'>
のように img 要素に直接 id名を与えてもいい。
CSSの left および top 属性で、画面上の要素の位置を決められるが、 それが有効になるためには position: absolute;
も指定されている必要がある。
また、HTMLを直接書かずに、pug で用意することもできる(下の例)。
doctype html
#a: img(src="ball.png")
style.
#a {position: absolute;
left: 20%; top: 30%;
}
body {background: #aaccdd;}
ボールが勝手に動く
マウスをクリックした場所に動く
or マウスに追従する
といった動作をさせることを考えて行こう。
CSS属性として様々なものがある。必要に応じてリファレンスで調べられるようにしておこう。
CSSを使いこなすためにセレクタの知識も必要となる。
画面のデザインや装飾のためにもCSSが必要だが、それ以外にもセレクタが様々な役割を果たすため(先月 クローリングを行った際にもセレクタの活用が必要となったのを思い出して下さい)。
属性ごとに、その値として付与できるデータの種類は決まっている(リファレンスを参照)。先の例で言えば、
position 属性には、relative, absolute など予め決められたキーワードの中から選んで指定する。
left, top など、画面上での距離(左上隅を原点として)を表す属性には、長さを示す数値を与える。
長さを示す値を表す数字は、いくつかの単位での表現方法が用意されている(ピクセル数、インチ、ミリメートルなど)ので、数値の後ろにその単位を付けて指定することが必要。
単位なしの数値は無視されることに留意されたい(これはよくつけ忘れてしまい 動作が変だと困惑することも多々ある)。
ここで 先に作ったWebページを表示した状態で、F12キーでブラウザのコンソールを開き、 以下のような式を試してみて下さい。
window // ブラウザ上のJavaScriptで
// プログラムの動作環境(現在表示しているページ)を表す
// トップレベルのオブジェクト
window.document // DOMを表す木構造
document // レシーバ(ピリオドの左)としての window オブジェクトは省略可
document.body
document.children
document.children[0] // 当該ノード(木構造の節点)の直下(DOMの木構造において、という意味)
// にあるすべての子要素の集合体
//(実体は NodeListという種類のオブジェクトだが、配列と同様に、
// 後置の[] に整数を置いて、
// 配列の要素(指定した添え字の位置に置かれたもの、
// 実体はHTMLの要素を表すオブジェクト。
このようにしてオブジェクトの要素を(ピリオドの右にキーを指定して)選択する、という書き方を連鎖させて、ページ上のDOM要素にプログラムから自由にアクセスすることは可能だが、
ページの構成の小さい変化に対してもプログラムの変更を行う必要が出てしまうため、
実際にはこのアクセス方法はほぼ使われていない。
document.getElementById('a') // idを指定する 要素が1つ得られる
document.getElementsByTagname('img') // タグ名を指定
// 複数の要素があることを想定して HTMLCollectionが返ってくる document.getElementsByTagname('img')[0] // 配列と同様に扱える
// 以下は query 系のメソッド
document.querySelector('#a') // 最初に見つかった要素が得られる
// id を指定する場合はおそらく1つしか見つからないのでこれでいい
document.querySelectorAll('#a') // NodeList が返ってくる
document.querySelectorAll('#a')[0] // これも配列のように扱える
// 次の演習の準備として この要素を変数に代入しておく
var a=document.querySelector('#a')
a.style
a.style.top
a.style.left
a.getAttribute('style')
要素が画面上で表示される位置は、(この例では単純にleft top の2つのCSS属性だけで決定しているが、一般には) 要素の包含関係なども影響して、ブラウザ内部の計算で決まるようだ。
なので、1つのスタイル値を取得することで要素の位置を得ることができない場合がある。
代わりに以下のメソッドを使おう。
a.offsetTop
a.offsetLeft
a.offsetTop=0 // 代入式は受け付けている、が
a.offsetTop // 変化はない(画面上でも変化はない)
a.style.top
および a.style.left
に値を(CSSの値として)直接代入するといいだろう。
値を与えるときには、単位を明確にした上で文字列として代入することになる。ここではピクセル単位を想定して、数値の後ろに ‘px’ をつける。
`${a.offsetLeft+10}px`
a.style.left=`${a.offsetLeft+10}px` // 要素を10ピクセル分右に移動する
a.style.left
文字列を囲むクォート文字として、シングルクォート(' '
)、ダブルクォート(" "
) がよく使われている(場合によっては組み合わせて)が、ここでは、
バッククォート(これもJavaScriptに比較的新しく加わった)を使おう。
バッククォート `` ``
で囲まれた文字列の中では、${...}
の中に式を書くことができ、
式の値を評価(計算)した結果がその場所に展開される
以下のような例を参考に作ってみて下さい。
window.addEventListener("onmousemove", event => {
console.log(event.clientX, event.clientY);
});
(以下のいずれかの方向で取り組んでみて下さい =>宿題)
予め、HTMLの先頭部(doctypeの下ぐらいが適切だろう)に、
<script src="https://code.jquery.com/jquery-3.5.1.slim.min.js"></script>
を入れておく。
以下のような式が使える。
$('#a') // 要素の取得
// ただしここで得られる値は、
// jQueryで用意するオブジェクト(jQueryオブジェクトと呼ばれる)。
// $ 関数 (または jQuery関数)の値はすべてこの型。
$('#a').offset()
var t=$('#a').offset().top // 変数tに代入しておいて、
$('#a').css({top:`${t+100}px`}) // 値を変更する(100ピクセル下へ)
// CSS属性とその値をオブジェクトとして渡す
なお、jQueryでマウスイベント(ここではクリック)を扱うコードの例を示しておく。
$(document).click((ev)=>{
console.log(ev);
$('#a').css({left:`${ev.pageX}px`})
})