HTML CSS JavaScript 基礎編-第2回 CSS基礎

:::note info
仕事で、Plotly.jsを使ってデータを可視化する必要があるため、JavaScriptに詳しくない私は、HTML、CSS、JavaScriptについての書籍を勉強して基本的な知識を身につけておくことにしました。自分ためのメモですので、記事の中で一部中国語で書くことがあります。また、自分にとって重要ではないところも飛ばしています。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327130/595b81f8-0a72-83c3-4c8e-d7320ef8416f.png" width=160>
:::

# 1. CSS基礎

フロントだけでも、いろんな技術がありますので、以下の順番で勉強するのがおすすめです。
HTML(済) → CSS → JavaScript → JQuery → CSS3 → HTML5 → Vue.js
[第一回](https://qiita.com/Junlee/items/94c667965c02aba9cd83)では、HTMLの基礎を紹介しました。これからCSSの勉強をしていきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327130/1cbe0e73-6e51-3765-c3e3-823a384ba9db.png)

**CSSは三つの書き方があります：**
- **インラインスタイルシート**
インラインスタイルシートは、**HTMLタグに直接CSSを書き込む**方法です。例えば、
`<p style="color: red;">文字の色を赤に指定</p>`をbody本文に記載します。
- **内部スタイルシート**
内部スタイルシートは、**headタグにCSSを書き込む**方法です。

- **外部スタイルシート(推奨)**
外部スタイルシートは、CSSファイルを別に作り、**HTMLファイルで読み込む**設定にする方法です。

サンプルコードは以下の通りです：
```html:CSS-sp-01.html
<!DOCTYPE html>
<html>
	<head>
        <style>
            p{
                color: blue;
            }
        </style>
        <link rel="stylesheet" type="text/css" href="css/index_01.css">
	</head>
	<body>
        <p>おはようございます。</p>
        <p style="color: red;">文字の色を赤に指定</p>
        <p>こんばんは。</p>
	</body>
</html>
```

```html:index_01.css  
p{
    color: rgb(119, 0, 255);
}
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327130/ca2c71cd-873c-4a51-374b-7512eef160e5.png)

# 2. CSSセレクター
## 2.1 要素のidとclass
HTML文書の特定要素のスタイルを変更することが出来るセレクターに、**idセレクター**と**classセレクター**があります。
- 「idセレクター」：HTML文書内で重複して「id属性」の値に設定することはできません、唯一なものです。
    - セレクター名の前にシャープ(`#`)をつけます。
- 「classセレクター」：フォームの各項目など、ページ内に複数ある要素に関しては「classセレクター」を使います。
    - セレクター名の前にドット(`.`)をつけます。
```html:html
<!DOCTYPE html>
<html>
	<head>
	</head>
	<body>
        <div id="x_01">はじめに</div>
        <p class="content">今日の説明は...</p>
        <p class="content">次は、これを...</p>
        <div id="x_02">終わりに</div>
	</body>
</html>
```
## 2.2 セレクター

セレクターの役割は様式を設定したい要素を特定するためのものです。
CSSセレクターのフォーマットが：
```html
セレクター
{
    属性1: 値1;
    ...
    属性n: 値n;
}
```


基礎編では、五つのセレクターを説明します。
- 要素型セレクター
```html:要素型セレクター
p{
    color: rgb(119, 0, 255);
}
```
- IDセレクター`#`、クラスセレクター`.`
IDセレクターが特定要素に適用、クラスセレクタが種類ごとの複数要素に適用：
```html:IDセレクター# クラスセレクター.
<!DOCTYPE html>
<html>
	<head>
        <style>
            #x_01,#x_02{
                color: blue;
            }
            .content{
                color: rgb(255, 0, 166);
            }
        </style>
	</head>
	<body>
        <div id="x_01">はじめに</div>
        <p class="content">今日の説明は...</p>
        <p class="content">次は、これを...</p>
        <div id="x_02">終わりに</div>
	</body>
</html>
```

- 子孫セレクター
子孫セレクタは、**親要素**に含まれる全ての**要素B**に対して適用されます。
次の例では、**section 要素**に含まれる全ての**p要素**に対して文字色を変更しています。
```html:子孫セレクター
<html>
	<head>
        <style>
            section p {
            color:orange;
            }
        </style>
	</head>
	<body>
        <p>sectionの前</p>    
        <section>
          <p>secionの子1</p>
          <div>
            <p>sectionの孫</p>
            <h1>sectionの孫</h1>
            <div>
              <p>sectionのひ孫</p>
            </div>
          </div>
          <p>secionの子2</p>
        </section>
        <p>section直後</p>
	</body>
</html>
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327130/2d0944fa-9f7e-777b-c4f1-3f9567da8172.png)

- グループセレクター
同じスタイルを複数の要素に適用させる場合、グループ化をすることで見やすくなり、効率的に書くことができます。以下の例のように、要素セレクターやClass/Idセレクターをグループ化しています。

```html:グループセレクター
<html>
	<head>
        <style>
            .content,#x_01,#x_02,span{
                color: blue;
            }
        </style>
	</head>
	<body>
        <div id="x_01">はじめに</div>
        <p class="content">今日の説明は...</p>
        <p class="content">次は、これを...</p>
        <div id="x_02">終わりに</div>
        <span>こちらがSPAN</span>
        <h1>わしが何もないよ！</h1>
	</body>
</html>
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327130/b2ca8c8f-f529-5b9e-66c6-81d889ae6dbe.png)

# 3. フォントスタイル

font は CSS の一括指定プロパティで、要素のフォントの様々なプロパティをすべて設定します。また、要素のフォントにシステムフォントを設定することもできます。
フォントでよくある属性が：
- font-family
- font-size
- font-weight
- font-style
- color

また、CSSのコメントは、Bodyのと違います。
- CSS: `/*こちらがCSSのコメント*/`
- body: `<!--こちらがBodyのコメント-->`

```html
<html>
	<head>
        <style>
            /*こちらがCSSのコメント*/
            .content,span{
                font-family: Arial, Helvetica, sans-serif;
                font-weight: 200;
                font-style: italic;
                color: blue;
            }
            #x_01,#x_02{
                font-family: Verdana, Geneva, Tahoma, sans-serif;
                font-size:36px;
                font-weight: 900;
            }
        </style>
	</head>
	<body>
        <!--こちらがBodyのコメント-->
        <div id="x_01">はじめに</div>
        <p class="content">今日の説明は...</p>
        <p class="content">次は、これを...</p>
        <div id="x_02">終わりに</div>
        <span>こちらがSPAN</span>
        <h1>わしが何もないよ！</h1>
	</body>
</html>
```
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327130/1b6e4f34-3049-b55b-1dac-832bb3449033.png" width=480>

# 4. テキストスタイル

テキストのスタイルには、以下の属性があります。
- text-indent
- text-align: left/center/right
- text-decoration: none/underline/line-through/overline
- text-transform: none/uppercase/lowercase/capitalize
- line-height
- letter-spacing,word-spacing

<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="wvYqJGV" data-user="utanesuke0612" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/utanesuke0612/pen/wvYqJGV">
  textstyle-book</a> by Junlee (<a href="https://codepen.io/utanesuke0612">@utanesuke0612</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>


# 5. ボーダースタイル
border-style は 一括指定 の CSS プロパティで、要素の境界線の 4 辺すべての線のスタイルを設定します。
いかの属性があります。
- border-width
- border-style: none/dashed/solid
- border-color
- 上記の三つのまとめ → border:1px solid red;
- border-top-width
- border-top-style
- border-top-color
- 上記の三つのまとめ → border-top:2px solid red;(border-left,border-right,border-bottomも同じ)

```html
<html>
	<head>
        <style>
            #p1{
                font-size: 14px;
                text-indent: 28px;
                text-align: left;
                border-style: dashed groove none dotted;
            }
            #p2{
                font-size: 14px;
                text-indent: 28px;
                text-align: left;
                border-style: dashed double none;
                border-color: brown;
            }
            h3{
                text-align: center;
            }
        </style>
	</head>
	<body>
        <h3>日本語の名文</h3>
        <p id="p1">齋藤孝先生が、小さな子どもに"声に出して読んでほしい”日本語の名文48作品を厳選した絵本です。女優の永作博美さんが朗誦するCD1枚付き。</p>
        <h4>内容紹介</h4>
        <p id="p2">NHK Eテレ「にほんごであそぼ」の総合指導も務める齋藤孝先生が、小さな子どもに"声に出して読んでほしい”日本語の名文48作品を厳選し、素敵なイラストとともに1冊にまとめた絵本。
女優の永作博美さんが朗誦するCD1枚付き。</p>
    </body>
</html>
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327130/8a62b8b9-bf02-7138-5dea-526477dc67d9.png)

# 6. リストスタイル
list-style は CSS の一括指定プロパティで、リストのすべてのスタイルプロパティを設定します。
以下の属性があります。
- list-style-type: 順番あり場合 decimal(1,2,3) / lower-roman / upper-roman /..
- list-style-type: 順番なし場合 disc / circle / square / none
- list-style-image: url(img/leaf.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327130/4c5d5af5-179b-fc2e-5380-0c9f0b2267d5.png)

# 7. テーブルスタイル
テーブル関連のスタイル属性：
- caption-side: 表題の位置 top / bottom
- border-collapse: separate / collapse
- border-spacing: 30px
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327130/c0af6aec-add1-99b3-1b9b-1d5ca83479c4.png)

```html
<html>
<head>
    <style type="text/css">
        table,th,td{border: 10px solid orange;}
        table{border-spacing: 18px; caption-side: bottom;}
    </style>
</head>
<body>
    <table>
        <caption>おはようございます</caption>
    <tr>
        <td>セル1-1</td>
        <td>セル1-2</td>
    </tr>
    <tr>
        <td>セル2-1</td>
        <td>セル2-2</td>
    </tr>
    <tr>
        <td>セル3-1</td>
        <td>セル3-2</td>
    </tr>
    </table>
</body>    
</html>
```

# 8. 画像スタイル

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327130/8ff37451-276d-d6c2-9774-a1297a18c14f.png)

# 9. 背景スタイル
CSS 背景と境界モジュールでスタイル付けをすると、背景を色や画像で埋めたり (クリッピングや寸法の変更も) 他の加工を行ったりすることができます。

https://developer.mozilla.org/ja/docs/Web/CSS/CSS_Backgrounds_and_Borders

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327130/0f773d72-70b4-f668-0930-a14bc92d4d51.png)


# 10. リンクスタイル
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327130/4828091d-22f9-5881-686a-44945795fe51.png)

# 11. ボックスモデル

https://developer.mozilla.org/ja/docs/Web/CSS/CSS_Box_Model/Introduction_to_the_CSS_box_model

ブラウザーのレンダリングエンジンは文書をレイアウトする際に、それぞれの要素を標準的な CSS 基本ボックスモデルに基づいた長方形のボックスとして表現します。 CSS は**これらのボックスの寸法、位置、プロパティ（色、背景、境界の幅など）**を決定します。

それぞれのボックスは 4 つの部品 (または領域) から構成され
- content：内容、テキストや画像など
- padding：内部距離、テキストと境界の間の距離
- border：境界線の様式
- margin：現在のボックスと他のボックスの距離
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327130/20bc10cc-eded-73f0-0f57-9d3d779c9526.png)

| 属性 | 値 |
|:-:|:-:|
| content  | width,height,overflow  |
| padding  |padding-top,padding-left,..,padding   |
| border  | border-width,border-style,border-color;border  |
|  margin | margin-top,margin-left,..,margin  |

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327130/0cbb0202-266c-409b-b56d-a011f91f4864.png)

こちらで`display:inline-block`を使っています、`inline-block`を使うと、`inline-block`要素の長さが内容で決めます。例えば、以下のように**外す**と、一行になってしまう：

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327130/1e6a6533-b742-e9d1-95d5-39bded34cbfe.png)

## 幅と高さ

ブロック要素だけが幅widthと高さheightの設定できますが、行内要素が設定できません。例えば、以下のようにdivがブロック要素、spanが行内要素です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327130/af2f18eb-921a-5efa-38db-4b9f7dcfd788.png)

もし行内要素のspanも幅と高さを設定するとしたら、ブロック要素に変換する必要があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327130/51e1d79e-9eaf-9a1c-0478-70ba205010ae.png)

# 12. フローティングレイアウト

デフォルトの設定ですと、行内要素(inline)が複数個を一行に並んでも可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327130/98b29de1-36d0-9b5c-e4a8-6a79e9c5f547.png)

例：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327130/540f09fd-7b82-4443-96e6-c5a95b0632df.png)

```html
<!DOCTYPE html>
<html>
	<head>
        <style>
            #father{
                width: 300px;
                background-color: aquamarine;
                border: 1px solid silver;
            }
            #father div
            {
                padding: 10px;
                margin: 15px;
                border: 2px dashed red;
            }
            #son1{
                background-color: hotpink;
                float: left;
            }
            #son2{
                background-color:orange;
                float: left;
            }
        </style>
	</head>
	<body>
        <div id="father">
            <div id="son1">box1</div>
            <div id="son2">box2</div>
            <div class="clear">box3</div>
        </div>
	</body>
</html>
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327130/c7a66bf6-073e-01ba-eeef-c4056e94ef97.png)

最後に、` .clear{clear: both;}`を付け加えて、Box3のFloatingが消されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327130/5e66e8d7-04d3-1079-4b89-1b6e53500b35.png)

# 13. ポジショニングレイアウト

位置指定を使用すると、通常のドキュメントレイアウトフローから要素を取り出して異なるふるまいをさせることができます。 例えば、互いの上に重なったり、常にブラウザーのビューポート内の同じ場所に留まったりします。

https://developer.mozilla.org/ja/docs/Learn/CSS/CSS_layout/Positioning

- 固定位置指定（Fixed positioning）: fixed、top/bottom/left/rightも必要
- 相対位置指定（Relative positioning）: relative、top/bottom/left/rightも必要
- 絶対位置指定（Absolute positioning）: absolute、top/bottom/left/rightも必要
- 静的位置指定（Static positioning）: static(default)

例：

```html
<!DOCTYPE html>
<html>
	<head>
        <style>
            #father div
            {
                padding: 10px;
                margin: 15px;
                border: 2px dashed red;
            }
            #son1{
                background-color: hotpink;
                position: fixed;
                top:30px;
                left: 160px;
            }
            #son2{
                background-color:orange;
                position: relative;
                top: 290px;
            }
            #son3{
                background-color:orange;
                position: absolute;
                top: 390px;
                left: 300px;
            }
        </style>
	</head>
	<body>
        <div id="father">
            <div id="son1">box1</div>
            <div id="son2">box2</div>
            <div id="son3">box3</div>
        </div>
	</body>
</html>
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327130/25d576e5-dbd8-f304-c67b-adc751079ad7.png)



# 参考情報

http://www.lvyestudy.com/


https://developer.mozilla.org/en-US/docs/Web/CSS