【WordPress専用】ヘッダーの作り方(後編)

注意

前編をまだ見ていない方、HTML/CSSを導入していない方は、こちらをご覧ください。

ヘッダー(完成品)

モバイルモードにする(ウィンドウ横幅を781px以下に縮める)と、
2つ目のリストが表示され、Menuをクリックすると展開されます。

JavaScript

環境的にCSSの読み込みにラグが生まれている為、ReSizing()関数を、
1秒後に呼び出しています。


const header = document.querySelector(".header-area");
const list = header.querySelector(".list-for-pc");

const top_link = list.querySelector(".top");
const span = top_link.querySelector("span");

const links = list.querySelectorAll(".link");

let links_position;

window.addEventListener("resize",ReSizing);

function GetStarting(){
    return top_link.getBoundingClientRect().left;
}

let now_position_num = 0;

function ReSizing(){
    const temp = [];
    const starting = GetStarting();

    for(let i = 0; i < 8; i++){
        const position = links[i].getBoundingClientRect().left;
        temp.push(position - starting);
    }

    links_position = temp; 
}

setTimeout(ReSizing, 1000);

function Reset(){
    now_position_num = 0;
    span.style.transform = "none";
    span.style.width = "120%";
}

list.addEventListener("mousemove",(el)=>{
    const starting = GetStarting();
    const position = el.pageX - starting;

    if(links_position != undefined){
        if(position < links_position[0]){
            Reset();
        }else{
            for(let i = 0; i < 8; i++){
                if(position > links_position[i] && links_position != i){
                    now_position_num  = i;
                }
            }
    
            span.style.transform = "translateX(" + links_position[now_position_num] + "px)";
            span.style.width = links[now_position_num].offsetWidth * 1.2 + "px";
        }
    }
}); 

list.addEventListener("mouseleave",function(){
    Reset();
});

const toggle = header.querySelector(".toggle-list");
const sp_links = toggle.querySelectorAll("li");

sp_links[0].addEventListener("click",function(){
    for(let i = 1; i < 7; i++){
        sp_links[i].classList.toggle("active");
    }
})
 

メソッドとは

このJavaScriptにはメソッドというものが使われています。
メソッドとは、オブジェクトに関連付けられた関数で、
中身を簡単に図解した一例がこちらになります。


// オブジェクトの定義
var myObject = {
    // プロパティ
    name: "John",

    // メソッド
    greet: function() {
        console.log("Hello, my name is " + this.name + ".");
    }
};

// メソッドの呼び出し
myObject.greet(); // "Hello, my name is John."

先頭にvarとありますが、定数constで宣言された場合でも、
振る舞いに違いがありません。

メソッド自体の中身を書き換える事は出来ませんが、
メソッドはElement(HTMLの要素)を書き換える役割があります。

ただし、印象としてはstyleプロパティを用い、
CSSのプロパティに変数または定数を代入する機会の方が多いです。

getBoundingClientRect()メソッド

getBoundingClientRect()メソッドは読み込み専用で、
Element要素が特有的に持つメソッドの一つで、6つのプロパティを含有しています。
これらのプロパティはDOMRectオブジェクトのプロパティと言います。


// HTML要素を取得
var element = document.getElementById("myElement");

// 要素の位置やサイズに関する情報を取得
var rect = element.getBoundingClientRect();

// 取得した情報を使って作業
console.log("要素の左上のX座標:", rect.left);
console.log("要素の左上のY座標:", rect.top);
console.log("要素の幅:", rect.width);
console.log("要素の高さ:", rect.height);
console.log("要素の右下のX座標:", rect.right);
console.log("要素の右下のY座標:", rect.bottom);

Element.classList.toggle()

JavaScriptにおける.(ドット)演算子は、ここでは①プロパティへのアクセスと
②メソッドの呼び出しに使われます。
両者は全く違う意味であるものの、JavaScriptでは直感的に、
違和感なく使う事が出来ます。

Element.classList.toggle()はElementから
要素(Element)のプロパティにアクセスし、メソッドを実行しています。

toggle()メソッドはクラスの有無を切り替える、つまりON/OFFの役割を果たします。

まとめ・注意点

未定義のプロパティや定数や変数にアクセスした場合、
その値はundefinedとなります。
これは、定数名や変数名を参照し間違った時や、
今回のようにsetTimeout()メソッドを用い、
遅発的に変数に値(配列)を代入した時に起こります。

JavaScriptの学習を進めると、
リアルタイムでの関数の呼び出しが一つの関門となりますが、
時系列に沿ってコードを書き直す事が、自然な理解に繋がります。

みらいワークの施設利用者
チュンチュン

「WordPress」でのHTML・CSS・JavaScriptに関する情報を、
提供させて頂く予定です。
使用プラグインは「Simple Custom CSS and JS」で、
JavaScriptの表示位置は必ず「要素内」です。
ただし、使用環境により異なる事をご了承ください。

サイト制作
「みらいワーク」利用者ノート
タイトルとURLをコピーしました