WEBサイト制作の勉強

WEBサイト制作の勉強の為の解説ブログです。

フェリカテクニカルアカデミー

スムーススクロール

サイトのトップに戻すだけであれば、以下のようにシンプルな記述で大丈夫です。

$(function() {
  $("#to_top").on('click', function () {
    $('html,body').animate({ scrollTop: 0 }, 'swing');
      return false;
    });
});

複数の場所にスムーススクロールで移動させたい場合

$(function(){
   // #で始まるアンカーをクリックした場合に処理
   $('a[href^="#"]').on('click',function() {
      // スクロールの速度
      var speed = 400; // ミリ秒
    // 移動先を取得
      var href= $(this).attr("href");
      var target = $(href == "#" || href == "" ? 'html' : href);
      // 移動先を数値で取得
      var position = target.offset().top;
      // スムーススクロール
      $('body,html').animate({scrollTop:position}, speed, 'swing');
      return false;
   });
});
ビット排他的論理和演算子
$('[ 属性 ^= "値" ]')

「ビット排他的論理和演算子」とはjQueryの構文の1つで、指定した"値"が属性の値と前方一致する要素を選択する、というものらしいです。
つまり、$([href^="#"])とすることで、href属性が "#" で始まる要素を取得することができます。
ちなみにjQueryのバージョンによっては#を""で囲まないと動作しないことがあるので、"#"とする方が無難です。

なので、このままでは、

<a href="#〇〇">

といったリンク全てにスムーススクロールのアニメーションがかかってしまうので、除外したいa要素には除外用のクラス名を指定しましょう。

$(function(){
	$('a[href^=#]:not(a.notscroll)').on('click',function(){
		var speed = 400;
		var href= $(this).attr("href");
		var target = $(href == "#" || href == "" ? 'html' : href);
		var position = target.offset().top;
		$("html, body").animate({scrollTop:position}, speed, "swing");
		return false;
	});
});



場合によってはある程度スクロールしてから表示させたい場合もあります。
その場合、まず「.hide」で見せなくさせて、ある条件(今回の場合は何pxスクロールしたら)になったら、
「.fadeIn」で表示させ、ある条件以外の時は「.fadeOut」で非表示にさせましょう。

scrollイベント

要素がスクロールした時のイベントとして関数を指定できます。

scrollTopイベント

「scrollTop()」を使用した場合、要素の最上部から縦スクロールした現在位置の上部までのピクセル数を取得します。

位置の取得

position()は、親要素から見た座標を取得します。 offset()は、親要素関係なく、documentから見た座標を取得します。
さらに複数回使う要素は変数に置き換えた方が効率的なので記述するパターンも覚えておきましょう。


以下はターゲット要素より、50px上にスクロールするサンプルです。
var position = target.offset().top - 50;


ある程度スクロールしたらボタンを表示させる
    $('#to_top').hide();
    //スクロールが100に達したらボタン表示
    $(window).scroll(function () {
        if ($(this).scrollTop() > 100) {
            $('#to_top').fadeIn();
        } else {
            $('#to_top').fadeOut();
        }
    });

スクロールアニメーション「SCROLL TRIGGER」の実装

ページのスクロールと連動して文字や画像に様々なエフェクトで要素が表示されていくスクロールアニメーション、Javascriptプラグイン「SCROLL TRIGGER」
jQuery不要で動くので動作も軽く、比較的簡単に設定できます。




ScrollTrigger - Scroll based animations with ease

github.com

on-ze.com



デモページ

https://yachin29.com/school/box-scroll/sample.html




さらに、最近よく見かける斜めや曲線の区切り線をSVGで制作し、コンテンツ間の区切り線にしてみましょう。

plusgraph-ca.jp

www.apiajapan.com

www.taguchi.co.jp

background-clipとtext-fill-colorを使ってcssを使って文字で画像を切り抜く

以前、Photoshopクリッピングマスクを使い、文字で画像を切り抜く加工を行いましたが、css3の「background-clip」と「text-fill-color」を使う事で同じような表現が出来るようになります。

background-clip

background-clipプロパティは、背景の適用範囲を指定する際に使用します。テキスト部分に背景画像を適応させたい場合、

-webkit-background-clip: text;

と指定します。
※注意 2019月3月現在、-webkit-のベンダープレフィックスが記述が必要です。



さらに

-webkit-text-fill-color: transparent;

「text-fill-color」を transparentに指定する事で文字色を透過にする事が出来ます。transparentの代わりに「color: rgba(0,0,0,0);」でもOKです。

h1 {
  background:url(img/bg.jpg) no-repeat center 75%/cover;
  width:100%;
  height:70vh;
  text-align:center;
  font-size:200px;
  line-height:70vh;
  position:absolute;
  top:0;
  left:0;
  -webkit-background-clip:text;/*テキストの形でクリッピングする*/
  -webkit-text-fill-color:transparent;/*テキストの塗りを透明に*/
  white-space:nowrap;
  text-indent:1em;
  animation:txt-anime 20s 0.5s linear infinite;
}

codepen.io


creativity-class.xyz

Ajaxを使って外部ファイルを読み込む

Ajaxとは「Asynchronous(エイシンクロナス) JavaScript + XML」の略です。簡単に言えばJavaScriptXMLを使って非同期にサーバとの間の通信を行うことが出来ます。
通常Webページの内容を変更するためには画面遷移やリロードする必要がありますが、ajaxを使用すればリロードせずにページの内容を変更することができます。
サーバーにアクセスすることなくページを変更できるのでサーバーの負荷軽減や、リロードの時間の解消によるUX(ユーザーエクスペリエンス)の向上などが利点としてあげられます。


jQueryでは$.loadと$.ajaxの2種類の方法があります。


Google ChromeはローカルではAjaxが動かないので、firefoxで確認してみましょう。



$.loadを使って外部ファイルを読み込む

index.html

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>loadを使った非同期通信</title>
<script src="https://code.jquery.com/jquery-3.0.0.min.js"></script>
<script>
  $('#text').load('list.txt');
</script>
</head>
<body>
<div>
<ul id="text"></ul>
</div>
</body>
</html>


list.txt

<li>テスト1</li>
<li>テスト2</li>
<li>テスト3</li>
<li>テスト4</li>
<li>テスト5</li>


$.ajaxを使った方法

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>CSS overflow</title>
<script src="https://code.jquery.com/jquery-3.0.0.min.js"></script>
<script>
$(function() {
 $.ajax({
	url: 'list.txt',
	dataType: 'text',
	success: function(data) {
	$('#text').html(data);
	},
	error: function(data) {
		alert('error');
	}
 });
});
</script>
</head>
<body>
<div>
<ul id="text"></ul>
</div>
</body>
</html>


www.sejuku.net

webサイトにGoogleAPIを導入する

Googleが提供しているGoogleAPIを使うことで簡単に様々な便利な機能をwebサイトに導入する事が出来ます。
Webサイトにスケジュール表やメールフォームを追加したい場合、PHPで作成する事が可能ですが、「Googleカレンダー」と「Googleフォーム」を使うのも選択肢の1つです。2つともGoogleのアカウントさえあれば、無料で特別なスキルもいらずに簡単に作成する事が出来ます。
さらにGoogleユーザー同士でドキュメントの共有や編集も出来ます。

APIとは

APIとは、アプリケーションプログラムインターフェイスの略語で、プログラミングの際に使用できる命令や規約、関数等の集合の事を指す。 ソフトウェア開発の際、いちから全てを作るより、APIを利用すればもともとあるプログラムを呼び出して、その機能を組み込んだソフトウェアを開発することができる。

Googleフォームの便利なポイント

  • HTML・PHPの知識が無くても、簡単にフォーム機能をwebサイトに導入する事が出来る。
  • 入力データをスプレットシートに自動で保存してくれる
  • Googleフォームの管理画面で編集が可能
  • セキュリティー・サーバー運用もGoogleが管理しているのでとりあえずは安心。それでも不安な人は有料のアカウントであるGoogle Apps for Workを使うと、最高度のセキュリティーが受けられる

Googleフォームを作る

f:id:yachin29:20161202102606p:plain


設問が済んだら、コードを取得してhtmlファイルにコピペするだけ!
f:id:yachin29:20161202104622p:plain







nendeb.com

jQueryでのパララックス

パララックスとは、視差効果のことです。
Webデザインにおけるパララックスはスクロールなどの動作に応じて、複数のレイヤー(層)にある要素を異なるスピードで動かすことで、「立体感や奥行きを演出」、「フェード・拡大縮小・回転などの視覚的エフェクト」を演出する手法を指します。




最近は一時期よりは減りましたが、シングルページの縦長ページではまだまだ見かけるデザインです。
シングルページはページデザインが単調になりがちなので、パララックスやスクロールアニメーションを使って、アイキャッチを作りましょう。


pogg-sweetpotatopie.com




on-ze.com


<!doctype html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title></title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="robots" content="noindex">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>
<script src="js/script.js"></script>
</head>

<body>
<div class="parallax para-box" data-height="70vh" data-speed="0.8" data-mobile="false">
<div class="para_img background"></div>
</div><!--/#para-box-->

<div class="parallax para-box" data-height="70vh" data-speed="0.8" data-mobile="false">
<div class="para_img background"></div>
</div><!--/#para-box-->

<div class="parallax para-box" data-height="70vh" data-speed="0.8" data-mobile="false">
<div class="para_img background"></div>
</div><!--/#para-box-->

<div class="parallax para-box" data-height="70vh" data-speed="0.8" data-mobile="false">
<div class="para_img background"></div>
</div><!--/#para-box-->

<div class="parallax para-box" data-height="70vh" data-speed="0.8" data-mobile="false">
<div class="para_img background"></div>
</div><!--/#para-box-->
</div>

<script src="js/parlx.js"></script>
<script>
$('.parallax').Parlx({
item: '.background',
});
</script>
</body>
</html>


スタイルシート

.parallax {
	position:relative;
	height:80vh;
	overflow:hidden;
}
.background {
	position:absolute;
	background-repeat:no-repeat;
	background-size:cover;
}

jquery

/*!
* parlx.js v1.0
* Copyright 2017-2018 Jakub Biesiada
* MIT License
*/

class Parlx {
  constructor(elements, settings = {}) {
    if (elements.length > 1) {
      this.init(elements, settings);
      return;
    } else {
      this.element = elements;
    }

    this.settings = this.settings(settings);

    this.parallaxEffect();
    this.addEventListeners();
  }

  init(elements, settings) {
    for (var element = 0; element < elements.length; element++) {
      new Parlx(elements[element], settings);
    }
  }

  addEventListeners() {
    window.addEventListener('scroll', () => this.onWindowScroll());
    window.addEventListener('resize', () => this.onWindowResize());
  }

  onWindowScroll() {
    this.parallaxEffect();
  }

  onWindowResize() {
    this.parallaxEffect();
  }

  parallaxEffect() {
    if ("ontouchstart" in document.documentElement && this.settings.mobile === false) {
      this.settings.speed = 0;
    }

    if (this.settings.speed < 0 || this.settings.speed > 0.5) {
      this.settings.speed = 0.3;
    }

    this.element.style.height = this.settings.height;

    this.children = this.element.querySelector(this.settings.item);

    let scrolled = window.pageYOffset - this.element.offsetTop;

    Object.assign(this.children.style, {
      'top': '0px',
      'left': '50%',
      'min-height': `${this.element.offsetHeight * (1 + this.settings.speed * 2)}px`,
      'min-width': '100%',
      'width': 'auto',
      '-webkit-transform': `translate(-50%, ${this.settings.speed * scrolled}px)`,
      '-ms-transform': `translate(-50%, ${this.settings.speed * scrolled}px)`,
      'transform': `translate(-50%, ${this.settings.speed * scrolled}px)`
    });

    if (this.children.tagName.toLowerCase() !== 'img') {
      this.children.style.backgroundPosition = 'center center';
    }
  }

  settings(settings) {
    let defaults = {
      item: '.background',
      speed: 0.3,
      height: '400px',
      mobile: true
    }

    let custom = {};

    for (var setting in defaults) {
      if (setting in settings) {
        custom[setting] = settings[setting];
      } else if (this.element.getAttribute(`data-${setting}`)) {
        let attribute = this.element.getAttribute(`data-${setting}`);
        try {
          custom[setting] = JSON.parse(attribute);
        } catch (e) {
          custom[setting] = attribute;
        }
      } else {
        custom[setting] = defaults[setting];
      }
    }

    return custom;
  }
}

// JQUERY PLUGIN CALL IF JQUERY LOADED
if (window.jQuery) {
  let $ = window.jQuery;

  $.fn.Parlx = function (options) {
    for (var element = 0; element < this.length; element++) {
      new Parlx(this[element], options);
    }
  }
}

Googleフォームに自動返信機能を付ける

Googleフォームに自動返信機能を付ける

以前作ったフォームをカスタマイズして、フォームを記入してくれた人に自動でメール返信が出来る機能を追加します。
自動返信機能を付ける事でフォームを利用したユーザーにタスクの進行状況を伝える事が出来るので、結果としてユーザビリティの向上に繋がります。


1. お問い合わせフォームとリンクさせた「スプレットシート」の、「ツール」メニューから「スクリプトエディタ」を選んでスクリプトエディタを起動する。
f:id:yachin29:20180828022623p:plain


2. エディタ内のfunction myFunction(){}を削除し、以下のスクリプトに差し替える。

function sendMailGoogleForm() {
 Logger.log('sendMailGoogleForm() debug start');
 
 //------------------------------------------------------------
 // 設定エリアここから
 //------------------------------------------------------------
 
 // 件名、本文、フッター
 var subject = "[お問い合わせありがとうございます。]"; 
 var body
 = "お問い合わせありがとうございます。\n\n"
 + "------------------------------------------------------------\n";
 var footer
 = "------------------------------------------------------------\n\n"

 + "内容を確認させて頂き、後日担当の者よりご連絡差し上げますので\n"
 + "よろしくお願いいたします。\n"
 
 + "◯◯◯◯株式会社\n\n"
 
 // 入力カラム名の指定
 var NAME_COL_NAME = 'お名前';
 var MAIL_COL_NAME = 'メールアドレス';
 
 
 // オプションメール送信先
 var admin = "admin@example.com"; // 管理者(必須)
 var sendername = "送信者名";//送信者名(必須)
 var cc = ""; // Cc:
 var bcc = admin; // Bcc:
 var reply = admin; // Reply-To:
 var to = ""; // To: (入力者のアドレスが自動で入ります)
 
 
 //------------------------------------------------------------
 // 設定エリアここまで
 //------------------------------------------------------------
 
 try{
 // スプレッドシートの操作
 var sheet = SpreadsheetApp.getActiveSheet();
 var rows = sheet.getLastRow();
 var cols = sheet.getLastColumn();
 var rg = sheet.getDataRange();
 Logger.log("rows="+rows+" cols="+cols);
 
 // メール件名・本文作成と送信先メールアドレス取得
 for (var i = 1; i <= cols; i++ ) {
 var col_name = rg.getCell(1, i).getValue(); // カラム名
 var col_value = rg.getCell(rows, i).getValue(); // 入力値
   
 ////////////タイムスタンプを消す////////////////
if (col_name === "タイムスタンプ"){
	continue;
}
////////////////上記を入れる////////////
 
 body += "【"+col_name+"】\n";
 body += col_value + "\n\n";
 if ( col_name === NAME_COL_NAME ) {
 body = col_value+" 様\n\n"+body;
 }
 if ( col_name === MAIL_COL_NAME ) {
 to = col_value;
 }
 }
 body += footer;
 
 // 送信先オプション
 var options = {name: sendername};
 if ( cc ) options.cc = cc;
 if ( bcc ) options.bcc = bcc;
 if ( reply ) options.replyTo = reply;
 
 // メール送信
 if ( to ) {
 MailApp.sendEmail(to, subject, body, options);
 }else{
 MailApp.sendEmail(admin, "【失敗】Googleフォームにメールアドレスが指定されていません", body);
 }
 }catch(e){
 MailApp.sendEmail(admin, "【失敗】Googleフォームからメール送信中にエラーが発生", e.message);
 } 
}


3. 編集メニューから「現在のプロジェクトのトリガー」を選びます。
f:id:yachin29:20180828022858p:plain


4.「許可のリクエスト」で「承認する」ボタンをクリックして承認しましょう。
f:id:yachin29:20150403145323j:plain


5. サンクスページの編集
f:id:yachin29:20180828023223p:plain


このままではログインしているアカウントが自動的に返信メールの差出人になってしまいます。
返信メールの差出人を変えたい場合は以下の記事を参考に設定を変える必要があります。



liapoc.com







自動返信メールを他の差出人に変えた場合のスクリプト

function sendMailGoogleForm() {
 Logger.log('sendMailGoogleForm() debug start');
 
 //------------------------------------------------------------
 // 設定エリアここから
 //------------------------------------------------------------
 
 // 件名、本文、フッター
 var subject = "[お問い合わせありがとうございます。]"; 
 var body
 = "お問い合わせありがとうございます。\n\n"
 + "------------------------------------------------------------\n";
 var footer
 = "------------------------------------------------------------\n\n"
 + "後ほど担当者よりご連絡させていただきます。";
 
 // 入力カラム名の指定
 var NAME_COL_NAME = 'お名前';
 var MAIL_COL_NAME = 'メールアドレス';
 
 
 // メール送信先
 var admin_name ="差出人の名前";//送信メールの名前 
 var admin = "admin@example.com"; // 先程作成したアドレスに書換
 var bcc = admin;// bccがいらない場合は、adminを""に書換
 var reply = admin;
 var to = ""; // To: (入力者のアドレスが自動で入ります)
 
 
 
 // 送信先オプション
 var options = {};
 if ( admin_name ) options.name = admin_name;
 if ( bcc ) options.bcc = bcc;
 if ( reply ) options.replyTo = reply;
 
 
 //------------------------------------------------------------
 // 設定エリアここまで
 //------------------------------------------------------------
 
 try{
 // スプレッドシートの操作
 var sheet = SpreadsheetApp.getActiveSheet();
 var rows = sheet.getLastRow();
 var cols = sheet.getLastColumn();
 var rg = sheet.getDataRange();
 Logger.log("rows="+rows+" cols="+cols);
 
 // メール件名・本文作成と送信先メールアドレス取得
 for (var i = 1; i <= cols; i++ ) {
 var col_name = rg.getCell(1, i).getValue(); // カラム名
 var col_value = rg.getCell(rows, i).getValue(); // 入力値
  
 
 ////////////下記を入れる////////////////
if (col_name === "タイムスタンプ"){
	continue;
}
////////////////上記を入れる////////////
   
   
 body += "【"+col_name+"】\n";
 body += col_value + "\n\n";
 if ( col_name === NAME_COL_NAME ) {
 body = col_value+" 様\n\n"+body;
 }
 if ( col_name === MAIL_COL_NAME ) {
 to = col_value;
 }
 }
 body += footer;
 
 
 // メール送信
 if ( to ) {
 /* メールを送信 */
 GmailApp.sendEmail(
 to, //toアドレス
 subject, //表題
 body, //本文
 {
 from: admin, //fromアドレス
 name: admin_name //差出人
 }
 ); 
}else{
 MailApp.sendEmail(admin, "【失敗】Googleフォームにメールアドレスが指定されていません", body);
 }
 }catch(e){
 MailApp.sendEmail(admin, "【失敗】Googleフォームからメール送信中にエラーが発生", e.message);
 } 
}