Quantcast
Channel: CSSタグが付けられた新着記事 - Qiita
Viewing all 8591 articles
Browse latest View live

今更CSS設計の歴史を考えてみた(過去から今)

$
0
0

今さらながらCSS設計について学んだので自分なりにまとめてみました。
内容としてはどうしてCSS設計が必要になったのか、それを踏まえてどんなCSS設計が考えられたのか過去から今の流れを書いています。

CSSとは何か

HTMLで文章を作成したとしても、見出しやカラーなどの表示がなければ読みにくいですし、ユーザーは飽きてしまいます。
そうならないためにも装飾を使って、オリジナルなサイトを作成するためにCSSは必要です。

そもそもCSSは必要なのか?

CSSが普及される前までは、WEBページの背景や文字の色などデザインもHTMLで行なっていました。
しかし、HTMLは情報構造を定義するもので、デザインを定義すると言う使い方は間違っています。
そこでCSSが注目され、情報構造とデザインを切り離して記述できるようにするために必要になりました。

CSSのデメリットとは何?

CSSのデメリットとしてあげられるのは、2点あります。
1. WEBページの表示が崩れる原因になる
2. サイトデザインの属人化に繋がる

1.WEBページの表示が崩れる原因になる

CSSで定義しブラウザに表示されます。そのブラウザ自身がCSSの進化に追いついていない場合は、意図したデザインと異なった表示結果になってしまいます。
CSSで新しい技術を使用する際は、各ブラウザが対応しているのか必ずチェックする必要があります。

こちらのサイトで各ブラウザの対応状況について調べることができます。
https://caniuse.com/

2.サイトデザインの属人化に繋がる

CSSは比較的扱いやすい言語です。
メリットでもありますが、デメリットでもあります。誰にでも扱えると言うことは何も考えず記述をしていくと作成した人だけしか把握できないCSS構造になってしまうことが多々あるからです。
このCSS何のために記述されているのか、またどのHTMLから呼びさられているのか分からない状態では保守性にかけます。
事業が大きくなればなるほど、触れる人間が触れるためCSSの保守性も視野に入れてコーディングする必要があります。

CSS設計が生まれた背景

なぜCSS設計が生まれたのか自分の中では大きく2点あると思っています。

  1. CSSの特徴はグローバルスコープでありカスケードであること。  サイトに携わる人たちが、好きなように書いているとグローバルスコープでありカスケードであることが原因で、CSSでの上書き合戦が始まったりいつの間にか変更した点とは違う部分に影響が出てしまい破綻(炎上)することも多々ありる

 2.サイトを携わる人が増えかつ、ルールが設けられていないこと。
 サイトに携わる人間が増え、何も考えず記述していると同じようなコードが複数存在していたり、使用していないコードがあったりすると、とても見辛く保守がしにくくなる。

これら2点の問題を解決するためにCSS設計が必要と考えられました。

CSS設計とは

CSS設計とは先ほどの問題を解決するためのCSSの記述ルールです。
そして良いCSSにすることができます。良いCSSよく知られているのは以下の4つです。

  ・予測しやすい
  ・再利用しやすい
  ・保守しやすい
  ・拡張しやすい

予測しやすい

 これは文字通りでそのクラスがどのような挙動をするのか予測しやすいことです。
 

再利用しやすい

 運営をしていると似たようなコードを書く必要があります。その際に同じようなコードを作成するのではなくコンポーネント管理をしてコードの記述を最低限にしようということ。

保守しやすい

 こちらも運営をしていると新しいコードを書かなくてはならないことがあります。
 その時にコードの記入や修正が容易にできるような状態を作っておくということ

拡張しやすい

 すでに存在するコードをさらに拡張したい時に誰でも容易に管理ができる状態を維持すること。
 これは上記3つができていないと難しいかなと思います。

以上がCSS設計の考え方になり様々な設計方法が考えられています。
順に紹介していきます。

OOCSS

OOCSSとはObject Oriented CSSの略で、オブジェクト指向のCSSと呼ばれています。
この考え方はこれから紹介するSMACSSなど基礎とされています。
OOCSSの考え方は大きく2点あります

  1. 入れ物とコンテンツ中身を切り分ける
  2. 構造と見た目を切り分ける

入れ物とコンテンツ中身を切り分ける

従来は複数のページに同じようなスタイルが存在していても別々としてコードを作成されていました。
しかしそれではページが増えるごとにコードが増えていくのでどこでも使用できる汎用的なパーツを作るという考えです。
そうなることで場所の依存も避けられます。

構造と見た目を切り分ける

また同じボタンだけど色が違うと言った場合に、形は.btnに記述し、.btn-blueや.btn-redのようなクラスにbackground-colorを記述する考えです。
例:<div class=“btn btn-red”>

.btn{
  width:200px;
  height:50px;
}

.btn-red{
  background-color:red;
}

この設計方法で、コード量が削減されますし、別の場所でも.btn-redを使用すれば背景を赤色に変えられ汎用的にすることができます。
しかし、仮にクラスを改修しようとすれば影響はかなり大きいですし、共通化することでどこにどのスタイルが当たるのかCSSの見通しが悪くなります。さらにマルチクラスのためHTMLのコードも見づらくなるなと感じました。

SMACSS

SMACSSはOOCSSを基礎として作られたcss設計手法です。
OOCSSは共有パーツをどんどん追加することで見通しが悪くなることがありましたが、SMACSSはそれが改善されています。
SMACSSは、5つのカテゴリに分けられ目的が分けられているためメンテナンスが高いです。

CSSの役割5つに分けられる
1. ベース
2. レイアウト
3. モジュール
4. ステート(状態)
5. テーマ

ベース

 全ての基盤となる部分です。
 要素セレクタや属性セレクタ、擬似セレクタなどが対象になります。
 reset.cssなどもここに含まれる。

レイアウト

 レイアウトとはページ内のセクションやエリアなどが対象になります。
 例えばsidemenuやmainやgridなど大きな枠組みが対象です。
 クラス名の付け方は、l-sidemenu, l-main, l-grid
 もしくはlayut-sidemenu, layut-main, layut-gridです。

モジュール

 モジュールはボタンやフォームなど部品が対象になります。
 モジュールにはl-などの規則はありませんし、クラスをつける必要はありません。
 h1などの要素に対してスタイルを当てることも可能です
 ただし要素に対し当ててしまうと目的がわかりづらくなるので、クラスを利用するのがいいでしょう。

ステート

 モジュールやレイアウトの状態が対象になります。
 javaScriptなどで、tabを選択している状態やアコーディオンを開いてる状態などに使われます。
 クラスの付け方は.is-active, is-errorです。

テーマ

 テーマは必須で使われるものではないですが、サイト全体のトーン統一などに使用されます。
 例えば色やフォントなどが対象です。
 場合によってはtheme-をつけます。

簡潔にまとめましたが、こちらの記事が詳しく書かれていますので興味があればご覧ください

https://ver-1-0.net/2017/12/10/learn-smacss

このようにOOCSSではどこにどのスタイルが当たっているのかわかりづらかったですが、テーマごとに命名規則も加えることでどこが役割を持っていてどのファイルを改修すればいいのか見通しがよくなります。(メンテナンスと予測)
またテーマごとに分けていることから、CSSの再利用性も高まると思います。

一方で、HTMLに依存しすぎているサイトではなかなか生かしづらく、途中からSMACSSに変えたりSMACSSから乗り換えようと思うととても難しいかなと感じます。
また、決まりがしっかりと決められている分、導入する際の学習コストも高いですし、理解をしていないと簡単に破綻する可能性があるのは大変です。

BEM

BEMはOOCSSやSMACSSと考え方が違います。
OOCSSやSMACSSはディレクトリ構造で分けましたが、BEMの場合は命名規則でCSS設計を行います。
CSS設計として利用率も一番高いです。

BEMは、Block, Element, Modiferの頭文字をとっており、Block__Element—Modiferと独特なクラス名を使用します。
このクラス名のおかげでサイト構造が大体わかるのでとても良いと思っています。

Block

 ブロックはナビゲーションやヘッダー、フッター など大きなセクションが対象です。
 例えばヘッダーメニューの全体がBlockです。

Element

 エレメントはブロックの中身です。
 ヘッダーメニューの1つ1つの要素です。

<ul class=“menu>
<li class=“menu__litem”>HOME</li>
<li class=“menu__litem”>ACCESS</li>
<li class=“menu__litem”>CONTACT</li>
</ul>

Modifer

Modiferは、その要素の状態が対象になります。
SMACSSでいうステートと一緒だと思ってもらっていいと思います。

このようにBlock, Element, Modifeの命名規則のみでCSS設計を行うため非常にわかりやすいです。
学習コストも低く理解しやすいため、複数人で作業を行っても破綻がしにくいと感じました。
またBlockのクラス名で役割がわかるためサイト内の構造がわかりやすいのもメリットだと思います。

一方でBEMの命名規則は冗長になりやすく、汎用的なクラス名をつけようとするとかなり難しいです。
また汎用的を意識しすぎると、他のBlockと被ってしまうと意味がないので意識しないといけないのでネックです。

OOCSSやSMACSSは前時代?

今回はOOCSSとSMACSS、BEMについてお話しましたが、これ以外にもあります。
しかしOOCSSやSMACSSなどの役割で分ける方法は前時代の話だと感じています。

なぜかというと今までお話したCSS設計はグローバルでありカスケーティングが問題でそれをコンポーネント単位で解決しようとしていたのがOOCSSやSMACSSだからです。

今やReactやVueのようなコンポーネントを前提としたものが利用され、CSS ModuleのようなCSSの影響範囲をコンポーネント単位に閉じ込めてることが当たり前となっている以上OOCSSやSMACSSを利用する必要はないと思いました。(コンポーネント設計前提です)

自分が考える現代の解決方法はCSS in JSやCSS Module、scoped CSS(Vue.js)、BEMかなと考えています。
ここからは自分がVue.jsを利用しているので、scoped CSSとCSS Moduleについて話します。(Vue CLI利用前提)
なおscopedCSSとCSS Moduleに対して詳しい話はしません。こちらの方がわかりやすくまとめてくださっているので参照ください。https://qiita.com/mascii/items/3202b9e18fd4a7366ac1

scoped CSS

.vueファイルのstyleタグにscopedを追加することで利用することができます。
Scoped CSSの大きなメリット
1. 手軽に導入できる
2. 普段通りのコーディングを行える

自分がとてもいいなと思ったのは、デザイナーである僕でも普通に利用ができることです。
会社の体制によってはデザイナーがコーディングをする場合でも普段と同じコーディング方法で問題がないので気軽に導入できる点は最大のメリットだと思います。

ただし、scopedCSSを利用することで衝突が完全に防げたわけではありません。
子コンポーネントのルート要素に対しては、親のデータ属性がついてしまうためクラス名が同じだと衝突が起きてしまいますし、グローバルに定義されたセレクタが適用されるのでクラス名にルールを設ける必要はあります。

CSS Module

.vueファイルのstyleタグにmoduleを追加することで利用することができます。
CSS Moduleの大きなメリット
1. BEMのような命名規則が不要
2. クラスの衝突がない

CSS Moduleはコンポーネント名とランダムな記号を追加してくれます。


子コンポーネントであっても親コンポーネントとの衝突は基本考えられずCSSの影響範囲をコンポーネント単位に閉じ込めていると言ってもいい。
それにDOMを見ればどこのコンポーネントを改修すればいいのか一発で判断ができるのは大規模なサイトを運営する上ではメリットになってくると思います。

デメリットとしては、HTMLの記述が少し書きづらいことです。
<div :class=“$style.title”>のようにクラスを付与するタグ全てに$styleをつけないといけないのめんどくさい・・・。
ただしCSSの記述は今まで通りなので学習コストは低いと思います。

まとめ

Vue CLIで利用するのであれば、CSS Moduleが良いと思います。
子コンポーネントのルート要素に親のデータ属性がついてしまうのは気持ち悪いですし、それに伴ってクラス名を気にする必要があるのであれば、CSS Moduleを使えばいいと思います。
個人的にCSSの問題点をうまく解決しているのはCSS Moduleだと思っています。

ただし、BEMのような考え方がすでにチームに根付いているのであれば、CSS Moduleも使う必要もないと思います。
BEMのような命名規則で解決できのであれば一番いいかなと思います。
その理由としては、今後フレームワークを変えたりした場合に汎用性が高いと思っているからです。CSS Moduleやscoped CSSが使えるかなんてわからなけど、BEMの考え方はHTMLとCSSが存在し続ける限り使える設計方法だと思います。

長期的な運営を考えるのであればBEMをオススメしたい。
しかし、BEMを全員に理解してもらうのが難しかったり、BEMで課題を解決できないフェーズなのであれば違うCSS設計の導入を考えるべきだと思っています。


初心者によるプログラミング学習ログ 227日目

$
0
0

100日チャレンジの227日目

twitterの100日チャレンジ#タグ、#100DaysOfCode実施中です。
すでに100日超えましたが、継続。

100日チャレンジは、ぱぺまぺの中ではプログラミングに限らず継続学習のために使っています。

227日目は

JavaScriptでモーダルウィンドウ実装の仕方

$
0
0

モーダルウィンドウをjQueryを使わず、JavaScriptのみで実装

覚えたものを備忘録を兼ねてまとめました。

今回実装するのは簡単に説明すると、『詳細をみる』ボタンをクリックすると、デフォルトでつけているhiddenクラスが外されてモーダルとマスクが出現し、『閉じる』ボタンまたは、周りのマスクをクリックすれば、hiddenクラスがついてモーダルが閉じる仕様となっています。

早速雛形のファイルを作っていきます。

ソース

HTML

index.html
<!DOCTYPE html><htmllang="ja"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width, initial-scale=1.0"><metahttp-equiv="X-UA-Compatible"content="ie=edge"><title>モーダル</title><linkrel="stylesheet"href="style.css"></head><body><divid="open">詳細をみる
  </div><divid="mask"></div><sectionid="modal"><p>これは簡単なモーダルウィンドウです。</p><divid="close">閉じる
    </div></section><script src="script.js"></script></body></html>

JavaScriptでhtml要素を取得するため、idをふっています。

openはモーダル表示、maskはモーダル周りの黒っぽい背景、modalはモーダル、closeは閉じるボタンです。

CSS

style.css
body{font-size:16px;}#open,#close{cursor:pointer;width:200px;border:1pxsolid#ccc;border-radius:4px;text-align:center;padding:12px;margin:16pxauto0;background:#4caf50;color:white;}

これで一度展開してみましょう。

image.png

このようになればひとまず大丈夫です。

次にmaskとmodalのcss作っていきます。

マスクとモーダルのCSS

style.css
#mask{background:rgba(0,0,0,0.4);position:fixed;top:0;bottom:0;right:0;left:0;z-index:1;}#modal{background:#fff;color:#555;width:300px;padding:40px;border-radius:4px;position:absolute;top:40px;left:0;right:0;margin:0auto;z-index:2;}#modalp{margin:0020px;}

maskはposition: fixed;とrgbaで画面全体を黒っぽくしています。
modalと#maskにz-indexを設定していますが、#maskは#modalより下に来ないと、#modalまで覆いかぶさって黒くなってしまうので、#modal>#maskに設定しています。

この時点で下の画面のようになるはずです。

image.png

マスクとモーダルは標準時には隠しておきたいので、cssを用いて見えない状態にしておきます。

display: none;とtransform: translateで隠しておく。

index.html
<divid="mask"class="hidden"></div><sectionid="modal"class="hidden">
style.css
#mask.hidden{display:none;}#modal.hidden{transform:translate(0,-500px);}

htmlで”#maskと#modalにhiddenクラスを命名し、cssで隠します。
maskはdisplay: none;で普通に非表示にしていますが、今回モーダルは上から表示させたいので、
modalはtransform: translate(0,500px);で、500px上に隠しておきます。

image.png

消えていたら、JavaScriptに入ります。

JavaScriptでマスクとモーダルを操作する

今回は、『openをクリックすると、#modalと#maskのhiddenクラスが取り除かれて表示する』という設計なので、openにクリックイベントをつけていきます。

script.js
'use strict';{constopen=document.getElementById('open');constclose=document.getElementById('close');constmodal=document.getElementById('modal');constmask=document.getElementById('mask');open.addEventListener('click',function(){modal.classList.remove('hidden');mask.classList.remove('hidden');});}

これで、”詳細をみる”をクリックすることで、モーダルとマスクのhiddenクラスが外されて、表示されるのが確認できるはずです。
しかし、再び非表示にすることはできないので、今度はhiddenクラスを再クリックで付与できるようにします。
また、マスク部分を押しても非表示にできた方がユーザビリティ的にも自然なので、maskにもクリックイベントを適用します。

script.js
'use strict';{constopen=document.getElementById('open');constclose=document.getElementById('close');constmodal=document.getElementById('modal');constmask=document.getElementById('mask');open.addEventListener('click',function(){modal.classList.remove('hidden');mask.classList.remove('hidden');});close.addEventListener('click',function(){modal.classList.add('hidden');mask.classList.add('hidden');});mask.addEventListener('click',function(){modal.classList.add('hidden');mask.classList.add('hidden');});}

最後にアニメーションを

モーダルを上からにゅっと表示させるため、transitionを追加してやります。すぐに出来ます。

style.css
#modal{background:#fff;color:#555;width:300px;padding:40px;border-radius:4px;position:absolute;top:40px;left:0;right:0;margin:0auto;z-index:2;transition:0.4s;}

modalにtransitionを追加するだけです。
これで完成です。

ご閲覧ありがとうございます。

【CSS】WEBサイトでよく設定されるfont-family

$
0
0

個人的なメモです。

filename.html
font-family: 'メイリオ',
Meiryo,'Hiragino Kaku Gothic ProN',
'ヒラギノ角ゴ ProN W3','ヒラギノ角ゴ Pro W3',
'Hiragino Kaku Gothic Pro','游ゴシック Medium', 
'Yu Gothic Medium', '游ゴシック体', YuGothic, 
Helvetica, Arial, sans-serif;

flexboxの親要素を可変の子要素に合わせる

$
0
0

Flexboxで作成した場合、親要素は横幅100%となります。
子要素をinline表示とし、親要素幅を子要素に合わせたい場合のCSS設定をメモしておきます。

どんな状態か、デモをご確認ください。

デモ

子要素に合わせて親要素を横幅可変

See the Pen 親要素の横幅100% by harumi-sato (@harumi-sato) on CodePen.

子要素に関係なく親要素を横幅100%固定

See the Pen 親要素の横幅、子要素のサイズに可変 by harumi-sato (@harumi-sato) on CodePen.

コード

Flexboxを囲ったblockに inline-blockを指定すると、
子要素がinline-blockの振る舞いとなります:thumbsup:

HTML
<divclass="parent"><ulclass="item_parent"><liclass="item_child _child1">category1</li><liclass="item_child _child2">category2</li></ul></div>
CSS
.parent{display:inline-block;}.item_parent{display:flex;background:lightpink;}.item_child{background:#fff;}

まとめ

親要素が可変する場合、1段上に幅指定用のブロックを作成する。

これから学習される方へ(Rails学習まで)

$
0
0

これから学習を始める方へ

あくまで一個人の感想ですので参考までに。
Railsまでの勉強と試験を行ったので、後続の方に
少しでもお役立ていただければと思い、今回記事にします(できる人には物足りない内容です。プログラミング学習に不安がある方向けです)。

学習の方法論

 👉人それぞれです。
できる人から学習法を教えてもらったとしても、それが必ずしも自身に当てはまるとは限りません。参考程度にするべき。

学習の進め方

 👉座学勉強のイメージとは少し違うかも。
ほぼ独学状態でぐんぐん進んでいけるのはある程度のバックグラウンドやセンスのある方かもしれません。
重要事項やどうしても理解できないところは素直に教えてもらったり質問をしましょう。ある概念に対しての自分の認識が合っているのか、ずれていないのか確認するのでもいいんです。そうすることで効率よく学習が進んでいきますし、アウトプットになって頭にも残りやすくなります。

学習内容を項目ごとに整理しながら進める

 👉学習を進めていくと、いまどこの何を勉強しているのかよくわからなってしまう、という状況に遭遇します。全くの初学者の場合、特にそうだと思います(自分がそうでした)。
例えば、「□□をするには△△が必要で、いま△△の内容を理解しようとしている。□□は〇〇の中の一つなのだな」のように進めていくと少し遠回りのようですが、
「△△ってこういうものなんだな〜」と漫然と学んでいくことより実は近道です。

先生に習おう

 👉ザッキーさんやスナカワさんは皆さんよりもはるかに多くを知っています。
一つの部分の学習にこだわりすぎずに、まずはひと通り学習範囲を網羅してから細部の復習をしよう、と指導してくれてるのもしっかりと理由があってのことなんです。そうすることで以前の学習した内容を上から俯瞰して見ることができます。私たちの疑問点に対する回答もワンランク高い視点で答えてもらえますよね(だからこそ聞き方は失礼のないように)。メンターのメンターが先生です。先生のアドバイスに従って学習を進めていけば絶対大丈夫です!
この記事で少しでも不安が軽減される方がいらっしゃれば嬉しいです!!
もっと先まで学習したあとに、その時の視点でまた記事を書ければと思っております!

HTML & CSS超入門

$
0
0

1.はじめに

タイトルとして超入門とつけたがここではHTML&CSSについて全くと言っていいほど網羅しておらず、私としてややこしいがwebサイトを作り上げていこうとする際に必須になるであろう知識についてまとめた。申し訳ないが網羅的に学ぼうと訪れた方にはこのページは向いてないので他のサイトを参考にしてほしい。しかしHTML&CSSの基礎をある程度学んだうえで納得できないもしくは理解できない部分がある際にはこのサイトが役に立つと信じている。ここでは大きく3つの重要事項についてまとめた。

2.HTML&CSS

1.margin: 0 auto;とtext-align: center;の違い

この2つは要素を中央寄せにしたいときに使う。2つの大きな違いはインライン要素に使うかブロック要素に使うかということである。margin: 0 auto;の場合は初期値としてコンテンツエリア親要素の100%目いっぱいに広がるので同時にwidthも指定しないと中央寄せが適用されているのかわからない。

2.rgba、opacityの違い

要素を透過させるにはrgbaもしくはopacityを用いる。しかし両方とも同一の働きをするのではなく、それぞれ違いがある。opacityには要素のすべてを透過してしまうという性質があるのに対し、rgbaには背景色のみを透過する性質がある。この2つは場面場面で使い分けなければならない。

3.positionプロパティの使い方

positionプロパティは要素の位置を決定するときに用いる。値の種類にはstatic,relative,absolute,fixedがある。staticは初期値で、absoluteはサイト全体の右上を基準にして、要素を移動させることができるプロパティ、relativeはその要素の親要素に指定することで親要素の右上を基準にして、要素を移動させることができるである。fixedを用いることで常に要素を画面上の指定した位置に固定させておくことができる。これらのプロパティはtop,left,right,bottomを用いて指定する。positionを使用することで要素同士が重なり合うということが発生する。この重なりはz-indexプロパティを使用することでコントロールすることができる。このプロパティの値に数字を指定することでその数字の大きい順に要素が上から配置されていく。position: relative;は子要素の位置を決定する際に基準となる親要素の位置を決定するものであったが、要素の位置の変更に用いることもできる。position: relative;topやleftと同時に指定することでもともとその要素があった位置から指定した分だけずらすことができる。

3.参考

サルワカ https://saruwakakun.com/html-css/basic/relative-absolute-fixed

Webpark http://weboook.blog22.fc2.com/blog-entry-282.html

progate https://prog-8.com/

ChromeでうまくいったものをIEにするとうまくいかなかったこと事例

$
0
0

はじめに

WEBページ制作においてどのブラウザでも表示できることはとても大切だと思います。
今回Chromeでうまく表示できていたものがIEではうまくできなかったことと、解消方法を備忘録として記載します。事例が追加されれば追記したいと思います。

① 画像が表示できない

Chromeでは問題なく表示できていた画像がIEだと出てこない。。。。orz

解決方法

調べるとカラーモードが 「CMYK」になっているとIEでは表示されないとのこと。
画像軽量化ツールを利用し画像を軽量化することで解決できました!

■参考サイト
JPGなどの画像が表示されない原因、チェックしたいこと まとめ

② flex-directionを指定すると余計な余白が発生する

Chromeでは出なかった不自然な余白がIEで発生し、確認したところflex-directionを指定している箇所でした。

どうやら flex-directioncolumncolumn-reverseを指定した子要素に画像があると、その子要素に画像の元サイズの高さ分のスペースができてしうとのことです。この元サイズの高さ分のスペースを消す必要があります。

解決方法

min-height: 0%;を指定することで解決できました!

■参考サイト
flex-directionを指定した時に IE11で表示がおかしくなる

まとめ

まだまだ初心者なのでブラウザごとに表示状況が変わっていることにかなりストレスを感じていましたが、きちんと調べて対処していけば解消できる(と思う)ので、これからもトライしていきます。

また、これからまだまだたくさんでてくることだと思うので随時更新していきます!


Node.jsでhtmlのlinkタグなどから外部ファイルを読み込めないときの解決法

$
0
0

Node.jsでJavaScript入門書のサンプルコードを実行したが、htmlのlinkタグとscriptタグでcssとJavaScriptが読み込まれなかった。

なお学習目的のため以下の条件を設けている

  • Expressなどのフレームワークは使わない
  • サンプルのディレクトリ構造は変えない

サンプルコード

入門書のコードをそのままここに書くわけにはいかないので、自作のサンプルコードを記しておく。

ディレクトリ構成図

.
├── common
│   ├── jquery-3.4.1.min.js
│   └── style.css
└── samples
    ├── sample1
    │   ├── index.html
    │   └── script.js
    └── sample2

  
ピンク色の「うんこ」を表示するサンプルコード

index.html
<!DOCTYPE html><htmllang="ja"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width, initial-scale=1.0"><metahttp-equiv="X-UA-Compatible"content="ie=edge"><title>sample1</title><linkhref="../../common/style.css"rel="stylesheet"></head><body><h1>うんこ</h1><script src="../../common/jquery-3.4.1.min.js"></script><script src="./script.js"></script></body></html>
style.css
h1{font-size:60px;color:deeppink;}

cssを読み込めれば同じ方法でJavaScriptも読み込めるはずなのでJavaScriptは割愛。

Node.jsで実行してみる

上記のサンプルコードをNode.jsで実行するためsample1/app.jsを作成

app.js
consthttp=require('http');constfs=require('fs');constindexHtml=fs.readFileSync('./index.html')constserver=http.createServer((req,res)=>{res.writeHead(200,{'Content-Type':'text/html'});res.write(indexHtml);res.end();});constport=8000;server.listen(port,()=>{console.info(`Listening on ${port}`);});

$ node app.jsで実行しhttp://localhost:8000にアクセスすると

キddャプチャ.PNG

黒い。cssを読み込んでない。

考察

console.log(req.url)を追記

app.js
constserver=http.createServer((req,res)=>{console.log(req.url)res.writeHead(200,{'Content-Type':'text/html'});res.write(indexHtml);res.end();});

  
再度$ node app.jsで実行しhttp://localhost:8000にアクセス後コンソールを見てみると

/
/common/style.css
/common/jquery-3.4.1.min.js
/script.js
/favicon.ico

http://localhost:8000/common/style.cssなどにリクエストしてしている

http://localhost:8000/common/style.cssにアクセスしてみると
キssssssャプチャ.PNG

http://localhost:8000へのリクエストに対しindex.htmlをレスポンスとして返したのと同様に

http://localhost:8000/common/style.cssへのリクエストに対してレスポンスとしてsyle.cssを返すようにルーティングしてあげればよさそう。

解決方法

app.js
consthttp=require('http');constfs=require('fs');constindexHtml=fs.readFileSync('./index.html')conststyleCss=fs.readFileSync('../../common/style.css')constserver=http.createServer((req,res)=>{switch(req.url){case'/':res.writeHead(200,{'Content-Type':'text/html'});res.write(indexHtml);res.end();break;case'/common/style.css':res.writeHead(200,{'Content-Type':'text/css'});res.write(styleCss);res.end();break;default:break;}});constport=8000;server.listen(port,()=>{console.info(`Listening on ${port}`);});

  
$ node app.jsで実行しhttp://localhost:8000にアクセスすると

ddddキャプチャ.PNG

成功。同じ要領でJavaScriptも読み込める。

終盤問題ジェネレーター(仮)の開発2:JavaScriptコード圧縮

$
0
0

概要

私が開発を進めている終盤問題ジェネレーター(仮、以下ジェネレーターと略)の開発に関する記事です。
最初の記事はこちら
今回はコード圧縮についてです。
例の如く、ITを本職とされている方々からすると気になる部分などあるかもしれませんが、素人の戯言でございますのでご容赦ください。

目的

他の言語とWeb開発系の言語(JavaScript, CSS, HTML)で大きく異なる点の一つは、ユーザーが(.exeファイルのようなバイナリではなく)ソースコードを受け取るところにあります。
このため、以下のような問題が生じます。

  1. 識別子名の命名法によって、ファイルサイズが大きく変化する。
  2. ユーザーに私のヘタクソな書き方のコードがバレてしまう。

こういった理由から、「ファイルサイズを小さくしてトラフィックの負荷を軽減する」「コードを読みにくくする」といったことをする必要が出てきます。
実際、Web系のソースコードは圧縮や難読化といった処理をされてから公開されることが多いようです。

実際の処理Lv1

デバッグを容易にするために、識別子名は読んだだけでその機能が分かるようなものが望ましいです。
ただそうすると、どうしても長くなりがちです。
例えば以下の関数は、問題情報の入ったオブジェクトを2次元配列から取り出す関数です。
それぞれの機能を分かるように書こうとすると、(私の場合)どうしてもこうなってしまいます。

non_compressed.js
functionLFFetchHistoryPosition(LVSelectedProblemIndex,LVSelectedMoveIndex){returnLVHistory[LVSelectedProblemIndex][LVSelectedMoveIndex].concat();//適当にコメントを書いておく}

そこでClosure Compilerを使います。
Closure CompilerはGoogleが開発しているJavaScriptのコンパイラーです。
一般にコンパイラーというと、以下のような変換を実行するものをイメージされることが多いかと思います。

  • C++ソースコード → 実行ファイル
  • Javaソースコード → Jarファイル

ですがClosure Compilerは「JavaScriptソースコード → JavaScriptソースコード」の変換を行ってくれます。
この時、無駄に長い変数名を短縮してくれます。
また一部の処理についても機能そのままでコードサイズを最適化してくれるようです(便利!)。
以下にコマンドラインでの使用例を示します。

コマンド入力例
java -jar closure-compiler/closure-compiler-v20190325.jar --js non_compressed.js --js_output_file compressedLv1.js

このようにすると、以下のようなコードが生成されます。
コメントは自動で消してくれます。

compressedLv1.js
functionLFFetchHistoryPosition(a,b){returnLVHistory[a][b].concat()}

この時注意したいのは、デフォルトでは基本的にローカル識別子(関数内でのみ有効な識別子)のみが処理される点です。
JavaScriptは別のファイル(HTML等)から読み込まれることが多いですので、その時に関数名の不一致などが起きないようにという意図でしょう。

実際の処理Lv2

私はさらに関数名やグローバル変数まで圧縮したかったのですが、残念ながら良さげなツールを見つけることはできませんでした。
そこで簡易なテキスト置換スクリプトを書き、それを実行することで関数名も圧縮しようと考えました。

abbreviate.py
# coding:utf-8
importsysimportosimportcsvifsys.version_info[0]==3:importurllib.parseelifsys.version_info[0]==2:reload(sys)importurllibsys.setdefaultencoding('utf-8')#argv 1=target file, 2=template file as csv.
#template item = template string, abbreviation string
templateFile=open(os.path.abspath(sys.argv[2]),mode='r')templateLists=csv.reader(templateFile,delimiter=",",doublequote=True,lineterminator="\r\n",quotechar='"',skipinitialspace=True)destinationFile=open(os.path.abspath(sys.argv[1]),mode='rb')destinationText=destinationFile.read()destinationFile.close()destinationText=destinationText.decode()forrowintemplateLists:#  print(row[0] + " -> " + row[1])
destinationText=destinationText.replace(row[0],row[1])destinationText=destinationText.encode()destinationFile=open(os.path.abspath(sys.argv[1]),mode='wb')destinationFile.write(destinationText)destinationFile.close()templateFile.close()

このスクリプトを実行すると、まずテンプレートファイル(CSV)を読み込みます。
ターゲットのファイルを対象として検索を行い、テンプレートの各行1列目の文字列を2列目の文字列で置換します。
このツールの注意点は以下の通りです。

  • いろんなところに出てくる単語("history"など)がテンプレート1列目にあると誤置換が発生しますので、識別子の命名の段階でちょっとした工夫をします。 具体的には、簡単な接頭辞("LV"や"LF"など)をつけておくことで、識別子をユニークにします。 長いソースコード中で検索をかけた時に、"History"だとHistoryを含むたくさんの識別子がヒットしますが、"LVHistory"であれば1種類の識別子に絞ることができます。
  • HTMLから呼び出す関数を置換した場合は、それを呼び出しているHTMLにも同じ置換処理を実行する必要があります。 後述するコマンドをHTMLにも適用すればOKです。

以下にコマンドラインでの使用例を示します。

コマンド入力例
python abbreviate.py target_file.js template.csv
template.csv
...
LFFetchHistoryPosition,a0
LVHistory,a1
...

先ほどのLv1の圧縮済みファイルをこのスクリプトでさらに処理すると、以下のような結果が得られます。

compressedLv2.js
functiona0(a,b){returna1[a][b].concat()}

これでほぼほぼ圧縮は完了です。

実際の処理Lv3

Lv1とLv2の処理を行うのに、毎回コマンドを手打ちするのは少々骨が折れます。
ですので私はGNU Makeで処理しました。
依存ファイルにコンパイル前のファイルとテンプレートファイルの両方を指定することで、どちらかに変更があった場合にmakeすると一連の処理が自動で実行されます。

Makefile
compressed.js :non_compressed.js template.csvjava-jarclosure-compiler/closure-compiler-v20190325.jar--jsnon_compressed.js--js_output_filecompressed.jspythonabbreviate.pycompressed.jstemplate.csv

ここまで環境構築が完了したら、後はもりもりコードを書いてmakeするだけです!
自動で最小化されたコードが生成されます。
一例として、元々49402バイトだったファイルをこの方法で処理すると、14600バイトまで軽くなりました。

まとめ

Closure Compilerと簡単なpythonスクリプトの組み合わせにより、コードの効率的圧縮を実現しました。
この処理は、私が開発しているA4-games (スマホ向けサイト)のソース圧縮に使用しています。
長らく駄文にお付き合いいただきありがとうございました。

擬似要素で三角形を作る

$
0
0

初めて擬似要素で三角形を作ったのでさらにいろいろ数値を動かしてみた。

まずは擬似要素で三角形を作る。
三角形はborderで作る。
「三角形 擬似要素」で検索をかけるとたくさんヒットするので無数の記事を見ながら、とりあえず書いてみた。

html
<divclass="triangle"><p>三角形をつくる</p></div>
css
.triangle::after{content:" ";border-style:solid;border-color:#aaatransparenttransparenttransparent;border-width:10px;position:absolute;top:50%;left:50%;height:0px;width:0px;}

そうするとこうなる。
1 a.jpg

小さいので大きくしたい。
なんとなくwidthを0pxから50pxにしてみた。
3 heightを50pxにしても変わらないa.jpg

お、伸びた。
じゃあheightも50pxにしよう。

...変わらない。

そうだ、borderだからだ。
大きさはborder-widthが担っている。
ならばwidthとheightは0pxに戻して、border-widthを50pxに。
4 height 0,width 0 でborder-width 50pxにa.jpg

大きくなった。
これで大きさは自由に変えられる。
でも三角形の形は一律?
角度も変えたい。

では、角度も変えていく。

まずは分かり易いように各部分に色を付けてみた。
ちなみに上のコードに書いてあるtransparentは透明の意味。
border-colorを下のように書き換えてみた。(さっき作った三角形は左上へ移動させて、コードをコピペ、afterをbeforeに変えて、border-widthを30pxにした。)
(beforeやafterに関する記事 https://www.sejuku.net/blog/54556)

css
border-color:#0df#09b#057#002;

そうするとこう。
5 さっきのは置いといて、今度はすべてに色を付けてみたa.jpg

border-color 1つ目の値が上、2つ目が右、3つ目が下、4つ目が左と対応している。
4つの三角形が中心を向いていて、1つの正方形が出来上がっている。
このまま4つとも色を同じにすれば正方形の擬似要素ができあがる。

次に今は一括で30pxにしているborder-widthを変えてみる。

css
border-width:30px60px;

するとこう。
8 solidに戻り、今まで一括30pxだったborder-widthを30px 60pxにしたa.jpg

横に伸びたし、崩れていない。
この状態でborder-colorの1,2,3つ目の値をtransparentにすれば右向きの三角が、
2,3,4番目をtransparentにすれば下向きの三角ができる。
12a.jpg

最初に作った三角形とは違う三角形になった。できた。

11a.jpg
border-widthに1つ値を入れると上の図の赤、黄、ピンク、青の4箇所ともその値になる(つまり正方形)。
2つ入れると赤とピンクが1つ目の、黄と青が2つ目の値を反映する。
3つ入れると赤が1つ目、黄と青が2つ目、ピンクが3つ目の値を反映する。

3つ入れたときの様子はこんな感じ。

css
border-width:30px60px10px;

10 今度は30px 60px 10pxにしたa.jpg

組み合わせ次第で好きな角度の三角形が作れることが分かった。

〈番外編〉
・border-width: 30px;のまま、border-styleをsolidからdottedにしてみた。
6 5のsolidをdottedにしてみたa.jpg

角がいい感じに丸くなった。
ただしborder-width: 30px 60px;など縦≠横の時は形が崩れる。
9 8のままdottedにしたら崩れた dottedは縦=横の場合のみ角が丸くなるらしいa.jpg
こんな感じに。まあ角を丸くする場合はborder-radiusを使えばいいと思う。

・同条件でborder-styleをdoubleにしてみた。
7 今度はdoubleにしてみたa.jpg

border-widthを30px 60pxにしても崩れない。
doublea.jpg

なんか面白いので機会があったら使いたいと思う。
ちなみにdashedはsolidと同じになるし、wavyはいなくなる。

おわり。

初心者によるプログラミング学習ログ 228日目

$
0
0

100日チャレンジの228日目

twitterの100日チャレンジ#タグ、#100DaysOfCode実施中です。
すでに100日超えましたが、継続。

100日チャレンジは、ぱぺまぺの中ではプログラミングに限らず継続学習のために使っています。

228日目は

AtomicDesignでAtomsの設計を失敗した話

$
0
0

概要

今回は、AtomicDesignでのコンポーネント設計をした行った時にやらかしたミスを記事にしてみました。

AtomicDesignって

最初にAtomicDesignとはなんなのかを軽く振り返ってみましょう。
Qiita内外でも多くの説明がなされているので、ざっくりと。

AtomicDesignとは、コンポーネントを以下の5つの階層に分け、
コンポーネントの役割や責任を明確しそれらをルールを決めて分割していこう、という概念です。

  • Atoms(原子)
  • Molecules(分子)
  • Organisms(有機体)
  • Templates
  • Pages

上が最小のコンポーネントで、下が一番大きいコンポーネントとなります。
また、AtomicDesignのルールとして、

  • Atoms
    • これ以上機能として分割できない機能達
  • Molecules
    • Atomsの集合体
  • Organisms
    • AtomsやMoleculesの集合体で、複雑な構成
  • Templates
    • MoleculesやOrganismsを配置する設計図
  • Pages
    • Templatesに対してデータを反映した物

といった感じですね。
それぞれの役割が明確化されていて、コンポーネントをどう作っていけばいいかの方針がわかりやすくなってますね。
それでもやらかした自分とは一体

Atomsをつくってみた

まずは、設計がマズい形のAtomsを見てみましょう
今回はButton要素のコンポーネントを例に使います。

button
<template><button@click="onClick"><slot></slot></button></template><script>exportdefault{methods:{onClick(){returnthis.$emit("click");}}};</script><stylelang="scss"scoped>.Base__Button{&--green{//省略}&--red{//省略}&--yellow{//省略}}</style>

HTML要素とScript要素は至ってシンプルな構成です。
CSS要素に関しては、1つのファイルの中に複数のClass属性が記述する形で作ってみました。
このComponentではclass属性の指定をせずに、Componentを配置した親側でClass属性を指定するという方法をとりました。
呼び出す側の例も書いておきます。

Parent
<base-buttonclass="Base__Button--green">HOGE</base-button>

親でClass属性を指定してる時点でとっても嫌な予感がするぞ

が、だめ!

最初はこの設計でも問題なく使えてましたが、使用するClass属性が増えて、記述が多くなってくると、
当然ながら使いづらくなってきました。

というのも、新しいスタイルが必要となった場合も同じファイルに追加していくために、
アイコンに使用する目的の無色透明で小さめのスタイルを…。
次はタブ用のスタイルを…
次はgreenだけ、ボタンのサイズを色々作りたい
次は…

となり、気づいたらClass属性の記述だけでファットになって、しかも複雑に絡み合い濃厚な味に…。

▂▅▇█▓▒░(‘ω’)░▒▓█▇▅▂ うわあああああああああ

Badな設計

どのような点がBadであったかを確認してみましょう。

  • 親と密結合
    • 親でクラス名を指定しないと見た目を固定できない
    • 下手したら親にスタイルのコードを書いている
  • ComponentのCSSがファット
    • 1つのComponentに色んなスタイルを詰め込みすぎ
  • CSSが上書きなどでスパゲッティコード化
  • Atomsの外でClass属性/CSS属性を記述
    • コンポーネントの状態を閉じ込めれてない

基礎的な注意点ばかりではありますね…。
なぜ、このような設計のComponentを作ってしまったかも反省しておきましょう。

  • 同じようなComponentを作るのはNG
    • 1つのComponentで管理やったら楽じゃん!
  • Atomsのルール通り処理の機能は分割しつつスタイルはまとめたい
  • 色んな箇所で使うなら同じComponentのほうがいいのでは
  • でも色んなデザインにしたいけど細かく制御できないから親にCSS属性を書くしか無い

というのを考えて作りやらかしてしまいました。
特に最後のは、もはやAtomsを親からスタイルを上書きしていたので、
これ普通のButtonタグでもよくない?のとこれ疎結合になっていないよね?という、色々なルール違反な状態となっていました。

そうだ、いっぱいつくればいいんだ

では、どうすればいいんだ!と悩み、色々ググって情報を漁っていたところ気づきました。
色んな人のLT資料や、記事を見ていっそのこと振り切って考えていいのかもと思ってすえたどり着いた答えが、
そうだ、必要な分のAtomsをいっぱいつくればいいんだ

HTML要素やJavascriptと同じように、CSSも見た目毎に最小単位まで絞り込んだComponentを作ってしまえばいいのだと。
方針としては、「Importしたら見た目も完成していたそのまま使える」ぐらいの疎結合と独立感で。
早速、先程のButtonを作り直してみました。
ImportしてるComponentが多くてパス修正が大変だった

BaseButtonGreen.vueBaseButtonRed.vueBaseButtonYellow.vueBaseButtonRadius.vueBaseButtonSemiRadius.vue

分解し、それぞれ作ってみました。
中身の方は、試しにBaseButtonGreen.vueを見てみましょう。

BaseButtonGreen.vue
<template><button@click="onClick"class="Base__Button--green"><slot></slot></button></template><script>exportdefault{methods:{onClick(){returnthis.$emit("click");}}};</script><stylelang="scss"scoped>.Base__Button--green{//省略}</style>

以前のComponentと違うのは、class属性をここで指定しCSSでは他のclass属性を記述していない、というところです。
BaseButtonGreen.vueは名前で表すように緑色のボタンに関係するCSS属性だけを記述し、
BaseButtonRed.vueは、赤色のボタンを。
BaseButtonRadius.vueでは、円形に関係するCSS属性だけを。
こうすることで、親とは疎結合になり独立性が高いComponentとなり、Importしそのまま使える事ができます。

差分がある場合には?

BaseButtonGreen.vueの縦横幅を大きい/小さいのを使いたいとなった場合ですが、
この場合はBaseButtonGreen.vueの中に差分を書くのではなく、いっそのこと別Componentにしましょう。

BaseButtonGreen.vueBaseButtonGreenLarge.vueBaseButtonGreenSmall.vue

ファイル名に修飾子で「Large」か「Small」などを付け加えて、違いを明確化。
このように、同じ構成や見た目だけど細部が微妙に違うAtomsを作る場合には、ファイル名に修飾子をつけました。
サイズだけではなく、hoverなどの擬似クラスでちょっとリッチなエフェクトを付けたいけど、
エフェクトがないのも必要という場合には、Componentを2つに分割する事で変更内容を1ファイルに閉じ込める事ができます。

おわり

今回はAtomicDesignで私がやらかした勘違いと失敗を、どのようにルールを見直した修正したかを記事にしてみました。
割とAtomicDesignの解説記事では、Moleculesからの作り方が多く書かれていますが、
Atomsでどうやって作るの?て記事はなかなか見ないので今回ネタにしてみました。
(ついでに自分犯した失敗の反省も込めて)

実際の現場ではAtomsは作らず、VuetifyなどのComponentFrameworkを使う事も多いと思われますが、
いざ自分でつくろうとすると案外どうやるんだったかな?とか、これでよかったよね?となりやすい部分であるので、
しっかりルール作りや方針確認をしたほうがいいですね!

また、アプリやサイトのデザインにがっつり影響する部分でもあるので
やっぱり自分で作ってると楽しいし、これからもたくさんAtomsを作っていこうかなと確信しました。
でも作りすぎるとImportがめんどくさいので、まとめて読み込む処理を組み入れなくちゃ…(確信)

:hoverを使ったら無茶チラついたので気になって悩んでしまった

$
0
0

とっても細かいどうでもいいところをなんとか直したくなり無茶時間かけて
試行錯誤した。解決?はしたっぽいがどういう原理なのかよく分からない・・・・

やっぱりフロントは嫌いだ。

やりたかったこと。

隣接した要素で、一方にマウスオーバーすると、
display: none;
にしておいたもう一方の要素を出現させて、
出現させた要素のリンクをクリックできるようにしたい。

CSSで実装する、マウスオーバーで表示される吹き出し

どこのサイトも簡単そうに書いてあり、TECHのカリキュラムでもおかしなことは起こらなかったのだが・・・

chromeで開くとなんかムッチャチラつく。何これ?

画面収録-2020-02-03-21.52.50.gif

色々調べたけど同じことになってる記事を見つけられなかったので、
このhoverの部分だけをhtml,cssに切り出した上でプロパティをどんどん削っていってテストした。

最終的にここまでにしたけど、やっぱり改善せず。ちなみに他のブラウザの動きとして、safariはちょっとチラつく。firefoxはチラつき無し。うん、わかんね。

test.html
<!DOCTYPE html><htmllang="ja"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width, initial-scale=1.0"><metahttp-equiv="X-UA-Compatible"content="ie=edge"><title>Document</title><linkrel='stylesheet'href='./test.css'></head><body><divclass="nickname">名前</div><divclass="box"><ahref="#">ログアウト</a></div></body></html>

※ scssは、vseditorにLive Sass Compilerっていうのを入れて、css変換して検証してた。

test.scss
.nickname{height:60px;background-color:#f0f0f0;&:hover+.box{display:block;}}.box{background-color:skyblue;display:none;position:absolute;top:2em;height:50px;}

最終的に思い至ったのが(元々、そういう風に書いておくものなのかもしれないが・・・)

nickname要素にのみhoverを適用させた状態だと、nickname要素の範囲からマウスが外れてしまった時にbox要素が消えちゃうじゃん、と思いbox:hover{ display: block; }
を追加したらなんとかなった。

test.scss
.box{background-color:skyblue;display:none;position:absolute;top:69px;height:50px;&:hover{display:block;}}

ちなみに、topを変えて試してみてたが、
双方の境界部分は、接するか、重ねるかしないとダメ、と思っていたが、
1 pixcel離れるのは許容される(1 pixcelの隙間にマウスオーバーしてもboxが消えずに済む)ということが分かった!!

どうでもいいけど。

ブラウザ別に動作が変わるだろうから、きっと接するか、重ねるかしとくのが無難なんだろう。

初心者によるプログラミング学習ログ 229日目

$
0
0

100日チャレンジの229日目

twitterの100日チャレンジ#タグ、#100DaysOfCode実施中です。
すでに100日超えましたが、継続。

100日チャレンジは、ぱぺまぺの中ではプログラミングに限らず継続学習のために使っています。

229日目は


Google OAuth 2.0 認証を使ったGoogle Sign-Inの実装(JS編)

$
0
0

概要

最近はどのサイトでもSNSからのログインだったり、登録するサイトが当たり前になっています。

スクリーンショット 2020-02-04 19.43.39.png

よく見かけるこんな感じのボタンですね。。

今回はjsだけを使って簡単にGoogle Sign-Inを実装してみます。

Googleアカウントの作成

まずはじめにGoogleアカウントを作成しましょう。
可能ならそのアプリ専用に作った方がいいと思います。

Google Cloud Platformでの設定

https://console.cloud.google.com/getting-started

まずは先ほど作ったGoogleアカウントでログインしましょう。

左上の[Project]からプロジェクトを作成を選択します。

スクリーンショット 2020-02-04 19.56.46.png

プロジェクト名はわかりやすい任意の名前をつけて、場所はとりあえずこのままで作成します。

先ほど作成したプロジェクトを選択して左のメニューから
[APIとサービス]→[認証情報]を選択

[認証情報を作成]→[OAuth クライアント ID]から今回使うOAuth認証情報を作成します。

スクリーンショット 2020-02-04 20.15.02.png

今回は[ウェブアプリケーション]を選択して[名前]を入力します。

[承認済みのJavaScript生成元]には作ったアプリのDomainを入力します。(複数選択可能)
例:http://localhost:8080

[承認済みのリダイレクトURI]にはユーザーが認証された後にリダイレクトされるURLを設定します。
例:http://localhost:8080/login/callback

[作成]するとクライアントIDが発行されるのでメモしといてください。

実装

では実装してみましょう。

HTML
<!DOCTYPE html><htmllang="ja"><head><metacharset="UTF-8"><metaname="google-signin-client_id"content="YOUR_CLIENT_ID.apps.googleusercontent.com"><script src="https://apis.google.com/js/platform.js"asyncdefer></script></head><body><divclass="g-signin2"data-onsuccess="onSignIn"data-theme="dark"></div></body></html>

正直HTMLにこの記述するだけでGoogle Sign-Inの実装はできちゃいます。
[YOUR_CLIENT_ID]は先ほどメモしたクライアントIDを入力しましょう。
簡単ですよね。

更にログインしたユーザーのプロフィール情報を取得するにはgetBasicProfile()メソッドを使用します。

JavaScript
functiononSignIn(googleUser){varprofile=googleUser.getBasicProfile();console.log('ID: '+profile.getId());// GoogleのIDconsole.log('Name: '+profile.getName());// アカウント名console.log('Image URL: '+profile.getImageUrl());// プロフィール画像console.log('Email: '+profile.getEmail());// ユーザーのメールアドレス}

ちなみにログアウトを追加したい場合は、こんな感じで書けます。

HTML
<ahref="#"onclick="signOut();">ログアウト</a><script>functionsignOut(){varauth2=gapi.auth2.getAuthInstance();auth2.signOut().then(function(){// ログアウトした後の処理
});}</script>

まとめ

今回はJSを使ってGoogle OAuth 2.0 認証を使ったGoogle Sign-Inの実装をしました。
ほんとこれだけでログイン機能の実装はできてしまうので皆さんも今時のおしゃれサイトにする際は使ってみてください。
ただ、実際の運用に使う際はこれだけだとセキュリティーガバガバなのでサーバーサイドでIDトークン検証したりなど、工夫が必要ですね。
また別でサーバーサイドでの処理などの実装もあげるのでよかったらみてください。

参考

https://developers.google.com/identity/sign-in/web

CSSでグリッチっぽい表現をやる

$
0
0

jdIOWpguRq.gif

PIXIV TECH FES.← このサイトかなりカッコいいですよね(私は行けませんが…)(担当したのは@yui540です1

CSSで文字を分割します、面倒くさいので構成はParcelで行きます、JavaScriptは使いませんが現実的なところを考えると要ります(アニメーションの発火を制御するのにとか…)

yarn add parcel-bundler -D
npx parcel src/index.html

この記事は自分でも空でかける自信が無いので備忘録として書き残しておきます(アニメーションまでは面倒くさくなって書かないことになりました、書くのは文字分割までです)

HTML

まずHTMLから

1

<body><divclass="wrapper"><divclass="text-wrapper"><p>そのツイート、切らせてもらう</p></div></div></body>

image.png2

まずグリッチしたい要素(今回はp)を.text-wrapperで囲む
.text-wrapperを更に大きな.wrapperで囲む

2

<body><divclass="wrapper"><divclass="text-wrapper"><p>そのツイート、切らせてもらう</p></div><divclass="text-wrapper"><p>そのツイート、切らせてもらう</p></div><divclass="text-wrapper"><p>そのツイート、切らせてもらう</p></div><divclass="text-wrapper"><p>そのツイート、切らせてもらう</p></div><divclass="text-wrapper"><p>そのツイート、切らせてもらう</p></div><divclass="text-wrapper"><p>そのツイート、切らせてもらう</p></div><divclass="text-wrapper"><p>そのツイート、切らせてもらう</p></div><divclass="text-wrapper"><p>そのツイート、切らせてもらう</p></div><divclass="text-wrapper"><p>そのツイート、切らせてもらう</p></div><divclass="text-wrapper"><p>そのツイート、切らせてもらう</p></div><divclass="text-wrapper placeholder"><p>そのツイート、切らせてもらう</p></div></div></body>

image.png

.text-wrappern + 1個に増やす(nは分割する数です)、今回は10分割するので11個に増やします

最後の要素に.placeholderクラスを付与しておく(次からのCSSでの見通しが良くなるからです(使わない場合は:nth-of-last-typeなどでどうにか気合でやる))

SCSS

forループとかを使うと一般化ができるのでかなり嬉しいのでSCSSで書く、リセットCSSなどでmargin等が消えている前提でCSSを書いていきます

1

.wrapper{position:absolute;top:25px;left:25px;}

概略図
mspaint_mK3RjqrKDt.png

2

.wrapper{position:absolute;top:25px;left:25px;}.text-wrapper{font-size:3rem;}.text-wrapper.placeholder{visibility:hidden;}.text-wrapper:not(.placeholder){position:absolute;top:0;left:0;}

image.png

すべての.text-wrapper要素に必要なスタイルを当てる(文字をデカくする)

.placeholder要素は場所を取るだけの要素なので見えないようにしておきます

.placeholder以外の要素はすべて重ね合わせてある状態になっています

概略図

image.png

3

.wrapper{position:absolute;}.text-wrapper{font-size:3rem;}.text-wrapper.placeholder{visibility:hidden;}.text-wrapper:not(.placeholder){position:absolute;top:0;left:0;width:10%;height:100%;overflow:hidden;&>p{position:absolute;top:0;white-space:nowrap;}@for$ifrom1through10{&:nth-of-type(#{$i}){left:($i-1)*10%;&>p{left:-(($i-1)*100%);}}}}

A4imFr318C.gif

気合で理解してほしいです

文字のような要素ではwhite-space: nowrapを指定しないと改行されて壊れます

概略図
image.png

4

.text-wrapper:not(.placeholder){position:absolute;top:0;left:0;width:10%;height:100%;overflow:hidden;&>p{position:absolute;top:0;white-space:nowrap;}@for$ifrom1through10{&:nth-of-type(#{$i}){top:($i*25%);// ← ここで文字を斬るleft:($i-1)*10%;&>p{left:-(($i-1)*100%);}}}}

image.png

おー斬れました よかったですね

後はmathsassなどを使って乱数っぽく座標をずらしたりすると良いと思います(29% * sin(1.7922rad * cos(1.9877777777deg * $i) + $i * .7rad)など)、transform, translateなどを駆使して頑張って下さい

一般化

.text-wrapper:not(.placeholder){$n:30;position:absolute;top:0;left:0;width:(100%/$n);height:100%;overflow:hidden;&>p{position:absolute;top:0;white-space:nowrap;}@for$ifrom1through$n{&:nth-of-type(#{$i}){left:($i-1)*(100%/$n);&>p{left:-(($i-1)*100%);}}}}

作例

画像でも応用できる
odFwwtFj7J.gif

transform: skew()などをやるとかなり意味がわからない動きになってメチャクチャ面白い
iM40d4seu6.gif

以上です

【CSS】要素の中央寄せ【備忘録】

$
0
0

中央寄せしなければならない時に、毎回調べてるので備忘録

ブロック要素

sample.css
/* 色、幅、高さの記述は省略 */.contentA{/* 親要素 */display:flex;align-items:center;}.contentB{/* 子要素 */margin:0auto;}
sample.html
<body><divclass="contentA"><divclass="contentB"></div></div></body>

実行結果(赤が親要素、青が子要素)

スクリーンショット 2020-02-04 22.22.28.png

インライン要素

インライン要素をdivで囲ってあげる

sample.css
/* 色、幅、高さの記述は省略 */.contentA{/* 親要素 */display:flex;align-items:center;}.contentB{/* 子要素 */margin:0auto;}/* ボタンの位置設定は特になし */
sample.html
<body><divclass="contentA"><divclass="contentB"><inputtype="button"value="テストボタン"></div></div></body>

実行結果(赤が親要素、青が子要素(ボタン))

スクリーンショット 2020-02-04 23.11.37.png

【未経験】ポートフォリオサイトを作成してみた。

$
0
0

自己紹介

現職は不動産管理会社のフロントマンをしています。
WEBデザイナーへの転職を考えてHTMLとCSSを勉強中です。
主にProgateを利用して勉強を進めております。

ポートフォリオサイト

Photoshopで作成したデザインを元にコーディングしてみました。
デザインする際には「どのようにしたらコーディングできるか」を意識しました。
デザイン~コーディングまで1週間と少しくらいかかりました。
偶然に3連休が入らなければ確実に終わらなかったと思います(笑)。

1.ポートフォリオサイト

プロフィール・スキル・作品・連絡先をシンプルにまとめました。
Progateのレッスンでは与えられていた画像のサイズなど、
基本情報から自分で考えなければならなかったのが大変でした。

https://tomohiro34685.github.io/portfolio-site/

2.架空のサイト

ポートフォリオサイトに載せる作品として作成しました。
デザインはファッションブランドのサイトを参考に作成しました。
まだ掲示できる作品としてのサイトが殆どないので、
勉強のためにも少しずつ増やしていきたいと思っています。

https://tomohiro34685.github.io/portofolio/

使用ソフト・参考サイト

1.使用ソフト
- Photoshop
- Atom

2.参考サイト
- Progate
- Unsplash

作ってみての感想

直すべき箇所は枚挙に暇がありませんが、サイトを作り上げた達成感があって嬉しいです。
サイトのデザインからコーディングまで、すべてを自分一人でやるのはとても苦労しましたし、途中で投げ出したくなる瞬間もありましたが、1つ自身に繋げられたと思います。
今はまだ知識もないので、その場しのぎの対応を調べて試すという繰り返しのサイトなので、とても不格好なものになっていると思います。
これからも自己研鑽を続けていくので、少しずつでもサイトを更新していけたらと思っております。
最後までご覧になっていただきありがとうございました。

CSSのみで表示をコントロールする時に使える便利な記法

$
0
0

表示の切り替えをする時、大抵の場合 JavaScript を使わないとできないとなるのだが、CSSのみで対応可能な場合もあるので、検討する時に使えるテクニックを集める。

切り替えを行う

ID アンカーを使うと URL内の #以降の文字列でターゲットの指定ができる。

<divid="modal"class="overlay">Dummy Modal</div>
.overlay{visibility:hidden;}.overlay:target{visibility:visible;}

https://test.dev/link
https://test.dev/link#modal

と言うそれぞれにアクセスすることで表示非表示が切り替えられる。

modal が css上の target にあたるかどうかで切り替えられる。

アコーディオンやその他いろいろな箇所で応用できる。

JSFiddleで見る

中の要素があるかないか

中身があるかないかでの切り替えも可能。要素を差し込んだりする場合に有効になってくる。
要素がない場合、余計なスペースを残してしまうとデザインが崩れることがあるのでそれを補正したい。

<divclass="footer"><button>Cancel</button><button>OK</button></div>
.footer{margin:20px;padding:20px;}.footer:empty{margin:0;padding:0;}
Viewing all 8591 articles
Browse latest View live


<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>