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

n件ずつ表示する「もっと見る」ボタンのシンプル実装

$
0
0

私はなぜか「もっと見る」ボタンを実装することがやたらと多いので、いろいろなやり方を試す中で「これが一番シンプル!」と発見した方法を書いておきます。

要件

今回は以下のような要件の「もっと見る」ボタンを実装します。
more_btn.gif

  • 一覧があり、最初は6件表示されている
  • 「もっと見る」ボタンをクリックすると6件ずつ表示される
  • もっと見るものがなくなったら、「もっと見る」ボタンは消える
  • データのロードは最初に全件行う。「もっと見る」をクリックしたときにロードするわけではない
  • したがって、速度を速くする目的ではなく、一覧の量が多いので隠しておきたい時に使えるものを実装する

デモ

デモを作成しましたので以下のリンクから動作確認ができます。
もっと見るボタン - codepen

この「もっと見る」ボタンのおすすめポイント

  • jsがたったの8行!
  • htmlはn件ごとにdivで区切ったりする必要なし
  • 「もっと見る」をクリックして出現する時、ささやかなアニメーションつき

実装のポイント

詳しい実装はデモのcodepenを見てほしいのですが、jQueryでやっていることは下記のような内容です。

  1. 最初の6件以外を非表示にする
  2. 「もっと見る」をクリックしたら、非表示になっている項目の頭から6件だけ表示する
  3. 表示後、非表示の項目が0件の場合は、「もっと見る」ボタンを非表示にする

実装は以下のようになっています。

JavaScript
varmoreNum=6;$('.list li:nth-child(n + '+(moreNum+1)+')').addClass('is-hidden');$('.more').on('click',function(){$('.list li.is-hidden').slice(0,moreNum).removeClass('is-hidden');if($('.list li.is-hidden').length==0){$('.more').fadeOut();}});

1. 最初の6件以外を非表示にする

「最初の6件以外」をどう取得するかがポイントですが、cssのnth-childという疑似クラスを使用しました。以下のコードの部分です。

$('.list li:nth-child(n + '+(moreNum+1)+')').addClass('is-hidden');

.list li:nth-child(n + 7)とすることで、「listクラス内のliタグの7番目以降」が取得できます。nth-childは大変便利で、jsでロジックを書かなくてもcssのセレクタだけでn番目、n以前、n以降、最初、最後などが取得できます。

2. 「もっと見る」をクリックしたら、非表示になっている項目の頭から6件だけ表示する

こちらは以下のような実装をしました。

$('.list li.is-hidden').slice(0,moreNum).removeClass('is-hidden');

非表示の要素にはis-hiddenクラスが付与されるので、これをセレクタにします。
6件目までを取得するには配列のsliceメソッドを使用しています。sliceは、配列の0から6までの要素をコピーして新しい配列を返すメソッドです。

最初はnth-childでできないか試してみたのですが、この場合では難しかったです。
li.is-hidden:nth-child(-n + 6)とか
li.is-hidden:nth-of-type(-n + 6)とか
これらはうまくいきません。理由はnth-childnth-of-typeもタグに対して何番目かを選択できるもので、is-hiddenなどのクラス要素内で何番目かは選択できないのでした。

スライドアニメーションの実装方法

アニメーションはcssで実装しています。以下はアニメーション部分のcssの抜粋です。

css
.listli{opacity:1;height:32px;margin-top:10px;transition:all0.4sease0s;}.listli.is-hidden{opacity:0;height:0;margin:0;}

.list li {...}に書かれているのが表示状態のスタイルで、
.list li.is-hidden {...}に書かれているのが非表示状態です。
非表示→表示に変わる時の変化の指定をしているのが、transitionプロパティです。transitionはアニメーション関連の設定のショートハンドです。一言で解説すると「0.4秒で変化しろ!」という指定となっています!

「非表示のスタイルはdisplay:none;でいいんじゃないの?」と思う方もいるかもしれませんが、ダメなのです。
transitionできるプロパティとできないプロパティがあるためです。そのため、非表示→表示や表示→非表示にアニメーションを入れたい場合、opacity(透明度)をよく使っています。fadeIn・fadeOutの効果が出せておすすめです。
今回はheightにも変化をつけたため、「fadeInしながらスライド」みたいなアニメーションになりました。

この実装の問題点

初回表示時に全件表示されたあと7件目以降が隠れるところのが一瞬見えてしまいます。もっと良い実装をするなら、アニメーション時だけ特定のクラスを付与すると良いのですが…それはまたの機会に…。
気になる場合はアニメーションをやめると良いと思います。

まとめ

css疑似クラスのnth-childやjs配列のsliceメソッドを使って、n番目以降やn番目以前を取得する方法をご紹介しました。こういうテクを知っていればごりごりロジックを書く必要がなくなって便利ですね!

参考記事

何番目系の便利なCSSまとめ
【CSS】nth-childとnth-of-typeでもう混乱しない。
【CSS3】Transition(変化)関連のまとめ


ブラウザー上でも4桁のtabを入力したい

$
0
0

TEXTAREAでTabキーを入力したい

ブラウザー上ではTabキーを打つとフォーカスが次の入力欄に移ります。当たり前ですよね。
なので仕方なくコピペでTabを入力したりします。それとTab幅は4桁にしてほしい(Qiitaの投稿欄も…)。
色分け表示のテキストエディターは各種ありますが、もっと軽いもので良いんです。

tabbedText.html
<textarea></textarea><style>textarea{-moz-tab-size:4;/* for Firefox */-o-tab-size:4;/* for Opera */tab-size:4;font-family:monospace;}</style><script src="tabbedText.js"type="text/javascript"></script>
tabbedText.js
textarea=document.getElementsByTagName('TEXTAREA');for(i=0;i<textarea.length;i++){textarea[i].addEventListener('keydown',function(event){switch(event.key){case'Tab':event.preventDefault();pos=event.target.selectionStart;val=event.target.value;val=val.substr(0,pos)+String.fromCharCode(event.keyCode)+val.substr(pos);event.target.value=val;event.target.selectionStart=pos+1;event.target.selectionEnd=pos+1;returnfalse;default:returntrue;// 通常の文字入力をさせる}returnfalse;},false);}

まずはこれだけ! テキストエディタの拡張機能の導入!(VScode)

$
0
0

まずはこれだけ! テキストエディタの拡張機能の導入!

「テキストエディタ導入できたけどいきなりコード書いていいの?」
もちろん書いていいです!
でもその前に少しだけテキストエディタをカスタマイズして使いやすくしましょう!

 わかりやすく解説します。

ペルソナ

  • プログラミングをこれから勉強しようとしている方
  • 初めてプログラミングを書こうと思っている方
  • テキストエディタ導入できた方

まだ導入できていない方はこちらを参照してください

内容

テキストエディタの拡張機能の導入(詳しいコーディングは解説しません)

Key Word

  • 拡張機能(extensions)

目次

1.拡張機能とは?
2.実際に導入してみる
3.まとめ

Contents

1.拡張機能とは?

前回のまずはこれだけ!テキストエディタの導入!(VScode)で、
テキストエディタをダウンロードして使う理由の一つに、
プログラミング開発に特化したカスタマイズができるからとご紹介しました。

そのカスタマイズのことを拡張機能(extensions)と言います!
(ちなみにextensionsという英語を覚える必要は全くないです)

実際にプログラミングをする前に、最低限の拡張機能を入れておきましょう!
(とにかくプログラミングやらせてよ!という方はこの記事は読み飛ばしても構いません!
ただ、おそらく何処かのタイミングで実装することになると思うのでその時振り返ってみてください)

2.実際に導入してみる

では、早速導入しましょう!

① VScodeを開く
commandキー+スペースキーで検索ボックスを開き、VSと打てば見つかると思います。
(ここでは詳細省きますが、VScodeがいつでも開きやすいようにDesktopや、Macであれば「DOCK」に
移動してもいいですね)

Image from Gyazo

拡張機能をインストールする

無事にVScodeを開けたでしょうか。

では拡張機能のインストールをしていきましょう!

まずはVScodeの左のサイドバーに
VScode拡張機能ボタン.png

このボタン見つかるでしょうか?
こちらをクリックしてください。

Image from Gyazo

なにやらタブが開いたと思います。
(実際の画面は個人で異なることがあるため、上記と全く一緒でなくても大丈夫です!)

いよいよインストールですが、今回インストールする拡張機能は以下の4つです。

  • Japanese Language Pack for Visual Studio Code
  • zenkaku
  • YAML
  • HTML Snippets

(それぞれの機能の詳細は省きますが開発しやすくするための機能という認識でいいです)

インストール手順ですが
拡張機能のタブの上部に、検索ボックスのようなものがあると思います。
そこに上記の拡張機能の名前をコピー&ペーストをしましょう!

具体的に
- Japanese Language Pack for Visual Studio Code
を例にしてやってみましょう!
(ちなみにこちらはエディタを日本語表記にするものです。英語で平気な方は入れる必要はありません)

Image from Gyazo

①検索ボックスに「Japanese Language Pack for Visual Studio Code」を
コピー&ペーストして検索する

・検索前
Vs code.png

・検索後
VS code拡張機能検索後.png

すると検索ボックスの真下に「日本語」とか「instll」書かれたものが出てきましたね?

では「install」ボタンを押しちゃいましょう!

②インストールする!
Image from Gyazo

インストールボタンを押すと左の広いエリアにその拡張機能の説明文が出ます。
正常にインストールが完了していれば「install」ボタンが消えて「uninstall」ボタンに変わります。

この拡張機能はVScodeを日本語表記にするものですがこれだけでは設定が終わりません。

少し面倒ですがもう少し頑張りましょう!

③日本語設定を完了させる
commandキー + shiftキー + pで検索ボックスをだす
・検索ボックスでconfigと入力して検索する
config display languageを選択する
・さらに検索ボックスが表示されるので、「ja」と入力する
・VScodeを再起動する
・完了!

順番に画像を参考にしながら実行してみてください!

commandキー + shiftキー + pで検索ボックスをだす
b71b54abdbbfce3e4a21d31057d47c6a.png

・検索ボックスでconfigと入力して検索する
74f59584966d67c3e1b833da32565e0b.png

config display languageを選択する(青枠内をクリックしてください)
74f59584966d67c3e1b833da32565e0b.png

・さらに検索ボックスが表示されるので、「ja」と入力する
d1addafbc14987c87402882cb10348ef.png

・VScodeを再起動する (Restartボタンをおす)
14a084197657a5c9564293a936faf397.png

・完了! 日本語表記に変わっていると思います。
dc14734eeacd894da47b4fe251784410.png

お疲れ様でした!!
少し設定が複雑でしたができましたでしょうか?

残りの3つの拡張機能は「install」すればすぐに使えるのでぜひやってみてください

  • zenkaku
  • YAML
  • HTML Snippets

3.まとめ

今回のポイントは

テキストエディタに拡張機能を導入する方法

  • 基本的には検索してインストールボタンをおす。
  • 例外的にその後の設定が必要なものもある。

でした!

今回はテキストエディタに拡張機能をインストールする方法をお伝えしました!
他にも拡張機能はたくさんあるのでぜひ調べてみてください!

(ただあれもこれもと入れすぎると動作が遅くなるなどの弊害もあるので本当に必要なものだけ入れるようにしましょう)

みなさんそろそろ「実際にプログラミングを書かせてくれよ!」となってきていると思います。

お待たせしました!

次回から実際に手を動かしながらコードを書いていきましょう!!

今回も最後までありがとうございました!!

CSSでドット絵マリオを作るシリーズまとめ(随時更新)

$
0
0

画像を一切使わずいドット絵だけでマリオを作れるのか?そしてそれを動かせるのか?を試しているシリーズのまとめです(随時更新中!)

imgタグに色を付ける

liタグの中にimgタグを無数に入れて、:nth-childで「○行目の○番目のimg」といった指定で色を付ける。

※参考:CSSだけでドット絵マリオを描けるのか

CSS変数でルイージを作る

色をCSS変数に置き換えることでルイージを簡単に作る。

※参考:CSS変数でドット絵マリオをルイージにしたった!

立ちポーズ作成と切り替え

16マスドットを量産して、ジャンプポーズを作り、hoverアクションで切り替える。

※参考:【CSSドット絵】マリオ立ちポーズとジャンプポーズの切り替え

マリオをジャンプさせる(CSS animationとJS)

CSS animationを使ってマリオのジャンプループアニメを作る。:hoverと:actionを試すが相当通りにならず、JSのイベントリスナでclassの追加、削除して実現。

※参考:CSSドット絵マリオをCSSアニメでジャンプさせてみる

この次は、Tone.jsで「トゥ〜ン」というジャンプ音を作って鳴らしてみたいと思っています…

スタイルシートが反映されなかった原因と対処法

$
0
0

昨日アップしたファイルに反映されない

昨日、HTMLとCSSを使って作成した自己紹介ページに、翌日修正を加えて、再度アップしました。
(サーバーはロリポップを使っています。)
すると、スタイルシートで指定した部分が全く反映されていないことが分かり、そこから修正できるまでに結構な時間を要しました。

原因はブラウザのキャシュ

結論は、ブラウザとして使用していたグーグルクロームのキャッシュでした。

対処方法

  1. 更新したいサイトをグーグルクロームで開く
  2. [F12]を押してデベロッパーツールを開く
  3. ブラウザのリロードボタンを右クリック→「キャッシュの消去とハード再読み込み」をクリック

こちらのサイトで問題の解決に至りました。ありがとうございます。
https://saruwakakun.com/it/web/google-chrome

[Vue.js] v-bind:style で background-image がバインドできなかったら

$
0
0

よくあるのは値( url())の指定方法がちょっと特殊だというもの。
Vue.jsでbackground-imageを指定する - Qiita

しかしそれでも上手く行かなかった。

原因

URLに ( )が含まれていた。

See the Pen Vue style binding test 1 by ふくい 👨‍💻 (@var_fukui) on CodePen.

もっと詳しく

URLには encodeURIをかましているので問題ないと思いこんでいたが、実はこの関数、

encodeURI は下記以外の全ての文字をエスケープします。

エスケープされないもの:

A-Z a-z 0-9 ; , / ? : @ & = + $ - _ . ! ~ * ' ( ) #

参考:encodeURI() - JavaScript | MDN
RFC2396 という基準に沿っているので ( )をエンコードしてくれない。

この話自体は割と有名かもしれないが、問題は v-bind:style で ( )付きの URL を background-imageに設定してしまうと、要素の style 属性に background-imageプロパティが設定されないという事。

nonstyle.png

↑ style 属性が空なので、style 属性ごとごっそり削除されている。

解決策

  • 画像 URL に ()を使わない
  • RFC3986 準拠( ! ' ( ) *も対象)の encodeURIを自分で定義する
fixedEncodeURI.js
functionfixedEncodeURI(str){returnencodeURI(str).replace(/[!'()*]/g,function(c){return'%'+c.charCodeAt(0).toString(16);});}

参考:encodeURIComponent() - JavaScript | MDN

そもそも際どい文字はファイル名として使わないのがベターですが、サービスのユーザーが直接アップロードする形式のアプリなんかだとファイル名そのままにしちゃってること多いですよね。
何かの助けになれば幸いです。

$Thank$ $you.$

FLIP手法によるスムーズなアニメーションとVanillaとReactでの実現

$
0
0

FLIP手法って何?

60fpsでスムーズなアニメーションを達成することは簡単ではない。ピュアなCSSでできることも多いが、DOMの変更とJavascriptがかかわるアニメーションは、メインスレッドが忙しいと、その影響を受けるので遅延することがある。
たとえば、setIntervalを使った、positionを変える「移動」のアニメーションは、設定したインターバルの値にもかかわらず、他に処理しないといけないことの多さによって実行が遅くなることがある。60fpsをはるかに下回ると、アニメーションがカクカクしてしまうのでユーザーにとって悪い体験になる。

が、Paul Lewis氏が考えたFLIP手法によって、複雑なアニメーションでもスムーズに実行することができる!

FLIPとは:
1. First : 最初(のDOM位置などの状態)と
2. Last : 最後(のDOM位置などの状態)を
3. Invert : 反転させて
4. Play : 再生する

YoutubeにあるPaul Lewis氏の発表を見てみると、使いどころがたくさんあることがわかるが、今回はとてもシンプルな例を挙げる。

リスト並べ替えのアニメーションの例 (Vanilla編)

TODOリストとか商品のリストなどを並べ替えるアクションがあるとしよう。普段なら、DOMの位置が瞬時にかわるだけで、ユーザーには並べ替えた結果しか見えない。リストの子要素が前の位置から、新しい位置に移動する過程が見えないわけだ。残念ながらCSSだけでは、このようなアニメーションを定義することができない。

しかし、ブラウザーがどう描画を進めるか思い出すと、次のようなトリックができる。

あくまでコード的に、並べ替えた直後、それとも新しい子要素を追加した直後に、結果が描画されるわけではない。並べ替えたあとでも、同期処理がある場合、それらが実行されるまで描画が遅延される。次の場合を見てみよう:

<!DOCTYPE html><html><head></head><body><buttonid="btn">Click</button><script>document.querySelector("#btn").addEventListener("click",()=>{constdiv=document.createElement("div");div.style.height="50px";div.style.width="50px";div.style.backgroundColor="black";document.body.appendChild(div);leti=0;while(true){i+=1;}});</script></body></html>

ボタンをクリックすると、<div>が作成されて、それを<body>の入れ子にしたのに、実はいつまで経ってもその<div>が現れない(描画されない)。なぜかというと、メインスレッドがずっと無限ループで忙しいから。

その事実を利用することができる!

無限ループはもちろん書かない。

  1. まずは、並べ替える前の、すべての子要素の元位置を覚える。位置がわかるために、getBoundingClientRect()という関数を使う (First)
  2. そして、子要素を並べ替えた直後に、描画される前でも、子要素の「新しい」DOMの位置がわかるので、getBoundingClientRect()関数を使って、新しい位置も覚える (Last)
  3. 次に、LastとFirstの差を計算し、子要素が元の位置にまだあるかのように見せるために、CSSのtransformを使って、LastとFirstの差だけtranslateする (Invert)
  4. 好きなtransitionの値を設定して、transformの値をnoneに戻すと、子要素が元の位置から、新しい位置にスムーズに移動するアニメーションができる (Play)

1-3はすべて同期処理で、スタイルも含めて、描画される前に実行される!一方で、4は、requestAnimationFrameの中で実行しないと、ブラウザーからすれば、transformがもともとあって変更されたということにはならないので、注意。なので、ここだけrequestAnimationFrameを使うように気を付けよう。

以下のような結果になるはず:

qiitaflip.gif

ちなみに、"Vanilla"コードにすると、少し長いかもしれないが、こんな感じになる:

<!DOCTYPE html><html><head><style>/* 省略 */</style></head><body><buttonid="btn">Click</button><divclass="container"><divid="first">1</div><divid="second">2</div></div><script>document.querySelector("#btn").addEventListener("click",()=>{constcontainer=document.querySelector(".container");constchildren=container.children;constprevPos={};Array.from(children).forEach(child=>{prevPos[child.id]=child.getBoundingClientRect().left;});container.insertBefore(children[1],children[0]);//ここでDOMの位置がかわるが、描画されないfor(letchildofchildren){constnewPos=child.getBoundingClientRect().left;constdeltaX=prevPos[child.id]-newPos;child.style.transition="";child.style.transform=`translateX(${deltaX}px)`;requestAnimationFrame(()=>{child.style.transition="500ms";child.style.transform=``;});}});</script></body></html>

React編

では、Reactでは同じことが簡単にできるか?答えはYES。
YESだが、Reactがどういうふうに、どの段階でDOMの更新をするか、把握しないといけない。前のバージョンだと、それがcomponentDidUpdateになるようだ。16.8.0以降では、Hooksもできたので、Hooksを使う場合は、useLayoutEffectのコールバックが最適のようだ。useLayoutEffectのコールバックが、DOM更新が終わったあとに、同期的に実行される。

Reactでやるとめんどくさいところ

Vanillaと違って、まず親と子要素のDOMの参照ができるようにするためには、それらのrefを保持しないといけない。さらに、元の位置は、レンダー後のsetStateなどで保管してもいいのだが、余計なレンダーを起こすので、最適とは言えない。なので、そこでuseRefを使うと、単純なオブジェクトをステートとして利用することができる。その中身を変えても、再レンダーが起こらないから。

ほかにも、レンダーが頻繁だと、子要素がまだアニメーション中で、それの新しい位置が、正確ではなくアニメーションが崩れることがある。ひとつの対策として、onTransitionEndなどのリスナーで、アニメーションが終わるのを待ってから、位置を保存することができる。

おすすめライブラリー

以上のめんどくさいところがたくさんあるということで、OSSのソリューションを使うとかなり手間が省ける。

  1. react-easy-flip
    https://github.com/jlkiri/react-easy-flip
    僕が作ったライブラリー。OSSの中でHooksを使っているのはこのライブラリーだけで、もっとも軽い (807B)。現状では、並べ替えなどpositionが変わるケースに特化していて、将来opacityscaleの対応も実装予定
    DEMO: https://flip.jlkiri.now.sh/
  2. react-flip-toolkit
    https://github.com/aholachek/react-flip-toolkit
    Vanilla向けとReact向けのパッケージがある。対応するCSSのアニメーションが多い。比較的にサイズが重い (7.0KB)
  3. react-flip-move
    https://github.com/joshwcomeau/react-flip-move

potision:fixed したheaderがページ全体のmin-widthを下回った時にスクロールできなくなってしまう

$
0
0

「position: fixed」でスクロール固定したヘッダーを横にスクロールさせる

この記事が参考になる。

.header{position:fixed;top:0;min-width:1000px;}

みたいに固定されててmin-width指定してあると、min-width下回ると普通のコンテンツは横スクロール出来るが、fixedのコンテンツは出来ない。
なので、fixedしてあるheaderだけが横スクロールできなくなってしまう。本来は中身のコンテンツを横スクロールしたらheaderも横スクロールしたい。
なので、その時は

$(window).on("scroll",function(){$(".header").css("left",-$(window).scrollLeft());});

のようにJSで動かしてあげる。
windowscrollしたら、.headercssleftを入れてあげる。
その値はwindowの横スクロールした値の逆。

scrollLeftは右に画面がいった値(左にスクロールした値)なので、その逆をleftに入れてあげる。
100px左にスクロールしたらleftに-100px。

これで実質同じ動きが実現できます。


コンポーネント中心のCSS設計

$
0
0

はじめに

コンポーネントの考え方の自由度を高くして、いろいろなスケールのプロジェクトに合わせることができるCSS設計を考えた。

  • OOCSSやSMACSSのようなオブジェクト指向ではなく、ECSSの考えをベースにした。
  • コンポーネントは抽象化を避け、管理しやすさを重視する。
  • COMPONENTS/ELEMENTS/VARIANTで構成する。
  • ファイル管理で文脈がわかるようにする。

COMPONENTS

  • 全てのUIパーツをコンポーネントで構成する。
  • 2ワードをハイフン(-)で繋いで命名する。
  • キャメルケース(camelCase)にすれば1ワードとしてカウント。
  • コンポーネントごとにscssファイルを分けて管理する。
component-sample.scss
.component-sample { ... }

ELEMENTS

  • コンポーネントの子要素。
  • コンポーネント名とアンダースコアでつなぐ。(BEMのElementのように)
  • 1ワードで命名する。
  • ハイフンから始まる1ワードで命名する。
  • 親コンポーネントと同じscssファイルに含める。
component-sample.scss
...
.component-sample_element { ... }

VARIANT

  • コンポーネントやエレメントの変種・バージョン違い。
  • 複数のヴァリアントを併用して良い。
  • 必ずコンポーネントやエレメントとセットで使用する。単独で使用しない。
  • エレメントのような使い方はしない。
component-sample.scss
.component-sample {
    &.-variant { ... }
}
.component-sample_inner {
    &.-black { ... }
}
//NG
.-large { ... }
//NG
.component-sample {
    .-element { ... }
}

ディレクトリ構造

それぞれを別のフォルダにして、上から順に読み込む。

RESET

CSSのリセット。あらゆるプロジェクトであらかじめ設定しておいた方が良いスタイル。

(DEVELOP)

開発用のレイヤー。実際のコードにならないscssの変数やmixinなどを入れる。
色、文字サイズ、z-index、要素の高さと幅、アイコンフォント、レスポンシブ設定などを書く。

BASE

基本設定。このファイルはHTMLタグに直接スタイルを書いてよいこととする。
例えば、htmlタグに全体に適応される文字設定を書いたりする。

COMPONENTS

全てのUIパーツ。
なるべく共通化を避け、機能ごとに分類するようにする。
プロジェクトの要件に合わせ、componentsフォルダ内で分類できる。複数のレイアウトの種類がある場合はlayoutフォルダ内で管理したり、画面のカテゴリでフォルダをつくったり、文脈が分かるように整理する。

sample
_scss
├── _base
│   └── _base.scss
├── _components
│   ├── _button-pageTop.scss
│   ├── _category_menu.scss
│   ├── _category_title.scss
│   ├── _common
│   │   ├── _common-footer.scss
│   │   └── _common-header.scss
│   ├── _global-navi.scss
│   └── _main-visual.scss
├── _develop
│   ├── _breakpoints.scss
│   ├── _color.scss
│   ├── _font.scss
│   ├── _mixin.scss
│   ├── _print.scss
│   ├── _size.scss
│   └── _zindex.scss
├── _reset
│   └── _reset.scss
└── common.scss

その他のルール

推奨
  • モバイルファースト。基本的にmin-screenのみを使用してレスポンシブを切り替える。
  • 色や文字、サイズなどは全てscssの変数とし、_developフォルダ内で管理する。
  • 縦方向のmarginルールを決める。(margin-top派でもmargin-bottom派でも良いが、ルールを決めるのが大事。)
  • 文字サイズや余白の単位はremかvwを使用する。pxの使用は推奨しない。
  • 要素の高さはできるだけpxで指定しない。ロゴのサイズや、Sass変数で管理した方が良いヘッダーの高さなどは例外。
  • gulp-sass-globを使用し、アスタリスク(*)でscssのimportをする。
  • 可能な限り言葉を略さない。タイトルはtitleと書きttlと書かない。もし略語を使う時は用語集をつくり共有する。
  • 例外箇所はコメントを書き、多くなってきたらプロジェクトとしてのルールを見直す。
禁止
  • 抽象度の高い名前は避ける。(例:.text-1といったクラスは禁止)
  • scssのextendは使用しない。依存関係が複雑になるため。
  • !importantは使用しない。
  • HTMLタグに直接スタイルを書かない。(BASEファイルは例外。その他ファイルで書く場合はコメントで例外だとわかるようにする。)
  • idにスタイルを書かない。
  • 汎用クラスは使わない。(例:いろんなcomponentsを大きくするクラスはつくらない。)
  • 接頭辞(Prefix)は使用しない。Componentsの名前で工夫し、略語を使う場合はプロジェクト内で共有する。

まとめ

コンポーネントの自由度を高くした分、コンポーネント内で独自の設計が可能になる。そういうった意味では、メタなCSS設計と言えると思う。大きな(複数人が関わる)プロジェクトではこの設計の上でさらに詳細な設計が必要となるだろう。そういった場合でも下敷きとしてこのCSS設計が役に立つと思う。

HTMLレンダリングエンジン

$
0
0

目次

  • ブラウザとは(ブラウザコンポーネント)
  • ブラウザとサーバーの通信
  • HTMLレンダリングエンジン
  • JavaScriptエンジン
  • 日本ブラウザシェア率(2016~)

ブラウザとは

ウェブブラウザ(インターネットブラウザ、web browser)とは、 World Wide Web (WWW) の利用に供するブラウザであり、ユーザエージェント (UA) である。具体的には、ウェブページを画面や印刷機に出力したり、ハイパーリンクをたどったりするなどの機能がある。単にブラウザ(ブラウザー)と呼んだ場合、多くはウェブブラウザのことを指す。

出典: フリー百科事典『ウィキペディア(Wikipedia)』


ブラウザコンポーネント

1_lmbu87mtesvfqqbfmum-ka_m.png

出典: ブラウザはどのようにコンテンツをレンダリングしているのか?


各コンポーネント

  • ユーザインターフェース
    • ユーザは操作できる部分:アドレスバー、戻る/進むボタン、メニューなど
  • ブラウザ エンジン
    • ユーザインターフェースとレンダリングエンジンの間の情報の受け渡しを担当
  • ⭐️HTMLレンダリングエンジン
    • HTMLとCSSを解析し、画面に表示
  • ⭐️JavaScriptエンジン
    • JavaScriptを動かしを担当
  • ネットワーキング
    • HTTPリクエストなどのネットワーク呼び出しを担当
  • UIバックエンド
    • チェックボックスやウィンドウなどのコアウィジェットの描画を担当
  • データストレージ
    • Cookieなどのデータの保存を担当

ブラウザとサーバーの通信

20190413002537.jpg

  1. アドレスバーにアクセス先を入力
  2. ネットワーク経由でサーバーへリクエスト
  3. リクエスト内容より処理してHTMLを生成
  4. CSSとJSファイルなどもクライアントへ返信
  5. レンダリングエンジンとJavaScriptエンジンより画面を表示

出典: Webフロントエンドとサーバーサイドの技術動向をざっくり整理する


HTMLレンダリングエンジン

HTMLレンダリングエンジンとは、ウェブページ記述用言語で書かれたデータを解釈し、実際に画面に表示する文字や画像などの配置を計算するプログラムである。HTMLに加え、CSS、XMLなどを解釈できるものが多い。

出典: フリー百科事典『ウィキペディア(Wikipedia)』


主なHTMLレンダリングエンジン

Trident (Internet Explorer、QQ浏览器) - トライデント
    EdgeHTML (Microsoft Edge) - エッジ
Gecko (Firefox) - ゲッコー
    Servo - サーボ
KHTML (Konqueror)
    WebKit (Safari) - ウェブキット
        Blink (Chromium, Chrome, Opera, Microsoft Edge) - ブリンク

HTMLレンダリングエンジンの歴史

スクリーンショット 2019-10-27 17.12.18.png

参照:Browser engine From Wikipedia, the free encyclopedia
補足: EdgeブラウザのChromiumベース移行、マイクロソフトが正式発表


JavaScriptエンジン

JavaScriptエンジンとはJavaScriptコードを実行するプログラムまたはインタプリタのことです。

出典:V8エンジンでのJavaScriptの機能と最適化コードの書き方に関する5つのベストプラクティス


JavaScriptエンジンの種類

ブラウザレンダリングエンジンJavaScriptエンジン
IETridentChakra (Jscript9)
Microsoft EdgeEdgeHTMLChakara (JavaScript)
FirefoxGeckoSpiderMonkey
KonquerorKHTMLKJS
SafariWebKitJavaScriptCore
Chrome, OperaBlinkV8

参照:PhantomJSと各ブラウザのJavascriptエンジンまとめ
参照:V8エンジンでのJavaScriptの機能と最適化コードの書き方に関する5つのベストプラクティス


日本ブラウザシェア率(2016~)

スクリーンショット 2019-10-27 17.48.36.png

補足:Desktop、Mobile、Tabletを含む
[出典:https://gs.statcounter.com]


ご静聴ありがとうございます

HTML/CSSの書き方(ちょっとhaml)

$
0
0

html/cssで作るときにいつも忘れがちなことを個人でメモしているものになります。
都度更新しておりますのでご了承ください。

いつも参考にさせていただいているサイト

⭐️色の見本
http://www.netyasun.com/home/color.html
⭐️Font-familyメーカー
https://saruwakakun.com/font-family

基本

<!DOCTYPE HTML><html><head><metacharset="UTF-8"><title>サイト名</title></head><body><!-- 主にここからコードを書いていく --><!-- ここまでの間にコードを書く --></body></html>

リセットCSSが必要な場合は、好みのものを貼り付けてください。

画像の表示

html
<imgsrc="dog.jpg"alt="[写真]">
haml
<%=image_tag'dog.JPG'%>

画像を背景表示する

  • background-imageを使う
html
<sectionclass="works"><divclass="l-content"><h2class="heading">Works</h2></div></section>
css
.works{width:100%;height:600px;background-image:url(画像のパス);}

背景画像を透過する(テキストは透過しない)

  • opacityだとテキストも透過してしまうため、画像とテキストの間に1つ階層をはさめばOK!
html
<sectionclass="works"><divclass="l-content"> #これを挟む
      <h2class="heading">Works</h2></div></section>
css
.l-content{height:100%;background:rgba(255,255,255,0.5);}

画像を中央寄せ

  • positionを使う
scss
.top-box{background-color:$BaseOrange;height:100px;width:100%;margin-bottom:15px;position:relative;img{position:absolute;top:0;left:0;right:0;bottom:0;margin:auto}}

リスト(li,ul)

<ulclass=contents>店名:
        <liclass=contents__details>ジャンル:
        </li><liclass=contents__details>住所:
        </li>
//リストの点を消すli{list-style:none;}

IEでCSSプロパティのinitialとunsetを指定するとスタイルが崩れてしまう時の解決法

$
0
0

CSSのプロパティの initialunsetはIE11に対応していないためスタイルが崩れてしまいます。
詳しくはこちら(initialunset)を参照してください。
この記事ではこの問題に対処するために代表的なプロパティごとの解決法を書きます。

解決法

margin/padding/width/heightの場合

autoの記載を追加することでIEに対応できます。

sample.css
.block{margin:initial;/* IE対応のために追加する */margin:auto;}

line-height/font-weight/font-styleの場合

normalの記載を追加することでIEに対応できます。

sample.css
.block{line-height:initial;/* IE対応のために追加する */line-height:normal;}

年末まで毎日webサイトを作り続ける大学生 〜10日目 Css Grid Layout, Flex Box, Google Font, jsで名言をランダムに表示してみた〜

$
0
0

はじめに

初めまして。
年末まで毎日webサイトを作っている者です。
今日もMDNの初心者ページを見て勉強していたんですが、そういえばレイアウト全然やってないなということでGrid Layout, Flex Boxを使ってみました。
作ったものはGrid Layoutの枠に入ると名言がランダムで表示されるというものです。
JavaScriptも簡単ではありますが使っています。
扱う技術レベルは低いですが、同じように悩んでる初心者の方を勇気付けられれば幸いです。
今日は10日目。(2019/10/28)
よろしくお願いします。

サイトURL

やったこと

まずは、どんなものが出来上がったのかgifでどうぞ! ↓
test.gif

全体の構成と、カーソルが乗ると色が変わる部分をGrid Layoutで実装しています。
Grid Layoutを使うとhtmlがほとんど汚れません (これでhtml部分全て) ↓

<h2id="header">Css Grid Layout</h2><navid="nav"><spanid="rule">7 RULES</span><olid="rule_text"><li>enjoy!</li><li>relax!</li><li>fun!</li><li>eat!</li><li>you can do it!</li><li>yes!</li><li>happy!</li></ol></nav><divid="main"><divid="box1"></div><divid="box2"></div><divid="box3"></div><divid="box4"></div><divid="box5"></div><divid="box6"></div><divid="box7"></div><divid="box8"></div><divid="box9"></div></div><footerid="footer">
        All Rights Reserved.
    </footer>

全体の構成を調整するcss部分↓

body{display:grid;       /* ↓ここで縦方向を制御しています */grid-template-rows:100px1fr100px;       /* ↓ここで横方向を制御しています */grid-template-columns:200px1fr;}

rowsの100px 1fr 100pxというのは、縦に3つのブロックがあって上下が100px、真ん中は余った分全部のスペースを使うという意味です。
columnsの200px 1frは横に2つのブロックがあって左端が200px、1frは残り余った部分を使います。

ではカーソルが変わると色が変わる部分を見ていきましょう。htmlはこの部分が該当します↓

<divid="main"><divid="box1"></div><divid="box2"></div><divid="box3"></div><divid="box4"></div><divid="box5"></div><divid="box6"></div><divid="box7"></div><divid="box8"></div><divid="box9"></div></div>

css ↓ (他にやり方がわからず長くなってしまいました・・・)

#main{/*全体構成の中で#main自体をどこに配置するかの指定↓ */grid-column:2/3;grid-row:2/3;/* #mainのなかのdivたちをどう構成するかの指定↓ */display:grid;grid-template-columns:repeat(3,1fr);grid-template-rows:repeat(3,1fr);}#box1{grid-column:1/2;grid-row:1/2;}#box2{grid-column:2/3;grid-row:1/2;}#box3{grid-column:3/4;grid-row:1/2;}#box4{grid-column:1/2;grid-row:2/3;}#box5{grid-column:2/3;grid-row:2/3;}#box6{grid-column:3/4;grid-row:2/3;}#box7{grid-column:1/2;grid-row:3/4;}#box8{grid-column:2/3;grid-row:3/4;}#box9{grid-column:3/4;grid-row:3/4;}

grid-template-columns: repeat(3, 1fr); 

これは1frを3回繰り返すという意味です。columnsなので横に1frが3つ、つまり3ブロックは均等に1/3ずつの大きさが割り当てられます。

そしてJavaScript・・・。これはあまり見せたくないのですが・・・↓

<script>letbox1=document.getElementById('box1');letbox2=document.getElementById('box2');letbox3=document.getElementById('box3');letbox4=document.getElementById('box4');letbox5=document.getElementById('box5');letbox6=document.getElementById('box6');letbox7=document.getElementById('box7');letbox8=document.getElementById('box8');letbox9=document.getElementById('box9');box1.addEventListener('mouseover',meigenGo);box2.addEventListener('mouseover',meigenGo);box3.addEventListener('mouseover',meigenGo);box4.addEventListener('mouseover',meigenGo);box5.addEventListener('mouseover',meigenGo);box6.addEventListener('mouseover',meigenGo);box7.addEventListener('mouseover',meigenGo);box8.addEventListener('mouseover',meigenGo);box9.addEventListener('mouseover',meigenGo);box1.addEventListener('mouseleave',meigenGoAway);box2.addEventListener('mouseleave',meigenGoAway);box3.addEventListener('mouseleave',meigenGoAway);box4.addEventListener('mouseleave',meigenGoAway);box5.addEventListener('mouseleave',meigenGoAway);box6.addEventListener('mouseleave',meigenGoAway);box7.addEventListener('mouseleave',meigenGoAway);box8.addEventListener('mouseleave',meigenGoAway);box9.addEventListener('mouseleave',meigenGoAway);letmeigen=['Think rich, look poor.','One of these days is none of these days.','Believe and act as if it were impossible to fail.','If you obey all the rules, you miss all the fun.','努めて難関を歩いて、努めて苦労を味わう。これが人間としては、大切なことである。','人は忙しい中にも静かにくつろぐような心を持たなくてはならないし、苦しみの中にあっても、そこに楽しみを見出す工夫をしなければならない。','人を信じよ、しかし、その百倍も自らを信じよ。'];letcount=0;functionmeigenGoAway(e){leteventTarget=e.target;letrgb=randomRGB();letr=rgb[0];letg=rgb[1];letb=rgb[2];eventTarget.style.backgroundColor='rgba('+r+', '+g+','+b+', .5)';eventTarget.textContent="";}functionmeigenGo(e){letrandomNumber=Math.floor(Math.random()*meigen.length);letchoiceMeigen=meigen[randomNumber];leteventTarget=e.target;eventTarget.style.backgroundColor='rgba(255, 255, 255, .7)';eventTarget.textContent=choiceMeigen;count+=1;if(count>=50){alert('欲張るのか!');}}functionrandomRGB(){letr=Math.floor(Math.random()*256);letg=Math.floor(Math.random()*256);letb=Math.floor(Math.random()*256);letrgb=[r,g,b];returnrgb;}</script>

はい、怒涛のgetElementByIdとaddEventListenerです・・・。
どうやればスマートに書けるのか思案中です。

let meigen

これは名言を格納しておく配列です。

関数 meigenGoは、名言の配列の長さを使ってランダムに名言を1つ選び、それをtextContentでdivに入れ込むということをやっています。あとはbackgroundcolorを白にして文字を読みやすくするのと、50回以上名言が表示されたら「欲張るのか!」というアラートを出します。

次に関数 meigenGoAwayですが、これはカーソルがdivから離れた時に、meigenGoで背景色を白にしていたのを他の色にしています。ランダムな値はrandomRGB 関数から受け取っています。あとここでdiv内の名言を消しています。

最後にFlex BoxとGoogle Fontを紹介します。
Flex Boxはナビで使っています(ナビはしませんが) ↓

#nav{display:flex;/* 縦に要素を配置する指示↓ */flex-direction:column;/* 要素を左右中央に寄せる指示↓ */justify-content:center;/* Google Fontのコード↓ */font-family:'Liu Jian Mao Cao',cursive;}

そしてGoogle Fontはheadのところでlinkを読み込んでいます ↓

<linkhref="https://fonts.googleapis.com/css?family=Stoke&display=swap"rel="stylesheet"><linkhref="https://fonts.googleapis.com/css?family=Liu+Jian+Mao+Cao&display=swap"rel="stylesheet">

感想

Grid Layoutはとても便利だと思いました。Flex Boxも簡単に要素の配置が調整できて嬉しいです。以前floatとかいうのを使ったことがありますがそれとは段違いの使いやすさでした。
ちなみにMDNはやっぱりいいサイトですね。ありがとうございます。

--

最後までお読みいただきありがとうございます。
明日も頑張ります!

参考・引用

  1. CSS Grid Layout を極める!(基礎編)(https://qiita.com/kura07/items/e633b35e33e43240d363)
  2. flexの縦レイアウト (https://qiita.com/mczkzk/items/d9fb98f53aea6e82f9ac)
  3. CSS:text-shadowを使用し、文字に影や縁取りをする (http://raining.bear-life.com/css/text-shadow%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%80%81%E6%96%87%E5%AD%97%E3%81%AB%E5%BD%B1%E3%82%84%E7%B8%81%E5%8F%96%E3%82%8A%E3%82%92%E3%81%99%E3%82%8B)
  4. Google Fonts (https://fonts.google.com/?selection.family=Liu+Jian+Mao+Cao)
  5. グリッドレイアウトの基本概念 (https://developer.mozilla.org/ja/docs/Web/CSS/CSS_Grid_Layout/Basic_Concepts_of_Grid_Layout)
  6. 英語の名言【短い名言集】短文のいい言葉! | 名言+Quotes (https://meigen-ijin.com/eigomeigen/)
  7. 世界に誇る「日本」の偉人たちが語った、信念のことば10選 | TABI LABO (https://tabi-labo.com/274695/japanese-quote-04)

今日はたくさんのサイトにお世話になりました。ありがとうございます!

今日から学んできたことを毎日ブログにしていきたいと思います!

$
0
0

 さて、今日から毎日学んだことをブログに記していきたいと思う。

 そのまえに私の今現在の状況とプログラマーを目指すきっかけについて記していこうと思う。私は今現在、某国立大学で化学系のことを学んでいる。しかし、インターンシップなどに参加しても、どうも専攻の職に興味などが一切湧かなかった。それもそのはず、高校から大学までレールの上をただ何も考えずに歩んできたからだ。高校・大学では、何となく受かりそうだから受けてきた。大学に行くのも惰性で行き、人生つまんねえなあと思う日々。アニメ的な展開起きないかなと考える日々。そんな人生を変えることは起きないのも当たり前だ。何にも行動せず、ただ過ぎ行く日々をこなしているからだ。

 というのを毎日考え過ごして来て、これからは多くのことにチャレンジし継続していきたいと思う。きっかけは自分でもあまり覚えていないが、フリーランスになれば家で仕事できるなどそんな甘えた考えだろう。話は戻り、私が今現在継続していることは、プログラミング学習だ。つい一週間位前から始めている。それに加え、ブラインドタッチを三日前から始めている。今、ブログを書くのもブラインドタッチだ。全然思った文字も打てないし、時間もかかり、少しもどかしい気持ちだ。

 前置きが長いな。すみません。今日したことは、ドットインストールのBoostrapを1~7までこなした。プログラミングでインプットしたのはこれだけだ。すごい少ない。自覚はしているが、どうにも身が入らなかった。この原因としては就職について最近焦り初めており、今日はキャリアカウンセリングというのを受けてきた。これは、就職相談みたいなのだ。利用してみた感想としては、「めちゃくちゃ焦りが積もった」この一言につきる。今まで就職について考えてきてないとはいえ、やばいと思った。さらに、今の時期からインターンなどを経て早期面接とか受けている人がいることいにはとてもびっくりした。周りに動いている人がいないし、地方だからとは言え情報不足だった。このような原因で焦りの思考ループにより身が入らなかった。今日一日解決策を考えているが、現状何も思いつかない。明日も考えよう。

 さて話は戻り、今日は下のような画像のように、学んだ単元のことを要約しながら進めた。無題.png

さて、学んだことをアウトプットします。Boostrapによりcssの機能を省ける感じなのかな。br-○やtext-○をhtmlの中に組み込んで省いた感じだ。margin:0 auto;のやり方も覚えた。my-0 mx-autoでいけるみたい。後は高さや幅をhやwで略すのも覚えておきたい。このやり方を22回まで続けよう。

今回の記事で書きたかったことの半分も書けなかった。文章能力もぜんぜんないし、タイピングが思うようにいかないのが原因だろう。こんな短い文章を書くのにも1時間近く経った。明日からは、もう少し短い文章にして継続していこう。

 明日のTo Do List
・Progate 中級道場 上級道場
・ドットインストール Boostrap 8~15
・参考になるブログを読む 詳しくは明日書きます。
大学もあるけど明日も一日、頑張りましょう!

アスペクト維持 x トリミング x 横幅:レスポンシブ x 最大幅:元画像サイズ で画像表示

$
0
0

画像のアスペクト比を維持しながら、指定の比率でトリミングしたい。
表示サイズはレスポンシブ。ただし最大幅は元画像の横幅での表示の例です。

css
.img-fluid-trim{display:inline-block;}.img-fluid-trim>div{height:0;width:auto;overflow:hidden;}.img-fluid-trim-1x1>div{padding-bottom:100%;/* w:h = 1:1 */}.img-fluid-trim-2x1>div{padding-bottom:50%/* w:h = 2:1 */}.img-fluid-trim-1x2>div{padding-bottom:150%;/* w:h = 1:2 */}.img-fluid-trim-16x9>div{padding-bottom:56.25%;/* w:h = 16:9 */}.img-fluid-trim>div>img{width:auto;height:auto;max-width:100%;max-height:initial;/*transform: translate(0, -10%); トリミング開始高さを変える場合*/}
html
<divclass="img-fluid-trim img-fluid-trim-16x9"><div><imgsrc="/path/to/img.jpg"></div></div>

HTML+CSSでシュッと出てくる折りたたみメニュー

$
0
0

作りました。

See the Pen クリックでシュッと出るメニュー by むいにゃん 🧗 (@mui_nyan) on CodePen.

ソース

<details><summary>絞り込み</summary><div>シュッと出てくるコンテンツ
    </div></details><p>次のコンテンツ</p>
details[open]summary~*{animation:sweep.2sease-out;margin-left:1em;}@keyframessweep{0%{opacity:0;margin-left:0}100%{opacity:1;margin-left:1em}}

参考文献

【駆け出しWEBエンジニアのためのメモ】WEBアプリ作成の作業フロー_基礎(Rails)

$
0
0

背景

最近、10年のブランクをへてプログラムを猛勉強中で、特に未経験のWEBプログラミング(Rails)に挑戦しております!

TECH::EXPERTにて基礎は学びましたが、どこか「あと少し」な感じで全体像が掴めずにいました。
全体像を把握するためにも、WEBアプリ作成の大まかな作業フローをメモさせていただきました。

※フォーム、ログインなど、他の機能は別途記事を作成いたします。
 

WEBアプリ作成の作業フロー(概要)

①アプリの雛形作成($ rails 5.2.3 new ディレクトリ名 -d mysql)
         ($ bundle install)
②データベース作成($ rails db:create)
③サーバー立ち上げ($ rails s)
④ブラウザでアプリケーションの状態確認( http://localhost:3000
⑤ルーティング作成(config/routes.rb を編集)
⑥コントローラーを作成($ rails g controller コントローラー名 で作成)
           (app/controllers/コントローラー名_controller.rb を編集)
⑦ビューファイルを作成(app/views/コントローラー名/index.html.erb を作成・編集)
⑧モデルを作成(rails g model モデル名)
       (rails db:migrate)
⑨コントローラーでデータベースの情報を取得
⑩新しく別のページも追加してみる

MVCモデル:役割と関係性(図)

※作成中

WEBアプリ作成の作業フロー(詳細)

① アプリの雛形作成

まずはターミナルで以下の作業を実施。

# projectsディレクトリの作成
$ mkdir ~/projects

# projectsディレクトリに移動
$ cd ~/projects

# Railsのバージョン5.2.3を用いて、「my_app」を「-d」オプションでMySQLを指定して作成。
$ rails _5.2.3_ new my_app -d mysql

# 「my_app」ディレクトリに移動
$ cd my_first_app

# Users/ユーザー名/projects/my_appと表示されることを確認する
$ pwd

# 関連ファイルが読み込まれていることを確認する
$ bundle install

ここで、テキストエディタでmy_appのディレクトリを開いて中身を確認しておく。

② データベース作成

ターミナルで以下の作業を実施。

$ pwd  # my_appのディレクトリにいることを確認
$ rails db:create  # データベースの作成
Created database 'my_app_development'
Created database 'my_app_test

development : 開発環境。通常、開発をする際に使用。
test : テスト環境。アプリケーションの動作をテストする際に使用。
production : 本番環境。

ここで、データベースが正しく作成できているかを確認しておく。
※例えば、Sequel Pro(シークエル・プロ)などを用いて。
 
もしエラーで確認できなければ、以下でMySQLの再接続を試す。

# ホームディレクトリに移動
$ cd ~

$ mysql.server start
starting MySQL
.. SUCCESS!

③ サーバー立ち上げ

ターミナルで以下の作業を実施。
※何か変更したり、うまく反映されない時は立ち上げなおしてみる。

# アプリケーションのあるディレクトリに移動
$ cd ~/projects/my_app

# ローカルサーバーを起動
$ rails s

④ ブラウザでアプリケーションの状態確認

以下にアクセス。
http://localhost:3000

⑤ ルーティング作成

以下を記述(例)。
・「HTTPメソッド:GET、アクション:index」なので、ページを表示する操作のみを行う時、一覧表示ページを表示するリクエストに対応して動く。

・リクエスト
GETのHTTPメソッド(トップページを表示するため)
URLはhttp://localhost:3000/posts

・行き先
postsコントローラーという名前のコントローラー
indexアクションという名前のアクション

config/routes.rb
Rails.application.routes.drawdoget'posts',to: 'posts#index'end

以下のコマンドで、ルーティングが確認できる。

# my_appディレクトリにいることを確認しましょう
$ pwd

# ルーティングを確認
$ rails routes
Prefix  Verb  URI Pattern       Controller#Action
posts   GET   /posts(.:format)  posts#index

※以下、リクエストの種別を示すHTTPメソッド

HTTPメソッドどのような時に用いるリクエストか
GETページ表示
POSTデータ登録
PUTデータ変更
DELETEデータ削除

⑥ コントローラーを作成

ターミナルで以下を実行。

$ pwd  # my_appのディレクトリにいることを確認する
$ rails g controller posts  # 例:コントローラー名を「posts」としてコントローラーを作成してみる

以下にindexアクションを定義してみる

app/controllers/posts_controller.rb
classPostsController<ApplicationControllerdefindex# indexアクションを定義したendend

※以下、定義できるアクションの種類

アクション名動作
index一覧表示ページを表示するリクエストに対応
new新規投稿ページを表示するリクエストに対応
createデータの投稿を行うリクエストに対応
show個別詳細ページを表示するリクエストに対応
edit投稿編集ページを表示するリクエストに対応
updateデータの編集を行うリクエストに対応
destroyデータの削除を行うリクエストに対応

⑦ ビューファイルを作成

・ビューファイルは「app/views/コントローラー名」ディレクトリに格納する。上記(例)ではコントローラー名をpostsとしたため、「app/views/posts」ディレクトリにビューファイルを作成。ファイル名は「アクション名.html.erb」となるが、上記(例)ではindexアクションを定義したため、「index.html.erb」とする。

・「app/views/posts/index.html.erb」にHTMLで記述することで、「 http://localhost:3000」に記述内容を表示することができる。

・以下のようにコントローラーにインスタンス変数を定義することで、「index.html.erb」にRubyでの記述をしてブラウザに表示させることができる。

app/controllers/posts_controller.rb
classPostsController<ApplicationControllerdefindex@post="コントローラーで定義したインスタンス変数を確認"endend
app/views/posts/index.html.erb
<h1>例</h1>
<%= @post %> #Rubyの記法がHTMLに埋め込める
<% @post %>  #Rubyの記法がHTMLに埋め込めるが表示はされない

⑧ モデルを作成

ターミナルで以下を実行。
コントローラーの名前はpostsでしたが、今回はその単数形のpost。

$ pwd  # my_appのディレクトリにいることを確認する
$ rails g model post  # モデル名を「post」としモデルを作成

作成されたファイルのうち、以下2つに注目。
・app/models/post.rb
・db/migrate/20XXXXXXXXXXXX_create_posts.rb (マイグレーションファイル(仕様書・設計図))

以下のように、マイグレーションファイルを編集。

db/migrate/20XXXXXXXXXXXX_create_posts.rb
classCreatePosts<ActiveRecord::Migration[5.2]defchangecreate_table:postsdo|t|#postsテーブルを作成するt.text:content#text型のcontentカラムを追加t.timestampsendendend

※「型」の種類

どのような型か用途
integer数字金額、回数など
string文字(短文)ユーザー名、メールアドレスなど
text文字(長文)投稿文など
boolean真か偽かはい・いいえの選択肢など
datetime日付と時刻作成日時、更新日時など

 
ターミナルで以下を実行し、データベースのテーブルを作成

$ pwd  # my_appのディレクトリにいることを確認する
$ rails db:migrate  # マイグレーションを実行する

Sequel Proを起動し、my_app_developmentデータベース内にpostsテーブルがあるか、またpostsテーブル内にcontentカラムがあるかを確認。

⑨ コントローラーでデータベースの情報を取得

app/controllers/posts_controller.rb
classPostsController<ApplicationControllerdefindex@post=Post.find(1)# 「@post」というインスタンス変数を定義し、1番目のレコードに情報を全て代入endend

もし、1番目のレコードに複数個の値が存在していたら、正しく表示されない。
以下の方法で、特定のカラムだけを表示する。

app/views/posts/index.html.erb
<h1>例</h1>
<%= @post.content %>
<%= @post.created_at %>

そのほか、全てのデータを取得できるようにコントローラーを編集した状態で、eachメソッドで1つずつ順々に複数個の表示をさせることもできる。

app/controllers/posts_controller.rb
classPostsController<ApplicationControllerdefindex@posts=Post.all# 全てのレコードを@postsに代入endend

このまま画面表示について、まずはHTMLファイルの編集。

app/views/posts/index.html.erb
<h1>トップページ</h1>
<% @posts.each do |post| %> #インスタンス変数「@posts」から1つずつ変数「post」に代入
  <%= post.content %>  #1番目のレコードのcontentのみ表示
  <%= post.created_at %>  #1番目のレコードのcreated_atのみ表示
<% end %>

続いて、「app/assets/stylesheets」ディレクトリ内の、「posts.scss」を編集。
デザインに合わせて整えていきます。

※以下、ActiveRecordクラスのメソッドの一例

メソッド用途 例 
allテーブルの全てのデータを取得Post.all
findテーブルのレコードの内、ある1つのデータを取得Post.find(1)
newクラスのインスタンス(レコード)を生成Post.new
saveクラスのインスタンス(レコード)を保存Post.save

⑩ 新しく別のページも追加してみる

・まずはルーティングの設定。
以下を追記(HTTPメソッド:GET、アクション:new ➡︎ ページを表示する操作のみを行う時、新規投稿ページを表示するリクエストに対応して動く)。

config/routes.rb
Rails.application.routes.drawdoget'posts',to: 'posts#index'get'posts/new',to: 'posts#new'#追記end

・ターミナルで以下を実行。

$ rails routes

Prefix      Verb    URI Pattern           Controller#Action
posts       GET     /posts(.:format)      posts#index
posts_new   GET     /posts/new(.:format)  posts#new

・コントローラーに追記。

app/controllers/posts_controller.rb
classPostsController<ApplicationControllerdefindex@posts=Post.allenddefnew#追記end#追記end

・ビューファイルの作成。
「app/views/posts」ディレクトリに、「new.html.erb」を作成。

app/views/posts/new.html.erb
<h1>新規ページ</h1>

 
 
以上です。

【レスポンシブサイト向け】<br>タグを使った小技

$
0
0

あるあるネタですが、感動したのでメモがでてら記事に。

<br>タグとは おさらい

<br>タグは文中の改行に使用するタグです。
<p>タグで区切って改行する場合もありますが、
<p>タグ自体にpadding-bottoのcssがあてがわれてるため、
「なんかこの改行ひろすぎじゃね?」と思うときとかに使われてますね。

もともとは
<p>タグは段落
<br>タグは改行
らしいっすよ。

へぇ~

<br>タグ小技

<br>タグもclassが使えるらしく、これを下記のようなclass付
タグにします。

test.html
<brclass="ps-br"><brclass="sp-br">

各画面幅で、この<br>が出たり消えたりするように下記のようなcssを書きます。

test.css
/* 画面幅が1024px以上の時は */@mediascreenand(min-width:1024px){.ps-br{display:block;/* PCを改行して */}.sp-br{display:none;/* SPの改行を隠す */}}/* 画面幅が560px以下の時は */@mediascreenand(max-width:560px){.ps-br{display:none;/* PCの改行を隠して */}.sp-br{display:block;/* SPを改行する */}}

こうすることで、画面幅による改行の有無を指定することができます。
今まで空の<span>に同様のcssつけてたのですが、<br>にclassつけたほうがすっきりして良いですよね。
<br>ってこれ単体で使うイメージが強くてclassつけるなんて考えたことなかったんだけど、
これ見つけた人ビューティフォーだなって感動したんです。

こんな時に便利です。

文章内の改行は基本的にはそこまでナーバスにならず、PC・SP兼用の場合がおおいです。(こういう場合は普通に<br>を使う)
しかし、見出しの中の文言やタイトルの文言は、大きな太字などになっていて意図しない箇所で折り返してしまう場合があり、
デカくて太いぶん、見栄えの悪さが目立ってしまうことがあります。
こういうときにちょっとした気遣いで改行を入れるとクオリティアップします。

6fcb1e97cb9fefa43c74425f9cf2c1e6.png

変なところで改行されると困る文言とかあるじゃないですか。

ハーゲ
ン〇ッツ

とかね。

ヤッターマン
...いや、なんでもないです

  • 細かいところを作り込みができる
  • 改行位置を気にしすぎるクライアント対策

という点がミソなので、必須なテクニックではないです。
こういうテクニックがあるのか。とふんわり覚えておいて必要になった時にピカンとくれば幸いです。

レスポンシブサイトってなんだっけ おさらい

レスポンシブサイトとは、PC・タブレット・SPがすべて同じURLで見れて、
その環境(画面幅)ごとに見栄えが変わるサイトのこと。
最近は大体のサイトがコレでできてるんじゃないでしょうか。

メリットはPCサイトとSPサイトで同じ文章で書かなくていいことです。
単純な時間短縮ですね。同じこと2回しなくていい。

PC・SPでURL分かれているサイトはユーザーエージェントで切り替えているので、
システム上や無負えないところはこれ採用してるらしいですが、最近はあまり見かけませんね。
ユーザーエージェントの説明は割愛。

PCとSPでどうやって切り替えているの?

CSSメディアクエリというものを使っています。
「画面幅が〇〇px以下の場合は、このcssが適用される。」
というような条件分岐がなされていると思っていただければわかりやすいかと。

この画面幅の分岐する値をブレイクポイントというらしいです。

画面幅は端末によって異なるので、すべての機種に対応することは不可能です。
なので、調べる際はだいたい、

ブレイクポイント css 2019 定番:writing_hand:

こんな感じの検索ワードで、新しい情報を参考にして設定するのが良いと思います。

「この3~4つのブレイクポイントで区切れば、ほとんどの端末でキレイに見えるんじゃね?」

というような記事がでてくると思うので参考に。

CSSで書くとこんな感じ

下記のような塊を対応するブレイク
ポイントごとに作ります。

test.css
@mediascreenand(max-width:560px){/* この中に書いたcssは画面幅560px以下の場合のみ適用される */p{padding-bottom:10px;}}

参考記事

レスポンシブデザインのブレイクポイントの正解はこれだった[2019最新版]
https://hashimotosan.hatenablog.jp/entry/2019/05/28/164834

毎日ブログ2日間

$
0
0

今現在書き始めた、時刻が23:50分早めに書き終えるようにします。

昨日のTo Do List で実践できたことは

①Progate中級道場 

これは3回目ということもあり、2時間弱で終えれました。

containrはいじらない方が良くて、幅とmargin:0 auto;だけにしといた方がよさそう。
それに、container p とか hはしない方がよい。後半でもcontainer pとか出てくると、そこにスタイルが反映されてしまうので。

各要素の一番上に高さを設定すること。これは当たり前かもしれないけど、メモしながら進めていたら、気づいた。

pタグはブロックタグなのでtext-align:center;が適用されないことに気づいた。
なので、display:inline-block;にする必要があると気づいた。

②ドットインストール Boostrap4 8~14

最後までできませんでした。

覚えることが多すぎるので、メモしてからアウトプットするやり方だと、すごい時間かかりますね。たぶん一つので15分くらいかかりますね。

btnを大きくするときはlg 小さくするときはsm

グリッドレイアウトにするときは、colとrowを使う。colは一行が12分割でこれを振り分けられる。

一番難しかったのが、レスポンシブレイアウトである程度の幅で非表示にする方法。これは、d-md-noneとするみたい。
これに加えて、ある程度の幅で表示するには、d-noneにしつつ、d-md-blockでカラムについてはcol-md-2とすればメディアム以上では2で表示できるみたいだ。
もう一度、復習しよう。

h1とかのタグを大きくしたかったら、display-数字とすればよいことを忘れていた。

pyは上下、pxが左右というのも忘れていた。

丸くしたかったら、rounded-circleとすればよい。

カラムに順序をつけるには、orderを使う。

ここまでしか今日はできませんでした。昨日は上級道場もやろうと思ったのですが、You Tubeとか見ちゃうとできませんね。ほんまに減らしていきたい。

昨日は、すごい就活に悩んでいましたが今日はだいぶ和らぎました。

Twitterを見ていると、就活専用アカウントという文化があることには驚きました。見てみると、今の時期は遅いみたいなこと言っている人がいて次元が違うというか、意識の持ちようが全然違いすぎてありえねーと思いました。インターンの締め切りもあり、そろそろ、どの分野で就職するか考えないとですね。IT系に進みたいけど、就活大変そうで勇気がでませんね。でも、就職したくない分野で就職しても人生後悔しそうですし、IT系を狙っていきますかー。

また大学ではそろそろ研究室配属が決まりそうです。
一番、ホワイトな研究室通ってくれ。

昨日は、です、ます、口調じゃなくて実験レポートみたいな感じでしたが今日はです、ます、ぽい感じにしたけど、殴り書きだから適当になっている所が多すぎですね。本当に文章能力がないし、語彙力もないしやばいですよね。

他の人のブログの感想については休みの日にじっくり書きますね。

明日のTo Do List
・上級道場
・ドットインストール 15~22までで全て終わらす。
・できれば+αしたいですね

書き終えた時刻0:46

約1時間かかってしましました。多少は昨日より早く打てているなと実感していますが、どうも下をむいて確認しちゃいますね。明日は一度もキーを見ずにブログを書き終えることを目標にしますね。

明日も一日頑張りましょう!!!

今最も人気のあるCSSフロントエンドライブラリトップ10

$
0
0

こちらの記事は、Indrek Lasn氏により2019年 8月に公開された『 Here’s a List of the Top CSS Front-End Libraries 』の和訳です。
本記事は原著者から許可を得た上で記事を公開しています。

なぜ自前でCSSで書くよりもCSSライブラリを使った方が良いのでしょうか?簡単に言えば時間というリソースは限られているからです。スタイルよりも機能の構築に時間をかけるべきです。CSSをゼロから作成することで、パフォーマンスやビジュアルの利点はあるでしょうか?もちろん!あります。しかし、CSSの経験が豊富でビジュアルのクリエイティビティが高い人でない限り、アウトソーシングした方が効率的でしょう。

また、フレームワークを使用すれば、動作して人に見せられるアプリケーションを素早くプロトタイプすることがより簡単になります。

フレームワークの高い人気のおかげで、今では様々なフロントエンドフレームワークが使えるようになりました。今回、私は最も人気で多くの製品に使用されているフレームワークを一覧にまとめてみました。特にこれ以上説明することもないので、早速以下のCSSフロントエンドライブラリの一覧をご覧ください。

Ant Design

紹介文: 「Ant Designを使うと、UIデザインとプロトタイピングが、全てのプロジェクトメンバーにとってシンプルで簡単になります。バックグラウンドアプリケーションと製品の開発効率の向上に役立ちます。」— Ant Designのウェブページより

Ant DesignはバックグラウンドアプリケーションのUIデザイン言語で、Ant UEDチームによって改良が行われています。Ant Designは内部バックグラウンドプロジェクトのユーザインタフェース仕様を統一することで、デザインの違いや実装での不要なコストを削減し、従来UIデザインとフロントエンド開発に費やされていたリソースを解放することを目的としています。

特徴

  • エンタープライズクラスのWebアプリケーション用UIデザイン言語
  • 高品質なReactコンポーネントセットがすぐに利用可能
  • 完全な型定義を持つTypeScriptで開発
  • 開発や設計に役立つ様々なリソースとツール

対応環境

  • 全てのモダンブラウザとInternet Explorer 9以上(polyfill適用)
  • サーバーサイドレンダリング
  • Electron

Foundation

紹介文: 「Foundationは高い応答性を持つ先進的なフロントエンドフレームワークの集合体です。(中略) プロトタイプから製品環境へと素早く移行し、あらゆる種類のデバイスで動作するサイトやアプリを構築できます。(中略) Foundationでは強力にカスタマイズ可能なレスポンシブグリッドが使用できます。Sass Mixinの強力なライブラリ、一般的なJavaScriptプラグイン、アクセシビリティ機能にも対応しています。」— Foundationのウェブページより

特徴

  • a11yフレンドリー
  • シンプルさを重視したスタイリング
  • フレキシブルなSass
  • ZURBスターターテンプレート

Bulma

紹介文: Bulmaは純粋なCSSのフレームワークで、bulma.cssというCSSファイルをただ一つだけ出力します。

このbulma.cssをそのまま使用することも、Sassのソースファイルをダウンロードして変数をカスタマイズして使用することもできます。

このフレームワークにはJavaScriptは一切含まれていません。大抵の場合、開発者は独自のJS実装(通常すでにあるはずです)と組み合わせて使うことを望みます。Bulmaは環境への依存がないと考えてください。つまり、既存のロジックに重ねて使うスタイルレイヤーとして使用できます。

特徴

  • Flexboxなど最新のCSS3機能を使用し、CSS変数やCSSグリッドの使用も予定されています。 - Bulmaはブラウザ技術の最先端を追っています。
  • シンプルなグリッドシステム: 一つの.columnsコンテナに複数の.column要素を必要なだけ格0. 納するだけでBulmaグリッドを作成できます。
  • 習得しやすい構文: 読みやすいクラス名(例: .buttonや.titleなど)と、簡単で分かりやすい修飾子(例: .is-primary.is-largeなど)により、Bulmaの要素を数分もしないうちに簡単に見つけることができます。
  • 100以上の有用なCSSヘルパー
  • その他の機能はこちら

Spectre.css

紹介文: 「Spectre.cssは、軽量で応答性の高いモダンCSSフレームワークで、迅速で拡張性の高い開発を可能にします。Spectreでは、タイポグラフィと要素の基本スタイルや、Flexboxベースのレスポンシブレイアウトシステム、ピュアCSSコンポーネントとユーティリティが利用できます」— Spectre.cssのウェブサイトより

特徴

  • 軽量 (gzip圧縮で10KB以下)
  • 見た目に美しいコンポーネントとカラーパレット
  • 直感的な構文
  • 高い柔軟性: JavaScript不要

Tailwind CSS

紹介文: 「Tailwind CSSは、高度にカスタマイズ可能な低レベルのCSSフレームワークです。オーダーメイドのデザインを構築できる様々なビルディングブロックを、煩わしいブラウザ独自のスタイルをオーバーライドすることなく使用できます。」— Tailwind CSSのウェブページより

特徴

  • レスポンシブ
  • コンポーネントフレンドリー
  • 高いカスタマイズ性

Shoelace

紹介文:「Shoelace.cssは、将来のCSS構文を使用して開発された軽量で先進的なCSSライブラリです。使いやすく、高度なカスタマイズが可能です。Bootstrapのユーザーにとってはなじみ深いながらも、新鮮な使い勝手に感じるでしょう。Shoelaceはほぼ全てのブラウザで利用できます。CDNバージョンはプロトタイプの作成には最適ですが、すべての機能を利用するには、Shoelaceをソースからビルドする必要があります。」— Shoelaceのウェブページより

特徴

  • 69kB以下と軽量
  • ネイティブなCSS変数やその他将来のCSS機能を使用
  • 使いやすく、高度なカスタマイズが可能

Semantic UI

紹介文:「Semantic UIは、単語やクラスを交換可能な概念として扱います。クラスは、名詞/修飾子の関係、語順、複数形などの自然言語の構文を使用して、概念と名称を直感的に結びつけます。BEMまたはSMACSSなどと同じような利点が得られながらも、退屈な作業を必要としません。」— Semantic UIのウェブページより

特徴

  • 単語とクラスを交換して使える簡潔なHTML

    <div class="ui three buttons">
        <button class="ui active button">One</button>
        <button class="ui button">Two</button>
        <button class="ui button">Three</button>
     </div>
    
  • 単純化されたデバッグ

  • テーマ

Skeleton

説明文:「Skeletonは、いくつかの標準的なHTML要素のスタイルを設定し、グリッドを提供するだけですが、多くの場合はそれだけでも、始めるには十分だったりするものです。小規模なプロジェクトに着手する場合や、大規模なフレームワークのすべての機能が必要だとは感じない場合は、Skeletonを使用するべきでしょう。」— Skeletonのウェブページより

特徴

  • コードはわずか約400行と羽のように軽量
  • モバイルを念頭においた設計
  • UIフレームワークではなく、開発の開始点となるように設計されたスタイル
  • コンパイルやインストールが不要で、すぐに利用可能

Skeletonは開発をスピードアップしてくれ、セットアップも簡単なので個人的にとても気に入っています。

Tachyons

紹介文:「Tachyonsは、CSSと開発を機能的にするためのUIデザインシステムです。CSSを一切書かなくても、新しいUIをすばやく構築・デザインできます。」— TachyonsのGitHubページより

「(組織や製品の)規模が拡大すればするほど、新しいコンポーネントと、コンポーネントのバリエーションを開発していく事になるため、UIデザインシステムはどんどん崩壊していきます。これらのバリエーションはしばしば(「頻繁に」と読んでください)ドキュメント化されず、再びそのコンポーネントやバリエーションが必要になった時(または新たに作成された時)に、コンポーネントが重複して作成されてしまうことになります。仮にコンポーネントがドキュメント化されていたとしても、効果的なドキュメントは、すべての状態・バリエーションを取得するために数十〜数百ものインスタンスが必要になることがよくあります。Tachyonsなどのシステムではこれをドキュメント化する代わりに、コンポーネントのプロパティを制限することでこの問題に対処しています。(私はこれを「サブアトミック」デザインと呼んでいます)

そして、次にサブアトミックコンポーネント(プロパティ)を構成してコンポーネントを作成します。コンポーネントとそのバリエーションを作成するのではなく、代わりに「材料」としてのサブアトミックコンポーネントの包括的なリストを作成するだけで済みます。これらのサブアトミックコンポーネントを何千通りもの方法で組み合わせることで、何百ものコンポーネントを作成できるようになります。コンポーネントのプロパティの数は多くなりますが、いくつかの許容値(サブアトミックコンポーネント)の集合に拘束されます。— Daniel Eden、Facebookデザイナー

特徴

  • モバイルファーストなCSSアーキテクチャ
  • 490通りもの色の組み合わせ
  • 複数のデバッグユーティリティを使用し、レイアウトの問題を軽減
  • 軽量(14KB以下)
  • オープンソースのコンポーネントライブラリ
  • プレーンHTML、React、Ember、Angular、Railsなどとの高い親和性
  • 無限にネストできるレスポンシブグリッドシステム
  • PostCSSで開発

Material Design

紹介文:「Googleによって開発・デザインされたMaterial Designは、成功するデザインの古典的な原則に、革新と技術を組み合わせたUIデザイン言語です。Googleの目標は、あらゆるプラットフォーム上のすべての製品で統一されたユーザー体験を可能にするデザインシステムを開発することだ。」-Material Designのウェブページより

特徴

あなたのCSSライブラリをシェアしたいですか?私がまちがっていたり、すごいライブラリを見落としていましたか?その場合は是非教えてください!

読んでくれてありがとう!がんばって!

翻訳協力

 
Original Author: Indrek Lasn
Thank you for letting us share your knowledge!

この記事は以下の方々のご協力により公開する事が出来ました。
改めて感謝致します。
選定担当: yumika tomita
翻訳担当: siho1
監査担当: @nyorochan
公開担当: asuma yamada
 

私たちと一緒に記事を作りませんか?

私たちは、海外の良質な記事を複数の優秀なエンジニアの方の協力を経て、日本語に翻訳し記事を公開しています。
活動に共感していただける方、良質な記事を多くの方に広めることに興味のある方は、ぜひご連絡ください。
MailもしくはTwitterでメッセージを頂ければ、選考のちお手伝いして頂ける部分についてご紹介させていただく事が可能です。
※ 頂いたメッセージには必ずご返信させて頂きます。

ご意見・ご感想をお待ちしております

今回の記事は、いかがだったでしょうか?
・こうしたら良かった、もっとこうして欲しい、こうした方が良いのではないか
・こういったところが良かった
などなど、率直なご意見を募集しております。
いただいたお声は、今後の記事の質向上に役立たせていただきますので、お気軽にコメント欄へ投稿ください。
みなさまのメッセージをお待ちしております。

Viewing all 8700 articles
Browse latest View live
<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>