HYUDORO

勉強したことや日記など

JavaScriptでフルスクリーンを検知する

各ベンダーごとにイベントリスナーを追加して、fullscreenchangeイベントを検知する必要がある。 (MDN見る限り、フルスクリーンAPIの諸々がSafariに対応してないのでちょっとめんどくさい)

developer.mozilla.org

document.addEventListener("webkitfullscreenchange", myFunc, false);
document.addEventListener("mozfullscreenchange", myFunc, false);
document.addEventListener("MSFullscreenChange", myFunc, false);
document.addEventListener("fullscreenchange", myFunc, false);

ただ、これらをいちいちadd/removeするのはめんどくさいので、まとめて扱えるようにする。 addで作ってるが、イベントリスナーを削除したいときはremoveでつくればよい。

const target = document;
addMultipleEventListener(
    target,
    "webkitfullscreenchange mozfullscreenchange MSFullscreenChange fullscreenchange",
    myFunc
)

---

const addMultipleEventListener = (element, eventNames, listener) => {
    const events = eventNames.split(" ");
    events.forEach(event => target.addEventListener(event, listener, false));
}

ハンドラーに関しては下記のように、fullScreenElementをチェックする。 nullが返ってきたらフルスクリーンではなく、対象となるDOMのnodeNameが返ってきたらフルスクリーンということ。

const myFunc() {
    const target = document;
    if (
        (target.webkitFullscreenElement &&
            target.webkitFullscreenElement !== null) ||
        (target.mozFullScreenElement &&
            target.mozFullScreenElement !== null) ||
        (target.msFullscreenElement &&
            target.msFullscreenElement !== null) ||
        (target.fullscreenElement && target.fullscreenElement !== null)
    ) {
        console.log("フルスクリーンです");
    } else {
        console.log("フルスクリーンじゃないです");
    }
}

下記参考URL

w3g.jp

qiita.com

Nuxt.js+Netlify+GitHubでサイトを立ち上げる

Jamstackでポートフォリオサイト作りたかったので、いつも使ってるNuxt.jsをジェネレータとして、Netlifyにサイトをアップしてみた。

手順としては非常に簡単で、GitHubリポジトリにNuxt.jsのプロジェクトをアップして、それをNetlifyに接続するだけ。 mainブランチにマージされたら、NetlifyのCI / CD BUILDが走る。

こちらを参考にした。

qiita.com

やってることはほぼこのままなのだけど、Yarnの場合はビルドコマンドを yarn generate にして、かつnuxt.config.jstarget: 'static'を加えた。

https://hyudoro.netlify.app/

Vue.jsでTextareaフォーカス時にReturnキーを押したらSubmit処理する

KeyboardEventを型として、keyとcodeの両方で"Enter"を検出する。 下記の例では、0文字のときは送信しなかったり、改行したいときの対策でShiftを押している時は送信しないようにしている。

<textarea v-model="text" @keypress="onInputKeyPress"></textarea>
onInputKeyPress(_e) {
    if (_e.key == "Enter" || _e.code == "Enter") {
        if (this.text.replace(/\s/g, "").length > 0 && !_e.shiftKey) {
            _e.preventDefault();
            // Submit系の処理
        }
    }
}

mobile-device-detect を導入した

Vueプロジェクトでデバイス検出するためにmobile-device-detectを使ってみた。 普段のサービス開発では、nuxt-device-detectを使っていて、これはそれに似たもの。

www.npmjs.com

導入

$ yarn add mobile-device-detect

Vueファイルの中でいちいち呼び出すこともできるか、冗長なので手軽に呼び出せるようにする。

plugins/DeviceDetect.jsみたいなファイルを作って、下記のようにインスタンスプロパティを追加する。

import { deviceDetect } from "mobile-device-detect";

export default Vue => {
    Vue.prototype.$deviceDetect = deviceDetect();
};

こうするとすべてのVueインスタンスの中でthis.$deviceDetect.isMobileという風に使うことができる。

さらにここでユーティルを作っていろんなとこで使っている。 例えばこのライブラリではデバイスの向きは検出できないので、そこを補填して組み合わせるということができる。

import { deviceDetect, isMobileOnly } from "mobile-device-detect";

export default Vue => {
    Vue.prototype.$deviceDetect = deviceDetect();
    Vue.prototype.$deviceDetect.isSPLandscape = () => {
        return isMobileOnly && window.innerWidth > window.innerHeight;
    };
};

Vue Material Design Icon Components を導入した

普通のVueプロジェクトでマテリアルアイコンを使いたかったので、このライブラリを導入してみた。 クラスを指定するのではなく、コンポーネントを読み込む形式。

www.npmjs.com

チートシートはこちらを参照。

cdn.materialdesignicons.com

Oculus Quest が届いた

f:id:Horaotoko:20200608183344j:plain

今更?なのかもしれないけど、XR領域についてもっと知りたかったので手頃なOculus Questを購入した。 まず箱の装丁かっこいい、次に導入体験もめちゃかっこいい。 チュートリアルなのにめちゃくちゃ感動してしまって、手汗がひどかった。どうしてもっと早くやらなかったのか。

僕自身もOculus Questの方をおすすめされて買ったわけだけど、スタンドアローンでPC必要ないしとても気軽に使える。

最近は安定的に在庫があるっぽいし、国からお金も入ってくるようだし、家にいる時間もどんどん増えるので、この機会にVRをはじめるのは非常におすすめ。

まずはSuperHotとTilt Brushで遊んでみます。