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

CSSの基本単位として使うと便利なrem

$
0
0

CSSでのフォントサイズ指定は「px」や「em」を使うのが一般的。
CSS3で追加された「rem」という単位がとても使いやすそうなので、使い方について調べてみた。

rem と em の違い

emが親要素を基準としたサイズであるのに対し、remはroot (根っこ)が基準となっています。簡単に言うとhtmlに指定されたフォントサイズを基準とした倍率

index.html
<html><body><div> ABCDEFG </div></body></html>
style.css
html{font-size:62.5%;/*10px*/}body{font-size:1.5em;}div{font-size:1.5em;}

ABCDEFGの文字サイズ = 10px * 1.5 * 1.5 = 22.5px

emは親要素を基準とした単位なので、こういう計算になる。
次に、remを使った場合の挙動。

style.css
html{font-size:62.5%;/*10px*/}body{font-size:1.5rem;}div{font-size:1.5rem;}

ABCDEFGの文字サイズ = 10px * 1.5 = 15px
bodyに指定されたfont-size:1.5em;は無視して、htmlに指定された10pxを基準としたサイズが求められます。


WordPress始めました。その1。

$
0
0

上司:bust_in_silhouette:<チーム全員でWordPress使えるようになってほしい!

「使えるようになってほしい」=ただの保守・運用だけではなく、PHPも理解してカスタマイズできるようになってほしいの意見(恐らくそれ以上のことも)。
入社して2ヶ月経ち自社製品も任せてもらえるようになり、新たな壁が立ちふさがった!
やったことないけど、色々やってみよう:star:

必要な知識

  • HTML
  • CSS
  • PHP

私、未経験入社(少しはやっていた)ですが、入社してからひたすらググって!聞いて!Qiitaに書く!をやっています!WordPress自体も初めてです。

下準備

チーム全員で勉強するので、まずは環境を整えます。
でも殆ど他の社員が環境を整えてくださっていたので、あんまりやってないです

Dockerのインストール

https://docs.docker.com/docker-for-windows/install/
ここのDownload from Dockerをクリックしてダウンロード

Docker hubアカウントの作成をしないといけないのでここで作成。

設定の参考1:https://ops.jig-saw.com/techblog/docker-for-windows-install/
設定の参考2:https://dx.nissho-ele.co.jp/blog/docker-for-windows_20190829.html

docker-compose.ymlの設定

すみません、自分で最初から設定したわけではないんです:pensive:
上司から配布されました…
中身の説明は別記事で書こうかと思います。

docker-compose up -d

WindowsPowershellでこのコマンドを打って、コンテナの作成と起動。

-dはデタッチドモードというらしい。Compose はコンテナを実行すると終了するが、コンテナは後ろで動き続ける

http://ローカルホスト:XXXXにアクセス

docker-compose.ymlのports:に書いてあるホスト名でアクセスする

これで準備が整ったのでWordPressを始めよう!
http://docs.docker.jp/compose/wordpress.html

特定の文字だけフォントが変えたい? @font-faceを定義しよう!

$
0
0

「※」のみフォントを変更したい

タイトルの通り、「※」のフォントのみを他のものに変えたい問題を@font-faceで解決します。

前提

CSSで以下のようなコードを記述すると、基本的に始めに記述してあるフォントから読み込まれ、文字そのフォントに無いorそのフォントが端末で利用不可の場合のみ、次のフォントが読み込まれます。

main.css
*{font-family:'YuGothic','Yu Gothic','Hiragino Kaku Gothic ProN','ヒラギノ角ゴ ProN W3','メイリオ','Meiryo','MS ゴシック',sans-serif;}

この状態で「※」を記述すると、YuGothicに「※」が存在するため、YuGothicが表示可能な環境ではYuGothicの「※」が表示されます。
しかしこのご時世、この文字だけこのFontで表示してほしいみたいな不思議な要望が来ることがあります

そんなとき、まず思いつくのは以下のようなコードです。

index.html
<html><style>*{font-family:'YuGothic','Yu Gothic','Hiragino Kaku Gothic ProN','ヒラギノ角ゴ ProN W3','メイリオ','Meiryo','MS ゴシック',sans-serif;}.kome{font-family:'Roboto',sans-serif;}</style><body><p><spanclass="kome"></span>こんなことあるんか</p></body></html>

このコード、ココだけなら問題なさそうです。しかし、「※」の回数が増えたり、動的なコンテンツに対応したりすると辛いものがあります。

@font-faceを定義しよう

そんなときに役に立つのが@font-face規則というCSSの規則です。
これは独自fontを規定するための規則で、オンライン上やデバイス上のフォントを読み込み、font-familyプロパティで呼び出せる形式の名前を定義します。(GoogleFontsなどでimportをした際も@font-faceの塊がインポートされている)

@font-faceについて詳しくは上に記載のMDNのページを見てくれといった感じなのですが、実はこの規則、unicode-rangeで対象のフォントを読み込む範囲を限定できます。

main.css
@font-face{//ここでのfont-familyは、名前の定義なので自分で名前をつけるfont-family:'kome';//対象のFontを指定する、もちろんformatを指定してオンライン上やローカルのwoffファイルなどを参照することもできる。今回は面倒なのでRobotosrc:local("Roboto");//unicodeの範囲指定により、フォントをロードする範囲を限定できる。今回は「※」一文字なので単一の指定(203Bは※のunicode)unicode-range:U+203B;//この定義により、※印だけロードされたRobotoのフォントを、「kome」という名前で利用可能になる。}*{//komeフォントを最上位に設定。「※」以外の文字はkomeに存在しないため、下のfontがロードされる。font-family:'kome','YuGothic','Yu Gothic','Hiragino Kaku Gothic ProN','ヒラギノ角ゴ ProN W3','メイリオ','Meiryo','MS ゴシック',sans-serif;}

これでこのhtmlのすべての要素の「※」は「kome」というフォント名の元Robotoで表示される事になりました。そこからさらに出し分けたいみたいなことがあれば最初の例ようなspanタグ作戦をしましょう。

【SCSS / SASS】オレオレ爆速Mixins

$
0
0

SASSをしばらく使ってみて、どんなプロダクトでも使うとコーディングが早くなる汎用的なMixinとクラスを発見したので共有したいと思います。

他にも「これも結構使えるテンプレだぞ!」ってやつがあったらコメントで教えていただきたいです。

リセットCSS

早速Mixinじゃないですが、僕はあんまり巷に出回るリセットCSSが好きじゃなくて、自分が最低限必要だと思って毎回使ってるリセットCSSなのでご紹介しておきます。

一番下のbackground-colorはコメントアウトを外すと要素が見やすくなります。

*{position:relative;margin:0;padding:0;font-feature-settings:'palt';box-sizing:border-box;list-style-type:none;text-decoration:none;scroll-behavior:smooth;// background-color: rgba(255,0,0,0.05);}

ボタンにリンクを配置するとき

とてもよく使います。ボタンをリンクにするためのMixinです。

divspanで作ったボタンをそのままaタグで囲うと、ボタンの中の文字だけがリンクになるので、ボタンの内側を全てリンクにする場合はaタグをposition: absoluteして、ボタンの内側に配置するのが一般的だと思います。

それを一々書かなくても良くしたMixinと、それを指定したクラスになります。

@mixincovered-link{position:absolute;z-index:10;top:0;left:0;width:100%;height:100%;}a.covered-link{@includea-link;}

以下のように書くだけで使えます。(Pugを使ってます)

.button
    span ボタン
    a.covered-link(href='#')

背景画像を設定するとき

これもとてもよく使います。

background-imageを設定するときの多くは中央寄せにしますし、繰り返ししないので、それをまとめたmixinです。要素に収まるように画像を配置するとき用のbg-containと、要素いっぱいに配置するとき用のbg-coverがあります。

@mixinbg-contain{background-repeat:no-repeat;background-position:center;background-size:contain;}@mixinbg-cover{background-repeat:no-repeat;background-position:center;background-size:cover;}

以下のように使います。

.image{@includebg-cover;width:100px;height:100px;}

メディアクエリ

とてもよく使います。

メディアクエリを書きやすく、ブレイクポイントを変更しやすくしたものです。こちらのサイトを参考にしました。

$breakpoint-width-up:('sm':'480px','md':'896px','lg':'1024px',)!default;$breakpoint-width-down:('sm':'479px','md':'895px','lg':'1023px',)!default;@mixinmedia-width-up($breakpoint:md){@ifstr-index($breakpoint,px){@mediascreenand(min-width:#{$breakpoint}){@content;}}@else{@mediascreenand(min-width:#{map-get($breakpoint-width-up,$breakpoint)}){@content;}}}@mixinmedia-width-down($breakpoint:md){@ifstr-index($breakpoint,px){@mediascreenand(max-width:#{$breakpoint}){@content;}}@else{@mediascreenand(max-width:#{map-get($breakpoint-width-down,$breakpoint)}){@content;}}}@mixinmedia-height-up($breakpoint){@mediascreenand(min-height:#{$breakpoint}){@content;}}@mixinmedia-height-down($breakpoint){@mediascreenand(max-height:#{$breakpoint}){@content;}}

以下のように使います。横の長さはsm/md/lgでもpxでも指定できますが、縦の長さはpxでしか指定できないようにしています。

p{// 画面の幅がsm以下の場合に適用@includemedia-width-down(sm){color:yellow;}// 画面の幅が600px以上の場合に適用@includemedia-width-up(600px){color:white;}// 画面の縦の長さが1000px以下の場合に適用@includemedia-height-down(300px){color:red;}}

〇〇px以下で出現/消える要素

割とよく使うし、頼りになります。このMixinは上のメディアクエリに依存するので、使用するときは一緒に@importしてください。

メディアクエリでどうにかなるときがほとんどですが、PC版とスマホ版で違う文字のデザインが要求されたりします。そのときに「うっ」とならずに、強引に解決してしまう方法です。あまり変な使い方をするとSEOやアクセシビリティ的にも良くないとは思いますが、開発は爆速で進みます。

@mixinvisible-settings($size,$mode){&.#{$size}{@if$mode=='hidden'{@includemedia-width-up($size){&.inline{display:inline;}&.inline-block{display:inline-block;}&.block{display:block;}}display:none;}@else{@includemedia-width-down($size){&.inline{display:inline;}&.inline-block{display:inline-block;}&.block{display:block;}}display:none;}}}.when-less-than{&.hidden{@includevisible-settings(md,'hidden');@includevisible-settings(sm,'hidden');}&.appear{@includevisible-settings(md,'appear');@includevisible-settings(sm,'appear');}}

以下のように使います。

span.appear.when-less-than.sm.inline//スマホ版で表示span.hidden.when-less-than.sm.inline-block//PC/タブレット版で表示

注意点として、このクラスを指定した要素にはdisplayを上書きしないでください。

フォントが混ざらないようにするとき

まあまあ使います。

フォントを指定するときは英語専用のフォントを優先的に指定して、日本語のときはその他のフォントを指定することがほとんどですが、日本語の中に英語が混じることになります。それが困るときに、このMixinを使用して、日本語のみのフォントを指定します。

@mixinfont-family($lang){@if$lang==ja{font-family:'Noto Sans JP',sans-serif;}@else{font-family:'Apple LiGothic Medium','Roboto','Noto Sans JP',sans-serif;}}

以下のように使います。

p.only-japanese{@includefont-family(ja);font-size:14px;}

activeで出現するやつ

たまに使います。

JavaScriptでクラスをいじって、.activeが付いている間だけ出現するやつです。

@mixinon-active-appear{opacity:0;pointer-events:none;transition:opacity.5s;&.active{opacity:1;pointer-events:auto;}}

以下のように使います。

.login-button{@includeon-active-appear}
.login-button //- 見えない
.login-button.active //- 見える

隠しテキストを置くとき

SEOへの配慮も含めて、隠しテキストを置くときはよくあります。背景画像を使ったときの代替テキストや、section始めの区切りとしておくことがあります。apple.comで同様のテクニックが使われていたので、やっておくといいことがあると思います。display:noneはしないのがポイントだと思われます。

@mixinvisibility-hidden{position:absolute;overflow:hidden;width:1px;height:1px;}.visibility-hidden{@includevisibility-hidden}

以下のように使います。

.h2
    span.dog-image //- 犬の画像
    span.visibility-hidden Dog //- Dogというテキストを置いておく。

スクロール量に応じて背景の色を変えたい

$
0
0

スクロール量に応じて背景の色を変える方法

デモページ
こんな風なのが作りたい人向けの記事です。

サンプルコード

HTML

<divclass="hogehoge"data-module="backgroundChange"><!-- ページのコンテンツ --></div>

ページのコンテンツ要素をラッピングする要素を用意します。
なんならbodyでもいいです。

CSS

.hogehoge{width:100%;height:10000px;transition:background.4sease-out;}

CSSで要素の高さを指定します。
なんなら指定しなくても高さ持っていれば別にいいです。
大事なのはbackgroundtransitionを指定することです。

javascript

exportdefaultclassbackgroundChange{constructor(elem){this.elem=elem;this.elemHeight=this.elem.clientHeight;this.percentage=Math.round(this.elemHeight/360);this.init();}init(){this.bindEvents();}bindEvents(){constbh=window.innerHeight;window.addEventListener('load',()=>{this.setting(bh);});window.addEventListener('scroll',()=>{this.setting(bh);});}setting(bh){constoffsetY=window.pageYOffset;constscrollBottom=bh+offsetY;constcalc=Math.floor(scrollBottom/this.percentage);this.changeBackground(calc);}changeBackground(calc){this.elem.style.backgroundColor=`hsl(${calc}, 100%, 50%)`;}}constelem=document.querySelector('[data-module="backgroundChange"]')newbackgroundChange(elem)

これでOKです。

解説

もう少し詳しく解説すると

constructor(elem){this.elem=elem;this.elemHeight=this.elem.clientHeight;this.percentage=Math.round(this.elemHeight/360);this.init();}

ここで、newするときに引数で指定した要素を受け取ります。
そして、その要素の高さを取得して、
さらにそれを360等分して、Math.round()で小数点以下を四捨五入します。

なぜ360等分しているか木になる方は、「HSLカラーチャート」でググってみてください。
円形のカラーチャートが出てくると思います。円、つまり360度。そういうことです。

init(){this.bindEvents();}

そしてイベンドバインドの関数を叩きます。

bindEvents(){constbh=window.innerHeight;window.addEventListener('load',()=>{this.setting(bh);});window.addEventListener('scroll',()=>{this.setting(bh);});}

window.innerHeightでブラウザの高さを取得します。
そして、ページロード時とスクロール時に、背景の色を変える準備用の関数を叩きます。
その時に引数で、ブラウザの高さを渡します。

setting(bh){constoffsetY=window.pageYOffset;//垂直方向のスクロール量constscrollBottom=bh+offsetY;//ブラウザの高さ + 垂直方向のスクロール量constcalc=Math.floor(scrollBottom/this.percentage);//ごにょごにょ計算してスクロールした割合出すthis.changeBackground(calc);}

ここがややこしいですが、ごにょごにょと計算して、
ページ全体のうちのどのくらいスクロールしたかを計算します。
そしてその計算した値を元に背景色を変える関数を叩きます。

changeBackground(calc){this.elem.style.backgroundColor=`hsl(${calc}, 100%, 50%)`;}

いよいよ、newする時に受け取った要素の背景色を替えます。
上でごにょごにょ計算した値をHSL形式の色指定の第一引数に突っ込みます。

これで、スクロールするたびに色が変わるようになっているはずです。

カレーを例にしたCSSアニメーションのことはじめ

$
0
0

カレー、ほかほかにさせたくない?

というわけで、今回はカレーに簡単なCSSアニメーションをつけていきたいと思います。

対象

  • CSS書けるけど、もうちょっと表現を豊かにしたい人
  • CSS アニメーションなんのこっちゃ
  • カレーのルーはご飯の真上にぶっかける人

といった方に向けて書いていこうと思います。
CSSアニメーションのテクニックとか、速度を考慮したらこれがベストだ!等の
上級者向けのものは書きません。(当方まだまだペーペーなので)
あくまで基礎のご紹介です!

そもそもCSSアニメーションって?

CSSは以下のように定義されています。

カスケーディングスタイルシートCascading Style Sheets (CSS) はスタイルシート言語であり、 HTML や XML (方言である SVG, MathML, XHTML などを含む) で記述された文書の体裁や見栄えを表現するために用いられます。 CSS は、要素が画面上で (あるいは紙や音声といった別のメディア上で) どのように表現されるのかを定義します。

  • スタイルシート言語である
  • 文書の体裁・見栄えを表現する為に用いる

ざっとこのようなものです。

それを踏まえて、CSSアニメーションというのは
要素をアニメーションさせるCSSの機能の1つであるとされています。

CSSアニメーションは

  • Transition
  • Animation

に大別されます。

ではそれぞれどういうものなのかを見てみます。

2種類のCSSアニメーション

上記で紹介したTransitionAnimationについてそれぞれ説明します。

Transition

Transitionは要素の状態間の変化を定義することができます。
例えば、:hover時や、:active時にtransitionを効かせることが可能です。

「〜〜〜」を「〜〜〜」したら「〜〜」を「〜〜〜」に状態変化させる。
と覚えておくとよいと思います。
「カレーに手」を「突っ込ん」だら「手」を「真っ赤」に状態変化させる。
みたいな感じ。サイコパス

また、transitionは一方通行!繰り返しません。

transitionで指定できるプロパティは以下です。

プロパティ名効果記述例
transition-propertyトランジションの効果を適用するプロパティtransition-property: opacity;
transition-durationアニメーションの継続時間transition-duration: 1s;
transition-timing-function加速曲線の定義transition-timing-function: ease-in;
transition-delayアニメーションが始まるまでの待ち時間の定義transition-delay: 250ms;

これらのプロパティは、transitionプロパティで一括指定できます。
transition-propertyallにすつことで全てのプロパティへの適用ができます。

transition: {プロパティ名} {継続時間} {加速曲線} {待ち時間};
transition: margin-right 4s ease-in-out 1s;

長くなりましたが、Transitionのまとめは以下です。

  • Transitionは状態を変化させるアニメーションを付与できる
    • 「〜〜〜」を「〜〜〜」したらを指定する
  • 1回きりであり、繰り返しの再生はできない
  • 指定できるのは以下で、一括指定できる
    • トランジションを適用するプロパティ
    • アニメーションの継続時間
    • 加速曲線の定義
    • アニメーションが始まるまでの待ち時間

Animation

続いてAnimationについてです。
Animationは要素の状態間の変化を定義するTransitionに対し、スタイル間のアニメーションを適用します

なので、Transitionの「〜〜〜」を「〜〜〜」にしたら部分はごっそり不要になり、
「〜〜〜」を「〜〜〜」にするのみの記述になります。

また、Animationはアニメーションの繰り返しを行うことが可能です。

animationプロパティで指定できるものは以下です。

プロパティ名効果記述例
animation-nameトランジションの効果を適用するプロパティtransition-property: opacity;
animation-durationアニメーションの継続時間transition-duration: 1s;
animation-timing-function加速曲線の定義transition-timing-function: ease-in;
animation-delayアニメーションが始まるまでの待ち時間の定義transition-delay: 250ms;
animation-iteration-countアニメーションが停止するまでの再生回数animation-iteration-count: infitite;
animation-direction再生の向きの設定animation-direction: forwards;
animation-fill-modeアニメーション再生中・再生後のスタイルの指定animation-fill-mode: both;
animation-play-stateアニメーションが実行中か停止中かの設定animation-play-state: paused;

こちらもanimationプロパティで一括指定できます。

animation:{アニメーション名}{継続時間}{加速曲線}{再生開始までの待ち時間}{再生の向き}{再生中・再生後のスタイル指定}{停止中or実行中};animation:fadeIn3sease-in-out1sreversebothrunning;

Animationのまとめは以下です。

  • transitionより指定できるプロパティが多い
  • 状態変化の「〜〜〜」を「〜〜〜」にしたらの指定はしない
  • 繰り返し再生ができるし再生回数も指定できる

アニメーション指定方法

Transition

実際にtransitionを適用する場合は以下のようなコードになります。
例として、このカードにマウスオーバーした時に不透明度を下げましょう

スクリーンショット 2019-12-17 15.26.39.png

<divclass="card"><aclass="card_link"href="#"><spanclass="card_title">おいしいカレー ¥500</span><spanclass="card_image"><imgsrc="https://japaclip.com/files/curry-rice.png"alt=""></span></a></div>

transitionの対象を.cardとし、マウスオーバー時の指定を:hoverにしてあげます。

.card{color:#333;cursor:pointer;width:200px;transition:opacity1sease-in-out;//transition対象を宣言&:hover{opacity:.7;//hover時の変化を指定}}

スクリーンショット 2019-12-17 15.29.58.png

ふわぁんと薄くなりましたね。

実際のコードは以下にあります。
https://codepen.io/thugumi-ishimaru/pen/BgxgrR?editors=1100

Animation

animationを指定する時は、「何秒のときにどの状態」が必要になるので、
css側に@keyframesの作成が必要です。
構文は以下です。

@keyframesanimation-name{0%{アニメーション開始時の処理}100%{アニメーション完時の処理}}

animation-nameは任意の名前にしてください。
上記の@keyframesを作った上で、要素にanimationを適用させます。

こちらはせっかくなので、以下のカレーを題材にしましょう。

カレーに湯気を......

はい、お待たせしました。
お腹空きましたかね、私まだお昼ご飯食べてないのでお腹空きました。

こんなカレー鍋を作りました。
湯気がゆらゆらしてるものです。
(スマホでバグってすみません)

See the Pen カレー鍋 by Thugumi Ishimaru (@thugumi-ishimaru) on CodePen.

湯気(.yuge)を用意します。
class名雑なのは自覚あるので許して

<divclass="curryPot"><divclass="curryPot_head">
     (中略)
    <divclass="yuge"></div></div>
     (中略)
</div>

.yugeの擬似要素に対して今回は
opacitytransitionプロパティのアニメーションをつけます。
この時、アニメーションさせる対象の要素に対して、@keyframesの0%の状態と同じ値を
指定しておく必要があります。

.yuge{position:relative;&:before,&:after{animation:yugeUp5sease-in-outinfinite;//ここが!アニメーションの!指定だよ!アニメーションの時間は5秒間!永遠再生してください!!!!opacity:0;//@keyframesの0%のときと同じ値transform:translateY(-15px);//@keyframesの0%のときと同じ値}&:before{content:"";position:absolute;height:200px;top:-250px;left:60px;border-right:0pxsolidtransparent;border-top:2pxsolid#fff;border-left:135pxsolid#fff;border-bottom:12pxsolidtransparent;filter:blur(35px);z-index:4;transform:rotate(168deg)skewY(10deg);border-radius:80%010%10%;}&:after{content:"";height:200px;top:-180px;right:60px;display:block;position:absolute;border-right:0pxsolidtransparent;border-top:2pxsolid#fff;border-left:125pxsolid#fff;border-bottom:12pxsolidtransparent;filter:blur(35px);z-index:4;transform:rotate(168deg)skewY(10deg);border-radius:80%010%10%;}}

で、css内に@keyframesを設定します。

@keyframesyugeUp{0%{opacity:0;transform:translateY(-15px);}50%{opacity:.7;}100%{opacity:0;transform:translateY(-250px);}}

これでほかほかのカレーができました!
めしあがれ!!!!!!

まとめ

今回はカレーを題材にしてCSSアニメーションを紹介しました。
以下を覚えてたらなんとなく、多分、実務で、できるかもしれません。

  • transitionとanimationの2種類があるよ
  • transitionは「〜〜」に「〜〜」をしたらの指定が必要だよ
  • animationは@keyframesの設定と再生開始時の指定が必要だよ

もっと詳しく知りたい人はぜひ手元でCSSアニメーション使って遊んでみてください!

ありがとうございましたー!
引き続きよろしくお願いします。

リップルエフェクト解体新書

$
0
0

リップルエフェクトとは

実際に見た方が早いです。これです。

See the Pen Ripple Effect Sample by NumLocker (@numlocker-japan) on CodePen.

こんな感じで、クリックするとそのクリック位置に合わせて波紋が出るエフェクトのことをリップルエフェクトと言います。
マテリアルデザインにも使われているアニメーションです。

実装方法

では、さっそく実装方法を見ていきます。

クリックされた座標の取得

リップルエフェクトは先ほども述べたとおり、マテリアルデザインに使われており、「ユーザーのクリックに応じた」動作が求められます。つまり、クリックされた位置にちょうどエフェクトが描画される必要があります。
クリックされた位置(座標)をJavaScriptで取得する方法は、2種類あります。
event.pageX / event.pageYを使う方法と、event.offsetX / event.offsetYを使う方法です。
例えば、特定のdiv要素がクリックされた際にそのpageXの値をconsoleに表示するならこのようになります。

sample.js
document.querySelector('div').addEventListener('click',(event)=>{console.log(event.pageX);})

下に、html要素およびその配下のdiv要素をクリックした時に、event.pageX / event.pageYおよびevent.offsetX / event.offsetYで取得したクリックイベントの座標がアラートで表示されるページを作ったので、それぞれの違いを、ぜひ一度確かめてみてください。(淡い青色の部分にhtml要素が広がっており、濃い青色の部分がその配下のdiv要素です。)

See the Pen Where is the event? by NumLocker (@numlocker-japan) on CodePen.

以上のことから、event.pageX / event.pageYで返される値は、画面に対する絶対座標であること、event.offsetX / event.offsetYで返される値は、クリックされた要素の右上の点からの相対座標であり、下の要素のoffsetX / offsetYの値も、一番上にある要素の値が返されるということが分かります。(div要素をクリックした際に、html要素のクリックイベントのoffsetがdiv要素のものと一致していたことから分かる。)

座標の値を用いて円の描画を行う

では、クリックイベントの座標の値に合わせて、クリックされた位置に円を描画してみます。
分かりやすいように半透明にしています。いろんな場所でクリックしてみてください。

See the Pen Circle Sample by NumLocker (@numlocker-japan) on CodePen.

では、重要な部分のコードを説明していきます。

Circle_Sample.css
button{/*とりあえずそれっぽいボタンにします*/width:180px;height:60px;font-size:18px;color:white;background-color:blue;border:2pxsolid#fff;border-radius:12px;/*ここからが大事*/outline:none;position:relative;z-index:1;}.ripple{/*とりあえずそれっぽいエフェクトにします*/width:50px;height:50px;background-color:#f005;border-radius:50%;/*ここからが大事*/position:absolute;z-index:5;transform:translateX(-50%)translateY(-50%);outline:none;pointer-events:none;}
Circle_Sample.js
document.querySelector('button').addEventListener('click',(event)=>{event.currentTarget.insertAdjacentHTML('afterbegin','<span class="ripple" style="left:'+event.offsetX+'px;top:'+event.offsetY+'px;"></span>')})

(rippleクラスは、赤い円に付与されているクラスです)
JavaScriptでは、クリックに合わせて、その対象の要素(ここではbutton)の内側にrippleクラスを持ったspan要素を挿入しています。button要素は、event.currentTargetとして取得しています。

ボタンに指定した outline: none;は、指定しないと、こんな感じで、青い枠線が表示されてしまいます。

outline.png

次に、ボタン側に position: relative; , エフェクト側に position: absolute;を指定しています。これは、JavaScript側で、クリックイベントのoffsetの値をエフェクトの位置指定に使用していることに起因します。

ボタン側に position: relative;, エフェクト側に position: absolute;が指定されていることで、rippleクラスの top, leftの基準が、bodyではなく、buttonになります。これにより、rippleクラスの leftにクリックイベントの offsetX, rippleクラスの topにクリックイベントの offsetYを代入することで、要素の位置がクリック位置と一致するわけです。

ただし、これだけではクリック位置とrippleクラスの指定されたspan要素の左上が一致します。これは、CSSの位置の基準が要素の左上であるからです。そのため、要素の幅の半分だけ左に、要素の高さの半分だけ上に、位置をずらすことで、クリック位置に円の中心が一致して表示されるようになります。そして、そのためのスタイルが、transform: translateX(-50%) translateY(-50%);です。

ところが、ここで問題になってくるのが、z-indexです。というのも、positionやtransformの値を設定することで、z-indexがうまくきかなくなってしまうのです。ここでは念のためz-indexを明示的に指定していますが、ここで紹介したコードをそのまま他のページに埋め込んだりすると、上手く表示されない可能性があります。

最後に、rippleクラスには、pointer-events: none;が指定されています。
これは、rippleクラスのついた要素、つまり赤い円に対し、クリックイベントを無効化するプロパティです。
これを行わないと、すでに存在していた円の上をクリックした際、その円を基準として座標が返されてしまいます。(下の要素に対するoffsetの値であっても、一番上にある要素の値が返されることを思い出してください。)

エフェクトの完成

ではいよいよ、先ほどの赤い円が表示されるボタンをさらにグレードアップして、リップエフェクトを作ってみます、先ほどのボタンに足りないのは次の要素です。

  • 赤い円のボタン外の部分を非表示にする
  • 時間がたつにつれて、円が大きくなりながら消えていくアニメーション

これだけで、冒頭で紹介したようなボタンが完成します。
1つめは簡単です。buttonに overflow: hidden;を指定するだけです。
では2つめはどうでしょうか。これは、CSSアニメーションを使って実装する方法が一般的です。(詳しい説明はよそ様にお願いします→CSSアニメーション 入門 )
では、作ってみます。

Circle_Animation.css
@keyframesrippleEffect{0%{opacity:1;width:0px;height:0px;}40%{opacity:.3;}100%{opacity:0;width:100px;height:100px;}}

始まった直後(0%の時点)は、opacity: 1;としているので、不透明ですが、次第に透明になっていき、終了時(100%の時点)で、 opacity: 0;すなわち完全に透明になっています。さらに、それにしたがって大きさが0pxから100pxになっています。

では、このアニメーションをrippleクラスに適用します。

.ripple{animation-name:rippleEffect;animation-duration:.5s;animation-fill-mode:none;}

0.5sで実行し、その後はCSSアニメーション実行の影響を受けていない状態に戻ります。よって、

.ripple{width:0px;height:0px}

も合わせて指定しておくことで、0.5sたてば、大きさが0pxになってくれます。

ここまで追加したCSSをまとめます。

Circle_Sample_added.css
button{overflow:hidden;}.ripple{width:0px;height:0pxanimation-name:rippleEffect;animation-duration:.5s;animation-fill-mode:none;}@keyframesrippleEffect{0%{opacity:1;width:0px;height:0px;}40%{opacity:.3;}100%{opacity:0;width:100px;height:100px;}}

では、赤い円を表示していたボタンにこれらを追加します。

See the Pen Ripple Effect Final by NumLocker (@numlocker-japan) on CodePen.

いかがでしょうか?
こうして読み解いていくと、決して難しいものではないと思っていただけたのではないでしょうか?

応用編

四角形エフェクト

リップルエフェクトとは呼ばれないと思いますが、今回の応用として四角形のエフェクトも作ってみました。リップルエフェクトとの違いは、はじめの位置がクリック位置と一致するだけでなく、終了位置がborderと一致している点です。時間がかかる処理の前などに入れると見栄えがよさそう...

See the Pen bGNBpEm by NumLocker (@numlocker-japan) on CodePen.

処理の概要

リップルエフェクトと同じ手法で、四角形を描画します。transformによって、CSSアニメーションが終わるまでに、四角形を大きくしながら、中心位置までずらしています。また、クリック位置をCSS変数に代入してCSSアニメーションに組み込んでいるのですが、(他にもっと賢い方法があれば教えてください。*_ _))ペコリ )
また、クリックから時間差でbuttonのborderとcolorをオレンジ色に変更します。これには setTimeout()を用いました。また、色変更がゆっくり行われるのは、buttonに transition: .3s;が指定されているからです。

まとめ

いかがでしたか?はじめは非常に巧みで複雑なエフェクトに見えますが、マスターしてしまえば簡単にクールなボタンが作れます。
アイデア次第でどんなエフェクトにも転用することができることでしょう。ぜひ、誰もが押したくなるボタンを作りましょう!

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

$
0
0

100日チャレンジの186日目

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

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

186日目は


CSS設計で気をつけること

$
0
0

前書き

今回はこのブログ記事の内容を移したものです。

Webシステムの開発はユーザーの方が期待する通りに動くことはもちろん大事ですが、アクセスするページの見栄えが悪かったり、どこに何があるかがわかりにくかったりすると、使う側にとって気持ちよく使えなかったりするので、Webシステムはどう見えるかも結構大切だったりします。

そこで、Webページのデザインを整える役割を持つCSSをどうやって作るかが問題になってきます。 今回は、こちらの本を参考に、CSS設計の中でも一番基本的なところを簡単にまとめてみました。

セレクタの詳細度

CSSの設計を考える上でまず押さえておくべきなのが、「セレクタの詳細度」です。セレクタとは、クラスとかIDとか、スタイルを適用させる要素のことです。ある要素に複数のスタイルが当てられているときには、詳細度の高い方が優先されます(同じ詳細度の場合は後に設定されたものが優先になります)。

セレクタの詳細度は、ずばり以下のようになります。

(1)!important
(2)インライン記述(HTMLのstyle属性)
(3)IDセレクタ
(4)クラスセレクタ・属性セレクタ・擬似クラス (button:first-childなど)
(5)要素セレクタ・擬似要素(::after, ::beforeなど)
(6)ユニバーサルセレクタ(*を使ったもので、他にスタイルが当たってないもの全てに適用される)

例えば、

#red-id{color:red;}.blue-class{color:blue;}

このようになっていた場合、

こんにちは。

この「こんにちは。」はIDセレクタの方がクラスセレクタより優先度が高くなるので、赤く表示されます。

実際にはいくつかのセレクタの組み合わせで適用される要素が決まることが多く、結構複雑になりがちなのですが、例えばクラスセレクタが1つの場合と2つの場合で後者の方が優先されることになります。 このサイトを使ってみると、理解が深まるかもしれません。

この中で、(1)と(2)は保守性の観点から出来れば使わない方が望ましいのですが、なかなか思ったように表示させることができなくて、ついやってしまうことがあります。

そうならないようにも、セレクタをうまくリファクタリングすることが重要になってくるわけです。リファクタリングのコツはいろいろあるのですが、例えばこんな感じです。

要素セレクタを省略する

例えば、以下のようなスタイル設定があったとします。

span.form-control{font-size:14px;}

これは、spanを省略して下のようにしても、多くの場合問題なかったりします。

.form-control{font-size:14px;}

セレクタを短くする

例えば、次のようなケースを考えます。

<ulclass="students"><li><ahref="/student1.html">学生1</a></li><li><ahref="/student2.html">学生2</a></li><li><ahref="/student3.html">学生3</a></li></ul>

これに対して、以下のスタイルを設定することを考えます。

.studentslia{font-weight:bold;}

ここで、HTML5の仕様ではul要素の直下はli要素になるのですが、セレクタはそのようなマークアップの構造に縛られないので、以下のように省略することができます。

.studentsa{font-weight:bold;}

セレクタを限定的にする

例えば、div .dataというふうに書くと、div要素の子要素だけでなく、それの子要素やさらにそれの子要素、・・・という風にdiv以下の全ての要素が影響を受けてしまいます。

div > .dataと書けば、div要素の直下のdataクラスのみに影響範囲を狭めることができます。

クラスセレクタを活用する

セレクタの詳細度一覧を見ても分かる通り、IDセレクタは結構強いセレクタなので、あるIDが含まれる要素の中の一部だけにスタイルを当てたい場合は、IDセレクタを使わずにその部分の要素にクラスを設定し、クラスセレクタでスタイルを設定した方がより柔軟な設計になります。

前の会社にいたときの社内のプログラマによる勉強会でCSSの設計がテーマになったことがあり、その時自分自身発表を聞いていて「あの時はこうすればよかったのか」と思ったりしたので、今回基本的なところをまとめてみました。

実際にはOOCSSとかSMACSSとか、色々な手法があるようなので、余裕がある時にさらに深く勉強して、今後のCSS設計に役立てていきたいです。

追記

とはいっても、例えばAdminLTEなどのCSSフレームワークを導入している場合、そっちの方の設定の方が強力でなかなか思うように設定できない場合もあったりします(しかも、AdminLTE自体が!importantを結構使っていたり)。

そういう場合どうするか悩むところですが、おとなしくCSSフレームワークの設定に合わせるか、CSSフレームワークで使っていないクラス名を設定するか、ケースバイケースとしか言えないでしょうね。もしかしたらこういう時にも定石みたいなのがあるのかもしれないですが、少なくとも僕は知らないです。

追記2

設定したい要素が限定的な場合はまとめて行うプロパティよりも必要な要素に対してのみ働くプロパティを使用したほうが良さそうです。

例えば、背景の色だけを変えたいと言った場合、背景に関する指定をまとめて行うbackgroundよりも、背景色の設定のみを行うbackground-colorを使うといった感じです。

.input-form{background:red;}

ではなく、

.input-form{background-color:red;}

みたいな感じです。

【JavaScript/CSS】スクロールしたら順番に要素を表示するデモ(IntersectionObserver使用)

$
0
0

はじめに

Webページで良く見る、スクロールしたら順番に要素が表示される演出のデモを作成してみました。

JavaScriptのIntersectionObserverを使っています。

環境

OS:macOS Catalina 10.15.1

結論:デモ

各要素の数字は、data-delayを何秒に設定したかです。
参考までに表示してあります。

See the Pen PowbvVx by terufumi (@terufumi1122) on CodePen.

おわりに

最後まで読んで頂きありがとうございました:bow_tone1:

どなたかの参考になれば幸いです:relaxed:

参考にさせて頂いたサイト(いつもありがとうございます)

IntersectionObserver?! Scroll Activated Animations & More with No Dependencies - YouTube

エヴァ感のあるエラー画面をCSSアニメーションで作った話

$
0
0

ブラウザで表示するページを作るとき、つい作り込むのが面倒でサボりがちなのが 「エラーが発生した際にユーザに通知する画面表示」

特に私はインフラエンジニアなので、普段CLI経由での操作が多いため、ちょっとしたコードのエラーハンドリングなどは 「最悪コンソールに表示すればいいや」くらいの感覚であまり「エラーをユーザに通知する部分」の実装に力を入れた経験がありませんでした

この記事ではこちらで紹介したOSSに「サーバで実行したShellScriptと、その実行結果をブラウザに表示する」という機能を追加する際に「ShellScriptがエラー終了したときの画面」を作る必要があったので、その実装方法を紹介します

実際の画面

まずは実際に作った画面を見てみましょう

error-submarine.gif

背景には実際にエラーが発生した際に catchされるオブジェクトをJSONに変換して表示しています

画面の中央で点滅しているのがエヴァ感を演出するメッセージになります

エラーメッセージが英語なので「警告」の文字だけ日本語にするのも統一感がないかと思い、英語でERRORと表示することにしました

エヴァ感について

エラー画面を作る際に、デザインの経験が全くない私が「エラーのような異常事態が発生したときに表示される画面」で、最初に思いついたのが、エヴァの「警告」画面でした

丸パクりするわけにはいかないので、エヴァのあの画面の「警告」感とは、いったいどういった要素で構成されているのか、というのを私なりに考え、以下のポイントをおさえて実装するようにしました

  • 赤or黄のような警戒色 + 黒で画面を埋める
  • 文字(メッセージ)が際立つようになっている(ここでは太くした)
  • 点滅などの比較的動きが早く、注意を引くアニメーションがある

実際の HTML / CSS を見てみる

HTMLタグは単に div要素を使っています。内側の文字は h2pです

error.html
<divid="error_baner"><h2>ERROR</h2><p>Something wrong occurred</p></div>

cssは少し長いです。 flex-boxで文字をレイアウトしていますが、CSSアニメーションとはあまり関係ないので、説明は割愛します

error.css
<style>#error_baner{display:flex;flex-direction:column;justify-content:center;align-items:center;position:fixed;padding:17px17px17px17px;border-style:solid;border-width:4px;border-color:rgba(255,0,0,1.0);border-radius:17px17px17px17px;background-color:rgba(0,0,0,1.0);...(続く)...

ここからが CSSアニメーションにかかわる部分です

error.css
...(続く)...animation:flicker0.85slinear0sinfinitealternatenonerunning;}@keyframesflicker{0%{opacity:0.0;}50%{opacity:0.34;}100%{opacity:0.85;}}#errorh2{font-size:34px;}#errorp{font-size:17px;}

@keyframe flickerの中で時間変化(%で表現)にともなって opacity (要素の不透明度)を変化させるように定義しておいて、それを実際の要素に適用するときには animation: flicker ...と指定します

そしてアニメーションのスピードや開始時間の遅延などをのパラメータを設定すれば、完成です

CSSアニメーションの使い方の説明は、探せばより詳しい記事が出てきますので、こちらでは簡単に説明します

animation:<animation-nameアニメーションの名前(@keyframesで指定した名前)><animation-durationアニメーション開始から終了までの時間><animation-delayアニメーション開始までの遅延時間><animation-iteration-countアニメーションを繰り返す回数><animation-directionアニメーションの再生方向(0%->100%,100%->0%など)><animation-timing-functionアニメーションの緩急の付け方><animation-fill-modeアニメーション終了後にもcssを適用したままにするか><animation-play-stateアニメーションを実行するか>

おわりに

CSSアニメーションが登場したおかげで、デザイナーでもフロントエンドエンジニアでもない私でも、JavaScriptをこねくり回すことも無く、凝った表現を実現する敷居がかなり下がったように思います

今後エラー画面を実装する方に、何らかのインスピレーションになればと思います

webpack初心者がstylelintのCSSプロパティの並び替えを行ってみた

$
0
0

この記事はウェブクルー Advent Calendar 2019の18日目の記事です。
昨日は@yuko-tsutsuiさんのRailsAdminと遊ぼう~カスタマイズ戦記~でした。

はじめに

弊社ではチーム内でCSSプロパティの記載順序が決まってはいましたが、人によってCSSプロパティの記載順序がバラバラであったり、新しく入社された方がその順番を覚えるのに手間となってしまう問題がありました。
上記の問題を抱えている際に、私が新規サービスに携わる機会があったので、新規サービスで記載順序の見直しや、記載順序を自動で行ってくれるstylelintのorderモジュールの導入を行いました。
その際orderモジュールのカスタマイズについて日本語で説明されいたものがなかったので、ここにまとめてみたいと思います。
Sassを用いており、webpackは事前に入っており、npmはインストールされているということを前提としておきます。

導入するうえでの手順

プラグインの選定

今回は、CSSプロパティの記載順序を自分でカスタマイズしたかったので、stylelint-orderプラグインを導入しました。
このプラグインは本来、CSSプロパティをアルファベット順に並べるものですが、自身でカスタマイズできるようにしています。
カスタマイズできるように下記のjsonファイルを作成します。(名前は任意で大丈夫です)
また、今回は、Sassを使用しているのでstylelint-scssプラグインも使用しております。

{"plugins":["stylelint-scss","stylelint-order",]"rules":["order/properties-order":["_comment":"自分の好きなCSSプロパティの記載順序を書いていく",]]}

本来ならば手書きで一つずつCSSプロパティを書くのですが、かなり手間になるのであらかじめ記載順序が決まっているプラグイン等があるのでそこから持ってくるのがベストです。私は、現在一番CSSプロパティが準備されているstylelint-config-recess-orderから必要なプロパティを持ってきて並び替えました。

taskの追加

webpackのpackage.jsonに以下のタスクの追加をしてください

タスク名 stylelint --config 設定したjsonファイル --fix 並べ替えを行いたいscssファイルor並べ替えを行いたいscssファイルの改装

上記のコードを解説していきます。--configでCSSプロパティの記載順序を設定したjsonファイルを設定します。そして--fixですが、これもCSSプロパティの記載順序を並び替える上で重要で--fixがなかった場合、指定していた記載順序と違った数だけにエラーが表示され流だけで自動で並び替えを行ってくれません。
--fixをつけることによって強制的にCSSプロパティを並び替えています。

taskを走らせる

コマンドnpm タスク名を入力し、タスクを走らせる。タスクを走らせると下記の画像のように勝手にCSSプロパティを並び替えてくれます。
stylelint4.gif

最後に

今回、弊社の新規サービスでstylelintの並び替えのタスクを追加した事によって、CSSの記載順序を気にする事なく、コーディング可能な環境を作成できました。これによりプロパティが重複する等の問題も少なくなり、第三者がSCSSファイル等をいじる際も読み解きやすいSCSSファイルを運用しやすくなったのではないかと感じております。
また今回、このCSSプロパティの記載順序を決定する際にもチームメンバーで話し合い再度記載順序を見直すなどの良い機会になりました。
皆さんもぜひCSSを効率的に運用できるように見直してみてはどうでしょうか。

明日の記事は@haruka_kouyamaさんです。
よろしくお願いします。

Font AwesomeってほんとAwesome

$
0
0

3度目まして こんにちは!:penguin:
こちらはSC(非公式) Advent Calendar 2019 18日目の記事になります!

一応自己紹介

ついに社会人4年目となってしまい新人の枠から外れたOsanuです:baby_tone1:
永遠に新人でいたかった:;(∩´﹏`∩);:
もう12月ですね...ちょっと5年目が見えてきて怖いです。思っていた5年目と私の乖離がすごい。笑

最近あった良いことは猫を飼い始めて毎日かわいい毛玉ともふもふライフしていること
最近あった悪いことは2年次の私がボーナスはたいて買ったSurfaceが享年2歳で逝ったこと
全データ飛んだのでいつものお絵描きは載せられません:no_good_tone1:

皆さんより全然プログラミングスキルもないしUI以外全然勉強してないので
UI関連のことばかり書いていますがなんだかんだ3年間皆勤してます
今年もUIのこと書かせていただきます 社内では寡占市場ってことで何卒:bow_tone1:

今年は何かと仕事で使った:sparkles:Font Awesome:sparkles:について書きます

Font Awesomeとは

Get vector icons and social logos on your website with Font Awesome, the web's most popular icon set and toolkit.
(公式サイトより)

つまりはベクター形式(大きさ変えてもぼやけたりかくかくしないやつですね)の
アイコンフォントです。
無料プランでも1500種くらいあって、勿論商用利用もOKです:ok_hand_tone1:
(有料プランだと7000種くらい!多杉内)
公式サイト見ていただくとわかると思うんですけど死ぬほど種類あるので
もうフリーアイコンをいちいち探して透過して~~ってやらなくていい。神。:angel_tone2:

マテリアルデザインで直感で操作を理解できるアイコンボタンが多く使われているので
色んな所で見かけますね。画面開発で使う機会も多いのでは。

使い方

使い方としては、CDNを使用する方法と
フォントをダウンロードして、サーバーに配置する方法の2種類あります。

CDN

htmlのhead内に以下を追加します。

<script defer src="https://use.fontawesome.com/releases/v5.12.0/js/all.js"></script>

これは公式のマイページに表示されているscriptタグでもOKです。

サーバー配置

①公式ページからダウンロードします。
https://fontawesome.com/how-to-use/on-the-web/setup/hosting-font-awesome-yourself

②任意のパスに配置します。
この時all.min.cssとwebfontsファイルの相対関係が崩れないようにしてください。
image.png
all.min.cssの一階層上にwebfontsがあるのが正解です。
要らないファイルは削除して構いません。

③linkタグでファイル指定

<link rel='stylesheet' href='{該当ファイルへのパス}/css/all.min.css' 
type='text/css' media='all' />

これで使用する準備が出来ました!

早速ボタンに入れてみよう

とりあえず仮の姿はこんな感じ

<head>
    <link rel='stylesheet' href='./fontawesome-free-5.12.0-web/css/all.min.css' type='text/css' media='all' />
</head>
<body>
    <div class="box">ツリー</div>
</body>
</html>

image.png

普通にボタンじゃないけどフラットデザインのボタンっぽいやつってことで堪忍:;(∩´﹏`∩);:
ここに入れていきます!
折角アドベントカレンダーなのでクリスマスにちなんだアイコンにしましょう!

image.png

わーいクリスマスツリーだー()
こんなボタンいつ使うねんって感じですが上の方にいて目に入ったので
今回はこれにします。

因みに有料プランになると画像右側にあるPROマークのアイコンも使うことができます。

HTMLに記載するパターン

image.png
上部のここにhtmlが書いてありますのでそのままコピるだけです。
htmlをクリックするとクリップボードにコピってくれます。

<body>
    <div class="box">
        <i class="fas fa-air-freshener"></i>
    </div>
</body>

それをこんな感じで貼り付けて。ドン!
image.png

はい!導入出来ました!
めっちゃ簡単ですよね。

CSSに記載するパターン

同じアイコンだと導入できたかわかんないのでアイコン変えます。
image.png

公式のIconページでxmasで検索すると...
image.png
まあまあヒットしましたね!giftにしましょう。

image.png
giftアイコンのunicodeはf06bですね。

まずhtmlをこんな感じで用意します。

<body>
    <div class="box">
        <p></p>
    </div>
</body>

そしてこのpタグに疑似要素でスタイル指定していきます。

    p:after {
        font-family: 'Font Awesome 5 Free';
        content: '\f06b';
        font-weight: 900;
    }

FontAwesomeは普通にフォント指定するときと同じように使えるので
font-familyでFont Awesomeを指定します。
今回は最新の無料版を指定するので'Font Awesome 5 Free'となります。

そしてcontentでunicodeを指定します。
さっき確認したgiftのunicodeはf06bだったのでそのように記載します。
その時「¥」を忘れないようにしてください。

またfont-weightですが無料版だと400もしくは900しか使えないようになっています。
物によっては900しか使えないので表示してみて確認してください。
ちなみにgiftは900しか使えませんでした。
400にするとimage.pngこうなります。

ではこのスタイルを指定して更新すると
image.png ←ばっちりですね!

どっちもめっちゃ簡単に導入することができました!

何がAwesomeなのか

個人的意見ですがまとめ。

導入が簡単

見ていただいた通りほぼ説明要らんやろレベルで簡単です。

種類が豊富、かつ色・サイズ変え自由

無料版で1500種類を超えるアイコンの数。めっちゃ豊富だと思います。
そしてこれらはスタイル指定で色変え・サイズ変えも自由ですし
ベクター形式のファイルなので潰れたりぼやけたりカクついたりしません。

ちなみにcssでなくてもclassに入れることでいろんな種類のサイズ変更が出来ます。
たとえばこれ。

<div class="box">
        <i class="fas fa-air-freshener"></i>
    </div>
    <div class="box">
        <i class="fas fa-air-freshener fa-2x"></i>
    </div>
    <div class="box">
        <i class="fas fa-air-freshener fa-3x"></i>
    </div>

image.png

classにfa-nxを追加すると2倍、3倍と大きくすることが出来ます。
因みにこれは10倍までできます。

等幅、回転など色々オプションがありますがこちらの方のブログが
大変詳しく書いてありましたのでご参照ください。:bow_tone1:
https://webdesign-trends.net/entry/8351

前述したようにこういった直感的デザインのアイコンの使用は
現在すでに主流になっていますので使用する機会は多いと思います。
ぜひFontAwesome、簡単なので使用候補に入れてみてはいががでしょうか!:sparkles:

わ~~最初せめて賑やかな記事にしようと絵文字を無駄に使いましたが
最後の方は使う暇もないほどに駆け足になってしまいました!笑

以上です!:raised_hands_tone1:
読んでいただきありがとうございました:relaxed:

p.s
書き終わって気付きましたがタイトルは駄洒落にしたつもりではありませんでした!
でもまじで時間がないし、いいタイトル思いつかないので直さず行きます!
優しい皆さんあまり触れないでください!:see_no_evil:w

めっちゃ汎用的なアコーディオンメニューを作ろう

$
0
0

JavaScript 2 Advent Calendar 2019の18日目の記事です。

使うもの

HTML,CSS(SCSS),jQuery

目的

・どんなデザインでも使える
・既にあるコードにも適用が容易
そんな汎用的なアコーディオンメニューを作る

どちらかといえばCSS寄りの内容かも…?(カレンダー新設する勇気が無かったのでjsにお邪魔しています…:relaxed:)

概要

:fist::fist::fist:とにかく装飾と分離する!!:fist::fist::fist:
汎用的に作るにはこれが重要です

装飾は装飾、機能は機能でクラスをわけましょう

<!-- HTML --><divclass="js_acc_trigger acc_trigger"></div><divclass="js_acc_content acc_content"></div>

上記のように、今回用意するクラスは4つだけ
(状態を表すためにjsで付与する.is_openも含めると5つ)

  1. jsでアコーディオンの開閉状態を操作する用の2つのクラス
    .js_acc_trigger←イベントのトリガーにつける ボタン的な役割
    .js_acc_content←このクラスがついた要素の中にアコーディオンの中身を入れる

  2. CSSでアコーディオンが開いたり閉じたりする見た目を記述する用の2つのクラス
    .acc_trigger
    .acc_content

//jQuery//アコーディオンメニューvaraccordionFix=function(evt){evt.stopPropagation();if($(this).hasClass('is_open')){$(this).next('.js_acc_content').removeClass('is_open');$(this).removeClass('is_open');}else{$(this).next('.js_acc_content').addClass('is_open');$(this).addClass('is_open');}}$('.js_acc_trigger').on('click',accordionFix);

「.js_acc_trigger」に「.is_open」クラスがついていたら、外す&
「.js_acc_trigger」の直後の「.js_acc_content」からも「.is_open」を外す

「.js_acc_trigger」に「.is_open」クラスがついていなかったら、つける&
「.js_acc_trigger」の直後の「.js_acc_content」にも「.is_open」をつける

現実世界のスイッチ的な感じで、押す度にONとOFFを切り替えます。

//SCSS.acc_trigger{&.is_open{//+-アイコン.fa-plus-circle::before{content:'\f056';}//矢印アイコン.fa-chevron-down::before{content:'\f077';}}}.acc_content{display:none;&.is_open{display:block;}}

↑CSSはこんな感じで、基本的に表示か非表示のみ。装飾用のスタイルを含めないようにします。
.acc_contentにborderをつけたい、とかアイコンのサイズを変更したい、といった場合は装飾用のクラスを作ってそちらで対応します。

どう使い勝手が良いのか

たとえば既存コードでなんか色々クラスがあって装飾されていても…


See the Pen
acc1
by xyuno0717 (@xyuno0717)
on CodePen.


↓こんな感じで、divで囲んで4つのクラスをつけ足すだけで、既存のHTMLが簡単にアコーディオンになります。


See the Pen
acc2
by xyuno0717 (@xyuno0717)
on CodePen.



押せることがわかりやすいようにアイコンもつけて、「.is_open」クラスによって「+-」を切り替えたりすると見た目もわかりやすくて良い感じになります

終わり

こういう汎用的なものをどんどん作って作業を効率化していきたいですね!

イベントに釣られてQiita初投稿しました。
メルカリさん・メルペイさん、クリスマスプレゼントが欲しいです!!!よろしくおねがいします!

HTML/CSS復習 marginの相殺及びmarginの無効化について

$
0
0

はじめに

現在自分はHTMLとCSSをもう一度復習しようと思い、HTML・CSSのモダンコーディングという技術書で復習をしています。
今回は、その復習途中で出会った、新しく覚えたことや重要な部分をまとめていきたいと思います。

marginの相殺

marginとは、borderの外側の余白のことを言い、上下のmarginが隣接する別のmarginと重なってしまった場合、marginの総裁が起きてしまいます。

marginの無効化

今まで気づかなかったのですが、小要素の上下のmarginは無効化されてしまいます。
その解決策としては、親要素にborderプロパティで明確なborderを作ることや、小要素に実際にmarginを設定するのではなく親要素のpaddingを設定することで解決することができます。


オリジナルWebサービス -Lunches- (フルスクラッチ開発)

$
0
0

はじめに

フロントエンジニアを目指してプログラミング学習をしている小林と申します。
本記事ではオリジナルWebサービス「Lunches」の概要や制作過程について説明します。

スクリーンショット 2019-11-08 午後5.15.02.png

URL

リンク:Lunches

目的

  • フルスクラッチ開発でPHP、SQLの言語理解を深める
  • Webサービスの基本的な構成、動作を把握する

スペック

プログラミング言語:HTML5/ CSS3 / Javascript / PHP

データベース言語:MySQL

開発環境:macOS Catalina 10.15.1

バージョン管理:SourceTree

本番環境:さくらサーバー

機能

ユーザー管理機能
 ・ユーザー登録
 ・ログイン
 ・プロフィール編集
 ・ユーザー削除機能
 ・退会

イベント機能(メインサービス)
 ・イベント投稿
 ・イベント詳細
 ・イベント一覧(ページネーション)
 ・カテゴリー検索、日付検索

サービス概要

「Lunches」はランチタイムに恋愛やビジネス、友達作りなどもイベントを気軽に開催することができる 
Webサービスです。
インターネットを通じて人との交流を活性化させることを目的として制作しました。

開発手順

1.ワイヤーフレーム作成

7つブラウザ画面をノートに手書きでワイヤーフレームを作成しました。

2.テーブル設計

実装させたい機能から必要な情報を洗い出し、それに応じてテーブルを作成しました。
作成したテーブルは以下の3つです。

users
users.png

event
event.png

category
category.png

3.画面モック作成

ワイヤーフレームを元にHTML・CSSでコーディングを行い画面モックを作成しました。

セキュリティ

バリデーションチェック

 ・未入力チェック
 ・Email型式チェック(正規表現)
 ・Email重複チェック
 ・最大、最小文字数チェック
 ・半角英数字チェック
 ・同値チェック

*コード一部抜粋
スクリーンショット 2019-11-27 22.18.15.png

例外処理

DBへ接続する際にはエラーで接続できない可能性を考慮して「try」「catch」で例外処理を行っています。
スクリーンショット 2019-11-29 21.11.58.png

セッションIDの再生成

セッションハイジャックによって第三者による乗っ取りを防ぐためにsession_regenerate_idを使用
この関数をコールすることで現在のセッションデータを保持したまま、セッションIDを新しくすることができる。
session.png

パスワードハッシュ

スクリーンショット 2019-11-29 22.20.27.png
DB側でユーザーのパスワードが漏れないようにパスワードをpassword_hashでセキュリティを高めています。

スクリーンショット 2019-12-04 19.54.15.png

ログイン時にはpassword_verifyを使用してハッシュ化されたパスワードと照合しています。
このとき第一引数である$passにはフォームからpostされたパスワード
そして、第二引数にはDBから配列形式で取り出した情報を$resultに詰め
array_shiftを使って先頭のパスワードを取り出しています。

SQLインジェクション対策

DB接続時にはプレースホルダーを使用し、SQL文を作成。
値をバインドすることでSQLインジェクション対策を行っています。
スクリーンショット 2019-12-04 21.30.56.png

Lunchesの使い方

①イベントの登録・ プロフィール編集

スクリーンショット 2019-12-18 14.18.27.png
イベント投稿、プロフィール編集の画像登録ではjQueryを使用し、ドラック&ドロップでファイルをinputすることができます。

②イベント一覧・検索機能

スクリーンショット 2019-12-18 14.25.58.png
イベント一覧ページではGETパラメータを使用して、ページネーションと検索機能を実装しています。
検索機能はカテゴリー検索、投稿日時のソート順検索ができます。

今後の課題

・スマートフォンにも対応したレスポンシブデザイン
・オブジェクト指向に基づく、保守性の高いコード設計
・FLOCSSをベースとしたCSS設計

主に以上の3点です。
特に様々なデバイスからアクセスされるユーザーを想定したレスポンシブデザインでの設計は
現在のWebサービスでは必要不可欠な物だと思いました。

flexboxを使用した横スクロール可能なレイアウト

$
0
0

概要

cssのflexboxを使用しつつ、横スクロールが可能なレイアウトのサンプルです。flexの設定ですこし手間取ったので記録しておきます。要件は以下の通り。

  • 横幅を縮めると横スクロールになる
  • 横幅を広げると中身の数で均等に別れる
  • 中身の文字列が多い時は、改行せずに横幅が広がる

サンプル

See the Pen scroll-x flexbox by T_Y (@y___k) on CodePen.

flexboxの外側でoverflow-x: autoして、中身にflex設定をするだけです。
flexは、flex-grow, flex-shrink, flex-basis の一括指定プロパティです。(MDN

flex.scss
.item{flex:10200px;// flex-grow: 1; … 横幅を広げた時にいっぱいまで広がるように設定// flex-shrink: 0; … 横幅が調整されて縮まらないように設定// flex-basis: 200px … 基本の幅を指定}

備考

IE、Edgeは未確認です。確認後に追記します。

@contentを使って、@mixinにスタイルセットを渡す

$
0
0

@mixin(ミックスイン)おさらい

Mixin(ミックスイン)はプログラミングの関数に近い。
関数というよりCSSスニペットに名前を付けていつでもどこでも呼び出せるというイメージ。

mixの呼び出しは@includeで呼び出す

app.css
/*
ミックスイン
よく使うものをスニペットとして保存しておこう
*//* 
ミックスインの作り方
頭に@mixinを付ける

@mixin 名前($変数1,$変数2,...){

    プロパティ1:$変数1;
    プロパティ2:$変数2;
    プロパティ3:$変数1 $変数2 ...;
}
*//*
ミックスインの使い方 
頭に@includeを付ける

@include 名前(値1,値2,...);
*/(例)@mixinbtn(){display:block;padding:20px30px;color:#fff;border-radius:6px;cursor:pointer;background-color:#20aee5;text:{decoration:none;align:center;}}.footer__sns__btn{@includebtn();//『@includeclass名()』で呼び出し}

@contentの使い方

@mixinの中で@content;と記述するとコンテントブロックを渡すことができる
・ これにより1つのmixinで呼び出し側に合わせた処理が可能

例えば、mixin,scssというscssファイルに
スマートフォンでのレスポンシブを@mixin似て呼び出せるようにしておきます。

mixin.scss
@mixinsp{@mediascreenand(max-width:767px){@content;}}
例.scss
.p-top-training{margin:60pxauto;padding-bottom:98px;position:reltive;@includesp{margin-top:.8rem;padding:0.2rem.6rem0;}&-content{background:url(/xxx/xxx.jpg)no-repeatcenter/cover;width:1120px;height:600px;padding:100px100px155px420px;@includesp{background:url(/xxx/xxx.jpg)no-repeatcenter/content;height:5rem;padding:.6rem.4rem.8rem;width:355px;}}&-background{background:url(/xxx/xxx.png)no-repeatcenter/contain;width:1276px;height:240px;position:absolute;right:0;bottom:-29px;z-index:-5;}&-title{font-size:60px;letter-spacing:6px;color:#fff;text-align:center;@includesp{font-size:.4rem;letter-spacing:.04rem;}}

WordpressのDBから自作SQLを使ってアイキャッチ画像を取得した結果わかったこと

$
0
0

1はじめに

Wordpressを勉強する人が最初にやることは、環境構築と管理画面の使い方だと思いますが!私はなんとデータベースから入りまして、管理画面⇒フォルダ構成と、なぜか逆走しながらWordpressを勉強中。今回は自作SQLを使ってアイキャッチ画像を取得したときのアハ体験をまとめました。

Wordpressのデータの全てはWP_POSTSが握っている!?

Wordpressの便利なところは、ネットで検索すればなんでも出てくるところ。それだけユーザが多く、みんな困ったことを共有しているからなのでしょう。
Wordpressのデータベース(以下、DB)は、全部で12テーブルしかないとてもシンプルなもの。こんなにいろいろ出来るのに、12テーブルしか持ってないことに驚きを隠せないのですが、本当すごいですね…。(※でもこの後、データベースの構造的には否定的な見解になってきたのでそれはまた後日。)
Wordpressの主となるデータは全てWP_POSTSにあると言ってもいいくらい、このテーブルはとっても重要なテーブルです。固定ページ・記事ページ・画像など、画面で見えるページのほとんどをこのテーブルで管理しています。

※参考:Wordpress Codex 日本語版(データベース構造)
http://wpdocs.osdn.jp/%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E6%A7%8B%E9%80%A0

記事とアイキャッチ画像の紐づけはWP_POSTMETAで管理!

今回、記事に使われているアイキャッチ画像のURLを取得するためネットで調べていたのですが、どのサイトもPHPの処理ありきで書いてあるではありませんか。いやいや、私はSQL1本でとってきたいのです。だって、PHP分かんないんだもん(´;ω;`)
でも、どの方法を見てもWP_POSTMETAmeta_key="_thumnail"を条件に何かをみているではありませんか!(そういうのは分かる。笑)
どうやら、記事に使われているアイキャッチ画像の居場所を教えてくれているみたい…。ってか!数字しか書いてない!!どゆこと?と思ったら、どうやらその数字は、WP_POSTSのID情報だということが分かりました。(さすが!すべてを握っているテーブル!!)

アイキャッチ画像自体の情報はやっぱりWP_POSTSにある!

さっそくアイキャッチ画像のIDを指定して表示したところ、見事!WP_POSTSguidにアイキャッチ画像のURLが格納されていました。神!これで、記事に使われているアイキャッチ画像の保存先を特定することが出来ました。

アイキャッチ画像取得のために作成した鬼SQLがこちら↓↓↓

下記に記載するSQLは、アイキャッチ画像を取得するためだけのSQLではなく、「現在公開中の記事&ある特定のタグが付いている記事」という条件も追加しているSQLになっています。なので、途中ごちゃごちゃやっててすみません。
[xxxxx]のところは、限定したいタグのタグIDを記載するところなので、このまま実行しても動かないのでご注意ください。

selectpost_list.id,post_list.term_id,post_list.name,post_list.post_title,post_list.post_date,img_list.guidfrom(selectpost.meta_id,post.id,tag.term_id,tag.name,post.post_title,post.post_datefrom(selectwp_postmeta.meta_id,wp_posts.ID,wp_posts.post_title,wp_posts.post_datefromwp_postmetaleftjoinwp_postsonwp_postmeta.post_id=wp_posts.idwherewp_postmeta.meta_key='_thumbnail_id')aspostleftjoin(selectwp_posts.id,wp_terms.term_id,wp_terms.namefromwp_postsleftjoinwp_term_relationshipsonwp_posts.ID=wp_term_relationships.object_idleftjoinwp_term_taxonomyonwp_term_relationships.term_taxonomy_id=wp_term_taxonomy.term_taxonomy_idleftjoinwp_termsonwp_term_taxonomy.term_id=wp_terms.term_idwherewp_posts.post_status='publish'andwp_term_taxonomy.taxonomy='post_tag')astagonpost.id=tag.id)aspost_listleftjoin(selectwp_postmeta.meta_id,wp_postmeta.meta_value,wp_posts.guidfromwp_postmetaleftjoinwp_postsonwp_postmeta.meta_value=wp_posts.idwherewp_postmeta.meta_key='_thumbnail_id')asimg_listonpost_list.meta_id=img_list.meta_idwherepost_list.term_id='[xxxxx]'orderbypost_list.post_dateDESC;

「長くて読む気にならん…汗」と近くに座っている人に言われたのですが(笑)、WP_POSTSが記事ページやら画像情報やらを全部レコード単位で保持しているのでややこしいだけで、実は結構考え方は簡単です。
上記SQLでは大きく分けて、post_listという私が勝手に名前を付けたSQL内のテーブルと、img_listというこれまた私が勝手に名前を付けたSQL内のテーブルが結合されています。それぞれのテーブルは、どちらもWP_POSTSから必要なデータを取得しています。つまり!WP_POSTSテーブル同士を結合させ、記事とアイキャッチ画像を紐づけているWP_POSTMETAで繋いでいる、そんなイメージで作成しました。(何言ってるか分からなかったらすみません…。)

WP_POSTSにあるpost_parentに騙されてはいけない!

はい、ここが今回のアハ体験によって声を大にして言いたいところです!!!
アイキャッチ画像のレコードを眺めていると、WP_POSTSpost_parentに設定されている記事のIDが記載されているではありませんか!おお!WP_POSTMETAで確認しなくても、ここで見ればええやん!って早とちりしてまんまとハマりました。
このpost_paretには、確かにアイキャッチ画像を設定した記事IDが入ることもあるのですが、100%アイキャッチ画像として設定されている記事IDがセットされているわけではないのです。

アイキャッチ画像の場合、WP_POSTSpost_parentの格納IDは管理画面の操作によって異なる

今となってはちょっとずつ理解できているのでなんとなく分かることも多いですが、これを調べていた時の私はWordpress Codexの各テーブルのフィールド解説を読んでもチンプンカン。親ってなんや!添付ファイルが所属する記事IDってなんや!何がどう違うんやっ!!!ってほぼほぼ半泣き。笑
アイキャッチ画像の登録をいろいろな方法で試してみた結果、post_parentに格納されるIDが3パターン存在することが分かりました。

パターン1:記事編集画面にあるところからアイキャッチ画像を新規登録
⇒この場合は記事IDが格納されます。

パターン2:メディアに新規登録したあと、記事編集画面からアイキャッチ画像を登録
⇒この場合は記事に依存しない画像という扱いになるので、一律ゼロが格納されます。

パターン3:他の記事で使用・登録された画像を作成中記事のアイキャッチ画像として使う
⇒この場合、流用元の記事IDが格納されます。

まとめ

WordpressはDBやプログラムが分からなくても簡単にWebサイトが作成出来るのが売りなのに、完全無視してDBを穴が開くほど見た結果、ちょっと楽しくなってきちゃいました。(今となっては前職の経験に感謝!笑)おそらく需要はないと思いますが、まだまだ同じようなアハ体験がけっこうあるので、ちょこちょこまとめて行きたいと思います。

おまけ

現在、絶賛中途採用募集中です!
もしご興味ありましたら、中途採用ページよりご応募ください。
※小声)一生懸命、中途採用ページをリニューアルしたので見に来てください!笑

■株式会社サンシーア@上野(最寄り駅:銀座線 稲荷町駅)
https://www.sunseer.co.jp/recruit/careers/position.html

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

$
0
0

100日チャレンジの187日目

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

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

187日目は

Viewing all 8563 articles
Browse latest View live


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