marautube

マローチューブ (韓国語・動画コミュニティーサイト)

marautube

マローチューブ (韓国語・動画コミュニティーサイト)

Youtube Clone Coding.
ハリーポッターの「マローダーズマップ」からモチーフを得て、ホグワーツの学生向けの動画サイトを構築しました。 アカウント作成、 修正、動画アップロード、修正、削除、ログイン、録画、コメント作成、削除が 可能です。

今までは Javascriptが未熟で、試せなかったことが多かったら、今回の作品では自らコードを作って入れたものが多かったです。最も力を入れたところは ローディングページ チャンネルページ カーソルカスタマイズ ダークモードです。

バックエンドまで構築したのは初めてだったので、試行錯誤も多く、無数なエラーの中、諦めたい気持ちもありましたが、最後まで完成して韓国のBootCampでの「優秀作品」に選ばれてもっと意味深い作品・作業になりました。

concept

ハリーポッターの魔法学校コンセプトに忠実に

マローダーズマップでモチーフを得たので、魔法学校ホグワーツの世界観に忠実に従いたかったです。
普通じゃない魔法学校に通っているが、マローダーズはいたずらが好きな10代の学生たちだから教授たちが接続できない魔法をかけた 秘密のコミュニティーサイトを作ったというコンセプトです。

イントロページに「マローダーズマップ」を表す魔法の呪文をしたという仮定の上、右側の画像が時間をかけてフェードインされるアニメーションを与えました。
「マグルって何ですか?」をクリックすると、マグルたちを追放するためにgoogle ukのリンクを入れました。

marautube intro
  • color

    main color

    #2a0100

    color

    #820606

    color

    #d8ae84

  • font

    English: Cinzel Decorative
    Korean: Hahmlet
    Google Material Icon

  • tool

    Front-end

    SCSS, Javascript, Pug, Webpack, Babel

    Back-end

    NodeJS, Express, MongoDB, AWS

    Design

    Photoshop

  • type

    Responsive web

  • total elapsed time

    2022.6~8

  • theme

    ユーチューブクローンコーディング、動画サイト、ハリーポッター、マローダーズマップ、レスポンシブウェブ、ギャグ。

  • target

    10代

  • role

    Design/Development 100%

marautube intro

design

動画中心のシンプルなデザイン

動画サイトなので、特別なデザイン要素を入れずに動画に 集中できるようにデザインしました。
最初に出力される上部(DISCOVERY)には、「サイトでおすすめの 動画」、「サイトでおすすめするチャンネル」そして「最も購読者が多い アップローダー」を露出させました。 (デザインしただけで、機能しません。)

そしてその下(TRENDING VIDEO)は、登録した動画が順番に露出されるように しました。動画がメインなので、サムネイルとタイトルが一番目立つように しました。

marautube

function/design

詳細ページのデザインと技能

左側には動画、右側にはコメントをも越せるようにデザインしました。
動画のコントローラーもデザインしており、ユーチューブのようにカーソルの動きがなければ、 コントローラーが非表示になります。 また動画を最後まで見た場合、 自動に再生回数がカウントされます。そしてショートカットキーも動作します。
現在、動画は問題がありますが、スマホでは再生できないです。(修正予定)

右側のコメントの場合、ログインしないとコメントを残せないように 塞いでおり(写真を参照)、最新のコメントが一番下に並べられるように しました。

marautube

ログインした場合、コメント作成が 可能になり、自分が残したコメントを削除することもできます。 また、ユーザーが 投稿した場合、画像の修正または削除することができます。

marautube marautube marautube

function/design

会員登録/ログイン/アップロードなどのフォーム

フォームを作成する必要がある会員登録、ログイン、アップロード、会員情報の修正、動画 修正などのフォーム様式は統一感を与えるために同じデザインを 適用しました。
ログインページはサイトで 登録してログインすることもできますが、GitHubソーシャルログインを連動したので、こちらのアカウントでもログイン可能です。

会員登録にはコンセプトを守るため、 「寮入力」と自分のアピールができる自己紹介を書けるマスを用意しました。また、会員情報修正でプロフィール登録をするより登録 するときにプロフィール画像を登録できるようにしました。 もしプロフィール 画像を登録していないときは、上段に no dataと表示されます。情報修正では'no data'というイメージが表示され、IDは修正が不可能になります。

アップロードページはブラウザーでサービスする添付ファイルフォームのデザインがサイトと合わないため、カスタマイズをしました。サムネイル画像を添付したら、ユーザーが添付したイメージをプレビューできます。

marautube

function/design

チャンネルの詳細ページ

他のユーザーや自分のチャンネルをクリックすると出力されるページです。 ユーザーの IDと所属寮、自己紹介、プロフィール画像が左側に出力され、 そのユーザーがアップロードした動画は右側に出力されます。 また、 登録した動画が3つ以上ある場合、便宜のためスクロールしても左 ユーザー情報は固定しました。

スマホではユーザー情報の固定を解除し、上段に位置させ、その 以下にアップロードした動画が出力されます。

marautube

もしプロフィール画像とアップロードした動画がないユーザーの場合は、「no data」ではなく、「マローダーズマップ」イメージを出力するようにし、 右側には「死喰い人」のイメージを入れ、 Something Wrong. Someone used Deletrius.というフレーズを追加してコンセプトを守りながらウィットを加えました。(Deletrius: なくす魔法)

marautube

function/design

ダークモード

目の快適さのためにダークモードを追加しました。 一度もやってみたことがない技能だったので、それなりに研究しながら具現しました。 ユーザーがほしい時にボタンでモードを調節させるために Javascriptを採用しており、 ブラウザを「オン」「オフ」にするたびに、ユーザーが指定したモードが保存されるよう、 ウェブストレージオブジェクトである localstorageを使用して、ブラウザー内で「鍵-値」を保存できるようにしました。

Cookie, Sessionではなく、 localstorageを使用した理由はlocalstorageの知識が浅いということと、保存されたデータはセッション間で共有されること、 サーバーではなくローカルに保存される点、Javascriptで操作し、 スマホでも使用できる点などがあります。

HTML5
  
    <li class="theme-change">
      <a href="javascript:void(0)"
        ><i class="material-icons">dark_mode</i></a
      >
    </li>
  

html構造は簡単です。基本は light modeなので material iconsアイコンを dark_modeで設定します。

dark modeになったら CSSファイルの中に dark-mode時変わる色など指定します。色は強烈出ない色を使いました。 #000#fffを使えばむしろ 可読性が落ちたり、明るくて目に入らない場合があり、 #121212#bbbを使いました。

Javascript
  // dark mode
  const darkTheme = document.querySelector(".theme-change a");
  const darkIcon = darkTheme.querySelector("i");

  // ボタンをクリックするたびに同作するFunction
  function darkThemeClick() {
    darkTheme.addEventListener("click", function () {
      console.log(darkIcon);
      if (!body.classList.contains("dark-mode")) {
        body.classList.add("dark-mode");
        darkIcon.innerText = "light_mode";
        localStorage.setItem("modeSwitch", "light_mode");
      } else if (body.classList.contains("dark-mode")) {
        body.classList.remove("dark-mode");
        darkIcon.innerText = "dark_mode";
        localStorage.setItem("modeSwitch", "dark_mode");
      }
    });
  }

  darkThemeClick();

  const modeSwitch = localStorage.getItem("modeSwitch"); // "modeSwitch" アイテムの値を読み込む

  //もし modeSwitchがdark_mode(テーマはlight)なら、アイコンをdark_mode(月)に変える。
  if (modeSwitch === "dark_mode") {
    body.classList.remove("dark-mode");
    darkIcon.innerText = "dark_mode";
  } else if (modeSwitch === "light_mode") {
    // modeSwitchがlight_mode(テーマはdark)なら、アイコンをlight_mode(太陽)に変える。
    body.classList.add("dark-mode");
    darkIcon.innerText = "light_mode";
  }

ボタンをクリックするたびにlocalstorageにアイコンの名前を保存して現在のアイコンがlightなのか darkなのか、確認できるようにします。また、現在が dark modeならばbodydark-modeClassを追加し、アイコンを light_modeに変えます。

function

マウスオーバー効果/カーソルカスタム

魔法学校のコンセプトのため、マウスを魔法杖と設定し、リンクにマウスを上げると LUMOS(ルーモス。火を灯す魔法。)に変わるアニメーションを入れました。

  • マウスオーバーの前

  • マウスオーバーの後

HTML5
  
    <div class="cursor">
      <div class="link-wrap">
        <div class="cursor-rotate">
          <span class="eng">l</span><span class="eng">u</span
          ><span class="eng">m</span><span class="eng">o</span
          ><span class="eng">s</span>
        </div>
        <div class="cursor-rotate">
          <span class="eng">l</span><span class="eng">u</span
          ><span class="eng">m</span><span class="eng">o</span
          ><span class="eng">s</span>
        </div>
      </div>
    </div>
  

カーソルをCSSで隠してdivで偽物カーソルを作りました。画像を使ったらメンテナンスが大変なため、いちいち文字を壊してtransform: rotate(~deg);position: absolute;で丸の模様に作りました。

Javascript
let mouseCursor = document.querySelector(".cursor");
  let link = document.querySelectorAll("a");
  let hoverLink = document.querySelectorAll(".hover-link");
  
  // マウスが動くたびにdivを動かす。
  window.addEventListener("mousemove", cursor);
  function cursor(e) {
    mouseCursor.style.left = e.pageX + "px";
    mouseCursor.style.top = e.pageY + "px";
  }
  
  // aタグにマウスを載せたら「link-cursor」というクラスを付ける
  link.forEach((link) => {
    link.addEventListener("mouseover", () => {
      mouseCursor.classList.add("link-cursor");
    });
  
    link.addEventListener("mouseleave", () => {
      mouseCursor.classList.remove("link-cursor");
    });
  });
  // 「.hover-link」というクラスを持っている要素にマウスを載せたら「link-cursor」というクラスをつける。
  hoverLink.forEach((hoverLink) => {
    hoverLink.addEventListener("mouseover", () => {
      mouseCursor.classList.add("link-cursor");
    });
    hoverLink.addEventListener("mouseleave", () => {
      mouseCursor.classList.remove("link-cursor");
    });
  });

偽物divを動かすたびにJavascriptで x, y座標値を各自left, topに入力されるようにしました。

function

ローディングページアニメーション効果

ハリーポッターで「マローダーズマップ」を実行すると、すべての人の動きが分かるように 「足跡」が動きますが、それをローディングページに適用させ、ユーザーが地図の 中で実際に動いているように感じられるように表現したかったです。

marauders

marauders

HTML5/CSS
  
  <div class="loading">
    <div class="ani">
      <div class="rotate-wrap">
        <p class="rotate">
          <span>m</span><span>a</span><span>r</span><span>a</span
          ><span>u</span><span>d</span><span>e</span><span>r</span
          ><span>s</span>
        </p>
        <p class="rotate">
          <span>m</span><span>a</span><span>r</span><span>a</span
          ><span>u</span><span>d</span><span>e</span><span>r</span
          ><span>s</span>
        </p>
      </div>
    </div>
  </div>

  //css
  .ani {
    background: url("https://marautube.herokuapp.com/loading.png") no-repeat 0
      0;
    background-size: 1287px 127px;
    position: relative;
    z-index: 99999999;
    width: 127px;
    height: 127px;
    animation: loading 2000ms infinite steps(10);
  }
  @keyframes loading {
    100% {
      background-position: -1287px 0;
    }
  }
  

丸の周りを回る文字はカーソルで作った形式と同じく構築しました。
足跡が動くアニメーションはCSS keyframesstepsを利用して10フレームごとに background positionwidth値ほど見せられるように動作します。

Javascript
window.addEventListener("load", () => {
  body.classList.remove("before-load");
  document.querySelector(".loading").addEventListener("transitionend", (e) => {
    body.removeChild(e.currentTarget);
  });
});

loadingが完了したらbodyに指定した before-loadクラスを削除し、 transitionアニメーションが再生終わったら、 body中にいる.loadingタグを全部 削除して見えないようにしました。

marautube

function/design

ログインしたときのヘッダーの変化

ログインをしたときは、ユーザのプロフィール画像とニックネームが出力されます。 またdrop downを使用してプロフィールを押すとメニューが出ます。 ここでアップロード、ビデオ録画、マイチャンネル、会員情報の修正、ログアウトができます。

このような些細なところにもコンセプトを維持するために 会員情報の修正をポリジュース薬で、 ログアウトをいたずら完了にしました。

marautube

function/design

404エラーページ

404エラーページもデザインしました。 最後までモチーフでありコンセプト維持のために「マローダーズマップ」から出てきたスネイプ教授の好奇心を永遠に避けさせる魔法が出力されるようにしました。

スネイプ教授のイメージはgifで動き、「いたずら再開」を 押すとイントロ画面に移動します。