20210510のHTMLに関する記事は6件です。

【完全版】あなた、HTMLの基礎しっかりしてますか? (初学者の初学者による初学者のための”Web Developer Roadmap 2021”解説 Part3)

・初めに この記事は以下の方を対象としています。また、記事修正のコメントやLGTMなどモチベーションにつながるのでポチっとお願いします‼ 初学者の方 フロントエンドエンジニア志望の方 基本的なことを復習したい方 ・導入 閲覧ありがとうございます。この記事は、初学者がフロントエンド目指してロードマップ(下図)に沿ってアウトプットしていく毎日投稿の記事になります。 こちらの記事はPart3です。最初からご覧になりたいかたは、記事一覧よりどうぞ。 ・記事一覧 part1: Internet【HTTP,Browsers】 part2: Internet【DNS,Domain,Hosting】 ・随時更新予定 ・Part3 HTML 私は独学で数か月勉強しているのですが、今振り返ってみるとHTMLについては、本数冊に目を通しプロゲートをやっただけという、付け焼き刃感が否めないことが発覚したので、復習を兼ねてしっかりとアウトプットしていきます。そう意味でタイトルも自分に向けて付けました。(viewを増やしたいとか思っていない()) Learn the Basics(HTMLの基礎を学ぶ) HTMLとは HTML(Hypertext Markup Language/ハイパーテキスト・マークアップ・ランゲージ)は、Webサイトのコンテンツに構造を指定するためのコードです。HTMLはプログラミング言語と勘違いされることが多いですが、HTMLはプログラミング言語でなく、マークアップ言語といってコンテンツの構造を決めるものというのを覚えておきましょう。 マークアップ言語とは マークアップ言語といわれても、なんのことやらという感じだと思うので具体例で説明していきたいと思います。 まず基本的に、文章(サイト)はタイトルや見出し、段落や画像などの要素から成立しています。人は文章を読むと「タイトルだな」「ここは段落」「これは画像」など構造を理解できますが、これは人が経験で得た感覚であって、コンピューターにはその判断は不可能です。そこで、文章に「タイトル」「段落」「画像」などの目印をタグによってつけることで、コンピューターにも要素の判別ができるようにしました。これがマークアップといいます。 そのため、マークアップするのための言語(これは俗にいう言葉という意味ではなくやり取りのための手段という感覚)をマークアップ言語と呼びます。 以上をまとめると、HTMLはハイパーテキストをマークアップ言語という意味がわかるかと思います。 ハイパーテキストについてはpart1 HTTP,Browserの際に説明しましたが、ここでもしておくと、複数の文書を相互に関連付け結び付ける仕組みのことです。詳しくはPart1までどうぞ。 タグとは タグとは、上記の説明通りマークアップするためのモノです。次の文を見てください。 <p>My name is Ichiro</p> このように<p>と</p>で囲うことで、この要素は段落であることを指定しています。この時、<p>タグのほうを開始タグ、</p>タグのほうを終了タグといいます。終了タグのほうは、</p>と、"/"が入ることに注意しましょう。さらに、My name is Ichiroの部分をコンテンツいい、全体を要素といいます。 属性 要素は、属性(Attribute)を持つことが出来ます。属性とは要素に対し実際には表示されない追加情報を含んだものです。ここでは class が属性の名前で mlb-player が属性の値です。属性にも種類がありますが、今回はclass 属性を使って要素に識別するための名前を与えていて、後でこの要素を指定してスタイルをつけたり様々なことができるようになります。 <p class="baseball-playr">My name is Ichiro</p> 要素の入れ子(ネスト) 要素の中に他の要素を入れることも出来ます。これを入れ子(ネスト)と言います。下記の場合はIchiroがstrongタグによって強調されています。 <p class="baseball-playr">My name is <strong> Ichiro </strong></p> 結果としては、My name is Ichiro となっています。 空要素 コンテンツを持たない要素を空要素 (empty elements) と呼びます。 <img> 要素を例に見ていきます。 <img src="images/Ichiro.png" alt="Ichiro image"> この要素は2つの属性を持っていますが終了タグ</img>はありませんし、内部にコンテンツもありません。これは、image要素の目的は画像をHTMLページの表示させることなので、コンテンツが必要ないためです。 HTMLの構造 HTMLの要素は、1つあるところでサイトのようなページにはなりません。そこで、HTMLの一般的な構造をみていきましょう。 ・【注意】多くのタグが出てきますが、こんなのがあるんだくらいの感覚で読むことをおすすめします(多すぎて吐きます。実際私もうろ覚えなものばかりです…。)ただ、基本的にどのような意味を持つのかは覚えておくといいと思います。また、説明の多くはこちらの引用になります。興味がある方は見てみてください。 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>My test page</title> </head> <body> <img src="images/firefox-icon.png" alt="My test image"> </body> </html> 上記のコードを詳しく見ていくとともに、HTMLの基本タグについてしっかり学んでいきましょう。 <!DOCTYPE html> 文書型宣言です。HTML がまだ出来たばかりの頃 (1991~2年)、文書型宣言は HTML ページを正しい書き方がなされているかを示すルールセット (自動エラーチェックなどの便利なもの) に関連付けさせる役割を担っていました。しかし、最近ではそのようなことを気にする人はいなくなり、うまく動くために存在するただの遺産となってしまいました。今はこれだけ知っていれば大丈夫です。 メタデータ系+スクリプト <html>~</html> <html> 要素です。この要素はページのすべてのコンテンツを囲み、ルート要素とも呼ばれます。ただし、<html>~</html>の子要素として <head>と<body>がそれぞれ一つづつ必要となります。さらに、html要素には、lang属性で言語を指定することができます。 例えば、日本語の場合はlang="ja"、英語の場合にはlang="en"を指定します。 <head>~</head> <head> 要素です。この要素は「そのHTML文書に関するメタデータを集めたもの」を指します。メタデータとは、その文書に関する情報のことで、 例えば <title> や<base> , <link> , <style> , <meta> などが挙げられます。 これらのメタデータを表すタグは、すべて<head>~</head>の中に配置します。 <meta charset="utf-8"> このタグは<head>タグ内に記述します。終了タグが存在しません(入れるとエラーとなります)。HTML文書のメタデータは<head>~</head>の中に、<title>, <base>, <link>, <style>, <script>などのタグで指定しますが、 これらのタグで表現できないその他の様々なメタデータは<meta>で表します。<meta charset="utf-8">の意味としては文書に対し文字コードを UTF-8 に設定しています。 UTF-8 には人類が使う言語の殆どの文字が含まれています。基本的には指定することにより文書に書いたテキストコンテンツを扱うことが出来ます。 <title>~</title> <title> 要素です。 ほとんどの場合、title要素はhead要素の子要素として必須ですが、 より高いレベルのプロトコルでタイトル情報が提供される場合には、title要素を省略することができます。このタイトルはページが読み込まれた時にブラウザのタブに表示され、ブックマーク(お気に入り)に登録した時の名前にもなります。 <link> <link>タグは、リンクする外部リソースを指定する際に使用します。 外部リソースとは、例えば、HTMLファイル、CSSファイル、RSSファイルなど、現在の文書ファイルに関連している外部ファイルのことです。<link>タグは、<head>~</head>の中に記述します。<link>タグを指定する場合には、href属性とrel属性が必須です。 href属性とrel属性が指定されていない場合には、<link>タグの指定は無効となります。 href属性には、リンクする外部ファイルのURLを指定し、rel属性にはリンクタイプを指定します。 具体的には、現在のファイルとリンク先の外部ファイルとの関係性を表すキーワードを指定します。 <link>タグは一つの文書内に複数記述することができます。 例えば、rel="stylesheet"を指定された複数の<link>タグで、複数の外部CSSファイルを指定することも可能です。 この場合、リンクしている複数の外部CSSファイルのスタイル指定がすべて有効となります。 スタイル指定が競合した場合には、より後から読み込まれたCSSファイルのスタイル指定が優先されます。 <style>~</style> <style>タグは、スタイルシートを記述する際に使用します。 通常は<head>~</head>の中に配置しますが、 head要素内に記述することで文書単位でスタイルを指定することができます。 <script></script> <script>タグは、文書にJavaScriptなどのスクリプトや、データブロックを組み込む際に使用します。仮にHTML文書でJavaScriptなどのスクリプトを利用する際には、 HTML文書の<script>~</script>の中にスクリプトを記述するか、src属性で外部スクリプトファイルのURIを指定します。 src属性でJavaScriptの外部jsファイルを読み込む場合には、例えば以下のように記述します。 <script src="sample.js"></script> scriptタグにもいくつかの要素が指定できます。(詳細は割愛)使う際はググってみてください。 セクション セクションタグを使用する意図として、文書内のより大規模な構造を明確にするというのが挙げられます。以前の版の HTML には、関連するコンテンツをグループ化するための一般的なメカニズムとして<div> 要素だけがあり、意味づけが限られていましたが、これらの要素は、これを強化するためのものです。これらの意味づけ要素を意図した目的に沿って使用することが重要です。要するに、使うべきところで使うタグができたということです。しっかりと従っていきましょう。 <body>~</body> <body>タグは、文書の本体を表す際に使用します。 文書の本体とはブラウザ上に表示されるメインコンテンツのことです。 HTML文書では、<body>要素は<html>~</html>の中に一つだけ配置します。 <body>~</body>の中には見出し・段落・表・フォームなどの要素を配置します。 <section>(<section></section>) <section>タグは、ウェブページ内のその部分が、一つのセクションであることを示す際に使用します。セクションとは、文書やアプリケーションの一部分となる、意味や機能のひとまとまりのことです。 ウェブページ内のセクションとしては、例えば、導入部分、新着情報、連絡先などが考えられます。 セクションは意味的なひとまとまりなので、その部分の意味を表す見出しを付けることができるはずです。 見出しを付けることができない場合には、その部分を<section>~</section>で囲むのは適切ではないかもしれません。 もし、<section>タグを使用するべきかどうか迷った際には、その部分に見出しを付けることができるかを考えてみると、 セクションとしてふさわしいかどうか判断しやすくなるでしょう。 <article> <article>タグは、内容が単体で完結するセクションであることを示す際に使用します。 例えば、フォーラムでの投稿、雑誌や新聞の記事、ブログのエントリ、コメントなどです。 <nav> <nav>は、ナビゲーションであることを示す際に使用します。 ナビゲーションとは、ウェブサイト内の他のページへのリンクや、ページ内リンクなどのことです。他のページにリンクした箇所のすべてを ~ で囲む必要はなく、主要なナビゲーションとなるセクションのみを示すのに適しています。 <aside> <aside>タグは、その部分がウェブページ内における余談・補足情報のセクションであることを示す際に使用します。ここで言う余談・補足情報とは、本文と関連してはいるけれど区別して掲載するべき内容のことです。 例えば、印刷物などで本文の補足として欄外に掲載されるような内容です。 <main> <main>タグはメインコンテンツであることを示します。 <header> <header>タグは、イントロダクションやナビゲーショングループであることを示す際に使用します。 文書のヘッダ情報を表す<head>タグとは異なりますので注意してください。<header>の中には、通常は<h1>・<h2>・<h3>・<h4>・<h5>・<h6>など、セクションの見出しが含まれることが想定されていますが、必ず必要というわけではありません。 他にも、セクションの目次や検索フォーム、あるいは、関連ロゴをまとめるために<header>タグを使用することができます。 <footer> <footer>タグは、直近のセクションのフッタであることを示す際に使用します。フッタとは、そのセクションに関する情報のことで、一般的には、誰が書いたのか、関連文書へのリンク、著作権などの情報が含まれます。 <h1>・<h2>・<h3>・<h4>・<h5>・<h6> <h1>・<h2>・<h3>・<h4>・<h5>・<h6>タグは、見出しを付ける際に使用します。数値が小さいほど高いランクの見出しとなります。 <h1>が最も高位の大見出しで、<h6>が最も低位の小見出しです。 同じ数値のものが複数ある場合には同じランクとなります。 また、出しを配置すると暗黙的に新しいセクションを開始したことになります。 セクショニング・コンテンツの要素( <article>・ <aside>・ <nav>・ <section> )の中にある、 最初のヘッディング・コンテンツの要素( <h1>・ <h2>・ <h3>・ <h4>・ <h5>・ <h6> )は、そのセクションの見出しを表します。 そのあとに低いランクの見出しが続く場合には、暗黙的にそのセクションの一部となるサブセクションを開始したものとみなされます。 また、同じランクの見出しや高いランクの見出しが続く場合には、暗黙的に別の新しいセクションを開始したものとみなされます。 セクションが何たらというのは、要するに段落を勝手に変えるパターンがあるということです。 テキスト・コンテンツ <div> <div>タグは、ひとかたまりの範囲として定義する際に使用します。 <div>には特別な意味はありませんが、 <div>~</div>で囲まれた範囲を一つのグループとしてまとめることができます。 ページレイアウトやスタイリングを指定する際に、CSSを適用するためのコンテナ要素として使用されることの多いタグです。 <div>は大変便利なタグで、実際のコードでもよく使いがちですが、他に適切な要素が無い場合の最終手段として使用することが強く推奨されています。 より適切な要素があるにも関わらず<div>を使用していると、 ウェブページのアクセシビリティやメンテナンス性が低下してしまうからです。 <p> <p>タグは、ひとつの段落(パラグラフ)であることを表す際に使用します。<p>タグは、段落よりもふさわしい要素がある場合には使用するべきではありません。 <hr> <hr>タグは、段落レベルのテーマの区切り、セクション内における話題の区切りを表す際に使用します。例えば、物語におけるシーンの変わり目や、参考書のセクション内で別の話題に移る箇所などです。 また一般的なブラウザでは、hr要素を使用した場合には水平線が描画されます。 <ul> <ul>タグはunordered listの略で、順序のないリストを表示する際に使用します。 リスト項目は、<li>タグで指定します。<ul>タグで作成されるのは順序のないリストなので、リスト項目の順序を変えても文書の意味は変わりません。 順序のあるリストを作成する際には<ol>タグを使用してください。 <ol> <ol>タグはordered listの略で、順序のあるリストを表示する際に使用します。 リスト項目は、<li>タグで指定します。 <li> <li>タグはlist itemの略で、リストの項目を記述する際に使用します。li要素は、 ol要素・ ul要素・ menu要素 のいずれかの子要素として使用した場合には、その親要素のリスト項目となってお互いに関連しますが、 それ以外に配置された場合には他のli要素とは無関係となります。 インライン <a> <a>タグは、ハイパーリンクを指定する際に使用します。 ウェブページ内のテキストや画像などを<a>~</a>で囲んで必要な属性値を指定してやることで、 ハイパーリンクの始点(出発点)や終点(到達点)とすることができます。<a>は、anchor(アンカー)の略です。 anchorを日本語にすると“船の錨・つなぎ止めて固定する”といった意味になります。 <a>は、指定した場所同士をつなぐことで関連する情報同士を結び付け、ユーザーに情報間の移動手段を提供する重要なタグです。 また属性がいくつかあります。重要なところでいうとhref属性で、href属性はハイパーリンク先のURLを指定する際に使用します。 <br> <br>タグは、改行する際に使用します。<br>は、例えば詩や住所などのように、改行が実際にコンテンツの一部を成すような場合にのみ使用します。 文の長さを揃えたりレイアウトを整えるなどのスタイリング目的に<br>を使用してはいけません。 <span> <span>タグは、ひとつの範囲として定義する際に使用します。<span>はそれ自身では何も意味を持っていませんが、style属性・class属性・lang属性・dir属性などの属性と一緒に使用する場合に便利な要素です。 これらの属性と組み合わせることで、<span>~<span>で囲まれた範囲に スタイルシートやスクリプトを適用したり、その範囲の言語や表記方向を指定することができます。 メディア・コンテンツの埋め込み <img> <img>タグは、画像を表示する際に使用します。 必須属性のsrc属性で画像ファイルのURLを指定します。一般的なブラウザで表示できる画像フォーマットとしては、PNG・GIF・JPEGがよく利用されています。 他にも、ウェブ用のベクター画像フォーマットであるSVGや、単一ページのPDF・アニメPNG・アニメGIFなどをsrc属性の値として指定できます。 また、alt (alternative; 代替) 属性も指定しています。これは以下の様な理由で画像を見られない人に向けて文字で説明をするものです。alt 属性の内容は「説明する文」であるということが重要です。代替文は画像が伝えたいことをうまく言い表しているべきです。 <video> <video>タグは、動画を再生する際に使用します。<video>タグを使用することで、ユーザーにFlashなどのプラグインをインストールしてもらうことなく、標準のHTMLからシンプルに動画を扱えるようになります。 感覚的には<img>タグで画像を扱うような感じです。 例のごとく<video>にも多くの属性を指定できますが、ここでは割愛します。 <source> <source>タグは、動画や音声などのメディアファイルのURLや種類を指定する際に、<video>~</video>などのメディア要素の中で子要素として使用します。 <source>は、それ自身では何も表しません。メディアファイルのURLは、必須属性のsrc属性で指定します。 <source>を複数記述して、フォーマットの異なる複数のメディアファイルを指定しておくと、ブラウザに再生候補を提示することができます。 ブラウザは、記述された順に再生可能なデータを利用するので、より多くの環境で視聴してもらえる可能性が高くなります。 テーブル <table> <table>タグは、テーブル(表)を作成する際に使用します。テーブルの基本的な構造は、<table>~</table>の中に <tr>~</tr>で表の横一行を定義して、 さらにその中に<th>~</th>や<td>~</td>でセルを定義します。 テーブルは行(横行)とカラム(縦列)を持ちますが、空の行やカラムを持つことはできません。 ここで、テーブル要素をつくるためのタグはいくつかありますのでざっくり紹介します。個人的には、テーブル要素を使用することがあまりないので、使用するときに調べて使えばいいかなと思います。 ・<thead> …… テーブル(表)のヘッダ行を定義する。 ・<tbody> …… テーブル(表)のボディ部分を定義する。 ・<tfoot> …… テーブル(表)のフッタ部分を定義する。 ・<col> …… 表の縦列に属性やスタイルを指定する。 ・<tr> …… テーブル(表)の横一行を定義する。 ・<td> …… テーブル(表)のデータセルを作成する。 ・<th> …… テーブル(表)の見出しセルを作成する。 フォーム <form> <form>タグは、入力・送信フォームを作る際に使用します。<form>~</form>の間に、 <input>・ <select>・ <textarea>等のタグで、 一行テキストボックス・サブミットボタン・ラジオボタン・チェックボックス・セレクトボックス・テキストボックス等のフォーム部品を配置します。 フォームに入力されたデータは、送信ボタンを押すことでウェブサーバーへ送信されます。 その際の送信先URLはaction属性で、データの送信方法はmethod属性で、送信するデータの形式はenctype属性でそれぞれ指定します。 ウェブサーバーへ送信されたデータのプログラム処理は、 HTMLやCSSではなくPHPやCGIなどのサーバーサイド・スクリプトで行います。 <form>には多くの属性がありますが、多いすぎるのでここでは割愛させていただきます。 <input> タグは、フォーム(<form>~</form>)を構成する様々な入力部品を作成する際に使用します。多くの種類があるので、使用する際に適しているものを選べばいいかと思います。 <button> <button>タグは、ボタンを作成する際に使用します。 例のごとく多くの属性を付与できますが、頻出なものでいうとtype属性があります。type属性はボタンの種類を指定する際に使用します。 type属性の値には、以下の3種類のいずれかを指定することができます。 初期値はtype="submit"です。 ・type="submit" …… フォーム入力内容を送信するサブミットボタン(初期値) ・type="reset" …… フォーム入力内容をリセットするリセットボタン ・type="button" …… 何もしない汎用的な押しボタン <select> <select>タグは、セレクトボックスを作成する際に使用します。 一般的なブラウザでは、ドロップダウン式のセレクトボックスや、スクロール式のセレクトウィンドウとして表示されます。<select>~</select>でセレクトボックス全体を定義して、 その中に<option>タグを配置して個々の選択肢リストを作成します。 <option>タグで作成した選択肢を<optgroup>~</optgroup>で囲むと、選択肢をグループ化することができます。 <textarea> <textarea>タグは、複数行のテキスト入力欄を作成する際に使用します。cols属性は、一行当たりの最大文字数の目安を指定する際に使用します。 cols属性の値として指定できるのは、1以上の正の整数で、何も指定しない場合の初期値は20です。 これまた、いくつかの属性を用いてさまざまなオプションを付与することができます。 お疲れさまでした。まとめです。 ここまで、多くのタグを見てきて吐きそうになっている方が多いと思いますが、私もそうでした。しかし、ポジティブに考えればこれしかないとも捉えられるので、スタンスで行きましょう‼ 繰り返しにはなりますが、すべて覚えるというわけでなく、使ううちに覚えるのでこんな意味なんだという風になんとなく理解して、ある程度分かってきてからしっかりと復習すればいいと思います。 HTMLの概要については、しっかりと理解しておきましょう~‼ 次回予告 次回は、フォームのバリデーションと呼ばれることについて学んでいきます。 もしよろしければ、フォローやストック、LGTMお願いします(切実) 参考文献 MDN Web Docs HTMLクイックリファレンス
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

HTML, CSS, JavaScriptで掲示板システムを作ってみた【その2-飾りaタグ禁止】

作成した掲示板システムの概略 こんな感じのメッセージ投稿とアンカー機能を搭載した掲示板システムを作成し昨日初投稿の記事として紹介しました。 【作成した掲示板】 判明した不具合 昨日初めてのWebプログラミング挑戦の一環として掲示板の記事を投稿したのですが、一つ大きなバグがあったので、早くもアップデートが入りました。 この掲示板にはコメントにアンカーをつける機能を搭載しており、>>1などの文字列を正規表現で置き換えることで、リンクにして目立たせる機能を搭載していたのですが、リンク先がないので当然NotFoundエラーが表示されていました。 今回の改良ポイント そもそもリンク用途のaタグを修飾に使うべきではないような気がしたので、普通にspanで囲んで、青色をつけました。 1つ目.js $("#comment").html($("#comment").html().replace(/&gt;&gt;(\d)/g,"<a href=id$1 class='anc'>" + "&gt;&gt;$1" + "</a>")); 1つ目のコードはaタグを利用して修飾しています 2つ目.js $("#comment").html($("#comment").html().replace(/&gt;&gt;(\d)/g,"<span x=id$1 class='anc text-primary id$1'>" + "&gt;&gt;$1" + "</span>")); 二つ目では単にtext-primaryクラスを追加し、bootstrapで修飾しているので、NotFoundエラーは出ません。タグ内の要素はhrefではなく適当にxとおいて互換しています。 さらなる改良 モバイル用のマウスイベントがJavaScriptにあるなんて! 以前はmouseenterがポップ出現条件だったのですが、スマホでは使えないという欠点がありました。今回、リンク不良が治ったためポップ条件をclickにし、PC用ではマウスが離れた時、スマホ用では画面スワイプでポップを削除するようにしました。 改良.js $(".pop" + n).on("mouseleave", function () {//マウスが離れた時削除 $(this).remove(); }) $(".pop" + n).on("touchmove", function () {//画面をスワイプしたとき削除 $(this).remove(); }) 一つ前の記事へ
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【初心者向け】テキスト&CSSにするか、画像にするかの線引き

どうも7noteです。テキストにするか画像にするかの線引きをいろいろなパターンで考えてみた WEB制作を行う中で 「テキストにするか、画像にするか」 は非常に難解な問題です。 特に線引きが難しいこの問題を個人的見解で基準となる線引きをしてみました。 さまざまな場面に合わせてテキストか画像かを分けて行きます。 「テキスト」のほうが好ましい場面 ・seo対策に重要なキーワード 重要なキーワードはできる限りテキストとしてgoogleのクローラー(サイトを巡回してるロボット)に認識してもらい評価を受ける必要があるので、できるだけテキストで作成します。 ・見出し、ページタイトルなど こちらもseo対策を行う場合はテキストのほうが好ましいので、できる限りテキストで作成します。 ただCSSで再現できないものは画像にします。 ・今後更新することがある数値・テキスト 更新のたび画像を修正していると作業時間がとても増えてしまうので、できる限りテキストで作成します。 ただ、デザインを損なう場合は画像で作成します。 ・ナンバリングはolのカウントで出来るだけ再現 1.ほげほげ 2.ふがふが などの文字はcssの装飾で対応できる場合はcssだけで再現します。 もし新しく増えたり、順番が変更になってもHTMLの修正だけで済むので。 ただ、標準デバイスにないフォントで作成されている場合は画像で作ります。 ・テーブル、表 HTMLでテーブルがあるので、できるだけtableタグを使って再現します。 ただtableタグだけで表現が難しいデザインの場合は画像で作ることもあります。 ・コピペしてもらう用の文章 そんなにないとは思いますが、コピペしてもらいたい物、たとえばソースコードなんかは画像だとコピペできないのでテキストで書くようにしましょう。 「画像」のほうが好ましい場面 ・標準デバイスにもWEBフォントにもないフォントが使われている文字 フォントが変わりデザインが変わってしまうので、画像を使うしかありません。webフォントで対応できる場合でもページの読み込み速度を考えるとページに1箇所2箇所程度であれば、画像のほうがいいかもしれません。ページスピードを計測しながら良い方を利用してください。 ・CSSでは再現できないデザイン これは諦めて画像にしましょう。 cssで再現できるかどうかはgoogleで検索して、方法が見つからなければという判断でいいと思います。 ・文字の配置がcssではとても複雑になる テキストだけでは説明が難しいですが、文字の大きさがバラバラでかつ位置もcssで調整が難しいものは画像にすることが多いです。 CSSで再現してもいいのですが、デザインが細かいとCSSで完璧に再現するのはとても難しいので画像にしてしまいます。 微調整しても全てのデバイスで完璧に同じ見え方にさせるにはテキストでは限界があるので、凝ったデザイン配置のテキストは画像にします。 ・グラフや時間軸付きの図など グラフ系は複雑になりやすいので基本的に文字ごと画像にすることが多いです。 注釈は一緒に画像にしたり、テキストのみにしたりと場面に応じて変えてますね。 ただデータベースと連携してリアルタイムでグラフを生成する場合は画像では作れないのでcssやsvgを使って作成をしなければなりません。 まとめ いかがでしたでしょうか。思いつく限りを書きましたが、まだ他にも具体例があるかもしれません。 web制作をする上では気をつけなければ行けないポイントや悩むポイントが多くあると思います。 そんなときに自分なりの指標をもって取り組むことでムダな考える時間を省くことができるので、マイルールに従って作成していくといいかなと思います。 また「本来テキストでないといけないところを画像にしてしまった!」となっても、1箇所2箇所程度であればそこまで大きな影響はありません。 作成する人によってもそれくらいの誤差がでるものなので、あまり気にしすぎずどんどん作って自分なりにこういう作りにしようと考えて取り組んでみてください。 そうやって考えて取り組んできたものが最も正解に近いのかなと思います。 【フロントエンド強化月間に参加中↓↓】 おそまつ! ~ Qiitaで毎日投稿中!! ~ 【初心者向け】WEB制作のちょいテク詰め合わせ
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Rails の link_to メソッドで :delete や :put を指定しても GET のリクエストが送信されてしまう理由と対策

最近Railsの学習を始めたのですが、ログアウト機能を実装していた際にハマったので、メモとして残します。 問題の概要 railsのlink_toメソッドを使って、以下のようにログアウト用のリンクを実装しました。 application.html.erb <%= link_to 'ログアウト', logout_path, method: :delete, class: 'nav-link' %> method: :delete として、HTTPメソッドをDELETEに指定しているのですが、なぜか最終的にGETになってリクエストが送られるという現象に遭遇しました。 ちなみにlink_toメソッドを使って生成されたHTMLのソースを確認したところ <li class="nav-item"> <a class="nav-link" rel="nofollow" data-method="delete" href="/logout">ログアウト</a> </li> となっており、きちんとaタグでdata-method="delete"となっていました。 解決法 いろいろと情報を探っていると、RailsではJavaScriptを使って、サーバーにリクエストを送信することもあるようです。 なので、JavaScriptを導入できていなかった場合に上記のようなHTTPメソッドのerrorが起こってくるようです。 自分の場合、Webpackerを導入しようとしていて、どこかで、手順の漏れがあったようです。 結局、現在制作中のアプリ(Rails学習のため作成)にはWebpackerを導入する必要性がなさそうだったので、Rails newを実行した時にデフォルトで記載されていた、以下の記述に戻して application.html.erb <%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %> app/asset/config内のapplication.jsに以下の記述を追加するとしっかりとDELETEでリクエストが送信できました。 application.js //= require jquery //= require jquery_ujs
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Webアプリケーション(2)

Webアプリケーション(2) Webアプリケーション(1)の続きです。 XAMPPとVisual Studio Codeがインストール済みを前提としてすすめます。 今回の内容(動画) XAMPPの作業用フォルダを設定する Visual Studio Codeでフォルダを開くを選択 Windosの場合 Cドライブ>XAMPP>htdocs フォルダを選び、下のフォルダーの選択をクリック Macの場合 移動>アプリケーションXAMPP>xamppfiles>htdocs フォルダを選び、下のフォルダーの選択をクリック エクスプローラーにhtdocsの中が表示される 先ほど選択したフォルダの中がエクスプローラー(左)で見えていることを確認してください 次はこちら (次)
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【javaScript】エモいマインスイーパ から学ぶ再帰関数

プログラミングの学習のために同僚たちとともにマインスイーパを作る腕試しをしたところ、とてもエモい作品が上がってきたのでご紹介したいと思い、記事にしました。 以下のページで実際に動かすことができます。 MINESWEEPER 本記事の内容はエモいマインスイーパの紹介を通して、 再帰関数の使い方 背景色をじわじわ変えるCSSの方法 を解説します。 デザインコンセプト エモいマインスイーパは、初期画面では真っ黒な背景です。 ゲームを進めていくごとに背景色が徐々に変化していきます。 黒→青→水色… と変化し、成功すると最後は美しいグラデーションでfinishします。 これは夜明けをイメージしています。マインスイーパは地雷除去のゲームなので、平和な世界にしたいというエモい希望が込められています。 背景色が変化する実装は後ほど解説します。 start play1 play2 clear game over アルゴリズム、ロジックのわかりやすい解説 セルの生成と状態管理 ゲームボードはtableタグで、ひとつひとつのセルはtdタグになっています。 セルは、以下のような状態を持つ必要があります。 爆弾があるか 周辺の爆弾の数 旗が立っているか 開いているか、閉じているか エモいマインスイーパはこれらの状態をDOMに保持して管理しています。つまり、tdタグのclass属性であったり、innerTextに数字を持っていたりします。 周辺の爆弾の数の求め方 周辺の爆弾の数を求めるには、周辺のセルにアクセスする必要があります。 エモいマインスイーパはjQueryによるDOM操作で周辺のセルにアクセスします。 // n番目のセルを取得するコード $('#gameBody td').eq(n); tdを配列で全部取得して、配列のn番目を取得しています。 周辺のセルは、上、下、左、右、左上、右上、左下、右下の8箇所あります。それぞれのnを求める必要があります。 起点となるセルのインデックス(i)とゲームボードの列数(w)のふたつを使いnを算出します。 // 左上 let tl = i - w - 1; // 上 let t = i - w; // 右上 let tr = i - w + 1; // 左 let l = i - 1; // 右 let r = i + 1; // 左下 let bl = i + w - 1; // 下 let b = i + w; // 右下 let br = i + w + 1; ただし、角や端のセルは周辺にセルが8箇所あるとは限りません。角かどうか、端かどうかを判定しながら存在する周辺セルのnのみを取得します。 let array = [tl, t, tr, l, r, bl, b, br]; if (i === 0) { // ボードの左上の角 array = [r, b, br] } else if (i === w - 1) { // ボードの右上の角 array = [l, bl, b] } else if (i === w * (h - 1)) { // ボードの左下の角 array = [t, tr, r] } else if (i === w * h - 1) { // ボードの右下の角 array = [tl, t, l] } else if (i < w - 1) { // ボードの1行目(上端) array = [l, r, bl, b, br] } else if (i > w * (h - 1)) { // ボードの最優業(下端) array = [tl, t, tr, l, r] } else if (i % w === 0) { // ボードの1列目(左端) array = [t, tr, r, b, br] } else if (i % w === w - 1) { // ボードの最終列(右端) array = [tl, t, l, bl, b] } return array; これで周辺のセルのnをすべて取得ことができました。 あとは周辺のセルにアクセスして、爆弾があれば集計変数に+1し、起点となるセルに数字を設定します。 爆弾がないセルを一気に開く 開いたセルに爆弾がない場合、上、下、左、右、左上、右上、左下、右下の8方向に数字or旗がないかを判定しならがセルを開いていき、数字or旗が見つかったらセルを開くのをやめる、という実装をします。 このようなロジックには再帰関数を利用することが多いと思います。 再帰関数とは 再帰関数とは自分自身を呼び出す関数のことです。 以下は再帰関数を利用する場合の例です。 function openCell(targetCell) { if (targetCellに数字or旗がある場合) { return; } targetCell.open(); openCell(targetCellの上のcell); openCell(targetCellの下のcell); openCell(targetCellの左のcell); openCell(targetCellの右のcell); openCell(targetCellの左上のcell); openCell(targetCellの右上のcell); openCell(targetCellの左下のcell); openCell(targetCellの右下のcell); } openCell関数からopenCell関数が8回呼び出されています。こうすることで8方向に、数字 or 旗が見つかるまでセルを開き続けることができます。 もちろん再帰関数ではなく、ループを利用しても可能ですが、再帰関数の方がコードの重複が少なくシンプルに書くことができます。 再帰関数を利用する際には注意点があります。 必ず再帰呼び出しを抜けるためのreturnを書くこと 当たり前ですが再帰呼び出しはreturnしないと永遠に(※)呼び出し続けてしまいます。必ずreturnを書くことと、returnに入る条件をミスしないように気をつけましょう。 ※実際には永遠にということはなく、メモリ内のスタックという領域を使い果たしてエラーになります。 相互再帰 エモいマインスイーパは再帰関数の一種である相互再帰が利用されています。相互再帰とは一つの関数内での循環した呼び出しではなく、複数の関数を組み合わせた状態での循環呼び出しです。 こちらが相互再帰を利用したコードです。 function clearCell($el) { if ($el.hasClass('is-flag')){ // 旗が見つかれば終了 return; } // セルを開ける $el.addClass('is-clear'); if ($el.hasClass('is-bomb')) { // 爆弾が見つかればゲームオーバー return gameOver(); } // これは後述 setProgress(); if ($el.hasClass('is-blank')) { // 数字も爆弾もないセルだったら、周辺のセルも調査 clearBlanks($el); } } function clearBlanks($el) { let index = $('#gameBody td').index($el); // 周辺の存在するセルのindex配列 let array = getAroundCell(index); $.each(array, function(){ let $cell = $('#gameBody td').eq(this); if(!$cell.hasClass('is-clear')){ // まだ開いていないセルの場合は開く clearCell($cell); } }); } 背景色が徐々に変わるCSS bodyに付与しているクラスを付け替えることで背景色を変えています。 セルを開くたび、以下の関数が呼び出されます。 function setProgress() { clearCount += 1 // 開いたセルの数 ÷ 爆弾のない全セルの数 × 100 let progress = clearCount / (width * height - bomb) * 100; if (100 <= progress) { $('body').removeClass().addClass('is-morning'); gameClear(); } else if (90 <= progress) { $('body').removeClass().addClass('is-earlyMorning'); } else if (80 <= progress) { $('body').removeClass().addClass('is-sunrise'); } else if (70 <= progress) { $('body').removeClass().addClass('is-dayBreak'); } else if (60 <= progress) { $('body').removeClass().addClass('is-lateNight'); } else if (50 <= progress) { $('body').removeClass().addClass('is-midNight'); } else if (40 <= progress) { $('body').removeClass().addClass('is-deepNight'); } else if (30 <= progress) { $('body').removeClass().addClass('is-silentNight'); } else if (20 <= progress) { $('body').addClass('is-night'); } else { $('body').removeClass(); } } 進捗に応じてクラスを付け替えています。 色はCSSで以下のように設定されています。真夜中から朝にかけて、徐々に明るくなり、朝はlinear-gradientを利用して3色のグラデーション背景になっています。 body { width: 100%; min-height: 100vh; background: black; } body.is-night { background: #141418; } body.is-silentNight { background: #181620; } body.is-deepNight { background: #181621; } body.is-midNight { background: #12162b; } body.is-lateNight { background: #0d2246; } body.is-dayBreak { background: #0c3864; } body.is-sunrise { background: #0c5a8c; } body.is-earlyMorning { background: #498eb6; } body.is-morning { background: linear-gradient(180deg, #498eb6 0%, #b7dfc2 75%, #ffe1b2 100%); } これだけでは、クラスが付与された瞬間、急激に色が変わってしまうため、じわっと変化をするアニメーションを設定する必要があります。これもCSSで可能です。 * { transition: background 1s, color .6s, opacity .6s; } 上記のCSSは、すべての要素に対して、 背景(background)の変化に1秒をかける 文字色(color)の変化に0.6秒をかける 透明度(opacity)の変化に0.6秒をかける という指定になっています。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む