レスポンシブwebデザイン

レスポンシブwebデザインを学ぼう

 

レスポンシブ対応する方法

Webサイトをレスポンシブ化するためには以下の工程が必要です。

表示領域の設定をする
画面サイズによってCSSを切り替えるための設定をする
画面サイズごとに適用するCSSを記述する

 

表示領域を設定する方法

レスポンシブ対応をするためには、画面幅が異なるデバイスに対してWebサイトの表示領域の設定をする必要があります。

この表示領域をviewportと呼びます。

viewportの指定をしないと、スマートフォンで表示した時に、PCサイトのレイアウトをそのままスマートフォンの画面内に収まるように縮小して表示されるので、文字が小さくなり非常に見づらくなってしまいます。

viewportを設定するためには、htmlファイルのheadタグ内に以下の記述を追加します。

<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>TECH CAMP DEMO</title>
<link rel="stylesheet" href="./css/reset.css" />
<link rel="stylesheet" href="./css/style.css" />
</head>

contentプロパティにwidth="device-width"を指定することで、ブラウザの大きさをPCやスマートフォンなどの機器の大きさに合わせることができます。
initial-scaleは、画面の拡大率を指しています。拡大率は「1.0」に設定しているため、拡大は行われません。


これで表示領域の設定が完了しました。

 

次に、画面サイズによってCSSを切り替える方法を学びましょう。

先に例を出したほうがわかりやすいので、以下を見てください。

例えば、「画面幅が500px以下の時にのみ、pタグのfont-sizeを10pxにしたい」という場合は以下のように記述します。

@media (max-width: 500px) {
p {
font-size: 10px
}
}

見慣れない記述ですが、「max-width: 500px」の部分は「画面幅が最大500pxのとき」という意味になるので、すなわち「画面幅が500px以下のとき」という意味になります。

max-widthに対してmin-widthも存在します。その場合は「画面幅が最低500pxのとき」という意味になるので、すなわち「画面幅が500px以上のとき」という意味になります。

 

最後に画面サイズごとにcssを適用する方法を学びます

メディアクエリを書いたら、実際にCSSをその中に書いていきます。

例えば、以下はPC表示時はpタグのフォントサイズを30px、タブレット時は25px、スマホ時は20pxにするという記述です。

/* PC表示時 */
p {
font-size: 30px
}

/* タブレット表示時 */
@media (max-width: 1000px) {
p {
font-size: 25px
}
}

/* スマホ表示時 */
@media (max-width: 500px) {
p {
font-size: 20px
}
}

他にもPC表示時は横並びのレイアウトをスマホ時には縦並びにしたり、marginの値を小さくしたりすることがあります

レスポンシブwebデザイン

画面に今回はPC表示時のレイアウトを実装します。

それに先立ち、レスポンシブWebデザインとは、端末の画面幅に応じて表示が変わるWebデザイン設計のことをおさえておきます。

PCの完成イメージは以下です。

f:id:kikiMustang:20201201222748p:image

次に以下のフォルダ・ファイルを作成します。

いままでのフォルダ内に作成はしません。

responsiveimages
cssstyle.css
reset.css
index.html

 

次にindex.htmlを以下のように編集します。

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>TECH CAMP DEMO</title>
</head>
<body>
</body>
</html>

 

デフォルトのcssをリセットします

* {
box-sizing: border-box;
}

html,
body,
ul,
li,
h1,
h2,
p,
div {
margin: 0;
padding: 0;
}

body {
font-family: "Noto Sans JP", "Hiragino Kaku Gothic ProN W3", sans-serif;
color: #3b4043;
}

li {
list-style: none;
}

img {
max-width: 100%;
vertical-align: bottom;
}

a {
text-decoration: none;
color: #3b4043;
}

本来、このリセットCSSは自作するのではなく、世界中の有志のエンジニアが作成したファイルを読み込むことが一般的です。

cssを読み込む為index.htmlを以下のように編集します

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>TECH CAMP DEMO</title>
<link rel="stylesheet" href="./css/reset.css">
<link rel="stylesheet" href="./css/style.css">
</head>
<body>
</body>
</html>

 

フォントを設定するため、index.htmlを編集します

<link href="https://fonts.googleapis.com/css?family=Noto+Sans+JP:400,700,900&display=swap" rel="stylesheet">

次に画像をダウンロードしておき、imageフォルダにいれておく

 

PCのレイアウトの実装に入ります。

最初にマークアップします。

index.htmlの11行目以降に下記を追加します。

<header class="header">
<div class="inner">
<img src="./images/logo.png" alt="" class="logo" />
</div>
</header>
<!-- /.header -->

<main class="main">
<div class="inner">
<h1 class="page-heading">記事一覧</h1>
<div class="card__wrapper">
<div class="card">
<img src="./images/image.png" alt="" class="card__img" />
<div class="card__body">
<h2 class="card__title">記事タイトルが入ります</h2>
<p class="card__summary">
記事の要約が入ります。記事の要約が入ります。記事の要約が入ります。記事の要約が入ります。記事の要約が入ります。記事の要約が入ります。
</p>
</div>
</div>
<div class="card">
<img src="./images/image.png" alt="" class="card__img" />
<div class="card__body">
<h2 class="card__title">記事タイトルが入ります</h2>
<p class="card__summary">
記事の要約が入ります。記事の要約が入ります。記事の要約が入ります。記事の要約が入ります。記事の要約が入ります。記事の要約が入ります。
</p>
</div>
</div>
<div class="card">
<img src="./images/image.png" alt="" class="card__img" />
<div class="card__body">
<h2 class="card__title">記事タイトルが入ります</h2>
<p class="card__summary">
記事の要約が入ります。記事の要約が入ります。記事の要約が入ります。記事の要約が入ります。記事の要約が入ります。記事の要約が入ります。
</p>
</div>
</div>
<div class="card">
<img src="./images/image.png" alt="" class="card__img" />
<div class="card__body">
<h2 class="card__title">記事タイトルが入ります</h2>
<p class="card__summary">
記事の要約が入ります。記事の要約が入ります。記事の要約が入ります。記事の要約が入ります。記事の要約が入ります。記事の要約が入ります。
</p>
</div>
</div>
<div class="card">
<img src="./images/image.png" alt="" class="card__img" />
<div class="card__body">
<h2 class="card__title">記事タイトルが入ります</h2>
<p class="card__summary">
記事の要約が入ります。記事の要約が入ります。記事の要約が入ります。記事の要約が入ります。記事の要約が入ります。記事の要約が入ります。
</p>
</div>
</div>
<div class="card">
<img src="./images/image.png" alt="" class="card__img" />
<div class="card__body">
<h2 class="card__title">記事タイトルが入ります</h2>
<p class="card__summary">
記事の要約が入ります。記事の要約が入ります。記事の要約が入ります。記事の要約が入ります。記事の要約が入ります。記事の要約が入ります。
</p>
</div>
</div>
</div>
</div>
</main>
<!-- /.main -->

<footer class="footer">
<p class="copyright">Copyright © 2020 TECH CAMP DEMO All rights reserved.</p>
</footer>
<!-- /.footer -->
</body>
</html>

 

ここでブラウザで確認しましょう。

f:id:kikiMustang:20201201222408p:image

画面に収まらないので縮小した場合のものを表示します。

最後にスタイリングをします。

style.cssを以下のように編集します。

.header {
background-color: #f1f8fe;
margin-bottom: 48px;
padding: 10px 0;
}
.inner {
width: 1024px;
margin: 0 auto;
}
.logo {
width: 100px;
}
.page-heading {
font-size: 30px;
margin-bottom: 28px;
}
.card__wrapper {
display: flex;
flex-wrap: wrap;
justify-content: space-between;
align-items: center;
}
.card {
width: calc((100% - 50px) / 3);
margin-bottom: 40px;
}
.card__img {
margin-bottom: 16px;
}
.card__title {
font-size: 24px;
margin-bottom: 8px;
}
.card__summary {
font-size: 18px;
}
.footer {
background-color: #999;
padding: 10px 0;
}
.copyright {
text-align: center;
color: #fff;
font-size: 10px;
}

ブラウザで確認しましょう。

正しく実装すると以下のようになります。

f:id:kikiMustang:20201201222723p:image

Ruby on Rails(PicTweet)

投稿検索機能を実装しよう

 

検索フォームを作成しよう

検索の入力欄とボタンには、フォームを使う

f:id:kikiMustang:20201125211518j:image

ここではルーティングを書いていないのでエラーがでる

これから詳細を設定していく

ルーティングを設定してあげる

f:id:kikiMustang:20201125212105j:image

tweet.rbでwhereメソッドとlike句を使用して検索の処理をつくる

f:id:kikiMustang:20201125212847j:image

 

tweets_controller.rbの3行目に:searchを追加する

そしてsearchメソッドを定義する

ded search

@tweets = Tweet.search(params[:keyword])

end

 

app/views/tweetsのディレクトリの配下にsearch.html.erbを作成し下記を書く

f:id:kikiMustang:20201125214227j:image

Ruby on Rails(PicTweet)

ツイートにコメントを投稿しよう編

まずターミナルでコメントのモデルを作成する

生成されたマイグレーションで下記を追加する

t.integer :user_id

t.integer :tweet_id

t.text :text

そしてマイグレーションを実行する

 

アソシエーションを定義する

belongs_to :モデル単数系で、アソシエーションを定義する。今回はTweetとuserとする

複数のコメントを所有できるhas_many:モデル複数形でコメントを組み込む

app:models/user.rbにも追記する

 

createアクションのルーティングを設定する

routes.rbを下記のように書き換える

f:id:kikiMustang:20201124211230j:image

commentsコントローラーを作成する

 

comments_controller.rbを編集する

createアクションを定義し、ストロングパラメーターも利用する

f:id:kikiMustang:20201124212034j:image

そしてコメントを保存したのち、コメント完了画面を表示させるのではなく、コメントしたツイートの詳細画面へリダイレクトさせる

f:id:kikiMustang:20201124212425j:image

 

コメント投稿フォームを投稿詳細に追加しよう

app/views/tweets/show.html.erbの23行目以降を追加する

f:id:kikiMustang:20201124221218j:image

コメント表示欄を投稿詳細に追加する

tweets_controller.rbのshowアクションを編集する

下記を追記する

@comment = Comment.new

@comments = @tweet.comments.includes(:user)

下記を追記することでもし@commentsが空だった場合でもエラーが起こらないようにする

 

 

Ruby on Rails(PicTweet)

複数ページで利用する表示の一部をまとめよう

部分テンプレートとは、ビューファイルで繰り返し使用するコードを切り出し、再利用する仕組みのこと

app/views/tweetsに_tweet.html.erbを作成する

そしてindex.html.erbの3〜26行目を⌘+xで切り取る

そして⌘+vで先程作成したファイルに書く

先ほど切り取った箇所で、部分テンプレートを呼びだす

<%= render partial: "tweet", locals: { tweet: tweet }%> 

 

次に部分テンプレートを適用する

すでに部分テンプレートは作成してあるので、使用するファイルを呼び出すだけである

app/views/users/show.html.erb

f:id:kikiMustang:20201123213840j:image

フォーム部分もまとめる

_form.html.erbをapp/views/tweetsに追加

new.html.erbの4〜8行目を切り取り新ファイルに追加

そして1行目を下記に置き換える

<%=form_with(model: tweet, local: true) do |form|%>
先程切り取った箇所で、部分テンプレートを呼び出す

<%= render partial: "form", locals:{tweet: @tweet } %>
edit.html.erbも上記にまとめる

Ruby on Ruby(PicTweet)投稿者本人のみに編集・削除を許可しよう編

投稿者本人か確認して表示を変えよう

編集ボタンと削除ボタンの表示部分をif文で囲う

 

f:id:kikiMustang:20201123210224j:image

ツイート詳細ページ同様に、if文で表示を切り替える

current_user.id == tweet.user_idという条件を含むif文でプルダウンメニューごとに囲むことによって、「未ログイン時や自分の投稿でないときは非表示」となるように書き換える

 

Ruby onRails(PicTweet)マイページを実装しよう編

ユーザーのマイページ機能を実装します

ツイートにユーザー情報を追加する

カラムの追加の手順はnicknameカラムを追加するのと同様、ファイル名の命名規則にしたがって、自動でコードが記述されたマイグレーションを生成する

そしてapp/controllers/tweets_controller.rbでprivateの所に

.merge(user_id: current_user.id)を追記する

app/models/user.rbに

has_many :tweetsを追記する

 

app/models/tweet.rbに

belongs_to :userを追加する

 

マイページを表示する際には、usersコントローラーのshowアクションを動かせるようルーティングを設定しておく

config/routes.rbに

resourses :users, only: :showを追加する

 

マイページのビューを作成する

app/viiews/users内に、show.html.erbを作成し、以下のコードを書く

f:id:kikiMustang:20201123205552j:image

 

 

 

ログアウトボタン部分をプルダウンメニューに追加するよう、18行から25行を変更した

f:id:kikiMustang:20201121214345j:image

 

ターミナルでusersのコントローラーを作成する

その後app/cotrollers/users_controller.rbに@nicknameと@tweetsというインスタンス変数に代入する

 

投稿者こユーザー名の表示

tweetsテーブルのレコードである、「name」カラムの値が表示される部分を、アソシエーションを利用してツイート投稿者の「nickname」が表示されるように変更する

app/views/tweets/index.html.erbに

<a href="">

<span>投稿者</span><%= tweet.user.nickname %>
</a>

を追記する

そしてsequel Proでuser_idカラムに値を入れます

今回は1としました

app/views/tweets/index.html.erbの20行目のhref内に

/users/<%= tweet.user.id>を追記

そして以下を16-18行目に追記する

f:id:kikiMustang:20201122171341j:image

app/controllers/tweets_controller.rbの6行目を

@tweets = Tweet.incldes(:user)に書き換える

 

Nicknameを入力するためのフォーム部分を削除する

app/views/tweets/edit.html.erbの5行目も同様

app/cotroller/tweets_controller.erbの:nameも消す

tweetsテーブルからnameカラムを削除する