JSONで単純にファイル名を渡しても、当然ファイルのデータは送ることができません。
そのような場合は、base64_encodeを使って送りましょう。
このサンプルでは、JAVAScriptの時点でPHPのbase64_encodeを使用してデータ化した文字列を送り
受けて側で、base64_decodeしてファイルへ保存で渡すことが可能です。
続きを読む JSONで画像データを送信する方法
カテゴリー: JavaScript
jQueryを用いた気持ちのよいインタラクションとフェードインを考える
気持ちの良いデザインを考える
Webデザインについて再考する時間があったので、インターフェースの心理学やUI GRAPHICS等の本を読んでどんな事がサイトをデザインする時に人を魅了できるかを勉強してみました。
その中で、能動的に選んでいる気でいても、実は反応であったり無意識的に動かされている事が多いという事を学びました。
では、何をもって人は無意識的に動かされるか、という点で考えた時に「ユーザーが何か起こした事によって得られる反応(=インタラクション)を気持ちの良いものにする」事で、自然と楽しい気持ちになったり、もっと触ってみようという気持ちになって、より能動的な働きとして変えていけるんではないかと考えるようになりました。
インタラクションとは
例えば、ソフトウェア、各種製品、携帯機器、環境、サービス、ウェアラブルコンピューティング、組織自体などのシステムに適用される。インタラクションデザインは、人工物やシステムのユーザーへの反応を振る舞い(インタラクション)として定義する。IaD または IxD と略記されることもある。システム開発においてユーザーの人力操作に対するシステムからの適切な反応を設計することで利用目的に合致した両面転移や、グラフィカルユーザーインターフェース(GUI)要素の肖然な振る舞いをデザインする専門的な作業である。
引用:wikipedia
前述の「ユーザーが何か起こした事によって得られる反応」をインタラクションといい、システムにおけるView部分、Webサイトでいうリンクやボタンで表現される入力部分のみならず、画像や文字などの表示部分(視覚的に入力する)をより適切なデザインを施す事で、そのシステム自体をより良いものに見せるという点で、現在注目されている分野であります。
イマドキのWebサイトは、ボタンにマウスをホバーするとふわっと色が変わる事や、画像ギャラリーで画像が、自動的にスライドして見られるスライダーなど動的である事が標準となってきております。
jQueryやJavaScriptが持てはやされているのは、この「当たり前に動く」仕組みを実現するのに不可欠なプログラミング言語で、昨今では、HTML + CSSに加えて、JavaScriptができる事がデザインという分野で求められる傾向にあります。
気持ちいい画像の表示方法を考えてみる
前置きが長くなりましたが、本題はここからです。
「画像を表示させる」というWebサイトでは当たり前の事象についても再考してみました。以下のDEMOはAJAXにて画像データを取得して表示するサンプルですが、表示のさせ方を4パターン用意してみました。
※Chrome、Firefoxでの動作の確認をしました。
See the Pen AJAXを使った画像読み込みの一工夫 by koka (@kokaben) on CodePen.
画像を表示させる方法
画像は画像サイズによって表示までの速度がマチマチになる事や、画像データを取得している時でも他の作業ができるように、バックグラウンド読み込み処理を行いながら用意ができたものから表示させる非同期処理を用いるのが現在の主流です。
当サンプルでは、画像を裏で読み込ませてメモリに展開された時点で、表示させるという方法を用いております。
「すぐ表示」ボタンは、別段処理を施さずに、用意できた順から表示するようになっています。
一番最速で表示させたい時はこの方法が良いですが、少し無骨に見えませんか?文字のみならばこの方法が一番良いかもしれませんがもう少し見せ方にこだわりたく思ってしまいます。
「フェードインする」ではどうでしょうか。
少し気持ちよくなった気がしませんか?少しずつ表示される事で少しワクワクするようなそんな作用が引き起こされていれば狙い通りです!
ただ、これが何百件だとどうでしょうか。「これはいつまで、どこまで表示されるんだろうか」と多少不安になったり、遅延処理を行っているので「少し遅いな」と感じてしまうんではないでしょうか。
表示する量や、場所を選べば気持ちよさのみの印象を与える事ができそうです。
表示する数と領域をあらかじめ見せる
「背景を付けて●●」のボタンが2つありますが、この手法は記事を書いている時期(2017年)によくみられる手法で、ボタンを押すとあらかじめ表示される領域の背景をグレーで表示され、そこに画像や文字を展開していく見せ方です。
この手法は、YouTubeのスマートフォン版を起動した時や、検索した時に見られたり、Googleの画像検索でスクロールしていった時に自動的に次の30件が表示される時に見られる手法をまねたものです。
「背景を付けてすぐ表示」ボタンの動きを見てみましょう。
タイミング的には「すぐ表示」で画像が表示されるタイミングで表示されて、そこから0.5秒後に画像が表示されるので、実質は「すぐ表示」の時より遅いのですが、先に領域が出る事で「ああ、ここに何か表示されるんだな」と頭が認識する時間が発生するので、そこまで遅いと感じないのではないでしょうか。
ただまだ、無骨に思えるので、それにフェードインを加えた「背景を付けてフェードイン」を試してみて下さい。
気持ちよくないでしょうか?
領域が決まって、そこから画像と文字のフェードインが起きながら、文字の領域はフェードアウトさせる事で、安定感のある面白くて気持ちの良い見せ方になったのではないかと思います。
感性に訴えたい
以上のサンプルは、必ずしもそんな気持ちになるかどうかは別の話で、私は「そういう風に狙った」というだけな話です。受け手の気持ちは千差万別と思われます。
併せて思うのは使いどころを見誤ったり、要らない所まで動きを付けまくっていると見づらいページになってしまうので、使いどころを見定める事は必要と思います。「コレが利いてて気持ちいいんだよなー」くらいがちょうど良いと思っています。
オーソリティーに受ける方法というのを模索しながら、より面白くてコストパフォーマンスに優れた見せ方をこれからも模索していくぞーと考えながら、日々勉強していこうと思います。
JQueryにてJSONをPHPに送り、さらにベーシック認証の指定のURLにPOSTしてJSON形式のデータを受け取る方法
長いタイトルになってしまいましたが、ようするにJSON形式なら受け渡しが楽になりますよということです。
まず、JQueryからPHPにJSON形式のデータを渡す方法(www/index.php)
Ajax Sample Ajax sample
JQueryからJSON形式のデータを受け取りPHPで連想配列にして他のURLにポストする方法(www/ajax_api.php)
ちなみに、ベーシック認証がない場合は、define(‘DEMO’, true);をdefine(‘DEMO’, false);へ
"{$memberId}" ); $data = http_build_query($data, "", "&"); if (DEMO) { //header $header = array( 'User-Agent: My User Agent 1.0', //ユーザエージェントの指定 'Authorization: Basic ' . base64_encode('account:password'),//ベーシック認証 "Content-Type: application/x-www-form-urlencoded", "Content-Length: " . strlen($data) ); } else { //header $header = array( "Content-Type: application/x-www-form-urlencoded", "Content-Length: " . strlen($data) ); } $context = array( "http" => array( "method" => "POST", "header" => implode("\r\n", $header), "content" => $data ) ); $res = file_get_contents(SAMPLE_API, false, stream_context_create($context)); return $res; } ?>
POSTデータを頂き、情報(連想配列のID指定にしていますが、ご利用の際には、DBから取得する方法へもバージョンアップできます。)
を取得JSON形式の返信を頂く方法(wwwapi/index.php)
array("id" => 10000,'name' => 'Name10000','tel' => "000100010001"), "9999" => array("id" => 9999,'name' => 'Name9999','tel' => "000900090009"), "9998" => array("id" => 9998,'name' => 'Name9998','tel' => "000900090008"), "9997" => array("id" => 9997,'name' => 'Name9997','tel' => "000900090007"), "9996" => array("id" => 9996,'name' => 'Name9996','tel' => "000900090006"), "9995" => array("id" => 9995,'name' => 'Name9995','tel' => "000900090005"), "9994" => array("id" => 9994,'name' => 'Name9994','tel' => "000900090004"), "9993" => array("id" => 9993,'name' => 'Name9993','tel' => "000900090003"), "9992" => array("id" => 9992,'name' => 'Name9992','tel' => "000900090002"), ); $memberId = $_POST['member_id']; if(empty($memberArray[$memberId])) { echo json_encode(array()); } echo json_encode($memberArray[$memberId]); ?>
※jquery-1.11.2.min.jsは、特にふれていませんが、実行するには必要になります、ご注意ください。
ページを更新する度に背景の色が変わるキャッチコピー領域を作成してみました
ページのキャッチコピーの背景をどうしようかなと考えていた時に、ランダムで生成される四角形にしてみたらかわいいんじゃないかなと思ったので、作ってみました。モダンブラウザ用です。
サンプル
※表示を見たい場合は Result をクリック
四角形は可変なのでウインドウ幅を伸ばしたり、縮めたりすると動きがあります。
HTML
Walk on.
You have to learn to walk before you run.
四角形はli要素をJavaScriptで生成して、list_containerのul要素内に並べます。
CSS(抜粋)
// 外枠 #mosaic { position: relative; width: 100%; height: 300px; overflow: hidden; -webkit-border-radius: 3px; -moz-border-radius: 3px; -ms-border-radius: 3px; -o-border-radius: 3px; border-radius: 3px; } // ul要素 #mosaic #list_container { position: absolute; width: 120%; left: 0; top: 0; bottom: 0; right: 0; display: -webkit-flex; display: -moz-flex; display: -ms-flex; display: -o-flex; display: flex; -webkit-justify-content: flex-start; -moz-justify-content: flex-start; -ms-justify-content: flex-start; -o-justify-content: flex-start; justify-content: flex-start; -webkit-align-content: stretch; -moz-align-content: stretch; -ms-align-content: stretch; -o-align-content: stretch; align-content: stretch; -webkit-flex-wrap: wrap; -moz-flex-wrap: wrap; -ms-flex-wrap: wrap; -o-flex-wrap: wrap; flex-wrap: wrap; margin: auto; padding: 0; -webkit-filter: blur(3px); -moz-filter: blur(3px); -ms-filter: blur(3px); -o-filter: blur(3px); filter: blur(3px); } // li要素(四角形) #mosaic #list_container li { -webkit-flex: 0 0 100px; -moz-flex: 0 0 100px; -ms-flex: 0 0 100px; -o-flex: 0 0 100px; flex: 0 0 100px; list-style: none; height: 100px; }
外枠の高さをli要素の3つ分を設定し、li要素の生成数が多くてはみ出るものはoverflow:hiddenで隠して見えないようにしています。
ul要素は、親要素のサイズピッタリにしてるとウインドウ幅を伸縮していると右端で段落ちが発生して四角形がなくなってしまいますので、幅を120%程度に広げておいて空白を防ぐようにしています。
JavaScript
//ランダムな数を生成する関数式 var randFnc = function(min, max) { return Math.floor(Math.random() * max + 1 - min) + min; }; //出力先の指定 var target = document.getElementById("list_container"); //ブロック生成 for (var i = 0; i < 200; i += 1) { var li = document.createElement("li"); //ランダム色を生成 hslは色相, 明度, 彩度で指定する li.style.backgroundColor = 'hsl(' + randFnc(20, 186) + ', 100%, 86%)'; //生成したリストを追加 target.appendChild(li); } //背景を動かす setInterval(function(){ //はじめのli要素を変数に入れる var changeItem = target.childNodes[1]; //要素の削除 target.removeChild(changeItem); //要素の追加 target.appendChild(changeItem); },400);
色は生成時に全自動で作成しています。RGB指定だと色の彩度や明度もバラバラになってしまうので、HSL指定で明度と彩度は固定して極力黒が強い色を出さないように調整して、あとは色相の好きな範囲をランダムな値で出るようにして表示することにしました。
ブロックの生成数は 画面幅 / 100px * 3列でフルHDでだいたい60個くらいあれば大丈夫ですが、高解像度が進んでいるので、200個くらいにしておきました。多めにしていても溢れないので大丈夫です。
背景を動かすは遊びで入れてみました。無くても可愛いですよ。
jQueryでonメソッドを使って解決
最近、jQueryでブラウザの現在のウィンドウ幅を取得して処理を行うプログラムを書く機会がありました。まだjQueryに慣れていない私ですが、調べてみると「resize」というイベントを使うことで実現できそうだとわかりました。
$(window).resize(function() { // 処理.... });
でも、実際に書いてみると動いてくれません。なぜ・・と、さらに調べると、onメソッドとあわせて使う書き方を見つけました。実際に書いてみると、
$(window).on('resize', function () { // 処理.... }
これでちゃんと動きました。そう言えば前やってたプロジェクトでも同じようなところで詰まったことを思い出しました。動的に生成した要素に対してイベント適用する場合には、onメソッドを使わないと動かないとか。今回のウィンドウ幅取得もこれに関係しているのでしょうか。備忘録の意味も含め前やった所も書いておきます。
○クリックされた時に発生するイベント
$(document).on("click", function(){ // 処理.... }
○キー押下されたあと上がった時に発生するイベント
$(document).on('keyup', function(){ // 処理.... }
○セレクト等、指定要素の値が変更された際に発生するイベント
$("#QuestionItem").on('change',function(){ // 処理.... }
onメソッドを使うと、何かと解決されスッキリすることが多いです。しっかり勉強して、onメソッドを使いこなせるようになりたいと思います。
HighchartsのStacked barの縦軸に表示内容を増やす方法
ソフトウェア開発でプロジェクトに対して、縦軸プロジェクト名、横軸開発担当の開発合計時間で、
各担当者の開発時間はHighchartのStacked barで表現できるのですが、
トータルの時間や見積価格や単価を出そうとプロジェクト名の表示に追記すると省略表示されてしまいます。
そこで、HighchartのStacked barのプロジェクト名表示情報からx座標とy座標を取り、プロジェクト名の左横に
表示することに成功しました。(ただし、2016/07/14時点のHighchartのStacked barに限られましたらお許しください。)
その参考になるソースを掲載しますので、お役にたてれば幸いです。
aaa |
aaa |
aaa |
aaa |
aaa |
phpコードを利用してJQuery(JavaScript)の変数を定義する方法
PHPの配列にもっている値を、JavaScriptで利用する場合のサンプルです。
続きを読む phpコードを利用してJQuery(JavaScript)の変数を定義する方法
チェックボックスをラジオボタンのような動作にする。
bootstrapのpopoverでdatepickerを使う。
bootstrapのpopoverでdatepickerを使う際の手続きとpopoverしてから、popover以外をクリックするとpopoverが消える。ただし、datepicker表示中には消えないようにする方法をサンプルとしてまとめました。
簡単なJQueryのプラグインを作ってみた
ブラウザ上で動作するアプリケーションを開発されている方のほとんどは、JQueryライブラリを利用しているのではないでしょうか。最近ではUIの機能も成熟してきてますし、モバイル用にも拡張され、非常に使い勝手の良いライブラリです。
JQuery公式サイト(英語)
http://jquery.com/
JQuery UI公式サイト(英語)
http://jqueryui.com/
JQuery Mobile公式サイト(英語)
http://jquerymobile.com/
そして何より魅力なのはそれらの基礎ライブラリを元にユーザが拡張したプラグインが豊富に提供されていることです。
以前は入力補助の小さなものが主でしたが、今では複雑なチャートや書き込み可能なカレンダーといった大規模なプラグインがほとんどの場合無料で提供されています。
最初は他の人が作ったプラグインを使うばかりだった人も、慣れてくるにしたがって自分の作った機能をプラグイン化してみたい、という欲求に駆られてくると思います。
だって、うまく機能単位で切り出せれば他の所でも使えますし、人にも提供しやすくなりますもの。
JQueryのプラグインの初歩の初歩はこちらで勉強させていただきました。
jQueryプラグインの作り方 ~ 重要な3つのポイント ~
http://nigohiroki.hatenablog.com/entry/2013/02/13/002508
ふむふむ、なるほど、