JavaScript」カテゴリーアーカイブ

chart.jsでグラフを作る

Docker環境下でグラフを作りたい

1:新しくモデルを追加する

docker-compose run web bundle exec rails g model hiit user:references training_day:date training_time:integer

2:マイグレートする

docker-compose exec web bundle exec rake db:migrate

3:user.rbに以下の記述を追加する

4:コントローラーの追加をする

docker-compose exec web rails g controller hiits new edit show index

5:ルーティングを追加するroutes.rbに以下の記述を追加

6:ビューを追加する

new.html.erbの中身

<section class="hiit-form">
  <div class="log-form">
    <div class="form-title tween-animate-title center-position">運動記録</div>
    <%= form_with model: @hiit, local: true do |f| %>
     <%= f.date_field :training_day, id: "date-form", type: "text", readonly: "",
         placeholder: 'クリックして運動した日をカレンダーで選択', class: "form-field btn" %>
     <% if @hiit.errors.include?(:training_day) %>
       <div class="alert alert-danger ">
      <%= @hiit.errors.messages[:training_day][0] %>
       </div>
      <% end %>
       <%= f.number_field :training_time, required: true, placeholder: '運動時間を分単位で選択' %>
        <% if @hiit.errors.include?(:training_time) %>
         <div class="alert alert-danger ">
        <%= @hiit.errors.messages[:training_time][0] %>
     <% end %>
      <%= f.label '運動メモ', class: "box center-position" %>
      <%= f.text_area :content, class: "form-area center-position", placeholder: '例: スクワットを〇〇分、腹筋を〇〇分、プランクを〇〇分など' %>
       </div>
      <%= f.submit yield(:button_text), class: "btn slide-wine center-position" %>
     <% end %>
   </section>
<%= render 'shared/datetime' %>

<%= render ‘shared/datetime’ %>の中身

<script>
 const today = new Date(new Date().setHours(0, 0, 0, 0))
 const a_month_ago = new Date(today.getFullYear(), today.getMonth() - 1, today.getDate())

// ● カレンダー
// 選択できない日付データ(自由に変更できます。)
 const disable_dates = ['']

// カレンダーの日本語化
    flatpickr.localize(flatpickr.l10ns.ja);

// カレンダーの表示
    flatpickr('#date-form', {
// スマートフォンでもカレンダーに「flatpickr」を使用
     disableMobile: true,
// 1ヶ月前から本日まで選択可
     minDate: a_month_ago,
// 選択できない日付
     disable: disable_dates
});
</script>

なおflatpicker(カレンダー機能)を使わないときは無視していいです。できればjsに置き換えたほうが良いです

 

Javascript ex2(サイト作成詳細Ver)

サイトの作成手順などまとめ

いつでも、すぐに作れるように

1:まず初めにindex.htmlを作成する(太字の部分があるのを確認)

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
 
</body>
</html>

2:レスポンシブデザインにしたいので、Stylesというフォルダーを作成し、style.scssを作成して以下のような設定をする。(モバイルファースト)

 // スマホ画面の設定
@import "breakpoints/base";

// スマホ横向きのときの設定
@media (min-width: 480px) {
@import "breakpoints/480up";
}

// タブレットのときの設定
@media (min-width: 600px) {
@import "breakpoints/600up";
}

@media (min-width: 960px) {
@import "breakpoints/960up";
}

@media (min-width: 1280px) {
@import "breakpoints/1280up";
}

// Retinaディスプレイで適用
@media (min-resolution: 192dpi)
,(-webkit-min-device-pixel-ratio: 2) {
@import "breakpoints/2x";
}

// 印刷時のみ適用される設定
@media print {
@import "breakpoints/print";
}

3:フォルダーbreakpointsを作成してその中に各画面サイズ用の設定のためのscssを作成する(中身は後で作成します)。

4:ヒーロースライダーの機能の実装+Googlefontの利用とbootstrap-reboot.cssの準備)

index.htmlを以下のように記述して、googlefontsとbootstrap-reboot.css(中身は後で配置)を利用する。

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta http-equiv="X-UA-Compatible" content="ie=edge" />
<title>Flower Garden</title>
<meta name="description" content="This site is a my site.">
<link href="https://fonts.googleapis.com/css2?family=Kameron:wght@400;700&family=Noto+Sans+JP:wght@500&display=swap" rel="stylesheet">
<link rel="stylesheet" href="styles/vendors/bootstrap-reboot.css" />
<link rel="stylesheet" href="styles/vendors/swiper.min.css" />
<link rel="stylesheet" href="styles/style.css" />
</head>
<body>
<div id="global-container">
<div id="container">
<div id="content">
<div class="hero">
<div class="swiper-container">
<div class="swiper-wrapper">
<div class="swiper-slide">
<div class="hero__title">Magnificence</div>
<image src="images/Dahlia.jpg" alt=""></image>
</div>
<div class="swiper-slide">
<div class="hero__title">Solidarity</div>
<image src="images/Gaillardia.jpg" alt=""></image>
</div>
<div class="swiper-slide">
<div class="hero__title">Gentility</div>
<image src="images/Geranium.jpg" alt=""></image>
</div>
</div>
<div class="hero__footer">
<img class="hero__downarrow" src="images/arrow.svg" />
<span class="hero__scrolltext">scroll</span>
</div>
</div>
</div>
</div>
</div>
<script src="scripts/vendors/swiper.min.js"></script>
<script src="scripts/libs/hero-slider.js"></script>
<script src="scripts/main.js"></script>
</body>
</html>

↓の画像を参考に各ファイルを配置する

  1. フォルダーscriptsを作成してその直下にlibsのフォルダーを作成してヒーロスライダーのjsファイルを記述する。
  2. フォルダーscriptsの直下にvendorsのフォルダーを作成してswiper.min.jsを配置
  3. scriptsの直下にmain.jsを配置
  4. stylesの直下にフォルダーbreakpointsを作成して各scssファイルを作成する。
  5. stylesの直下にフォルダーmodulesを作成して各scssファイルを作成する。
  6. stylesの直下にフォルダーvendorsを作成してswiper.min.cssを配置する。
  7. stylesの直下にstyle.scssを配置する。

↑の詳細

1:hero-slider.jsの詳細

class HeroSlider {
constructor(el) {
this.el = el;
this.swiper = this._initSwiper();
}

_initSwiper() {
// returnでインスタンスに返す
return new Swiper(this.el, {
// オプション詳しくはSwiperで
// direction: 'vertical',
loop: true,
// effect: 'fade',
grabCursor: true,
effect: "coverflow",
// スライダーを中央揃えにする
centeredSlides: true,
// 1枚だけ表示する
slidesPerView: 1,
speed: 1000,
breakpoints: {
// 1024px以上は2枚表示する
1024: {
slidesPerView: 2,
},
},
});
}
// 空のオブジェクトを作る
start(options = {}) {
options = Object.assign(
{
delay: 4000,
// マウスで変更したあとでも4秒後、またオートでトランジション開始する
disableOnInteraction: false,
},
options
);

this.swiper.params.autoplay = options;
this.swiper.autoplay.start();
}
stop() {
this.swiper.autoplay.stop();
}
}

3の詳細:main.js

document.addEventListener('DOMContentLoaded', function () {
// newでインスタンス化
const hero = new HeroSlider('.swiper-container');
hero.start();
});

5の詳細:_mixin.scss

@mixin animation(
$name,
$duration: 1s,
$timing-function: ease,
$delay: 0s,
$iteration-count: 1,
$direction: normal,
$fill-mode: forwards
) {
animation: {
name: $name;
duration: $duration;
timing-function: $timing-function;
delay: $delay;
iteration-count: $iteration-count;
direction: $direction;
fill-mode: $fill-mode;
}
}
_hero-slider.scss



.swiper-container {
overflow: visible !important;
}

.swiper-slide {
height: 500px;
// 拡大してはみ出た部分を表示しない
overflow: hidden;

& > img {
width: 100%;
height: 100%;
max-width: 100%;
object-fit: cover;
// 拡大する
transform: scale(1.3);
transition: transform 1.9s ease;
}

&::after {
content: "";
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-color: rgba(0, 61, 125, 0.1);
}

&-active {
& > img {
transform: none;
}

& .hero__title {
// 透明度を解除
opacity: 1;
transform: translate(-50%, -50%);
}
}
}

.hero {
&__title {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, calc(-50% + 20px));
color: $cWhite;
font-size: 25px;
// 文字が最前面にくるようにする
z-index: 2;
opacity: 0;
transition: opacity 0.3s ease 1s, transform 0.3s ease 1s;
}

&__footer {
position: absolute;
left: 50%;
bottom: 20px;
transform: translateX(-50%);
z-index: 2;
height: 68px;
width: 32px;
// アニメーションで上下に動いているように見えなくする
overflow: hidden;
}

&__downarrow {
position: absolute;
left: 0;
bottom: 0;
width: 6px;
// アニメーションを付けるために必要
@include animation(
$name: kf-arrow-anime,
$iteration-count: infinite,
$duration: 2s,
$timing-function: linear
);
}

&__scrolltext {
position: absolute;
// 90度回転
transform: rotate(90deg);
color: rgba(255, 255, 255, 0.7);
left: -8px;
top: 15px;
font-size: 1.2em;
}
}

@keyframes kf-arrow-anime {
0%,
50%,
100% {
transform: translateY(-10%);
}
30% {
transform: none;
}
}

5:ノーマライズする。

vendors直下にbootstrap-reboot.cssを配置する。(ここからget)

6:共通クラスを作って複数回同じことを書かないようにする

_base.scssに以下のように記述

// Stylesheet: ベーススタイル(スマホ用の設定)
body {
  font-family: "Kameron", "Noto Sans JP", sans-serif;
}
img {
  max-width: 100%;
  vertical-align: bottom;
}
.font-sm {
  font-size: 14px;
}
.font-md {
  font-size: 17px;
}
.font-lr {
  font-size: 17px;
}
.font-lg {
  font-size: 25px;
}
.mb-sm {
  margin-bottom: 16px !important;
}
.mb-lg {
  margin-bottom: 80px !important;
}
.pb-sm {
  padding-bottom: 16px !important;
}
.pb-lg {
  padding-bottom: 80px !important;
}
.content-width {
  width: 90%;
  margin: 0 auto;
  max-width: $contentMaxWidth;
}

ある程度よく使うもの(フォントのサイズやマージンやパディング)を共通化する。

7:ヒーロースライダー用の画像をimagesフォルダの中に配置する。

なんでもOK

8:テキストアニメーションの追加(流れで後で記述を追加する)

↓の画像を参考に各ファイルを配置する。(中身は後述)

  1. フォルダーlibsの直下にscroll.jsファイルを作成する。

  2. vendorsの直下にscroll-polyfill.jsを配置

  3. vendorsの直下にtext-animation.jsを配置

  4. vendorsの直下にTweenMax.min.jsを配置

  5. main.jsの記述を変更

  6. modulesの直下にtext-animation.scssを配置する。

  7. style.scssやindex.htmlに読み込むための記述をする。

貼り付けたmain.js内の以下を切り取り

scripts/main.jsにこのように貼り付け

index.htmlの中身<body>から

<body>
<div id="global-container">
<div id="container">
<div id="content">
<div class="hero">
<div class="swiper-container">
<div class="swiper-wrapper">
<div class="swiper-slide">
<div class="hero__title">Magnificence</div>
<image src="images/Dahlia.jpg" alt=""></image>
</div>
<div class="swiper-slide">
<div class="hero__title">Solidarity</div>
<image src="images/Gaillardia.jpg" alt=""></image>
</div>
<div class="swiper-slide">
<div class="hero__title">Gentility</div>
<image src="images/Geranium.jpg" alt=""></image>
</div>
</div>
<div class="hero__footer">
<img class="hero__downarrow" src="images/arrow.svg" />
<span class="hero__scrolltext">scroll</span>
</div>
</div>
</div>
</div>
</div>
<div class= animate-title>text-animation</div>
<div class= "tween-animate-title">Tween-text-animation</div>
<script src="scripts/vendors/swiper.min.js"></script>
<script src="scripts/vendors/TweenMax.min.js"></script>
<script src="scripts/vendors/scroll-polyfill.js"></script>
<script src="scripts/libs/scroll.js"></script>
<script src="scripts/libs/text-animation.js"></script>
<script src="scripts/libs/hero-slider.js"></script>
<script src="scripts/libs/mobile-menu.js"></script>
<script src="scripts/main.js"></script>
</body>
</html>

_button.scssと_image-slide.scssをmodules直下に作成する。(記述は後ほど)

9:ローダーの追加

vendors直下にpace.jsを配置する。

htmlの<head>タグ内に読み込むよう記述(太字部分)

<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta http-equiv="X-UA-Compatible" content="ie=edge" />
<title>Flower Garden</title>
<link rel="icon" href="images/favicon.png">
<link rel="stylesheet" href="styles/loader.css">
<script src="scripts/vendors/pace.js"></script>
<link href="https://fonts.googleapis.com/css2?family=Kameron:wght@400;700&family=Noto+Sans+JP:wght@500&display=swap" rel="stylesheet">
<link rel="stylesheet" href="styles/vendors/bootstrap-reboot.css" />
<link rel="stylesheet" href="styles/vendors/swiper.min.css" />
<link rel="stylesheet" href="styles/style.css" />
</head>

styles直下にloader.scssを配置する

続きます

Javascript ex1(Javascriptの構文)

Javascriptの基本構文とその出力結果をまとめてみた。

1:変数の定義var,let,const

// var, let, const
// varは上書きできる
var name = 'Tom';
console.log('hello' + name);

// letも上書きできるよ
let name2 = 'anna';
name2 = 'Pon'
console.log('hello' + name);

// データ型は Number, String, Boolean, Undefined, Null, Symbol

let variable = 'str';
variable = 12;
variable = undefined;
variable = null;
variable = false;

// 実際に確認するには?
console.log(typeof variable);
// ポイント上書き禁止はconstで定義しよう!

// あとから上書きできないのでエラーになるよ
const nam = 'Yan';
nam = 'Tim';

出力結果

続きを読む

JavaScript14(知見まとめ)

サイト作成から得られた知見をまとめてみる

index.htmlで得た知見(ざっとで)

headタグ

headタグの中でサイトのタイトル、説明、ロゴが設定できる

スタイルシートの読み込みもできて読み込む順番が重要である

pace.jsもここで読み込み

Googleフォントもここで読み込める

<body>から

global-containerはローダーの設定やモバイルメニューで必要。

<divclass="mobile-menu__cover"></div>

<divclass="nav-trigger"></div>

この2つはスクロール監視とモバイルメニューのカバーのためにある

基本的に親要素__innerをつくり@extend.flex;など使うことによってレスポンシブ対応する

<h2 class="main-title tween-animate-title">Pick up</h2>

上のようにtween-animate-titleを付けてテキストアニメーションの準備をしている

&copy;でコピーライトのマークが作れる

&nbsp;を使うことでスペースを表現できる

スクリプトを読み込むときmain.jsは最下段が良い

続きを読む

JavaScriptのチートシート

JavaScriptのチートシート

0:JavaScriptの基本構文とその出力結果について調べたいとき

Javascript ex1(Javascriptの構文)

1:var,let,constと引数、戻り値、プロパティとメソッドについて調べたいとき

JavaScript学習のまとめ0(変数、関数、メソッドとプロパティー)

2:Array,オブジェクト、for、for in、for ofについて調べたいとき

https://suzutukiblog.com/index.php/2021/03/02/javascript1/

続きを読む

JavaScript13(Netlyfyにデプロイする)

1:Netlifyにデプロイする準備

index.htmlに以下の記述にする

タイトルとサイトの説明とアイコンの設定をしているよ

MinifyJavaScriptCSSのスペースを除去する作業をして貼り付け

画像を圧縮してサイズを小さくする

手動でもいいが、自動化する場合は別の記事で記載します

続きを読む

Javascript12.5(モバイルメニューの追加)

モバイルメニューの追加

scripts/libsにmobile-menu.jsを作成し以下の記述にする

class MobileMenu {
// コストラクタ関数を用意する
  constructor() {
// オブジェクトリテラルで初期化
  this.DOM = {};
  this.DOM.btn = document.querySelector('.mobile-menu__btn');
  this.DOM.cover = document.querySelector('.mobile-menu__cover');
// this.DOM.containerでないとエラーになるよ
  this.DOM.container = document.querySelector('#global-container');
  this.eventType = this._getEventType();
  this.__addEvent();
}

// プライベートメソッドにする(修正や保守のしやすさのため)
_getEventType() {
// スマホとデスクトップ対応するためにクリックかタッチかで処理をわける
  return window.ontouchstart ? "touchstart" : "click";
}

_toggle() {
// global-containerにクリックするたびにmenu-openを付加、解除
  this.DOM.container.classList.toggle("menu-open");
}
__addEvent() {
// ボタンが押されたら発火
this.DOM.btn.addEventListener(this.eventType, this._toggle.bind(this));
// カバーかクリックしたときに発火
this.DOM.cover.addEventListener(this.eventType, this._toggle.bind(this));
 }
}

モバイルメニューが正常に働くことを確認する

worldの部分(アニメーションの追加)

.world {
  @extend .content-width;
  @extend .mb-lg;
// 親要素でローカルスタッキングコンテキストを作るために必要
  &__inner {
    @extend .flex;
    justify-content: space-between;
// 周りに壁を作る
    padding: 15px;
    background-color: $cBgGray;
// 下の2つはローカルスタッキングコンテキストを作る設定
    position: relative;
    z-index: 0;
}

  &__title {
// 横線の位置決め
    position: relative;
// 横線を疑似要素で出力する
@include p-base(
$display: none,
$width: 70px,
$height: 1px,
$top: 50%,
// 線の長さ
$left: -75px
) {
// 棒線が伸びるアニメーション
  background-color: $cBlack;
  transform: translateY(-50%) scaleX(0);
// 右側を中心に伸びるアニメーション
  transition: transform 0.3s ease 1.6s;
  transform-origin: right;
 }
}
  &__sub {
    @extend .mb-sm;
}

  &__img {
    height: 300px;
    @extend .mb-sm;
// アニメーションが終わったときに表示したいので
    transition: box-shadow 1ms linear 0.8s;

    & > img {
      position: relative;
// ボックスシャドウを背面につけるための設定
      z-index: -1;
// 画像には基本object-fitをつける
      object-fit: cover;
// 画像の上部分を中心にしたいので
      object-position: top;
// 外側の親要素タテヨコ100%で画像が表示される
      width: 100%;
      height: 100%;
}

  &.inview {
// 内側にボックスシャドウを付ける設定
    box-shadow: inset 0 0 30px $cBlack;
}
}

  &__texts {
  @extend .pb-sm;
// 横線のアニメーションの設定
  &.inview {
  & .world__title::before {
//右から左に線が伸びるように
     transform: translateY(-50%);
   }
  }
 }
}

サイドバーやロゴのスタイル

//ロゴ
.logo {
  font-size: 42px;
  display: flex;

  &__img {
    width: 0.7em;
}

  &__Garden {
    color: $cWineRed;
 }
}
// スマホ画面のときサイド要素を非表示にする
.side {
  display: none;
// 固定する
   position: fixed;
// 画面の上から70%から表示する
  top: 70%;
// ここは検証で試してみるとよい
  transform: translateY(-50%);
  transition: all 0.3s ease-in;
  & .tween-animate-title {
    color: $cBlack;
    text-decoration: none !important;
    margin: 0 40px;
// ロゴと文字の中心のズレを修正
    vertical-align: middle;
    letter-spacing: 2px;
}
// サイドバー左側の設定
  &.left {
    left: -50px;
  &.inview {
    left: 50px;
}
  & .side__inner {
// 左端を軸とするための設定
    transform-origin: top left;
// 文字を-90度回転させる
    transform: rotate(-90deg);
}
}
// サイドバー右側の設定
  &.right {
    right: -50px;
  &.inview {
    right: 50px;
}
  & .side__inner {
// 右端を軸とするための設定
    transform-origin: top right;
// 文字を90度回転させる
    transform: rotate(90deg);
  }
 }
}
.icon {
  position: relative;
@include p-base($left: -20px, $top: 50%, $width: 1em, $height: 1em) {
transform: translateY(-50%);
background-position: center;
background-repeat: no-repeat;
background-size: contain;
}
//ロゴの設定
  &.twitter {
     &::before {
      background-image: url(../images/twitter.svg);
 }
}
  &.fb {
  &::before {
    background-image: url(../images/facebook.svg);
  }
 }
}
// サイドバーのローカルスタッキングコンテキストを作るための設定 
#main-content {
 position: relative;
 z-index: 0;
}
// サイドバーより背面にしたい 
main {
 position: relative;
 z-index: -1;
 }

サイドバーは前面にしたいのでmainのz-indexを低くしている

_600up.scssに以下の記述にする

// Stylesheet: 600px以上のタブレットやモニタで適用
.flex {
// 横に2列したいときの設定
  flex-direction: row;
// これを設定しないとflex-basisが変わらない
  flex-wrap: wrap;
}

.flowers {
  &__item {
    flex-basis: 50%;
    margin-bottom: 60px;
}
}

.popular {
  &__container {
// 余白を真ん中にしたい
     justify-content: space-between;
}

  &__item {
    flex-basis: 47%;
}
}

.world {
  &__inner {
    padding: 50px;
}
  &__texts,
  &__img {
    flex-basis: 47%;
}

  &__texts {
    display: flex;
// 文字を下揃えにするときに便利な設定
    align-items: flex-end;
}
}

.footer {
  & .logo {
// 左寄りにする右寄りはflex-end
    justify-content: flex-start;
}

  &__li {
// 検証を使いながら位置調整
    margin-left: 0;
    margin-right: 30px;
 }
}

.flexにflex-wrap: wrap;をつけるのを忘れないように!(flex-basisで調整できないから)

_960up.scssに以下の記述にする

// Stylesheet: 960px以上のモニタで適用

.font-sm {
  font-size: 16px;
}
.font-md {
  font-size: 19px;
}
.font-lr {
  font-size: 23px;
}
.font-lg {
  font-size: 36px;
}
.mb-lg {
  margin-bottom: 150px !important;
}
.pb-lg {
  padding-bottom: 150px !important;
}

.popular {
  &__item {
    flex-basis: 25%;
}

  &__img {
    height: 335px;
}
}

.world {
  &__img {
    height: 400px;
}

  &__description {
    margin-bottom: 40px;
}
  &__title {
// アニメーションを表示するための設定
  &::before {
// 960px以上のときアニメーションするように設定
    display: block;
}
}
}

.footer {
  &__li {
    justify-content: flex-start;
}
}
// 960以上ではヘッダー表示
.header {
  &__nav {
    display: block;
}
}
// ハンバーガーメニューを非表示にする(モバイル用でないため)
.mobile-menu {
  &__btn {
    display: none;
}
}
// スワイパースライドに影をつける
.swiper-slide {
  box-shadow: 0 8px 40px -10px rgba(0, 0, 0, 0.8);
}

ハンバーガーメニューを非表示にすることdisplay: none;

960px以上のときアニメーションとヘッダー表示display: block;を忘れずに!

_1280up.scssに以下の記述にする

// Stylesheet: 1280px以上のモニタで適用

.world {
  &__inner {
    padding: 50px 150px;
}
}
.popular {
  &__item {
    flex-basis: 23%;
}
}
// サイドバー要素を表示する
.side {
  display: block;
}

display: block;でサイドバーを表示させるのを忘れずに!

_viriables.scssを以下の記述にする

$cWhite: white;
$cBlack: black;
$cSubTitle: #535353;
$cBgGray: #eaebe6;
$cWineRed: #904669;
$contentMaxWidth: 1070px;
$navHeight: 100px;

2:ページローダーの導入

以前作成したページローダーを流用する

pace.jsとloader.scssをコピーして貼り付け以下のように配置

index.htmlの<head>タグの中に読み込ませるよう記述する

loader.scssに読み込ませるため以下のように記述

このようになっていればOK

3:_appear.scssを追加してアニメーションを追加する

フェードインアニメーションで作った_appear.scssをmodulesに配置してstyle.scssで読み込む

使い方index.htmlの親要素にappearをつけて子要素にitemをつけるとフェードインアニメーションを付加できる。

JavaScript12(サイト作成(4))

1:ヘッダーやサイドバーを作成しベースを完成させる

モバイルメニューのところで作成したstyle.scssを流用する

_mobile-menu.scssにリネームしてmodulesに貼り付けする

style.scssで読み込むのも忘れずに

_mobile-menu.scssに以下の記述を追加

$cMenuClose: Black;
$cMenuOpen: Black;

.mobile-menu {
  position: fixed;
  right: 0;
// 上から60px
  top: 60px;
  width: 300px;

  & .logo {
    padding: 0 40px;
    font-size: 38px;
}
// BEM(Block Element Modifier)
  &__btn {
    background-color: unset;
    border: none;
    outline: none !important;
    cursor: pointer;
 
    & > span {
      background-color: $cMenuClose;
      width: 35px;
      height: 2px;
      display: block;
      margin-bottom: 9px;
      transition: transform 0.7s;
 
    &:last-child {
      margin-bottom: 0;
  }
 }
}
// 黒い膜をつける
    &__cover {
      position: absolute;
      top: 0;
      left: 0;
      width: 100%;
      height: 100%;
      background-color: rgba(0, 0, 0, 0.3);
      opacity: 0;
      visibility: hidden; 
      transition: opacity 1s;
      cursor: pointer;
      z-index: 200;
 }
  &__main {
    padding: 0;
// 3Dアニメーションをしたいとき親の要素につける
    perspective: 2000px;
    transform-style: preserve-3d;
}
  &__item {
// ・をけす
    list-style: none;
    display: block;
    transform: translate3d(0, 0, -1000px);
    padding: 0 40px;
    transition: transform 0.3s, opacity 0.2s;
    opacity: 0;
}
  &__link {
// 左右いっぱいに広がるようにする
    display: block;
    margin-top: 30px;
    color: $cBlack;
// 下線を削除
   text-decoration: none !important;
  }
}

.menu-open {
// クリックしたときに左下にずれるアニメーションの設定
  & #container {
    transform: translate(-300px, 60px);
    box-shadow: 0 8px 40px -10px rgba(0, 0, 0, 0.8);
}
 // クリックされたときの記述を書く
  & .mobile-menu {
  &__cover {
    opacity: 1;
    visibility: visible;
}
  &__item {
    transform: none;
    opacity: 1;
// 要素を少しずつ遅延して表示
@for $i from 1 through 5 {
&:nth-child(#{$i}) {
transition-delay: $i * 0.07s;
  }
 }
}
  &__btn {
    & > span {
      background-color: $cMenuOpen;
 
  &:nth-child(1) {
    transition-delay: 70ms;
    transform: translateY(11px) rotate(135deg);
}
  &:nth-child(2) {
    transition-delay: 0s;
    transform: translateX(-18px) scaleX(0);
}
  &:nth-child(3) {
    transition-delay: 140ms;
    transform: translateY(-11px) rotate(-135deg);
    }
   }
  }
 }
}

続きを読む

Javascript11.5(フッター)

3:残りの画面の実装

イメージ

index.htmlに以下の記述を追加ヒーロースライダーの直下

<main>
  <section class="world">
    <div class="world__inner">
      <div class="world__img cover-slide">
    <img class="img-zoom" src="images/Birthday.jpg" alt=""/>
    </div>
     <div class="world__texts appear left">
      <div class="world__texts-inner">
       <div class="world__title main-title item">
      <span class="purple">Floroj </span>
     <span>de la mondo</span>
   </div>
   <div class="world__sub sub-title item">世界のお花をあなたに</div>
    <div class="world__description item">
     <p>世界150ヶ国の花を<br />あなたにお届けします。</p>
     <p>あなたの望む花がきっと見つかります。</p>
     </div>
    <div class="world__btn item">
     <button class="btn filled">もっと詳しく</button>
    </div>
   </div>
  </div>
 </div>
</section>

_600up.scssに以下の記述を追加

続きを読む