プログラミングの理解が遅すぎる初心者がJavaScript、Node.jsで投票型掲示板を作ろうとしてます

トップページでは記事の順番がごちゃごちゃなので、記事もくじをご覧いただければと思います。

CSS 掲示板を作る②パーツの配置

とりあえず掲示板を作るのに必要な、送信の部分に関しては作り終えましたけど、まあ見ての通り虚しさを覚えるほどの殺風景です。

前回作ったのがコレです。

Image
掲示板①

なんだコレは。

はやいとこ、ある程度装飾をしていきたいと思います。

最低でもあれらのパーツを縦に並べたいですよね。

というわけでまず縦に並べるところから始めます。

この操作はCSSから行うことになります。

なお、このブログではVS Codeを使っていますので、Sassを使った表示になります。

たとえば、

form {
  display: flex;
  flex-direction: column;
}

form input {
  margin-top: 10px;
}

form {
  display: flex;
  flex-direction: column;

  input {
    margin-top: 10px;
  }
}

のように書くことになります。

inputに対してformが親要素ですので、本来なら毎回「form input{}」のように書かないといけないのですが、Sassを使えばformの入れ子({}で囲まれた部分です)の中に入れておけば、formと書くことを省略できます。

Sassマジ便利。

で、その便利なSassを使うためには「scss」という拡張子のファイルを作る必要があります。

なので「style.scss」というファイルを作ってください。

これを保存すれば、勝手に「style.css」というファイルが出来上がります。

これが本来のCSSファイルです。

必要なのはあくまでCSSファイルのほうですので、必ずこのファイルが生成されているか確認してください。

さて。まずレイアウトを決めるところから始めるわけですからdisplayをつかうことになります。

ではdisplayはflexgridのどちらを使うべきかが悩みどころです。

どちらも配置を決めるものだからです。

で、調べてみたんですけど、flexは一方向に配置を並べたい場合、gridは二方向に配置を並べたい場合に使うと良いんだそうです。

つまりすごろくか将棋か、みたいな感じなんだと思います。

すごろくは一般的にはゴールまで一直線ですが、将棋は縦と横があります。

とりあえず今の私の理解はこんなところです。

というわけで上から下にパーツを配置したいだけなので、ここではflexを使いたいと思います。

まずlinkをエメットで変換し、あたらしいstyle.cssに紐づけます。

<link rel="stylesheet" href="style.css">
</head>

CSSflexを使うことを書きます。

form{
  display: flex;
  }

これの子要素を縦に並べるには「方向を縦に」という指示をすればいいので、こんな感じですね。

form{
  display: flex;
  flex-direction: column;
  }

flex」と書いただけで、エンターキーを二回ほど押せばここまで書いてくれました。

エメットマジ便利。

columnってのは、もともとラテン語はcolumnaといって「柱」って意味らしいです。

だから縦だってことみたいですね。

ちなみに横はrowです。

これはそのまま「行(ぎょう)」という意味です。

で、なんですけど、これでパーツが縦に配置されるかと思ったけど配置されません。

なんで?

よーく見直したら先日書いたhtmlのが2つありました。(前回の記事をご覧になってない方は気にしないでください。)

ので、要素を挟んでいないほうのを消したら、ちゃんとうまくいきました。

フォームもボタンも画面端から画面端まで届くとんでもない形ですが、とりあえず縦に並びました。

ただし、パーツが画面端から端まで届いていてバグってるようにしか思えない見映えです。

次はその馬鹿みたいな横長をどうにかします。

まずなんとなくわかりやすいということで、ボタンのサイズを考えてみます。

というより考えてもわからないので調べてみます。

適切な結構ボタンのサイズって結構議論があるところみたいですね。

まあサイトにもよるというのがおおきいのでしょうけど。

縦幅は初期設定で問題ないように思えるので、問題は横幅ですね。

これもまあ適当でいいとは思うんですけど、数値的に中途半端だと気分が悪いので、少なくとも偶数にしたいと思います。

とか色々思ってましたけど、まあもう適当でいいや。

あとから確認してダメそうなら修正します。

高さと横幅の指定は以下の通りにしてみます。

button{
  width: 200px;
  height: 50px;
}

まあスマホでタップすることも考えたら、これくらいの大きさでいいかというような気がします。

ただ、ボタンは大きくなったけど、中の「送信」という文字が小さすぎるので、これをどうにかします。

button{
  width: 200px;
  height: 50px;
  font-size: 20px;
}

高さの半分より少しだけ小さい、という感じで悪く無い気がします。

で、ここまでやっててずっと思ってたんですけど、フォームとフォームとボタンの間隔がゼロなので、めちゃくちゃ窮屈です。

これ、隙間を入れないとだめですね。

隙間はmarginだったと思います。

paddingやらとごっちゃになってるところがありますので、各々もとの意味を調べておきます。

margin=余白。

padding=詰め物。

マージンって利ざやという意味でしかあまり聞いたことはありませんけど、パッドはありますね。

パッド胸みたいな感じで。

最初に連想する単語としてはどうかと思いますが。

とりあえずGoogleChromeの「検証」で見られるそれらの関係図はこんな感じなので、意味といっしょに考えたら覚えられそうです。

Image
検証

margin。

border。

padding。

borderは普通に線の太さとかでしょう。

なんにしてもやっとmarginを変えれば、隙間を空けられるということがわかりました。

さて、ではどこにそれを書けばいいのでしょう。

ボタンの上に隙間を空ければいいからボタンの上にマージンを指定すればいいのでしょうか。

そうするとフォームの上、もう一つのフォームの上、とか一つひとつ書いていくことになります。

まあ

で一括りにしておいたのですから、そこで各々の要素の間にmarginを入れる、というように書けばよさそうな気がします。

ってことは

form{
 margin: ;
  display: flex;
  flex-direction: column;
}

とでも書けばいいのでしょうか。

いや、これだとフォームの塊全体の周りにマージンができるにすぎません。

なんとか要素の一つ一つに対して指定しなくてもいい方法はないものでしょうか。

思いつかないので諦めます。

いずれにしてもすべての要素はの中にあるので、VScodeでは以下のように指定することができます。

form{
  display: flex;
  flex-direction: column;
    
  input{
  }

  textarea{
  }
  
  button{
  }
}

それぞれにformを付けなくていいんです。

ではそれぞれ要素の上にmarginを取っていくことにします。

form{
  display: flex;
  flex-direction: column;
    
  input{
    margin-top: 10px;
  }

  textarea{
    margin-top: 10px;
  }
  
  button{
    margin-top: 10px;
  }
}

いい感じに隙間はできたのですが、

「名前」と名前の入力フォームより、その入力フォームと「コメント」のほうが距離が近いので違和感があります。

なので要素の下にもマージンを作りました。

input{
  margin: 10px 25px;
}
textarea{
  margin: 10px 25px;
}
button{
  margin: 10px;
}

これで間隔的な見栄えはマシになりました。

あくまでマシにです。

次に入力フォームの縦横幅を決めていくことにします。

まずは名前の入力フォーム。

とりあえず縦幅が40pxにすると良いとされているようなので、縦横ともに40pxにしてみます。

pxの意味はわかりますが、実際に指定したときのイメージができないので、まずは書いてみて、それを基準に作って行こうと思います。

・・・。

縦幅としてはちょうどいい感じです。

当然、横幅としては小さすぎるので、これを何倍に伸ばせばいいのかと考えてみますが、5倍くらいでいいように思います。

200pxにしましたが、ちょうどいい長さになりました。

次にコメントの入力フォームです。

数行書くことが前提となるので、名前の入力フォームの2倍、80pxにしてみます。

横幅もその5倍、400pxにしました。

見た目としてはいい具合になったと思います。

ところで、すでに出てきた数値を数倍するといった場合、pxを使うと絶対的な大きさになってしまいます。

相対的な大きさにするにはemを使うと良いらしいです。

pxを使うと、少し全体的に大きさを変えたいといったようなとき、すべてを書き直す必要が出てくるからです。

なのでemに書き直していきます。

・・・と思ったのですが、emは親要素の影響を受けるらしいので、親要素の影響を受けないremを使って行こうと思います。

remの基礎となる大きさは、デフォルトでは16pxで固定になります。

ちゅうか、これが基礎となるのであれば、入力フォームの大きさはいちいち親のフォントを気にしなければならないemより、すべてremで指定したほうがいいように思えます。

というわけで、名前の入力フォームは高さをフォントの1.5倍、幅を20倍にします。

コメントの入力フォームは、縦幅を更にその4倍、横幅を2倍にします。

この場合は親要素の倍数ということでemを使うといいのでしょうが、面倒なのでremのまま使おうとおもいます。

input{
  margin: 1rem 2.5rem;
  height: 2rem;
  width: 20rem;
}
textarea{
  margin: 1rem 2.5rem;
  height: 8rem;
  width: 40rem;
}
button{
  margin: 1rem;
}

なぜかボタンだけ別にしていたので、ボタンを統一します。

button{
  margin: 1rem;
  width: 200px;
  height: 50px;
  font-size: 20px;
}

これである程度見やすくなったと思います。

さて、もう一つ気になるところがあります。「名前」という文字列と入力フォームの左端が合ってないところです。

一番カンタンに揃えるには、フォームやボタンのマージンを、左側をゼロにすることです。ページの完成形としては、左右に余白がある1カラムにしようと思いますので、ここは左端のマージンをゼロにするということで良さそうです。

ということでinput,textare,buttonにmargin-left:0;を付け足します。

input {
    margin: 1rem 2.5rem;
    margin-left: 0;
    height: 2rem;
    width: 20rem;
}
textarea {
    margin: 1rem 2.5rem;
    margin-left: 0;
    height: 8rem;
    width: 40rem;
}
button {
    margin: 1rem 0;
    margin-left: 0;
    width: 200px;
    height: 50px;
    font-size: 20px;
}

marginの二項目が左側を指しますので、これをすべて0にしました

ここまでのコードをまとめておきます。

form{
  display: flex;
  flex-direction: column;
    
  input {
    margin: 1rem 2.5rem;
    margin-left: 0;
    height: 2rem;
    width: 20rem;
}
textarea {
    margin: 1rem 2.5rem;
    margin-left: 0;
    height: 8rem;
    width: 40rem;
}
button {
    margin: 1rem 0;
    margin-left: 0;
    width: 200px;
    height: 50px;
    font-size: 20px;

}

Image
掲示板②



少し物足りない気もしますが、まあこれくらいでいいでしょう。

Image