<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>✍️( •̀ .̫ •́ )✧</title>
        <link>https://velog.io/</link>
        <description>나의 개발일지</description>
        <lastBuildDate>Tue, 25 Feb 2025 16:17:32 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>✍️( •̀ .̫ •́ )✧</title>
            <url>https://velog.velcdn.com/images/930_10/profile/d5d5907d-3993-4e8b-bdfb-09860296e458/image.jpeg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. ✍️( •̀ .̫ •́ )✧. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/930_10" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[SSL] certbot을 이용해 인증서 갱신하기]]></title>
            <link>https://velog.io/@930_10/SSL-certbot%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%B4-%EC%9D%B8%EC%A6%9D%EC%84%9C-%EA%B0%B1%EC%8B%A0%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@930_10/SSL-certbot%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%B4-%EC%9D%B8%EC%A6%9D%EC%84%9C-%EA%B0%B1%EC%8B%A0%ED%95%98%EA%B8%B0</guid>
            <pubDate>Tue, 25 Feb 2025 16:17:32 GMT</pubDate>
            <description><![CDATA[<p>얼마전 kdt 해커톤 관련 서버가 닫혔냐는.. 질문을 들었다.
닫을까말까 예전에 고민했던게 생각나 안열리면 닫힌게 아닐까~라고 생각하고 무작정 닫았다고만 했다.
포폴 작성을 위해 잠시 열어달라는 말에 &#39;당연이 우리 소짱이 해달라는데 해줘야지&#39;하며..
오랜만에 ncp에 접속을 했는데 띠용?
서버 콘솔을 보니 여전히 서버 상태가 운영 중이었다..!!!</p>
<p>뭐지~? 하고 백엔드 서버 주소를 타고 들어가봤더니 아니 글쎄
<img src="https://velog.velcdn.com/images/930_10/post/1dcf2bc1-d403-4459-bd4a-e131f3c61dbc/image.png" alt=""></p>
<p>ㅋㅋㅋㅋㅋ 하핫 ;;
인증서 만료네욧 ;;
그래서 벌써 만료인가 하고 발급 받았던 당시 캡처해둔걸 보니</p>
<p><img src="https://velog.velcdn.com/images/930_10/post/2cb31ee7-9cfa-470c-9ff0-cd9dc9ac25ec/image.png" alt=""></p>
<p>정말이었다.
그래서 바로 인증서를 갱신했다!</p>
<hr>
<p>배포 당시 Let&#39;s Encrypt로 인증서를 발급 받았기 때문에, cerbot으로 간단하게 인증서를 갱신할 수 있었다.</p>
<p>그 전에 할 일: <strong>서버에 접속하기 !!!!</strong>
<code>ssh [사용자 이름]@[서버 IP]</code> 를 명령하고 비밀번호를 입력한 후 서버에 접속한다.</p>
<p>서버에 접속한 후 터미널에</p>
<p><code>sudo certbot renew</code></p>
<p>명령어를 쳐주면 완성 ^^*
인줄 알았으나.. 갑작스러운 오류 발생.. ㄷㄷ</p>
<p><img src="https://velog.velcdn.com/images/930_10/post/33f4a91b-48e8-482f-a1ea-70c839d1b454/image.png" alt=""></p>
<p>하핫 nginx 설정 파일에 나도 모르게 &#39;x&#39;가 있었나보다...!
그래서 nginx 설정 테스트 실패해서 certbot이 nginx를 통해 인증서 갱신을 진행할 수 없다는 것이었다!</p>
<p><code>sudo nano /etc/nginx/site-enabled/오류 발생 파일</code> 을 열고,
오타를 삭제한 후 저장을 해준다. (nano 사용 시 <code>ctrl+X</code> -&gt; <code>Y</code> -&gt; 엔터)</p>
<p>그리고 <code>sudo nginx-t</code> 명령어를 입력해 설정 문법을 검사하면 테스트 성공 메시지가 뜬 것을 확인할 수 있다.
<code>sudo systemctl restart nginx</code> 명령어를 입력해 nginx를 재시작한다.</p>
<p>nginx 설정이 정상으로 된 것을 확인했으면, 다시 <code>sudo certbot renew</code> 명령어를 입력한다.
<img src="https://velog.velcdn.com/images/930_10/post/723c7594-8b3c-44bd-810d-9323d2e86456/image.png" alt=""></p>
<p><strong>🎉 Congratulations, all renewals succeded</strong> 가 뜨면 인증서 갱신이 정상적으로 완료되었다는 의미!</p>
<hr>
<p>하하.. 인증서 갱신하는게 양치하는 것보다 쉽다 !</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[python] 예외처리 (try~except)]]></title>
            <link>https://velog.io/@930_10/python-%EC%98%88%EC%99%B8%EC%B2%98%EB%A6%AC-tryexcept-a2tydfkq</link>
            <guid>https://velog.io/@930_10/python-%EC%98%88%EC%99%B8%EC%B2%98%EB%A6%AC-tryexcept-a2tydfkq</guid>
            <pubDate>Wed, 08 May 2024 03:09:47 GMT</pubDate>
            <description><![CDATA[<h3 id="예외처리가-되지-않은-상태에서의-에러">예외처리가 되지 않은 상태에서의 에러</h3>
<pre><code class="language-python">people = [
    {&#39;name&#39;: &#39;bob&#39;, &#39;age&#39;: 20},
    {&#39;name&#39;: &#39;carry&#39;, &#39;age&#39;: 38},
    {&#39;name&#39;: &#39;john&#39;, &#39;age&#39;: 7},
    {&#39;name&#39;: &#39;smith&#39;, &#39;age&#39;: 17},
    {&#39;name&#39;: &#39;ben&#39;, &#39;age&#39;: 27},
    {&#39;name&#39;: &#39;bobby&#39;},
    {&#39;name&#39;: &#39;red&#39;, &#39;age&#39;: 32},
    {&#39;name&#39;: &#39;queen&#39;, &#39;age&#39;: 25}
]

for person in people:
    if person[&#39;age&#39;] &gt; 20:
        print(person[&#39;name&#39;])

# 결과 출력: bobby에는 age 값이 없으므로 에러 발생
carry
ben
Traceback (most recent call last):
  File &quot;/Users/user/Desktop/sparta_python/pythonProject1/hello.py&quot;, line 13, in &lt;module&gt;
    if person[&#39;age&#39;] &gt; 20:
       ~~~~~~^^^^^^^
KeyError: &#39;age&#39;</code></pre>
<h3 id="예외-처리를-통한-해결">예외 처리를 통한 해결</h3>
<blockquote>
<p><code>try~except</code> 문을 통해 해결한다.</p>
</blockquote>
<pre><code class="language-python">people = [
    {&#39;name&#39;: &#39;bob&#39;, &#39;age&#39;: 20},
    {&#39;name&#39;: &#39;carry&#39;, &#39;age&#39;: 38},
    {&#39;name&#39;: &#39;john&#39;, &#39;age&#39;: 7},
    {&#39;name&#39;: &#39;smith&#39;, &#39;age&#39;: 17},
    {&#39;name&#39;: &#39;ben&#39;, &#39;age&#39;: 27},
    {&#39;name&#39;: &#39;bobby&#39;},
    {&#39;name&#39;: &#39;red&#39;, &#39;age&#39;: 32},
    {&#39;name&#39;: &#39;queen&#39;, &#39;age&#39;: 25}
]

for person in people:
    try:
        if person[&#39;age&#39;] &gt; 20:
            print(person[&#39;name&#39;])
    except:
        print(f&#39;{person[&#39;name&#39;]}에는 입력된 나이가 없습니다.&#39;)

# 출력 결과
carry
ben
bobby에는 입력된 나이가 없습니다.
red
queen</code></pre>
<p>단, 남용 시에는 어떤 에러가 났는지 알기 어려우므로 웬만하면 사용하지 않는 것이 좋다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[python] f-string과 파일 불러오기(import)]]></title>
            <link>https://velog.io/@930_10/python-f-string%EA%B3%BC-%ED%8C%8C%EC%9D%BC-%EB%B6%88%EB%9F%AC%EC%98%A4%EA%B8%B0import</link>
            <guid>https://velog.io/@930_10/python-f-string%EA%B3%BC-%ED%8C%8C%EC%9D%BC-%EB%B6%88%EB%9F%AC%EC%98%A4%EA%B8%B0import</guid>
            <pubDate>Wed, 08 May 2024 03:07:10 GMT</pubDate>
            <description><![CDATA[<h3 id="f-string">f-string</h3>
<blockquote>
<p><code>f&#39;{any}문자열입니다.&#39;</code>의 형식으로 사용한다.</p>
</blockquote>
<pre><code class="language-python"> scores = [
    {&#39;name&#39;:&#39;영수&#39;,&#39;score&#39;:70},
    {&#39;name&#39;:&#39;영희&#39;,&#39;score&#39;:65},
    {&#39;name&#39;:&#39;기찬&#39;,&#39;score&#39;:75},
    {&#39;name&#39;:&#39;희수&#39;,&#39;score&#39;:23},
    {&#39;name&#39;:&#39;서경&#39;,&#39;score&#39;:99},
    {&#39;name&#39;:&#39;미주&#39;,&#39;score&#39;:100},
    {&#39;name&#39;:&#39;병태&#39;,&#39;score&#39;:32}
]

for s in scores:
    name = s[&#39;name&#39;]
    score = str(s[&#39;score&#39;]) # 문자형으로 안바꾸면 오류
    print(f&#39;{name}의 점수는 {score}점입니다.&#39;)</code></pre>
<h3 id="파일-불러오기-import">파일 불러오기 import</h3>
<pre><code class="language-python">📁 main_func.py
def say_hi():
    print(&#39;안녕&#39;)

def say_hi2(name):
    print(f&#39;{name}님 안녕하세요!&#39;)</code></pre>
<p><code>main_func.py</code> 파일에 있는 함수를 <code>main_test.py</code> 파일에서 사용하고 싶다면?</p>
<pre><code class="language-python">📁 main_test.py

from main_func import * 
# from 파일명 import *(전체) 이렇게 쓸 확률이 95% 😁
# from main_func import say_hi2 
# 함수명만 쓰면 이 함수만 현재 파일에서 쓰겠다는 의미
# (say_hi2 함수만 가져왔기 때문에 say_hi()는 사용 불가)

say_hi()
say_hi2(&#39;가희&#39;)</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[python] 함수]]></title>
            <link>https://velog.io/@930_10/python-%ED%95%A8%EC%88%98</link>
            <guid>https://velog.io/@930_10/python-%ED%95%A8%EC%88%98</guid>
            <pubDate>Wed, 08 May 2024 03:01:55 GMT</pubDate>
            <description><![CDATA[<h3 id="함수">함수</h3>
<p>파이썬에서 함수를 선언할 땐 <code>def</code>로 선언한다.</p>
<pre><code class="language-python">def sum(a,b):
        print(&#39;더하기를 하셨네요&#39;)
    return a+b

result = sum(43,5)
print(result)

# 출력 결과
&#39;더하기를 하셨네요&#39;
48</code></pre>
<h4 id="활용">활용</h4>
<pre><code class="language-python">def bus_rate(age):
    if age &gt; 65:
        print(&#39;무료입니다.&#39;)
        return 0
    elif age &gt; 20:
        print(&#39;성인입니다.&#39;)
        return 2400
    else:
        print(&#39;청소년입니다.&#39;)
        return 1200

myrate = bus_rate(26)
print(myrate)

# 출력 결과
&#39;성인입니다.&#39;
2400</code></pre>
<h4 id="연습문제">연습문제</h4>
<ul>
<li>주민 번호를 입력받아 성별을 출력하는 함수 만들기</li>
</ul>
<p>문자열을 숫자열로 바꿀 때는 <code>int()</code> 함수를 사용하면 된다.</p>
<pre><code class="language-python">def check_gender(pin):
    num = int(pin.split(&#39;-&#39;)[1][0])
    if num % 2 == 0:
        print(&#39;여자입니다.&#39;)
    else:
        print(&#39;남자입니다.&#39;)

check_gender(&#39;150101-1012345&#39;)
check_gender(&#39;150101-3012345&#39;)
check_gender(&#39;150101-2012345&#39;)
check_gender(&#39;150101-4012345&#39;)

# 출력 결과
&#39;남자입니다.&#39;
&#39;남자입니다.&#39;
&#39;여자입니다.&#39;
&#39;여자입니다.&#39;</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[python] 조건문과 반복문 그리고 줄여쓰기]]></title>
            <link>https://velog.io/@930_10/python-%EC%A1%B0%EA%B1%B4%EB%AC%B8%EA%B3%BC-%EB%B0%98%EB%B3%B5%EB%AC%B8</link>
            <guid>https://velog.io/@930_10/python-%EC%A1%B0%EA%B1%B4%EB%AC%B8%EA%B3%BC-%EB%B0%98%EB%B3%B5%EB%AC%B8</guid>
            <pubDate>Wed, 08 May 2024 02:06:44 GMT</pubDate>
            <description><![CDATA[<h3 id="조건문">조건문</h3>
<h4 id="if문"><code>if</code>문</h4>
<pre><code class="language-python">money = 5000
if money &gt; 3800:
    print(&#39;택시 타&#39;) # &#39;택시 타&#39;

money = 3000
if money &gt; 3800:
        print(&#39;택시 타&#39;) # 조건에 맞지 않으므로 아무 동작도 일어나지 않음</code></pre>
<h4 id="else와-elif"><code>else</code>와 <code>elif</code></h4>
<h5 id="else"><code>else</code></h5>
<pre><code class="language-python">money = 3000
if money &gt; 3800:
    print(&#39;택시 타&#39;) # money가 3800보다 크다면 if문의 &#39;택시 타&#39; 출력
else:
    print(&#39;버스 타&#39;) # 3800보다 작으므로 else문의 &#39;버스 타&#39; 출력</code></pre>
<h5 id="elif"><code>elif</code></h5>
<pre><code class="language-python">money = 100
if money &gt; 3800:   # money가 3800 초과하면 &#39;택시 타&#39; 출력
    print(&#39;택시 타&#39;)
elif money &gt; 1000: # money가 1000 초과 3800 이하이면 &#39;버스 타&#39; 출력
    print(&#39;버스 타&#39;)
else:              # money가 위 조건과 다 맞지 않다면 &#39;걸어가&#39; 출력
    print(&#39;걸어가&#39;)</code></pre>
<p>위 코드에서는 <code>money=100</code>이므로 결과값은 <code>&#39;걸어가&#39;</code>가 출력된다.
자바스크립트의 <code>else if</code>와 동일하게 여러 번 사용할 수 있다.</p>
<h4 id="줄여쓰기">줄여쓰기</h4>
<pre><code class="language-python">num = 3
if num % 2 == 0:
    result = &#39;짝수&#39;
else:
    result = &#39;홀수&#39;

print(f&#39;{num}은 {result}입니다.&#39;) # &#39;3은 홀수입니다.&#39;</code></pre>
<p>위 코드를 줄여쓴다면 아래처럼 나타낼 수 있다.</p>
<pre><code class="language-python">num = 3

result = (&#39;짝수&#39; if num % 2 == 0 else &#39;홀수&#39;)

print(f&#39;{num}은 {result}입니다.&#39;) # &#39;3은 홀수입니다.&#39;</code></pre>
<h3 id="반복문">반복문</h3>
<h4 id="for문"><code>for</code>문</h4>
<pre><code class="language-python">fruits = [&#39;apple&#39;, &#39;blueberry&#39;, &#39;pear&#39;, &#39;peach&#39;]
for fruit in fruits:
    print(fruit)

# 출력값
# apple
# blueberry
# pear
# peach</code></pre>
<p>리스트 속 요소들을 하나씩 꺼내서 써먹는 것이라고 생각하면 쉽다.
위에서 <code>fruit</code>는 요소를 꺼내서 담는 변수로서, 변수명은 자기 맘대로 지어도 된다.
리스트에 있는 요소를 하나씩 돌면서 꺼내쓴다.</p>
<pre><code class="language-python">people = [
    {&#39;name&#39;: &#39;bob&#39;, &#39;age&#39;: 20},
    {&#39;name&#39;: &#39;carry&#39;, &#39;age&#39;: 38},
    {&#39;name&#39;: &#39;john&#39;, &#39;age&#39;: 7},
    {&#39;name&#39;: &#39;smith&#39;, &#39;age&#39;: 17},
    {&#39;name&#39;: &#39;ben&#39;, &#39;age&#39;: 27},
    {&#39;name&#39;: &#39;bobby&#39;, &#39;age&#39;: 57},
    {&#39;name&#39;: &#39;red&#39;, &#39;age&#39;: 32},
    {&#39;name&#39;: &#39;queen&#39;, &#39;age&#39;: 25}
]

for person in people:
    name = person[&#39;name&#39;]
    age = person[&#39;age&#39;]
    print(name, age)

# 출력값
# bob 20 # 이 때 20은 숫자형. 문자열 x
# carry 38
# john 7
# smith 17
# ben 27
# bobby 57
# red 32
# queen 25</code></pre>
<ul>
<li>반복문과 조건문을 같이 쓰기<pre><code class="language-python">for person in people:
  name = person[&#39;name&#39;]
  age = person[&#39;age&#39;]
  if age &gt; 20: # age가 20보다 클 때만 출력
      print(name, age)
</code></pre>
</li>
</ul>
<h1 id="출력값">출력값</h1>
<p>carry 38
ben 27
bobby 57
red 32
queen 25</p>
<pre><code>#### `enumerate`
요소의 순서를 나타내고 싶을 때 사용
```python
people = [
    {&#39;name&#39;: &#39;bob&#39;, &#39;age&#39;: 20},
    {&#39;name&#39;: &#39;carry&#39;, &#39;age&#39;: 38},
    {&#39;name&#39;: &#39;john&#39;, &#39;age&#39;: 7},
    {&#39;name&#39;: &#39;smith&#39;, &#39;age&#39;: 17},
    {&#39;name&#39;: &#39;ben&#39;, &#39;age&#39;: 27},
    {&#39;name&#39;: &#39;bobby&#39;, &#39;age&#39;: 57},
    {&#39;name&#39;: &#39;red&#39;, &#39;age&#39;: 32},
    {&#39;name&#39;: &#39;queen&#39;, &#39;age&#39;: 25}
]

for i, person in enumerate(people):
    name = person[&#39;name&#39;]
    age = person[&#39;age&#39;]
    print(i, name, age)

# 출력값
0 bob 20
1 carry 38
2 john 7
3 smith 17
4 ben 27
5 bobby 57
6 red 32
7 queen 25</code></pre><h4 id="break"><code>break</code></h4>
<pre><code class="language-python">people = [
    {&#39;name&#39;: &#39;bob&#39;, &#39;age&#39;: 20},
    {&#39;name&#39;: &#39;carry&#39;, &#39;age&#39;: 38},
    {&#39;name&#39;: &#39;john&#39;, &#39;age&#39;: 7},
    {&#39;name&#39;: &#39;smith&#39;, &#39;age&#39;: 17},
    {&#39;name&#39;: &#39;ben&#39;, &#39;age&#39;: 27},
    {&#39;name&#39;: &#39;bobby&#39;, &#39;age&#39;: 57},
    {&#39;name&#39;: &#39;red&#39;, &#39;age&#39;: 32},
    {&#39;name&#39;: &#39;queen&#39;, &#39;age&#39;: 25}
]

for i, person in enumerate(people):
    name = person[&#39;name&#39;]
    age = person[&#39;age&#39;]
    print(i, name, age)
    if i &gt; 3: # i가 3보다 크다면 멈춰
        break

# 출력값
0 bob 20
1 carry 38
2 john 7
3 smith 17
4 ben 27</code></pre>
<h4 id="줄여쓰기-1">줄여쓰기</h4>
<pre><code class="language-python">a_list = [1,3,4,5,7,2,3]

b_list = []
for a in a_list:
    b_list.append(a*2)

print(b_list) # [2, 6, 8, 10, 14, 4, 6]</code></pre>
<p>위 코드를 줄여쓴다면 아래처럼 나타낼 수 있다.</p>
<pre><code class="language-python">a_list = [1,3,4,5,7,2,3]

b_list = [a*2 for a in a_list]
print(b_list) # [2, 6, 8, 10, 14, 4, 6]</code></pre>
<h3 id="연습-문제">연습 문제</h3>
<h4 id="1-짝수만-출력하기">1. 짝수만 출력하기</h4>
<pre><code class="language-python">num_list = [1, 2, 3, 6, 3, 2, 4, 5, 6, 2, 4]

for num in num_list:
    if num % 2 == 0:
        print(num)

# 출력 결과
2
6
2
4
6
2
4</code></pre>
<h4 id="2-짝수의-개수-출력하기">2. 짝수의 개수 출력하기</h4>
<pre><code class="language-python">num_list = [1, 2, 3, 6, 3, 2, 4, 5, 6, 2, 4]

count = 0
for num in num_list:
    if num % 2 == 0:
        count += 1
print(count)

# 출력결과
7</code></pre>
<h4 id="3-리스트-속-모든-숫자의-합계">3. 리스트 속 모든 숫자의 합계</h4>
<pre><code class="language-python">num_list = [1, 2, 3, 6, 3, 2, 4, 5, 6, 2, 4]

sum = 0
for num in num_list:
    sum += num
print(sum)

# 출력 결과
38</code></pre>
<h4 id="4-리스트-속-숫자-중-가장-큰-수-구하기">4. 리스트 속 숫자 중 가장 큰 수 구하기</h4>
<pre><code class="language-python">num_list = [1, 2, 3, 6, 3, 2, 4, 5, 6, 2, 4]

max = 0
for num in num_list:
    if max &lt; num: # max가 num보다 작다면
        max = num # max에 그 num 값을 넣어라

print(max)

# 출력 결과
6</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[python] 변수 선언, 자료형]]></title>
            <link>https://velog.io/@930_10/python-%EB%B3%80%EC%88%98-%EC%84%A0%EC%96%B8-%EC%9E%90%EB%A3%8C%ED%98%95</link>
            <guid>https://velog.io/@930_10/python-%EB%B3%80%EC%88%98-%EC%84%A0%EC%96%B8-%EC%9E%90%EB%A3%8C%ED%98%95</guid>
            <pubDate>Tue, 07 May 2024 12:59:28 GMT</pubDate>
            <description><![CDATA[<h1 id="변수-선언">변수 선언</h1>
<blockquote>
<p>변수 = 변할 수 있는 것, 어떠한 값을 담는 &#39;상자&#39;</p>
</blockquote>
<p>컴퓨터가 기억하고 있는 메모리 공간을 변수가 가리킨다~ 라고 생각해도 좋다. (메모리에 올려두는 개념)</p>
<pre><code class="language-python">a = 11.5
print(a) # a를 출력하는 함수, 결과값은 11.5</code></pre>
<p>변수에 넣은 값을 확인하고 싶다면 <code>print()</code> 함수를 사용하여 값을 출력한다.</p>
<pre><code class="language-python">print(&#39;hi&#39;) # hi
print(True) # True</code></pre>
<h1 id="자료형-데이터-타입">자료형 (데이터 타입)</h1>
<p>변수나 값의 자료형을 확인하기 위해서는 <code>type()</code> 함수를 사용한다.
파이썬에는 다양한 자료형이 있지만 가장 많이 쓰이는 자료형은 아래와 같다.</p>
<h3 id="nonetype"><code>NoneType</code></h3>
<blockquote>
<p>논타입, 값이 없다.
<code>None</code> 이라는 값을 가지고 있는 데이터 타입</p>
</blockquote>
<p>이는 다음과 같은 상황에서 반환된다.</p>
<ul>
<li>호출한 함수가 반환 값을 가지고 있지 않을 때</li>
<li>무언가를 검색하였는데 해당 값을 찾을 수 없을 때</li>
<li>접근하는 key가 dict에 존재하지 않을 때</li>
</ul>
<p><strong><code>False</code>, <code>0</code>과는 다른 의미임에 주의</strong></p>
<h3 id="number-int-float-complex">Number: <code>int</code>, <code>float</code>, <code>complex</code></h3>
<h4 id="int-정수-타입"><code>int</code> 정수 타입</h4>
<pre><code class="language-python"># int 선언
a = 10
print(a) # 10

# int 생성자
b = int(10.4)
print(b) # 10</code></pre>
<ul>
<li>파이썬은 범위가 무한대인 정수 자료형을 가지고 있다. -&gt; 정수 오버플로우 발생 X
아무리 큰 값을 저장하더라도 하나의 자료형인 <code>int</code> 로 해결할 수 있다.<h4 id="float-실수-타입"><code>float</code> 실수 타입</h4>
<pre><code class="language-python"># float 선언
a = 11.7
print(a) # 11.7
</code></pre>
</li>
</ul>
<h1 id="float-생성자">float 생성자</h1>
<p>b = float(21.5)
print(b) # 21.5</p>
<pre><code>- 실수를 선언하기 위해서는 소수점을 명시해줘야 한다.
- 같은 10이라도 `int`는 `10`, `float`는 `10.0`으로 표현해야 한다.
(단, `.` 앞/뒤의 `0`은 생략 가능 -&gt; `10.`으로 표기해도 됨)
- 부동 소수점 오차가 생길 수 있으므로 주의가 필요하다.
- 정수와 실수 연산 시 -&gt; 실수 타입으로 반환된다.
#### `complex` 복소수 타입
```python
# complex 선언
a = 2 + 3j # 실수부 + 허수부j
b = complex(3, 5) # complex(실수부, 허수부)
print(a) # 2 + 3j
print(b) # 3 + 5j</code></pre><h3 id="bool"><code>bool</code></h3>
<blockquote>
<p>참(<code>True</code>)과 거짓(<code>False</code>)을 가질 수 있는 데이터 타입</p>
</blockquote>
<pre><code class="language-python">a = True
b = False

c = ( 3 &gt; 2 )
print(c) # True

d = ( 3 &lt; 2 )
print(d) # False

e = ( 3 == 2 )
print(e) # False</code></pre>
<ul>
<li>파이썬에서 <code>True</code>, <code>False</code>는 파이썬의 예약어이기 때문에 반드시 첫 글자는 대문자로 작성</li>
<li>문자열(<code>&#39;&#39;</code>), 리스트(<code>[]</code>), 튜플(<code>()</code>), 딕셔너리(<code>[]</code>)가 원소를 가지지 않고 비어있으면 <code>False</code>, 하나 이상의 원소를 가지면 <code>True</code></li>
<li>숫자형에서 값이 <code>0</code>이라면 <code>False</code>, <code>0</code>이 아닌 다른 수라면 <code>True</code><h3 id="str"><code>str</code></h3>
</li>
</ul>
<p>1.</p>
<pre><code class="language-python">first_name = &#39;Gahee&#39;
last_name = &#39;Park&#39; # 큰 따옴표든 작은 따옴표든 상관 없음

print(first_name+last_name) # GaheePark</code></pre>
<p>2.</p>
<pre><code class="language-python">multi_str1 = &quot;&quot;&quot;
문자열
멀티라인
&quot;&quot;&quot;
multi_str2 = &#39;&#39;&#39;
문자열
멀티라인
&#39;&#39;&#39;</code></pre>
<p>3.</p>
<pre><code class="language-python">a = 2
b = &#39;a&#39;
print(b) # 숫자가 아닌 문자열 a 출력</code></pre>
<ol start="4">
<li>문자열 + 숫자 시 에러 발생<pre><code class="language-python">a = &quot;3&quot;
b = &quot;hi&quot;
print(a+b) # 3hi
</code></pre>
</li>
</ol>
<p>a = 3
b = &quot;hi&quot;
print(a+b) </p>
<h1 id="에러-발생">에러 발생</h1>
<h1 id="traceback-most-recent-call-last">Traceback (most recent call last):</h1>
<h1 id="file-usersuserdesktopsparta_pythonpythonproject1hellopy-line-3-in-module">File &quot;/Users/user/Desktop/sparta_python/pythonProject1/hello.py&quot;, line 3, in <module></h1>
<h1 id="printab">print(a+b)</h1>
<h1 id=""><del>^</del></h1>
<h1 id="typeerror-unsupported-operand-types-for--int-and-str">TypeError: unsupported operand type(s) for +: &#39;int&#39; and &#39;str&#39;</h1>
<pre><code>5.
```python
a = &#39;2&#39;
b = str(2) # 문자열로 바꾸는 함수
print(a+b) # &#39;22&#39;</code></pre><ol start="6">
<li>문자열의 길이를 세고 싶을 땐 <code>len()</code> 함수 사용<pre><code class="language-python">text = &#39;abcdefghijk&#39;
result = len(text)
</code></pre>
</li>
</ol>
<p>print(result) # 11</p>
<pre><code>7. 문자열 자르기 (슬라이싱)

(1) 다양한 방법으로 활용 가능
```python
text = &#39;abcdefghijk&#39;
result = text[:3]

print(result) # abc</code></pre><pre><code class="language-python">text = &#39;abcdefghijk&#39;
result = text[3:]

print(result) # defghijk</code></pre>
<pre><code class="language-python">text = &#39;abcdefghijk&#39;
result = text[3:7] # 3번째부터 7번째까지 문자열을 자르고 싶다

print(result) # defg</code></pre>
<pre><code class="language-python">text = &#39;abcdefghijk&#39;
result = text[:] # 복사하기

print(result) # abcdefghijk</code></pre>
<pre><code class="language-python">text = &#39;abcdefghijk&#39;
result = text[:-5]

print(result) # abcdef</code></pre>
<pre><code class="language-python">text = &#39;abcdefghijk&#39;
result = text[5:-1]

print(result) # fghij</code></pre>
<p>(2)</p>
<pre><code class="language-python">myemail = &#39;930_10@naver.com&#39;
result = myemail.split(&#39;@&#39;) # &#39;@&#39;를 기준으로 자른다
print(result) # [&#39;930_10&#39;, &#39;naver.com&#39;] 배열로 출력

result2 = myemail.split(&#39;@&#39;)[1]
print(result2) # &#39;naver.com&#39;

# 만약 naver가 필요하다면?
result3 = myemail.split(&#39;@&#39;)[1].split(&#39;.&#39;)[0]
print(result3) # &#39;naver&#39;</code></pre>
<pre><code class="language-python">phone = &#39;02-123-1234&#39; # 지역번호만 자르고 싶다면?
result = phone.split(&#39;-&#39;)[0]
print(result) # &#39;02&#39;</code></pre>
<ol start="8">
<li>문자열 찾기 (인덱싱)<pre><code class="language-python">text = &#39;abcdefghijk&#39;
result = text[4]
</code></pre>
</li>
</ol>
<p>print(result) # e</p>
<pre><code>### `list`
&gt; 리스트 자료형은 순서, 중복, 수정, 삭제를 모두 지원하는 자료형
`[]` 기호를 사용한다.

```python
a_list = [&#39;apple&#39;, &#39;pear&#39;, &#39;strawberry&#39;] # 문자열 뿐만 아니라 불리언형, 숫자형도 가능
print(a_list) # [&#39;apple&#39;, &#39;pear&#39;, &#39;strawberry&#39;]
print(a_list[0]) # &#39;apple&#39; 인덱스로 접근</code></pre><ul>
<li>원소를 가지지 않는 빈 리스트 선언 가능</li>
<li>서로 다르거나 같은 타입의 자료형을 원소로 가지도록 선언 가능</li>
<li>순서를 가지는 자료형이기 때문에 인덱스로 접근이 가능하다.<pre><code class="language-python">a_list = [3,5,2,6,8]
result = a_list[-1] # -1 입력 -&gt; 무조건 제일 마지막 요소 출력
print(result) # 8</code></pre>
</li>
<li>슬라이싱으로 특정한 범위의 원소들만 접근 가능<ul>
<li><code>start_index</code>는 범위에 포함되지만 <code>end_index</code>는 포함되지 않음<pre><code class="language-python"># slicing 문법
list_name[start_index : end_index : step]
# 또는 step 생략(생략시 자동으로 1로 설정)
list_name[start_index : end_index]
</code></pre>
</li>
</ul>
</li>
</ul>
<h1 id="예시">예시</h1>
<p>list = [0, 1, 2, 3, 4, 5]
print(list[2:4])</p>
<blockquote>
<blockquote>
<blockquote>
<p>[2, 3]</p>
</blockquote>
</blockquote>
</blockquote>
<pre><code>- 리스트 속에 리스트도 담을 수 있다.
```python
a_list = [2, True, &#39;strawberry&#39;, [&#39;blueberry&#39;,&#39;redberry&#39;]]
print(a_list) # [2, True, &#39;strawberry&#39;, [&#39;blueberry&#39;,&#39;redberry&#39;]]
print(a_list[3]) # [&#39;blueberry&#39;, &#39;redberry&#39;]
print(a_list[3][1]) # &#39;redberry&#39;</code></pre><ul>
<li><code>append()</code> 함수: 리스트의 맨 끝에 요소를 추가하는 함수<pre><code class="language-python">a_list = [3,5,2,6,8]
a_list.append(99)
print(a_list) # [3, 5, 2, 6, 8, 99]</code></pre>
</li>
<li>리스트 요소 수 세기<pre><code class="language-python">a_list = [3,5,2,6,8]
result = len(a_list)
print(result) # 5</code></pre>
</li>
<li><code>sort()</code> 함수: 리스트 정렬하는 함수<pre><code class="language-python">a_list = [3,5,2,6,8]
a_list.sort() # 오름차순
print(a_list) # [2, 3, 5, 6, 8]
</code></pre>
</li>
</ul>
<p>a_list.sort(reverse=True) # 내림차순
print(a_list) # [8, 6, 5, 3, 2]</p>
<pre><code>- `in` 을 사용하여 값이 있는지 없는지 파악하기
```python
a_list = [3,5,2,6,8]
result = (5 in a_list)
print(result) # True</code></pre><ul>
<li>리스트 요소 바꾸기<pre><code class="language-python">a_list = [&#39;사과&#39;, &#39;감&#39;, &#39;배&#39;]
a[1] = &#39;딸기&#39;
print(a_list) # [&#39;사과&#39;, &#39;딸기&#39;, &#39;배&#39;]</code></pre>
<h3 id="dict"><code>dict</code></h3>
<blockquote>
<p>딕셔너리. 사전 자료형은 순서가 없고 키-밸류 쌍으로 존재한다.
키 중복을 허용하지 않고, 데이터의 수정이나 삭제가 가능하다.
<code>{}</code> 기호를 사용한다.</p>
</blockquote>
</li>
</ul>
<pre><code class="language-python">a_dict = {&#39;name&#39;: &#39;bob&#39;, &#39;age&#39;: 27}
print(a_dict[&#39;name&#39;]) # &#39;bob&#39;
print(a_dict[&#39;age&#39;]) # 27</code></pre>
<ul>
<li>딕셔너리 선언 시 <code>key:value</code> 식으로 아이템을 선언할 수 있지만, <code>key=value</code>의 형식으로도 사용 가능</li>
<li>가독성을 위해 각 item간 줄 띄어쓰기를 사용할 수 있다.</li>
<li><code>value</code>를 찾고 싶을 땐, <code>dict_name[key_name]</code> 처럼 찾을 수 있다.<pre><code class="language-python"># 빈 dict 선언
dict1 = {}
dict2 = dict()
# 원소가 있는 dict 선언
dict3 = {&#39;name&#39;: &#39;Kim&#39;, &#39;phone&#39;: &#39;01012345678&#39;, &#39;birth&#39;: &#39;840102&#39;}
dict4 =  dict(name=&#39;Kim&#39;, phone=&#39;01012345678&#39;, birth=&#39;840102&#39;)
# 가독성을 위해 줄 띄어쓰기
dict5 = {
  &#39;name&#39;: &#39;Kim&#39;, 
  &#39;phone&#39;: &#39;01012345678&#39;, 
  &#39;birth&#39;: &#39;840102&#39;
}
print(dict5[&#39;name&#39;])
&gt;&gt;&gt; Kim</code></pre>
</li>
<li>리스트와 딕셔너리가 조합되어 들어가기도 한다.<pre><code class="language-python">a_dict = {&#39;name&#39;: &#39;bob&#39;, &#39;age&#39;: 27, &#39;friends&#39;: [&#39;John&#39;, &#39;Mike&#39;, &#39;Ann&#39;]}
result = a_dict[&#39;friends&#39;]
print(result) # [&#39;John&#39;, &#39;Mike&#39;, &#39;Ann&#39;]
</code></pre>
</li>
</ul>
<p>result = a_dict[&#39;friends&#39;][0]
print(result) # &#39;John&#39;</p>
<pre><code>- 딕셔너리에 키-밸류 쌍 추가
```python
a_dict = {&#39;name&#39;: &#39;bob&#39;, &#39;age&#39;: 27, &#39;friends&#39;: [&#39;John&#39;, &#39;Mike&#39;, &#39;Ann&#39;]}
a_dict[&#39;height&#39;] = 180
print(a_dict) # {&#39;name&#39;: &#39;bob&#39;, &#39;age&#39;: 27, &#39;friends&#39;: [&#39;John&#39;, &#39;Mike&#39;, &#39;Ann&#39;], &#39;height&#39;: 180}</code></pre><ul>
<li>딕셔너리에서 값 검색<pre><code class="language-python">a_dict = {&#39;name&#39;: &#39;bob&#39;, &#39;age&#39;: 27, &#39;friends&#39;: [&#39;John&#39;, &#39;Mike&#39;, &#39;Ann&#39;]}
a_dict[&#39;height&#39;] = 180
result = (&#39;height&#39; in a_dict)
print(result) # True</code></pre>
</li>
<li><code>get()</code>, <code>update()</code>를 사용해 값을 가져오거나 새로 추가하기<pre><code class="language-python">dict.get(&#39;key&#39;)
dict.update({&#39;key&#39;: value})</code></pre>
<h3 id="list와-dict의-조합"><code>list</code>와 <code>dict</code>의 조합</h3>
</li>
<li>하나의 리스트에 여러 개의 딕셔너리가 들어가 있는 형태<pre><code class="language-python">people = [
  {&#39;name&#39;: &#39;bob&#39;, &#39;age&#39;: 27},
  {&#39;name&#39;: &#39;John&#39;, &#39;age&#39;: 30}
]
</code></pre>
</li>
</ul>
<p>print(people) # [{&#39;name&#39;: &#39;bob&#39;, &#39;age&#39;: 27}, {&#39;name&#39;: &#39;John&#39;, &#39;age&#39;: 30}]</p>
<h1 id="만약-30이라는-값을-얻고-싶다면">만약 30이라는 값을 얻고 싶다면?</h1>
<p>print(people[1][&#39;age&#39;]) # 30</p>
<pre><code>#### 연습 문제
- smith의 sience 점수를 출력해라
```python
people = [
    {&#39;name&#39;: &#39;bob&#39;, &#39;age&#39;: 20, &#39;score&#39;:{&#39;math&#39;:90,&#39;science&#39;:70}},
    {&#39;name&#39;: &#39;carry&#39;, &#39;age&#39;: 38, &#39;score&#39;:{&#39;math&#39;:40,&#39;science&#39;:72}},
    {&#39;name&#39;: &#39;smith&#39;, &#39;age&#39;: 28, &#39;score&#39;:{&#39;math&#39;:80,&#39;science&#39;:90}},
    {&#39;name&#39;: &#39;john&#39;, &#39;age&#39;: 34, &#39;score&#39;:{&#39;math&#39;:75,&#39;science&#39;:100}}
]

# smith의 sience 점수 출력
print(people[2][&#39;score&#39;][&#39;science&#39;]) # 90</code></pre><h3 id="tuple"><code>tuple</code></h3>
<blockquote>
<p>순서와 중복은 지원하지만 수정과 삭제는 지원하지 않는다 <strong>(불변성)</strong>
<code>()</code> 기호를 사용
보안적 이슈 등의 이유로 절대 변경되면 안되는 중요한 값을 불변으로 유지하고 싶을 때 사용</p>
</blockquote>
<ul>
<li>튜플 내부에 원소가 하나만 있을 경우: 끝에 <code>,</code> 반드시 추가해야 한다.<ul>
<li>그렇지 않을 경우 괄호 안에 있는 원소의 타입으로 인식됨<pre><code class="language-python"># 빈 tuple 선언
tuple1 = ()
tuple2 = tuple()
# 원소가 있는 tuple 선언
tuple3 = (1,)  # 원소가 하나일 때는 끝이 , 로 끝나야 튜플로 인식한다.
tuple4 = (1, 2, 3, 4)
tuple5 = (&#39;football&#39;, 1, 2, &#39;soccer&#39;, False, 3.14159) # 서로 다른 자료형 사용 가능</code></pre>
</li>
</ul>
</li>
<li>list와 마찬가지로 다양한 데이터 타입을 함께 사용할 수 있다.</li>
<li>값을 수정하거나 삭제하려고 하면 에러 발생<pre><code class="language-python">a = (&#39;사과&#39;, &#39;감&#39;, &#39;배&#39;)
</code></pre>
</li>
</ul>
<p>a[1] = &#39;수박&#39;
print(a)</p>
<h1 id="출력-결과">출력 결과</h1>
<p>Traceback (most recent call last):
  File &quot;/Users/user/Desktop/sparta_python/pythonProject1/hello.py&quot;, line 3, in <module>
    a[1] = &#39;수박&#39;
    ~^^^
TypeError: &#39;tuple&#39; object does not support item assignment</p>
<pre><code>- 튜플의 값을 변경하고 싶다면 list 타입으로 변환 후 수정해야 한다.
```python
tuple = (1, 2, 3)
tuple = list(tuple)
tuple[0] = 100
print(tuple[0])
&gt;&gt;&gt; 100</code></pre><h3 id="set"><code>set</code></h3>
<blockquote>
<p>집합 자료형은 순서를 가지지 않고, 중복도 허용하지 않는 자료형이다.</p>
</blockquote>
<pre><code class="language-python">a = [1,2,3,4,5,6,7,8,9,0,2,4,5,1]

a_set = set(a)
print(a_set)

# 출력 결과
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}</code></pre>
<ul>
<li>순서가 있는 자료형과는 달리 인덱스로 접근 불가</li>
<li>원소를 찾고 싶다면 <code>in</code> 키워드 사용<pre><code class="language-python">set = {1, 2, 3, 4}
if 1 in set:
  print(&quot;found 1&quot;)
&gt;&gt;&gt; found 1</code></pre>
<h4 id="교집합-구하기">교집합 구하기</h4>
<pre><code class="language-python">a = [&#39;사과&#39;, &#39;감&#39;, &#39;배&#39;]
b = [&#39;사과&#39;, &#39;귤&#39;, &#39;참외&#39;]
</code></pre>
</li>
</ul>
<p>a_set = set(a)
b_set = set(b)
print(a_set &amp; b_set) # {&#39;사과&#39;}</p>
<pre><code>#### 합집합 구하기
```python
a = [&#39;사과&#39;, &#39;감&#39;, &#39;배&#39;]
b = [&#39;사과&#39;, &#39;귤&#39;, &#39;참외&#39;]

a_set = set(a)
b_set = set(b)
print(a_set | b_set) # {&#39;귤&#39;, &#39;사과&#39;, &#39;배&#39;, &#39;참외&#39;, &#39;감&#39;}</code></pre><h4 id="차집합-구하기">차집합 구하기</h4>
<pre><code class="language-python">a = [&#39;사과&#39;, &#39;감&#39;, &#39;배&#39;]
b = [&#39;사과&#39;, &#39;귤&#39;, &#39;참외&#39;]

a_set = set(a)
b_set = set(b)
print(a_set - b_set) # {&#39;감&#39;, &#39;배&#39;}</code></pre>
<h4 id="연습문제">연습문제</h4>
<ul>
<li>a는 듣고 b는 듣지 못한 수업을 차집합을 통해 구하는 방법<pre><code class="language-python">student_a = [&#39;물리2&#39;,&#39;국어&#39;,&#39;수학1&#39;,&#39;음악&#39;,&#39;화학1&#39;,&#39;화학2&#39;,&#39;체육&#39;]
student_b = [&#39;물리1&#39;,&#39;수학1&#39;,&#39;미술&#39;,&#39;화학2&#39;,&#39;체육&#39;]
</code></pre>
</li>
</ul>
<p>print(set(student_a) - set(student_b)) # {&#39;화학1&#39;, &#39;물리2&#39;, &#39;음악&#39;, &#39;국어&#39;}</p>
<pre><code>### `func`
&gt; 함수도 독자적인 자료형을 가진다.

```python
def sum(a,b):
        print(&#39;더하기를 하셨네요&#39;)
    return a+b

result = sum(43,5)
print(result)

# 출력 결과
&#39;더하기를 하셨네요&#39;
48</code></pre><h4 id="함수-활용">함수 활용</h4>
<pre><code class="language-python">def bus_rate(age):
    if age &gt; 65:
        print(&#39;무료입니다.&#39;)
        return 0
    elif age &gt; 20:
        print(&#39;성인입니다.&#39;)
        return 2400
    else:
        print(&#39;청소년이거나 아이입니다.&#39;)
        return 1200

myrate = bus_rate(26)
print(myrate)

# 출력 결과
&#39;성인입니다.&#39;
2400</code></pre>
<h4 id="연습문제-1">연습문제</h4>
<ul>
<li>주민 번호를 입력 받아 성별을 출력하는 함수 만들기<pre><code class="language-python">def check_gender(pin):
  num = int(pin.split(&#39;-&#39;)[1][0])
  if num % 2 == 0:
      print(&#39;여자입니다.&#39;)
  else:
      print(&#39;남자입니다.&#39;)
</code></pre>
</li>
</ul>
<p>check_gender(&#39;150101-1012345&#39;)
check_gender(&#39;150101-3012345&#39;)
check_gender(&#39;150101-2012345&#39;)
check_gender(&#39;150101-4012345&#39;)</p>
<h1 id="출력-결과-1">출력 결과</h1>
<p>&#39;남자입니다.&#39;
&#39;남자입니다.&#39;
&#39;여자입니다.&#39;
&#39;여자입니다.&#39;</p>
<p>```
<code>참고</code> 문자열을 숫자열로 바꿀 때는 <code>int()</code> 함수를 사용한다.</p>
<hr>
<p>이번 글에서는 파이썬의 변수 선언, 많이 사용되는 자료형에 대해 다뤄보았다.
파이썬 고수가 되기 위해 열심히 가..가보자고</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[리액트에서 CSS 사용하기]]></title>
            <link>https://velog.io/@930_10/%EB%A6%AC%EC%95%A1%ED%8A%B8%EC%97%90%EC%84%9C-CSS-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@930_10/%EB%A6%AC%EC%95%A1%ED%8A%B8%EC%97%90%EC%84%9C-CSS-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0</guid>
            <pubDate>Mon, 25 Mar 2024 15:33:35 GMT</pubDate>
            <description><![CDATA[<p>복습하다가 노션이 다운돼서 오랜만에 벨로그를 쓰게되었다는 슬픈 얘기를 전하며... 시작</p>
<h1 id="css-module-css-in-css">CSS Module (CSS in CSS)</h1>
<p>리액트 프로젝트에서 컴포넌트를 스타일링할 때, 여러 개의 CSS    파일을 사용하다보면 동일한 이름의 클래스가 중복으로 정의될 수 있다.
중복된 클래스가 정의된 리액트 엘리먼트는 여러 클래스에서 지정한 스타일이 모두 다 적용되며 내가 원하는 스타일이 안나올 수 있다!
이때, CSS Module 기술을 사용하면 CSS 클래스가 중첩되는 것을 방지할 수 있다.
<img src="https://velog.velcdn.com/images/930_10/post/473fb802-1225-4401-a236-43877fc14e10/image.png" alt="cssmodule예시">
[클래스 이름]_[해시값] 형태로 만들어진다.
같은 rounded-button을 가지고 있지만, 클래스 이름에 대해 고유한 이름이 만들어지기 때문에 CSS 클래스 이름과 중복되는 일에 대해 걱정할 필요는 없다.</p>
<h2 id="👩🏻💻-사용-방법--예제">👩🏻‍💻 사용 방법 &amp; 예제</h2>
<p>간단하게, css 파일의 확장자를 <code>.module.css</code> 로 하면 된다.
css module 기술을 이용해 위 사진의 버튼 컴포넌트들을 만들어 보았다.</p>
<p><code>Button.module.css</code> css 파일 ⬇️</p>
<pre><code class="language-css">📁 cssmodule/src/components/Button.module.css

.rounded-button {
  background-color: dodgerblue; /* background */
  border: none; /* Remove borders */
  color: white; /* White text */
  padding: 6px 18px; /* Padding */
  text-align: center; /* Center text */
  text-decoration: none; /* Remove underline */
  display: inline-block; /* Display as inline-block */
  font-size: 16px; /* Font size */
  margin: 4px 2px; /* Margin */
  cursor: pointer; /* Cursor pointer */
  border-radius: 6px; /* Border radius */
}

.button-darkblue-gray {
  background-color: darkblue;
  color: gray;
}

.button-lightblue-black {
  background-color: lightblue;
  color: black;
}

.button-bg-gray {
  background-color: darkblue;
  color: lightgray;
}

.button-bg-black {
  background-color: lightblue;
  color: black;
}

.button-salmon {
  background-color: salmon;
}</code></pre>
<p><code>Button.jsx</code> 컴포넌트 파일 ⬇️
컴포넌트 상단에 <code>module.css</code> 파일을 import 한 후 사용</p>
<pre><code class="language-js">📁cssmodule/src/components/Button.jsx
import PropTypes from &#39;prop-types&#39;;
import styles from &#39;./Button.module.css&#39;

// propType 지정
Button.propTypes = {
  children: PropTypes.string.isRequired,
  color: PropTypes.string,
  backgroundColor: PropTypes.string
}


function Button({ children, color, backgroundColor }) {
  return &lt;button className={ 
    `${styles[&#39;rounded-button&#39;]} 
     ${styles[&#39;button-&#39;+backgroundColor]}
     ${styles[&#39;button-bg-&#39;+color]}` }&gt;{ children }
    &lt;/button&gt;
}

export default Button;</code></pre>
<p>템플릿 리터럴 방식으로 클래스 이름을 가져와준다.
근데 만약 여러 개라면 <code>${style.first}</code>, <code>${style.second}</code> 이렇게 해야 하는데 너무 번거롭게 느껴진다..
(-&gt; 를 해결하기 위해 classNames 라이브러리를 쓸 수 있다.
이건 다음에 알아봐야지..)</p>
<p><code>App.jsx</code> 최종 렌더링 파일 ⬇️</p>
<pre><code class="language-js">📁cssmodule/src/App.jsx
import &#39;./App.css&#39;
import Button from &#39;./components/Button&#39;;

function App(){

  return (
    &lt;&gt;
      &lt;h1&gt;CSS 모듈 사용&lt;/h1&gt;
      &lt;Button&gt;기본 버튼&lt;/Button&gt;
      &lt;Button backgroundColor=&quot;darkblue&quot; color=&quot;gray&quot;&gt;다크블루색 버튼&lt;/Button&gt;
      &lt;Button backgroundColor=&quot;lightblue&quot; color=&quot;black&quot;&gt;라이트블루색 버튼&lt;/Button&gt;
    &lt;/&gt;
  )
}

export default App;</code></pre>
<p>렌더링 결과 ⬇️
<img src="https://velog.velcdn.com/images/930_10/post/19648d9b-99a3-412e-af58-f9ba849746e4/image.png" alt="cssmoduleappjsx"></p>
<h2 id="🔍-그렇다면-언제-사용하는-것이-좋을까">🔍 그렇다면 언제 사용하는 것이 좋을까?</h2>
<ul>
<li>레거시 프로젝트에 리액트를 도입할 때<ul>
<li>기존 프로젝트에 있던 CSS 클래스와 이름이 중복되어도 스타일이 꼬이지 않음</li>
</ul>
</li>
<li>CSS 클래스 네이밍 규칙을 만들기 귀찮을 때, 힘들 때, 번거로울 때<ul>
<li>클래스명을 모듈 내에서만 중복되지 않게 작성하면 되기 때문에 클래스명 네이밍 고민이 줄어든다.</li>
</ul>
</li>
<li>보통 컴포넌트 당 CSS 모듈을 작성하기 때문에 스타일을 유지보수할 때에도 편하다.</li>
</ul>
<h2 id="💡-새로-알게-된-사실">💡 새로 알게 된 사실</h2>
<p>CSS Module은 Sass에서도 사용할 수 있다! (아직은 안써봤지만)
<code>node-sass</code> 를 설치한 후, 확장자를 <code>.module.scss</code> 로만 바꿔주면 사용할 수 있다.</p>
<h1 id="styled-components-css-in-js">styled-components (CSS in JS)</h1>
<p>💅 <code>styled-components</code> ! 저 네일아트 하는 이모지가 인상 깊어서 정말 써보고 싶었던 라이브러리다.</p>
<p>styled-components는 대표적인 css in js 라이브러리이며, 그만큼 대중적으로 많이 사용하고 있다.
(이 외에는 emotion과 styled-jsx가 있다.)
(css in js: 자바스크립트 코드로 css를 작성하는 것)</p>
<p><img src="https://velog.velcdn.com/images/930_10/post/b4964003-4d0c-495f-b022-05621550c5e6/image.png" alt="styledcomponent"></p>
<p>css module 방식과는 다르게, class로 지정하는 것이 아니라 props를 이용해서 css를 적용하는 것을 볼 수 있다.
그럼 어떻게 사용하느냐?</p>
<h2 id="👩🏻💻-사용-방법--예제-1">👩🏻‍💻 사용 방법 &amp; 예제</h2>
<h3 id="설치">설치</h3>
<pre><code class="language-bash">npm i styled-components</code></pre>
<p>styled-components가 필요한 프로젝트 폴더에서 명령어를 입력해주고 엔터치면 설치 완료!</p>
<h3 id="예제">예제</h3>
<p>styled-components를 이용해 버튼을 만들어보았다.</p>
<p>버튼 컴포넌트를 만들고, 스타일 입히기
<code>StyledButton.jsx</code> ⬇️</p>
<pre><code class="language-js">📁 styledcomponents/src/components/StyledButton.jsx

import styled from &#39;styled-components&#39;;
import PropTypes from &#39;prop-types&#39;;

// Tagged Template Literal 방식을 사용해 컴포넌트의 props를 읽어온다.
const ButtonStyle = styled.button`
  background-color: ${ props =&gt; props.backgroundColor || &#39;dodgerblue&#39; }; /* background */
  border: none; /* Remove borders */
  color: ${ props =&gt; props.color || &#39;white&#39; }; /* White text */
  padding: 6px 18px; /* Padding */
  text-align: center; /* Center text */
  text-decoration: none; /* Remove underline */
  display: inline-block; /* Display as inline-block */
  font-size: ${ props =&gt; props.size || &#39;16px&#39; }; /* Font size */
  margin: 4px 2px; /* Margin */
  cursor: pointer; /* Cursor pointer */
  border-radius: 6px; /* Border radius */
`;

// ButtonStyle에서 색상만 따로 바꾸고 싶다면 이렇게 작성한다.
const ButtonStyleSalmon = styled(ButtonStyle)`
  background-color: salmon; /* background */
`;

// propType 지정
Button.propTypes = {
  children: PropTypes.string.isRequired,
}

Submit.propTypes = {
  children: PropTypes.string.isRequired,
  backgroundColor: PropTypes.string
}

// props를 하나하나 넣어주는 번거로운 짓은 하지 말고, rest 문법을 사용한다.
function Button({ children, ...rest }){
  return &lt;ButtonStyle type=&quot;button&quot; { ...rest }&gt;{ children }&lt;/ButtonStyle&gt;
}

function Submit({ children, ...rest }){
  return &lt;ButtonStyleSalmon type=&quot;submit&quot; { ...rest }&gt;{ children }&lt;/ButtonStyleSalmon&gt;
}


export { Button, Submit }</code></pre>
<p>최종 렌더링 파일 <code>App.jsx</code> ⬇️</p>
<pre><code class="language-js">📁 styledcomponents/src/App.jsx

import { Button, Submit } from &quot;./components/StyledButton&quot;;

function App(){
  return (
    &lt;&gt;
      &lt;h1&gt;Styled Components&lt;/h1&gt;
    // props를 넘겨주어 size, color, bgColor 등 원하는 것을 바꿔줄 수도 있다.
      &lt;Button 
        size=&quot;12px&quot; 
        color=&quot;lightblue&quot;
        backgroundColor=&quot;darkblue&quot;&gt;Button Type 버튼&lt;/Button&gt;
      &lt;Submit&gt;Submit Type 버튼&lt;/Submit&gt;
    &lt;/&gt;
  )
}

export default App;</code></pre>
<p>렌더링 결과 ⬇️
<img src="https://velog.velcdn.com/images/930_10/post/c4f2bf54-7394-4137-93ed-5d1ff5937026/image.png" alt="styledcomponentsrender"></p>
<h2 id="🔍-styled-components의-장점">🔍 styled-components의 장점</h2>
<ul>
<li>얘도 css module 방식처럼, css 클래스명의 중복을 고려할 필요가 없다. 고유한 클래스 이름을 자동으로 생성해주기 때문에!</li>
<li>자바스크립트 코드의 변수 값을 CSS 스타일링에 사용할 수 있기 때문에, 동적으로 스타일링이 가능하다. (<code>props</code> , <code>state</code> 등을 이용해서)</li>
<li>컴포넌트와 스타일이 결합 -&gt; 컴포넌트 단위로 스타일을 수정하기 용이하다.</li>
<li>vender prefix가 자동으로 추가된다!<ul>
<li>vender prefix<ul>
<li>css 표준안으로 확정되지 않았거나 특정 브라우저에서만 지원되는 css 속성을 사용하고 싶을 때, 벤더 프리픽스 사용 -&gt; 기능이 포함되어 있지 않은 브라우저에서도 사용할 수 있게 해준다.</li>
<li>예) <code>-webkit-line-clamp: 5;</code> 
(css 처음 배울 때가 기억나는구먼..)</li>
</ul>
</li>
</ul>
</li>
</ul>
<h3 id="💬-css-module-vs-styled-components">💬 css module vs styled-components</h3>
<p>내 개인적 의견으로는 styled-components가 더 쓰기 편한 것 같다!
한 파일 안에서 컴포넌트를 관리하는게 더 좋아서 .. (프로젝트 시작하면 또 다를 수도?)
일단 오늘 처음 배워본 입장에선, styled-components 압승</p>
<h1 id="tailwindcss">tailwindCSS</h1>
<p>CSS 수업이 끝나고 혼자 조금 독학해 본 테일윈드!
리액트에서도 쓸 수 있는 줄 몰랐는데, 오늘 배우게 되었다~!</p>
<ul>
<li>utility-first CSS framework</li>
<li>미리 정의된 CSS 클래스를 이용해서 스타일링을 할 수 있는 프레임워크</li>
<li>CSS 파일을 따로 만들 필요 없이 제공되는 클래스를 HTML 태그에 직접 지정한다.<h2 id="👩🏻💻-사용-방법--예제-2">👩🏻‍💻 사용 방법 &amp; 예제</h2>
<h3 id="설치-1">설치</h3>
</li>
</ul>
<p>tailwindcss를 사용할 프로젝트 폴더에 아래 명령어를 입력해서 설치해준다.</p>
<pre><code class="language-bash">npm i -D tailwindcss postcss autoprefixer</code></pre>
<h4 id="postcss">postcss</h4>
<ul>
<li>CSS 변환 도구<ul>
<li>다양한 CSS 전처리기, 후처리기 및 CSS 확장을 사용하도록 도와줌</li>
</ul>
</li>
<li>PostCSS를 사용해서 CSS를 처리하고 변경할 수 있다.</li>
<li>플러그인 생태계: 다양한 플러그인을 사용해 CSS를 확장하고 향상시킬 수 있다.<ul>
<li><strong>autoprefixer</strong>: vender prefix를 자동으로 추가</li>
<li><strong>tailwindcss</strong>: tailwindcss를 사용할 수 있게 함</li>
</ul>
</li>
<li>성능 개선: CSS를 효율적으로 처리하고 최적화함</li>
<li>최신 CSS 스펙을 지원하지 않는 브라우저에서도 최신 CSS 사용을 가능하게 해준다.</li>
<li>자동화 도구와 통합 -&gt; CSS 작업 자동화, 효율적 관리</li>
</ul>
<p>설치를 마쳤으면, 설정 파일을 수정해주어야 한다.</p>
<pre><code class="language-bash">npx tailwindcss init -p</code></pre>
<p>를 터미널에 입력해주면,
<code>postcss.config.js</code> 파일이 생성된다.
<code>tailwind.config.js</code> 파일도 확인할 수 있다.</p>
<h4 id="설정-파일-수정">설정 파일 수정</h4>
<pre><code class="language-js">📁 tailwind/postcss.config.js

export default {
  plugins: {
    tailwindcss: {},
    autoprefixer: {},
  },
}</code></pre>
<p>기본적으로 tailwindcss와 autoprefixer 플러그인이 추가되어 있다. 없다면 수정해주기~</p>
<pre><code class="language-js">📁 tailwind/tailwind.config.js

/** @type {import(&#39;tailwindcss&#39;).Config} */
export default {
  content: [
    &quot;./index.html&quot;,
    // 타입스크립트를 사용한다면, ts, tsx 확장자명도 추가해준다.
    &quot;./src/**/*.{js,jsx}&quot;,
  ],
  theme: {
    extend: {},
  },
  plugins: [],
}
</code></pre>
<h4 id="tailwindcss-지시어-추가">tailwindcss 지시어 추가</h4>
<pre><code class="language-js">📁 tailwind/src/index.css

@import &#39;tailwindcss/base&#39;;
@import &#39;tailwindcss/components&#39;;
@import &#39;tailwindcss/utilities&#39;;
@import &#39;./App.css&#39;;</code></pre>
<p>이렇게 써도 되고, 아니면</p>
<pre><code class="language-js">
// 이 때, App.css import 구문은 최상단에 위치해야 함
@import &#39;./App.css&#39;;
@tailwind base;
@tailwind components;
@tailwind utilities;</code></pre>
<p>요렇게 써도 된다.</p>
<p>만약 esLint에서 자꾸 경고를 준다면
vscode settings - unknown at rules - CSS &gt; Lint: Unknown At Rules를 ignore로 변경한다.</p>
<h3 id="예제-1">예제</h3>
<p>테일윈드로도 똑같이 버튼 컴포넌트를 만들어 보았다~</p>
<p>버튼 컴포넌트 파일 ⬇️</p>
<pre><code class="language-js">📁 tailwind/src/components/Button.jsx

import PropTypes from &#39;prop-types&#39;;

// propType 설정
Button.propTypes = {
  children: PropTypes.string.isRequired,
  bgColor: PropTypes.string,
  fontSize: PropTypes.string
}

// 역시나 여기서도 rest 문법을 사용한다.
function Button({ children, bgColor=&quot;red&quot;, fontSize=&quot;sm&quot;, ...rest }){

let btnColor = {
  blue: `bg-blue-400`,
  green: `bg-green-400`,
  gray: `bg-gray-400`,
  red: `bg-rose-400`
};

let btnSize = {
  sm: &#39;py-1 px-2 text-sm&#39;,
  md: &#39;py-2 px-4 text-base&#39;,
  lg: &#39;py-2 px-6 text-lg&#39;,
  xl: &#39;py-2 px-8 text-xl&#39;
};

let btnHoverColor = {
  blue: `hover:bg-blue-300`,
  green: `hover:bg-green-300`,
  gray: `hover:bg-gray-300`,
  red: `hover:bg-rose-300`
};

  return &lt;button 
              className={`
              ${btnColor[bgColor]}
              text-gray-50 
              font-bold ${btnSize[fontSize]}
              mx-2 
              my-3 
              rounded-md
              ${btnHoverColor[bgColor]}
            `} 
            {...rest} &gt;{ children }&lt;/button&gt;
}

export default Button;</code></pre>
<h4 id="💡-중요한-사실">💡 중요한 사실!</h4>
<p>tailwind 공식 문서에 따르면, Dynamic class name을 설정할 때는 항상 완전한 클래스 이름으로 설정해야 한다.
완전한 클래스 네임만 따로 추출해서 그 추출한 애들만 최종 결과에 반영하기 때문이다.
따라서, <code>bg-${bgColor}-300</code> 이렇게 사용하는 것은 안된다!!
(이거 때문에 tailwind 쓰기 싫다 엉엉 코드가 너무 길어~!)</p>
<p>아무튼 계속해서 최종 렌더 파일인 App.jsx 파일을 보자. 
(벨로그는 콜아웃 기능이 없나요?.... 불편해)</p>
<pre><code class="language-js">📁 tailwind/src/App.jsx

import Button from &quot;./components/Button&quot;;

function App(){
  return (
    &lt;&gt;
      &lt;h1 className=&quot;myTitle&quot;&gt;Tailwind CSS&lt;/h1&gt;
      &lt;p&gt;Hello Tailwind&lt;/p&gt;
      &lt;Button&gt;기본 버튼&lt;/Button&gt;
      &lt;Button 
        bgColor=&quot;blue&quot; 
        fontSize=&quot;md&quot;&gt;파란 버튼&lt;/Button&gt;
      &lt;Button 
        type=&quot;submit&quot; 
        bgColor=&quot;green&quot; 
        fontSize=&quot;lg&quot; 
        onClick={ () =&gt; alert(&#39;등록하시겠습니까?&#39;) }&gt;녹색 버튼&lt;/Button&gt;
      &lt;Button 
        bgColor=&quot;gray&quot; 
        fontSize=&quot;xl&quot;&gt;회색 버튼&lt;/Button&gt;
      &lt;button 
        className={`
            bg-violet-400 
            text-gray-50 
            font-bold 
            px-3 
            py-1 
            mx-2 
            my-3 
            text-lg 
            rounded-md 
            hover:bg-violet-300
        `}&gt;컴포넌트 아님&lt;/button&gt;
      &lt;br /&gt;
      &lt;button className=&quot;btn btn-primary&quot;&gt;주요 버튼&lt;/button&gt;
      &lt;button className=&quot;btn btn-warn&quot;&gt;경고 버튼&lt;/button&gt;
    &lt;/&gt;
  )
}

export default App;</code></pre>
<p>클래스를 이용해 스타일을 입히다 보니, 아주 번잡스럽기 그지 없다.
그럴 땐 주요 버튼과 경고 버튼의 코드를 보자. 깔끔하지 않는가요?
저렇게 줄여쓰기 위해.. index.css 파일을 이용해 자주 사용하는 버튼들을 따로 설정해주었다.</p>
<pre><code class="language-js">📁 tailwind/src/index.css

@import &#39;tailwindcss/base&#39;;
@import &#39;tailwindcss/components&#39;;
@import &#39;tailwindcss/utilities&#39;;
@import &#39;./App.css&#39;;

@layer components {
  .btn {
    @apply 
        bg-violet-400 
        text-gray-50 
        font-bold 
        px-3 
        py-1 
        mx-2 
        my-3 
        text-lg 
        rounded-md 
        hover:bg-violet-300
  }

  .btn-primary {
    @apply bg-orange-400 hover:bg-orange-300
  }

  .btn-warn {
    @apply bg-yellow-400 hover:bg-yellow-300
  }
}</code></pre>
<p>이렇게 설정해두고 갖고오면 된다!</p>
<p>최종 결과물 ⬇️
<img src="https://velog.velcdn.com/images/930_10/post/1274bf50-1df1-4f04-8e1b-101b14eef5e9/image.png" alt="tailwindcssrender"></p>
<p>ㅎ Button 컴포넌트 파일을 만드는가 vs index.css 파일에서 한번에 하는가~는 자신의 선택입니다용
근데 .. 나는 너무너무 불편해서 못쓸 것 같다 ㅠㅠ</p>
<h2 id="🔍-tailwindcss의-장점">🔍 tailwindcss의 장점</h2>
<ul>
<li>개발 생산성이 높다.<ul>
<li>개발자가 CSS 클래스 정의할 필요 X, 미리 정의된 클래스 사용 -&gt; 개발 속도와 생산성 향상 가능</li>
</ul>
</li>
<li>재사용 가능한 클래스 제공 -&gt; 동일한 클래스를 여러 엘리먼트에 사용해 일관된 디자인을 구축할 수 있다.</li>
<li>많은 유틸리티 클래스를 제공하며 커스터마이징이 가능해 유연성이 높다.</li>
<li>클래스 이름이 직관적이라 가독성이 높다.</li>
<li>사용하는 클래스만 포함해 최적화된 CSS 파일을 생성한다.</li>
</ul>
<h3 id="💬-여담">💬 여담</h3>
<p>난.. tailwind 잘 모르겠다.. (새로운게 아니라 그런가?ㅋㅋㅋ)
근데 배우는 입장이니까.. 다 열심히 써봐야겠다...!!</p>
<p>그럼 오늘 정리는 끝! 휴 이거 다쓰니까 노션 복구됐네~!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[CSS z-index와 쌓임맥락]]></title>
            <link>https://velog.io/@930_10/CSS-z-index%EC%99%80-%EC%8C%93%EC%9E%84%EB%A7%A5%EB%9D%BD</link>
            <guid>https://velog.io/@930_10/CSS-z-index%EC%99%80-%EC%8C%93%EC%9E%84%EB%A7%A5%EB%9D%BD</guid>
            <pubDate>Wed, 20 Dec 2023 16:05:46 GMT</pubDate>
            <description><![CDATA[<p>이때까지 만들었던 예제들을 보면, 보통 2차원적인 예제들이 많았다.(고 생각한다)
그래서 그동안 x, y 값에 대해서 생각만 했었다.
<del>사실 이거만 해도 좀 벅찼다 ㅎㅎ</del></p>
<p>그러다 position: absolute나 relative, 
또한 transform 속성에 대해 알고 난 후
위 속성들을 구현하기 위해선 3차원 공간처럼
css에도 z축이 있다는 것을 알게 되었다.</p>
<p>그래서 오늘 포스팅은..
z-index가 뭔지, 
그리고 추가로 알아야 할 개념인 쌓임 맥락이 뭔지에 대해
내가 알아본 정보들을 정리해서 적어보려고 한다..!</p>
<p>알면 알수록 신기한 css의 세계~</p>
<hr>
<h2 id="z-index">z-index</h2>
<blockquote>
<p>위치 지정 요소와 그 자손, 혹은 일반적으로 flex-item의 z축 순서를 지정한다.
initial value: <code>auto</code>, inheritance: no</p>
</blockquote>
<ul>
<li><p>문법: <code>auto</code> 또는 정수값을 사용한다.</p>
<ul>
<li><p>값이 <code>auto</code>일 경우, 새로운 쌓임 맥락을 생성하지 않는다.
쌓임 맥락에서의 위치는 부모 요소와 동일하다는 의미</p>
</li>
<li><p><code>정수값</code>일 경우, 이 값은 해당 요소의 z축 상의 위치를 나타낸다.</p>
<ul>
<li><code>z-index</code>는 <code>position</code> 속성이 설정된 요소에 대해서만 의미를 가진다.</li>
</ul>
</li>
<li><p>자신이 생성한 쌓임 맥락에서 자신의 z축 위치는 0으로 설정된다.</p>
</li>
<li><blockquote>
<p>따라서 그 자손의 z-index를 자기 외의 바깥 요소와 비교하지 않는다. 
(그 자손은 여기서 생성된 쌓임 맥락 위로 쌓이기 때문)</p>
</blockquote>
</li>
<li><p><strong>더 큰 <code>z-index</code> 값을 가진 요소가 그보다 작은 값의 요소 위를 덮는다.</strong></p>
<pre><code class="language-css">/* Ex */
z-index: -1
z-index: 0;
z-index: 2;
z-index: 999;</code></pre>
<p>위 예시에서 만약 같은 쌓임 맥락 안에 있는 다른 요소들 4개에 순서대로 저 값을 부여해줬다면,
<code>z-index: 999;</code> 가 지정된 요소가 다 덮는다는 의미이다.</p>
</li>
</ul>
</li>
</ul>
<ul>
<li>위치 지정 요소(position: <code>static</code>이 아닌 다른 값인 요소)에 대해, z-index 속성은 아래 항목을 지정한다.<ul>
<li>현재의 쌓임 맥락에서 자신(z-index가 지정된 요소) 의 위치</li>
<li>자신만의 쌓임 맥락 생성 여부</li>
</ul>
</li>
</ul>
<br>

<p><code>z-index</code>를 이해하기 위해선 계속 나오는 단어인 &#39;쌓임 맥락&#39;에 대해서도 숙지를 해야한다.
따라서, <code>z-index</code>는 잠시 제쳐두고 쌓임 맥락에 대해 알아보자.</p>
<hr>
<h2 id="쌓임-맥락-stacking-context">쌓임 맥락 (Stacking Context)</h2>
<blockquote>
<p>가상의 Z축을 사용한 html 요소의 3차원 개념화
각각의 html 요소는 자신의 속성에 따른 우선순위를 사용해 3차원 공간을 차지한다.</p>
</blockquote>
<h3 id="쌓임-맥락을-형성하는-요소의-조건">쌓임 맥락을 형성하는 요소의 조건</h3>
<ul>
<li>문서의 루트 요소 (<code>&lt;html&gt;</code>)</li>
<li><code>position</code>이 <code>absolute</code> 또는 <code>relative</code>이며, 
<code>z-index</code>가 <code>auto</code>가 아닌 요소 (두 가지를 모두 만족해야 한다.)</li>
<li><code>position</code>이 <code>fixed</code> 또는 <code>sticky</code>인 요소</li>
<li><code>flex-item</code> 중 <code>z-index</code>가 <code>auto</code>가 아닌 요소</li>
<li><code>opacitiy</code>가 <code>1</code>보다 작은 요소</li>
<li><code>mix-blend-mode</code>가 <code>normal</code>이 아닌 요소</li>
<li>아래 속성 중 하나라도 <code>none</code>이 아닌 값을 가진 요소<ul>
<li><code>transform</code></li>
<li><code>filter</code></li>
<li><code>backdrop-filter</code></li>
<li><code>perspective</code></li>
<li><code>clip-path</code></li>
<li><code>mask</code> / <code>mask-image</code> / <code>mask-border</code></li>
</ul>
</li>
</ul>
<p>이 외에도 <a href="https://developer.mozilla.org/ko/docs/Web/CSS/CSS_positioned_layout/Understanding_z-index/Stacking_context">여기</a>를 클릭하면 쌓임 맥락을 형성하는 요소의 조건을 더 알아볼 수 있다.</p>
<hr>
<h3 id="쌓임-맥락의-특징">쌓임 맥락의 특징</h3>
<ul>
<li><strong>쌓임 맥락 속 자식 요소의 <code>z-index</code> 값은 부모에게만 의미가 있다.</strong>
하나의 쌓임 맥락은 부모의 쌓임 맥락 속에서 통째로 하나의 단위로 간주된다.</li>
<li><strong>각각의 쌓임 맥락은 독립적이다.</strong>
어느 요소든 콘텐츠를 쌓은 후에는 그 요소를 통째로 부모의 쌓임 맥락 안에 배치한다.</li>
<li>모든 요소가 쌓임 맥락을 생성하는 것은 아니다.</li>
<li>쌓임 맥락 내부에 또 쌓임 맥락이 포함될 수 있다.
-&gt; 쌓임 맥락은 계층 구조를 이루며, 
쌓임 맥락의 계층 구조는 html 요소 계층 구조의 부분집합이다.</li>
<li>자신의 쌓임 맥락을 만들지 않을 경우, 부모/조상의 쌓임 맥락에 의해 동화된다. </li>
</ul>
<p>tmi지만 나는 쌓임 맥락을 캔버스라고 생각한다.
각 요소들이 물감을 칠할 수 있는 바탕? 배경? 같은..
뭔가 &#39;맥락&#39;이라고 하니 어렵게 다가와서
이렇게 생각하니까 훨씬 이해가 잘 되었다.
<del>물론 쌓임 맥락의 구조가 더 복잡하고 어렵다</del></p>
<hr>
<h3 id="z-index가-없는-경우의-쌓임">z-index가 없는 경우의 쌓임</h3>
<p>모든 요소들에 z-index가 지정되지 않았을 경우,
쌓임 맥락이 생성되지 않았을 경우
요소들은 다음 순서로 쌓인다. (아래에서 위로)</p>
<p><strong>1. 루트 요소의 배경과 테두리</strong></p>
<ul>
<li>루트 요소(일반적으로 <code>&lt;html&gt;</code>요소)의 배경과 테두리는
쌓임 맥락에서 가장 낮은 레이어로 간주한다.</li>
</ul>
<p><strong>2. 위치가 지정되지 않은 하위 요소</strong></p>
<ul>
<li>position 속성이 <code>static</code>으로 설정된 요소</li>
<li>root 요소 이후, 위치가 지정되지않은 요소들은 html에 나타나는 순서대로 쌓인다.</li>
<li>마지막에 나타난 것이 가장 위에 쌓인다.</li>
</ul>
<p><strong>3. 위치가 지정된 하위 요소</strong></p>
<ul>
<li>position 속성이 <code>static</code>이 아닌 값으로 설정된 요소</li>
<li>나타난 순서대로 위치가 지정되지 않은 요소 위에 쌓인다.</li>
</ul>
<p>(웹사이트에 렌더링되는 순서)</p>
<hr>
<h3 id="z-index가-있는-경우의-쌓임-맥락">z-index가 있는 경우의 쌓임 &quot;맥락&quot;</h3>
<p><code>z-index</code> 속성을 사용하면 위에서의 쌓임을 무시하고,
html 문서 상에서 먼저 나온 요소를 나중에 나온 요소보다 앞으로 나오게 할 수 있다.</p>
<p>브라우저는 <code>z-index</code> 속성값이 낮은 요소를 먼저 나타내고,
<code>z-index</code> 속성값이 높은 요소를 그 다음에 나타내기 때문에
만약 요소가 겹쳐있을 경우 <code>z-index</code> 속성값이 큰 요소가 속성값이 작은 요소의 일부를 가리거나 전체를 덮을 수 있다.</p>
<p><code>z-index</code>가 있는 경우의 쌓임 맥락은 예시를 통해 이해하는 것이 훨씬 빠르고 직관적이므로, 예시를 통해 알아보겠다.</p>
<pre><code>/* html, z-index 설명에 필요하지 않은 마크업은 제외함 */
&lt;div id=&quot;div1&quot;&gt;
  DIV #1
  position: relative;
  &lt;div id=&quot;div2&quot;&gt;
    DIV #2
    position: absolute;
    z-index: 2;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div id=&quot;div3&quot;&gt;
  DIV #3
  position: relative;
  z-index: 1;
  &lt;div id=&quot;div4&quot;&gt;
    DIV #4
    position: absolute;
    z-index: 10;
  &lt;/div&gt;
&lt;/div&gt;</code></pre><pre><code class="language-css">/* css, z-index 설명에 필요하지 않은 속성은 제외함 */
#div2 {
  z-index: 2;
}
#div3 {
  z-index: 1;
}
#div4 {
  z-index: 10;
}

#div1,
#div3 {
  position: relative;
}

#div2 {
  opacity: 0.8;
  position: absolute;
}

#div4 {
  opacity: 0.8;
  position: absolute;
}</code></pre>
<p>이 코드를 돌려보면 아래와 같은 결과값이 나온다.
<img src="https://velog.velcdn.com/images/930_10/post/7ac47469-515e-4979-95d6-d3d326e93f9e/image.png" alt="ㅇㄻ"></p>
<p>여기서 의문인 점을 미리 정리해보자면</p>
<ol>
<li><code>div1</code>도 쌓임 맥락을 생성하는가?</li>
<li><code>div4</code>의 <code>z-index</code>값이 <code>div2</code>보다 더 큰데 왜 <code>div2</code>보다 밑에 가려졌는가?
로 추려질 것 같은데, 하나하나 설명을 해볼 것이다.</li>
</ol>
<p>먼저, <code>div1</code>은 쌓임 맥락을 생성하지 않는다.
<strong><code>position</code>은 <code>relative</code>이지만, <code>z-index</code> 값이 <code>auto</code>이기 때문이다.</strong>
따라서, <code>div2</code>는 <code>div3</code>과 같은 루트 요소의 쌓임 맥락에 속한다.
여기서 <code>div2</code>의 <code>z-index</code> 값이 <code>div3</code>보다 높기 때문에 <code>div2</code>가 <code>div3</code> 위로 쌓인다.</p>
<p>문제는, <code>div4</code>의 <code>z-index</code> 값이 <code>div2</code>보다 높은데 왜 <code>div4</code>가 <code>div2</code> 밑에 있는가? 이것이다.
그 이유는 애초에 <strong>쌓임 맥락 속 자식 요소의 z-index 값은 부모에게만 의미가 있기 때문이다.</strong>
그래서 <code>div4</code>의 <code>z-index: 10;</code> 또한, 부모인 <code>div3</code>에게만 의미가 있다.
만약 <code>div4</code>에 <code>z-index</code>를 <code>9999</code>로 주어도, 여전히 <code>div2</code>보다 밑에 있다.</p>
<p><code>div3</code>은 <code>div2</code>보다 더 낮은 <code>z-index</code>값을 가지고 있기 때문에
<code>div2</code> 밑에 쌓이게 된 것이고,
<code>div4</code>는 <code>div3</code>의 자식 요소이기 때문에, <code>div4</code>의 <code>z-index</code>값은 <code>div2</code>와는 아무런 연관이 없다.</p>
<p>이해가 좀 되었는가요..</p>
<hr>
<span style="color:#d3d3d3">
참조</span>

<p><a href="https://developer.mozilla.org/ko/docs/Web/CSS/z-index">mdn z-index</a>
<a href="https://developer.mozilla.org/ko/docs/Web/CSS/CSS_positioned_layout/Understanding_z-index">mdn z-index 이해하기</a>
<a href="https://developer.mozilla.org/ko/docs/Web/CSS/CSS_positioned_layout/Understanding_z-index/Stacking_context">mdn 쌓임 맥락</a>
<a href="https://developer.mozilla.org/ko/docs/Web/CSS/CSS_positioned_layout/Understanding_z-index/Stacking_without_z-index">mdn z-index가 없는 경우의 쌓임</a>
<a href="https://developer.mozilla.org/ko/docs/Web/CSS/CSS_positioned_layout/Understanding_z-index/Stacking_context_example_2">mdn 쌓임 맥락 예제</a></p>
<hr>
<p>오늘은 z-index와 쌓임 맥락에 대해 알아보았다.
2차원 공간에서 요소들을 배치하다가 3차원 공간을 생각하다보니 머리가 깨질거 같았지만..
나름 이정도면 이해를 잘... 잘...(한거 맞겠지?) ㅠㅠ....말잇못
안녕</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[CSS Position 속성 (1)]]></title>
            <link>https://velog.io/@930_10/CSS-Position-%EC%86%8D%EC%84%B1-1</link>
            <guid>https://velog.io/@930_10/CSS-Position-%EC%86%8D%EC%84%B1-1</guid>
            <pubDate>Tue, 19 Dec 2023 14:51:16 GMT</pubDate>
            <description><![CDATA[<p><strong>들어가기에 앞서</strong>
이 글은 CSS의 Position 속성,
특히 지정값 중 relative와 absolute에 대해 다루고 있습니다.</p>
<hr>
<p>먼저, 요소를 이동시키는 방법에는</p>
<ol>
<li>네거티브 마진</li>
<li>tranform: translateX(또는 Y) 값 부여하기가 있다.
(이 외에도 있겠지만..)
오늘은 이 두 가지 속성 말고도,
요소를 이동시키는 속성인 <code>position</code>에 대해 알아보았다.</li>
</ol>
<p>(* 1. 네거티브 마진과 transform의 차이점
: 네거티브 마진은 뒷 요소를 함께 끌고 이동하지만,
transform은 속성이 적용된 요소만 이동한다.</p>
<p>* 2. translateX(또는 Y)에 퍼센트 값을 준다면 자기 너비의 퍼센트를 기준으로 요소가 이동된다.)</p>
<hr>
<h2 id="position이란">Position이란?</h2>
<blockquote>
<p>문서 상에서 요소를 배치하는 방법을 지정하는 CSS 속성
initial value: <code>static</code>, inheritance: no</p>
</blockquote>
<p>지정값: <code>relative</code>, <code>absolute</code>, <code>fixed</code>, <code>sticky</code>
 이 글에서는 <code>static</code>, <code>relative</code>, <code>absolute</code>에 대해 다뤄보겠다.</p>
<h3 id="1-position-static">1. position: <code>static</code></h3>
<ul>
<li>position 속성의 기본값이며, 요소들이 html에 작성된 순서 그대로 브라우저 화면에 표시가 된다.</li>
<li>요소들이 배치될 때, 보통 좌-&gt;우(우횡서 방식일 경우 우-&gt;좌), 상-&gt;하 순으로 배치된다.</li>
<li><code>top</code>, <code>left</code>, <code>bottom</code>, <code>right</code> 속성값은 요소의 position이 <code>static</code>일 때엔 무시된다.</li>
</ul>
<br>

<h3 id="2-position-relative">2. position: <code>relative</code></h3>
<blockquote>
<p>자기 자신을 기준으로 <code>top</code>, <code>right</code>, <code>bottom</code>, <code>left</code>의 값에 따라 오프셋 거리만큼 이동한다.<br> 현재 위치에서 <strong>상대적</strong>으로 이동하겠다는 개념</p>
</blockquote>
<ul>
<li><p>마진까지 포함해서 자기 공간은 그대로 두고, 시각적으로만 이동한다.</p>
</li>
<li><p>따라서 절대적인 위치 좌표를 표시하는 것이 아니다.</p>
</li>
<li><p><code>relative</code> 사용 예제</p>
<pre><code class="language-css">  .div {
          position: relative;
          left: 10px;
          top: 10px;
  }
</code></pre>
<p> 위 예시는 현위치(파란 화살표가 시작하는 지점)에서 left로 10px, top으로 10px 이동한다는 뜻이다.
 결과:
 <img src="https://velog.velcdn.com/images/930_10/post/de3a1936-0fb5-49fd-aed6-357f70bce793/image.png" alt="ㅇㄹㄴㅁㄹ"></p>
</li>
</ul>
<br>

<h3 id="3-position-absolute">3. position: <code>absolute</code></h3>
<blockquote>
<p>position: static 속성을 가지고 있지 않은 조상을 기준으로 움직인다.
그렇지 않다면, 뷰포트를 기준점으로 시작한다.</p>
</blockquote>
<ul>
<li><code>absolute</code>가 부여된 요소는 공간을 차지하지 않는다.</li>
<li>절대적인 위치는 <code>top</code>, <code>right</code>, <code>bottom</code>, <code>left</code>로 조정한다.</li>
<li><code>position: absolute</code>가 부여된 요소의 최초 컨테이닝 블럭= <strong>뷰포트</strong></li>
<li>부모 또는 조상 요소에 <code>position: static</code>이 아닌 값이 적용되어 있다면,
컨테이닝 블럭은 부모 또는 조상 요소가 된다.<ul>
<li>따라서 absolute가 부여된 요소는 컨테이닝 블럭을 기준으로 이동한다.</li>
<li>만약 부모와 조상 둘 다 position: static이 아니라면, 컨테이닝 블럭은 부모 요소가 된다.
<del>(자식 이기는 부모 없다고.. 부모 이기는 조상도 없는듯.. 못이기긴해)</del></li>
</ul>
</li>
<li>마진이나 패딩값을 주어도 그 박스까지 함께 이동한다.</li>
<li><code>absolute</code>가 부여된 요소는 공간을 차지하지 않는다.</li>
<li>절대적인 위치로 이동해야하기 때문에 요소의 콘텐츠 만큼만 크기를 가진다.
(-&gt; 인라인 요소처럼 보이게 되는 이유)</li>
<li><code>absolute</code> 사용 예제<pre><code>/* html */
&lt;div class=&quot;grand-parents&quot;&gt;
    &lt;div class=&quot;parents&quot;
    &lt;img class=&quot;children&quot; src=&quot;img.png&quot;&gt;
  &lt;/div&gt;
&lt;/div&gt;</code></pre><pre><code class="language-css">.grand-parents {
    position: relative;
}
.children {
    position: absolute;
    left: 10px;
    top: 10px;
}</code></pre>
위 예시는 컨테이닝 블럭인 <code>.grand-parents</code>를 기준으로 왼쪽 10px, 위쪽 10px의 위치로 이동된다.
(<code>.grand-parents</code>가 컨테이닝 블럭이 된 이유: position: static이 아니므로)
결과:
<img src="https://velog.velcdn.com/images/930_10/post/b4e11236-571b-4feb-bfcb-4a5af0aeb3cf/image.png" alt="dssd"></li>
</ul>
<br>

<hr>
<p>position 속성이 요소를 이동시키는 것이라면, 가운데 정렬도 가능할까?
대답은 Yes다.</p>
<p>실험대상이 될 코드 ↓</p>
<pre><code>  /* html */
  &lt;div class=&quot;grand-parents&quot;&gt;
      &lt;div class=&quot;parents&quot;
      &lt;img class=&quot;children&quot; src=&quot;img.png&quot;&gt;
    &lt;/div&gt;
  &lt;/div&gt;</code></pre><pre><code class="language-css">  .grand-parents {
      position: static;
      background-color: #bbb;
      width: 800px;
      margin: 0 auto;
      padding: 1px;
  }
  .children {
      width: 100px;
      height: 100px;
  }</code></pre>
<p>  위 코드의 결과 ↓
  <img src="https://velog.velcdn.com/images/930_10/post/f0db5951-1afc-4f33-8948-2ca90352bc0b/image.png" alt="ㄹㄹ"></p>
<hr>
<h4 id="absolute로-가운데-정렬하기-①-with-transform">absolute로 가운데 정렬하기 ① (with transform)</h4>
<p>이번 실험에선, 저 img 이미지를 할아부지의 정중앙으로 이동시킬 것이다.
그러기 위해 위 CSS 코드를 살짝 수정시켜 보았다.</p>
<pre><code class="language-css">  .grand-parents {
      position: static;
      background-color: #bbb;
      width: 800px;
      margin: 0 auto;
      padding: 1px;
      position: relative;
  }
  .children {
      width: 100px;
      height: 100px;
      /*추가*/
      position: absolute;
      left: 50%;
      top: 50%;
  }</code></pre>
<p>  (이렇게 수정한 이유: left와 top의 50%만큼 가면 가운데로 갈 수 있으니까라고 생각해서)
  수정한 코드의 결과는? ↓
  <img src="https://velog.velcdn.com/images/930_10/post/26499102-f52d-48e5-a43a-0dfa29d58f93/image.png" alt="ㅇ">
아뿔싸! 정중앙(노란 점)을 기준으로 좀 더 오른쪽, 밑쪽으로 치우쳐져 보인다.
<del>(치우쳐진게 맞다)</del>
이런 결과가 나온 이유는, 이미지가 자기 왼쪽 위(노란 점이 묻은 부분)를 기준점으로 이동하기 때문이다.
따라서 이 때엔 상단에 잠시 나온 translate를 이용하여 내 너비의 퍼센트만큼 다시 이동시킨다.</p>
<pre><code class="language-css">  .grand-parents {
      position: static;
      background-color: #bbb;
      width: 800px;
      margin: 0 auto;
      padding: 1px;
      position: relative;
  }
  .children {
      width: 100px;
      height: 100px;
      position: absolute;
      left: 50%;
      top: 50%;
      /*추가*/
      transform: translate(-50%,-50%);
  }</code></pre>
<p>  결과 ↓
  <img src="https://velog.velcdn.com/images/930_10/post/d35f3455-1f54-458c-b54b-8871724a8c9f/image.png" alt="ㅇㄻㄴㄹㅇ">
수직, 수평 가운데 정렬 완성!</p>
<hr>
<h4 id="absolute로-가운데-정렬하기-②">absolute로 가운데 정렬하기 ②</h4>
<p>transform 속성을 사용하지 않고도 할 수 있는 방법이 있다!
바로, <code>top</code>, <code>right</code>, <code>,bottom</code>, <code>left</code> 속성에 0을 준 후
<code>margin: auto;</code> 값을 주는 것이다.
실험대상에 코드를 추가해보았다. 결과는?</p>
<pre><code class="language-css">  .grand-parents {
      position: static;
      background-color: #bbb;
      width: 800px;
      margin: 0 auto;
      padding: 1px;
      position: relative;
  }
  .children {
      width: 100px;
      height: 100px;
      /*추가*/
      position: absolute;
      left: 0;
      right: 0;
      top: 0;
      bottom: 0;
      margin: auto;
  }</code></pre>
<p>  결과 ↓
  <img src="https://velog.velcdn.com/images/930_10/post/fdc2ee2f-042d-479c-b37a-2210afdfd67d/image.png" alt="ㅇㄹㄴㅁㅎ">
 실험 ① 보다 훨씬 간편하게 수직, 수평 가운데 정렬을 할 수 있었다.
 하지만 이 방법은 <code>top</code>, <code>right</code>, <code>,bottom</code>, <code>left</code> 속성이 <code>0</code>이어야 한다.
 또한, 이동할 요소의 너비와 높이가 설정되어 있어야 한다.</p>
<hr>
<p>만약 너비와 높이가 설정되지 않았을 때 <code>top</code>, <code>right</code>, <code>,bottom</code>, <code>left</code> 속성이 <code>0</code> 이라면..?</p>
<pre><code>  /* html */
  &lt;div class=&quot;grand-parents&quot;&gt;
      &lt;div class=&quot;parents&quot;
      &lt;div class=&quot;children&quot;&gt;멋사&lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;</code></pre><pre><code class="language-css">    .grand-parents {
        position: static;
        background-color: #bbb;
        width: 800px;
        margin: 0 auto;
        padding: 1px;
        position: relative;
    }
    .children {
        position: absolute;
        left: 0;
        right: 0;
        top: 0;
        bottom: 0;
        background-color: salmon;
    }</code></pre>
<p>일 때 어떻게 될까?
<img src="https://velog.velcdn.com/images/930_10/post/92f3d56f-c41b-42b3-86c9-ea74ad953a44/image.png" alt="ㅇㄻ">
위 사진처럼, 컨테이닝 블록을 기준으로 상하좌우로 늘어나서 마치..
할아부지를 잡아먹은 것처럼 보인다.. ㅠㅠ (flex-grow와 비슷?)
사실은 컨테이닝 블록 안에서 사용 가능한 공간을 최대치로 채워주는 느낌이다..!</p>
<hr>
<h3 id="자투리-지식">자투리 지식</h3>
<p>position의 top, right, bottom, left을 사용하려면 네 줄의 코드가 필요하다.
이를 줄여주는 단축 속성이 있는데, 바로 <code>inset</code> 이다. (IE에선 사용불가!)
나는 솔직히 단축속성은 예시로 봐야 더 이해가 잘 되어서 예시를..ㅎ 보이며 이만 글을 줄입니다.</p>
<pre><code class="language-css">left: 20px;
right: 20px;
top: 10px;
bottom: 40px;
/* 이것을 inset으로 요약한다면 */
inset: 10px 20px 40px;
---
left: 0;
right: 0;
top: 0;
bottom: 0;
/* 이것을 inset으로 요약한다면 */
inset: 0;
---
left: 20px;
right: 40px;
top: 50px;
bottom: 30px;
/* 이것을 inset으로 요약한다면 */
inset: 50px 40px 30px 20px;</code></pre>
<hr>
<p>오늘은 position의 static, relative, absolute의 성질과,
absolute일 때 요소를 가운데 정렬하는 것에 대해 배워보았습니다.</p>
<p>사실..
다른 분들이 포지션 쓰실 때 보면서
&#39;저거 뭔데 저렇게 남발하지???&#39;
&#39;진짜 편한가보다....그래서 많이 쓰는갑네&#39;
라고 생각했거든요..</p>
<p>근데 오늘 배우고 나니까
저라도 남발할 것 같다는 생각이 드네욧...ㅋㅋ
개인적으론 flex보다 더 편하게 요소를 이동시킬 수 있을거 같아서
flex와 position 둘 중 사용할 수 있는 상황이 온다면
잘 보고 position을 쓰도록 하겠습니다 ^^</p>
<p>이만 끝!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[CSS flex (1)]]></title>
            <link>https://velog.io/@930_10/CSS-flex-1</link>
            <guid>https://velog.io/@930_10/CSS-flex-1</guid>
            <pubDate>Mon, 18 Dec 2023 10:56:03 GMT</pubDate>
            <description><![CDATA[<h2 id="들어가기에-앞서">들어가기에 앞서</h2>
<p>이 글은 CSS의 Flex 속성, 특히 flex의 개념과 flex-items에 지정하는 속성에 대해 주로 다루고 있습니다.
flex-container에 지정하는 속성은 CSS flex(2) 게시글에서 더 자세히 다룰 예정입니다. 
조금만 기다려주세욤 🙄</p>
<hr>
<p>flex를 배우기 전까진 보통 세로로 배치하는 레이아웃을 이용했다.
예를 들어,
ㅁ
ㅁ
ㅁ
이렇게...
그러나 이제 이 요소들을
ㅁ ㅁ ㅁ ㅁ
이렇게 배치하고 싶은 타이밍이 왔다....
inline 요소들은 흉내라도 낼 수 있지 block 요소는..
흉내내다가 코드만 5m 정도로 길어질 수 있다.</p>
<p>하지만 이제는 그런 방법 없이 손쉽게 가로로 배치할 수 있다.
바로바로 flex에 대해 배웠기 때문 ^^
시작합니다. flex 😎</p>
<hr>
<h2 id="flex">Flex</h2>
<blockquote>
<p>display 속성 중 하나로, 박스 레이아웃을 작성할 때 유용하게 사용된다.
요소의 사이즈를 지정하지 않고도 유연하고 균형잡힌 배치가 가능하다.</p>
</blockquote>
<ul>
<li>선언 방법<ul>
<li>배치하고 싶은 대상의 직계 부모 요소에 <code>display: flex;</code>를 선언한 후,
부모 요소를 flex-container로 만들어 준다.</li>
<li>배치하고 싶은 대상이 아니라, 직계 부모에게 속성을 부여함으로써
그 자식 요소를 flex 세상에서 태어나게 해준다.. (라고 생각하면 이해가 쉽죠?)</li>
</ul>
</li>
<li>Ex. <pre><code>/* 필요하지 않은 속성은 기술하지 않았습니다. */
&lt;div class=&quot;playground&quot;&gt;
  &lt;div class=&quot;frog&quot;&gt;Frog&lt;/div&gt;
  &lt;div class=&quot;frog&quot;&gt;Frog&lt;/div&gt;
  &lt;div class=&quot;frog&quot;&gt;Frog&lt;/div&gt;
&lt;/div&gt;</code></pre>이 코드를 실행시켜보면 
<img src="https://velog.velcdn.com/images/930_10/post/a14735f6-1ccc-46f9-9c92-f2496998a84a/image.png" alt="">
위와 같이 나타난다.
잉잉.. 가로로 배치하는거 알려달라고 했잖아요 ㅡㅡ
<code>div</code>는 block요소인데 어떻게 가로로 배치하는데요ㅡㅡ
ㄴ 네 제가 보여드리겠읍니다..
flex 가보자고</li>
</ul>
<pre><code class="language-css">.playground { display: flex; }</code></pre>
<p>부모 요소인 <code>.playground</code>에 단 한줄...
<code>display: flex</code>만 추가시켜주면..
응애~ 자식들은 flex 세상에 태어나게 된다. 바로 아래처럼
<img src="https://velog.velcdn.com/images/930_10/post/9f7b7486-f2b8-4c5e-a01c-699bc26a1988/image.png" alt="flexitem">
드디어.. 가로로 배치가 가능해진 것이다..!!! 👏👏👏</p>
<p>여기서 질문할까봐.. 혹시나 말하는데
여전히 <code>div.frog</code>는 block-level 요소입니다..
(개인적으로 이게 가장 신기했삼..)</p>
<p>축하합니다.. 이제 당신은 flex의 반은 알게 되셨습니다. (시작이 반이니까요^^)
<br></p>
<ul>
<li>flex 속성을 받은 부모와 자식요소는?<ul>
<li>부모: flex-container라고 부를 수 있게 된다.</li>
<li>자식: flex-item이라고 부를 수 있게 된다.
__ 이때, flex-item은 내부 콘텐츠보다 크기가 작아질 수 없다.
내부 콘텐츠만큼의 사이즈가 강제된다.__
__ 이때, flex-item은 내부 콘텐츠보다 크기가 작아질 수 없다.
내부 콘텐츠만큼의 사이즈가 강제된다.__
__ 이때, flex-item은 내부 콘텐츠보다 크기가 작아질 수 없다.
내부 콘텐츠만큼의 사이즈가 강제된다.__
(중요하니까 여러번 반복..)<ul>
<li>위의 예시에서는 
flex-container: <code>.playground</code>
flex-item: <code>.frog</code> 이다.<br>


</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>flex를 한마디로 말하자면
<strong>flex-container는 flex의 영향을 받는 전체 공간이 되고,
설정된 속성에 따라 각각의 flex-item들이 어떤 형태로 배치되는 것</strong>
이라고 할 수 있다.
그래서 아래에 나올 속성값들도 flex-item에 선언해야 배치를 할 수 있다.
(flex-container에 적용을 해보았자 씨알도 안먹힙니다. ^^)</p>
<p>그래서 이제.. 어떻게 써야하나요?</p>
<hr>
<h3 id="1-flex-basis">1. flex-basis</h3>
<blockquote>
<p>flex-item의 초기 크기를 지정하는 속성 <strong>(원래 지 크기~!)</strong>
initial value: auto, inheritance: No</p>
</blockquote>
<ul>
<li><strong>flex-basis는 요소 크기를 강제하지 않는다</strong></li>
<li>값이 auto 일 때: 요소는 컨텐츠만큼의 영역을 가진다.</li>
<li>flex-direction 속성 값에 따라 크기를 정하는 기준이 달라진다.
(main-axis 기준으로 크기를 설정하기 때문이다.)<ul>
<li>flex-direction: row -&gt; 아이템의 너비(width)</li>
<li>flex-direction: column -&gt; 아이템의 높이(height)</li>
</ul>
</li>
</ul>
<hr>
<h3 id="2-flex-grow">2. flex-grow</h3>
<blockquote>
<p>flex-item 요소가 flex-container 요소 속에서 
차지한 영역(원래 자기 크기)을 제외한 사용가능한 공간을 비율로 분배하여 
원래 자기 크기에 추가한다.
initial value: 0, inheritance: No</p>
</blockquote>
<ul>
<li>flex-container의 남은 공간을 flex-item이 얼마만큼의 비율로 채울 수 있게 할지 결정하는 속성이다.</li>
<li>속성값은 숫자 단독으로만 사용한다.
: 비율로 분배하는 것이기 때문, 당연히 음수값은 사용하지 않는다.</li>
<li>Ex. flex-grow: 2;의 의미
: 자기 영역을 제외한 사용 가능한 공간을 2만큼 균등하게 분배하여 
원래 자기 크기(basis 값)에 그 비율만큼 추가된다.</li>
</ul>
<br>
여기서 알아가야 할 중요한 개념!!!

<hr>
<h3 id="flex-basis-0과-auto의-차이점">flex-basis: 0과 auto의 차이점</h3>
<p>이런 코드가 있다.</p>
<pre><code>&lt;div class=&quot;playground&quot;&gt;
    &lt;div class=&quot;frog&quot;&gt;Frog&lt;/div&gt;
    &lt;div class=&quot;frog&quot;&gt;Frog&lt;/div&gt;
    &lt;div class=&quot;frog&quot;&gt;Frog&lt;/div&gt;
&lt;/div&gt;</code></pre><pre><code class="language-css">/* 설명에 불필요한 속성들은 제외함 */
.playground { display: flex; }
.frog         { flex-grow: 1; }</code></pre>
<p>이 코드에서, 우리는 flex-basis 값에 따라 요소가 어떻게 변하는가에 대해 살펴볼 것이다.</p>
<p>flex-basis: auto (기본값)일 때와 0일 때,
위 코드를 실행시켜보면 아래와 같은 결과가 나온다.
<img src="https://velog.velcdn.com/images/930_10/post/c3a3c4eb-b1df-485a-9bc8-d334074b9ba5/image.png" alt="auto"></p>
<p>그런데, 만약 요소 속 콘텐츠의 크기가 커지면 어떻게 될까?</p>
<ol>
<li><p>flex-basis: auto 일 때
<img src="https://velog.velcdn.com/images/930_10/post/f1a5e90d-9a71-4646-974a-35cd5539580b/image.png" alt="autodlfEO"></p>
</li>
<li><p>flex-basis: 0 일 때
<img src="https://velog.velcdn.com/images/930_10/post/ed846cdf-6cff-4405-b73b-be392f77ea7a/image.png" alt="0dlfEo"></p>
</li>
</ol>
<p>차이가 느껴지는가?
왜 이런 결과가 나왔을까?</p>
<p>flex-basis: auto일 때엔 
flex-item의 기본 크기=자신의 콘텐츠만큼 가지게 된다.
flex-grow: 1에 따라 세 아이템 모두 같은 여백을 나눠가지지만,
원래의 자기 콘텐츠+나눠진 여백만큼을 자기가 가지므로
서로 다른 크기를 가지게 된 것이다.</p>
<p>flex-basis가 0일 때엔, 애초에 아이템의 기본 크기를 0이라고 지정한 것이므로
원래 자기 콘텐츠=0 이다.
따라서, 0+동등하게 나눠진 여백의 결과값으로
서로 동일한 너비를 가지게 되었다.</p>
<p>이렇게 보니 이해가 가시는지요..
저는 이해를 못해서 몇 번 힘들었습니다 ^^ㅎ</p>
<hr>
<h3 id="3-flex-shrink">3. flex-shrink</h3>
<blockquote>
<p>flex-grow와 반대로, flex-item의 너비를 감소시키는 비율을 설정한다.
initial value: 1, inheritance: No </p>
</blockquote>
<ul>
<li>flex-shrink: 0;: 줄어들지 않음, 수축 가능성 X</li>
<li>flex-basis로 크기를 정해두었어도 고정된게 아니기 때문에, 크기가 변할 수 있다.
이때 flex-shrink: 0을 선언하면 원하는 크기대로 고정할 수 있다.</li>
</ul>
<hr>
<h2 id="알아두면-좋을-속성">알아두면 좋을 속성</h2>
<h3 id="min-width">min-width</h3>
<blockquote>
<p>요소에 보장되는 최소 너비를 설정한다.
initial value: auto, inheritance: No</p>
</blockquote>
<ul>
<li>쉽게 말해, min-width: 100px로 설정해놨다면
<strong>&quot;니가 100px까지 줄어드는건 허용해줄게.
근데 그 미만은 안돼!!&quot;</strong> 라는 의미이다.</li>
<li>자식 요소의 이미지 크기가 커졌을 때, 부모 요소의 너비도 같이 커지는 상황에서
부모 요소에 min-width: 0; 값을 주게 되면 이 상황을 해결할 수 있다.</li>
<li>min-width 속성을 사용한다면, 부모 요소 크기는 콘텐츠의 크기보다 작아질 수 있다.</li>
<li>보다 더 효과적으로 사용하기!<ol>
<li>flex-basis를 이용하여 내가 원하는 레이아웃을 갖춘 후,
flex-shrink 속성을 이용해 줄어드는 비율을 0으로 맞춰준다.</li>
<li>최종적으로 min-width로 내가 원하는 너비를 강제해준다.</li>
</ol>
</li>
<li>flex-shrink나 flex-grow 속성은 무시하고 적용된다.</li>
<li>flex-item의 width값(flex-direction: row일 때)
: flex-basis+min-width</li>
</ul>
<hr>
<p>하.. 오랜만의 벨로그다 (일주일만인가)
요새 flex 이넘때문에 과제하느라 시간이.. 너무 후딱가고
적용할 때마다 왜이런거지? 이해하는데 시간이 오래걸려서
블로그를 쓸 새가 없었다..
(주말엔 피곤해서 그냥 쓰러짐.. 죄송 🙄)
오늘은 겨우겨우 과제 완성해서 벨로그 적었지롱 ㅋㅋ
아무튼 다시 이번주부터 힘내서 flex 2탄도 써야지...
화이팅 ㅠㅜㅠㅠㅠ
플렉스에 무너지지말자... 정복하자 이넘도</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[멋쟁이사자처럼 프론트엔드스쿨 2-2]]></title>
            <link>https://velog.io/@930_10/%EB%A9%8B%EC%9F%81%EC%9D%B4%EC%82%AC%EC%9E%90%EC%B2%98%EB%9F%BC-%ED%94%84%EB%A1%A0%ED%8A%B8%EC%97%94%EB%93%9C%EC%8A%A4%EC%BF%A8-2-2</link>
            <guid>https://velog.io/@930_10/%EB%A9%8B%EC%9F%81%EC%9D%B4%EC%82%AC%EC%9E%90%EC%B2%98%EB%9F%BC-%ED%94%84%EB%A1%A0%ED%8A%B8%EC%97%94%EB%93%9C%EC%8A%A4%EC%BF%A8-2-2</guid>
            <pubDate>Tue, 12 Dec 2023 12:44:44 GMT</pubDate>
            <description><![CDATA[<h2 id="vertical-align-속성">vertical-align 속성</h2>
<blockquote>
<p>inline 요소 또는 table-cell box에서의 수직 정렬을 지정하는 속성
inline-block을 포함한 모든 inline 요소의 수직 정렬을 위해 사용된다.
initial value: baseline, inheritance: No.</p>
</blockquote>
<p>vertical-align은 
특징</p>
<ul>
<li>block-level 요소의 수직 정렬에는 영향을 미치지 않는다.</li>
</ul>
<p>inline 요소엔 baseline이라고 하는 기준선이 존재한다.
따라서 inline 요소는 이 베이스 라인을 기준으로 배치된다.
vertical-align에 baseline 값을 줬을 때,
부모의 기준선에 맞추어 해당 요소의 기준선을 정렬해준다.</p>
<p>속성값 (initial: baseline)</p>
<ul>
<li>length: 요소의 길이만큼 올리거나 내린다. 음수값도 사용 가능
(px 값 사용 시엔 baseline을 기준으로 이동한다.)</li>
<li>% : 요소를 line-height 기준으로 이동, 음수값 사용 가능</li>
<li>top: 요소의 맨 위를 줄에서 가장 큰 요소의 맨 위 위치에 맞춘어 정렬한다.</li>
<li>middle: 요소를 부모의 중앙지점에 정렬한다.</li>
<li>bottom: 요소의 맨 아래를 줄에서 가장 낮은 요소에 맟추어 정렬한다.</li>
<li>이 외에도, sub, super, text-top, text-bottom 이 있다.</li>
</ul>
<hr>
<h2 id="자투리-지식">자투리 지식</h2>
<ol>
<li>letter-spacing 속성은 em단위로 쓰는 것이 좋다.</li>
<li>letter-spacing에 값을 크게 주게 되면 자간이 넓어 그만큼 글자가 오른쪽으로 쏠리는 현상을 볼 수 있다.
그래서 text-indent (들여쓰기 속성) 값을 똑같이 주게 되면 내가 원하는 모습을 볼 수 있다.</li>
<li>background-image vs img 태그
하다보면 이미지를 배경 이미지로 넣을지, 아니면 이미지 요소로 넣을지 고민하게 되는 순간이 있다.
저번에도 언급했었지만, 이 둘을 구분하는 기준은
<strong>내가 넣고자 하는 이미지가 비교적 단순한 데코용이냐, 아니면 정보를 담고있느냐</strong>에 따라 달라진다.
단순한 데코용이라면 background-image를 이용해 이미지를 삽입하고
의미있는, 또는 전달이 필요한 정보를 담고 있는 이미지라면 img 마크업으로 넣는 것이
접근성 차원에서 용도에 맞게 사용한다고 볼 수 있다.</li>
</ol>
<hr>
<h2 id="느낀-점">느낀 점</h2>
<p>오늘 flex 속성에 대해 배우게 되었다.
하지만 오늘 내용으로 담기엔 내가 이해를 제대로 못한 것 같아서,
더 깊게 배우고 나서 글을 포스팅할 것이다!
그래서 오늘은 내용이 역대급으로 짧다..ㅎㅎ</p>
<p>안녕.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[CSS의 Cascading 파헤치기]]></title>
            <link>https://velog.io/@930_10/CSS%EC%9D%98-Cascading-%ED%8C%8C%ED%97%A4%EC%B9%98%EA%B8%B0</link>
            <guid>https://velog.io/@930_10/CSS%EC%9D%98-Cascading-%ED%8C%8C%ED%97%A4%EC%B9%98%EA%B8%B0</guid>
            <pubDate>Tue, 12 Dec 2023 10:51:22 GMT</pubDate>
            <description><![CDATA[<p>저번 글에서 cascading의 명시도에 대해 다뤄보았는데,
cascading에 대해 더 자세히 알아보고 싶어 따로 글을 쓰게 되었다.
이런 기초 지식은 쌓아두면 언젠가 도움이 될 테니까..
CSS(Cascading Style Sheet)에서 맨 앞자리인 C를 차지하는 녀석이면
얼마나 중요할까? 하는 궁금증에서 시작했는데,
생각보다 더 체계적이며 중요한 녀석이었다.</p>
<p>시작!</p>
<h2 id="css에서-cascading에-대하여">CSS에서 Cascading에 대하여</h2>
<blockquote>
<p>cascading: <em>_ _&#39;위에서 아래로 흐르는, 상속 또는 종속하는&#39;</em> __의 의미를 갖고 있다.</p>
</blockquote>
<p>CSS(Cascading Style Sheet)에서의 Cascading은 무엇이냐...</p>
<blockquote>
<p><strong>선택자에 적용된 많은 스타일 중, 어떤 스타일로 브라우저에 표현할지 결정해주는 원리</strong></p>
</blockquote>
<p>라는 의미를 갖고 있다.</p>
<p>만약, 어떤 선택자에 속성(상속이 가능한)값 A를 적용했다고 치자.
그런데 어쩌다보니 그 선택자의 부모 요소에 속성값B를 주게 되었다.</p>
<pre><code>&lt;div style=&quot;color: blue;&quot;&gt;
    &lt;h1 style=&quot;color: black;&quot;&gt;멋사&lt;/h1&gt;
&lt;/div&gt;</code></pre><p><code>h1</code>은 <code>div</code>의 하위 요소이며, <code>div</code>에 적용된 스타일은 상속이 가능한 스타일이므로, 
하위 요소에 적용이 된다. ( -&gt; 사실 이것도 cascading 규칙임)
그러나 하위 요소인 <code>h1</code>에도 스타일이 따로 적용되어 있다.
이런 상황에서, h1은 어떤 색을 갖게 될까?
그리고 h1이 그 색을 가지게 된 원리는 무엇일까?
를 다루는 것이 바로 cascading이라는 것이다 큼큼..</p>
<p>즉, <strong>한 요소에 중복된 스타일을 주게 되었을 때,
css가 스타일을 순차적으로 적용하게 되는 규칙</strong>을 cascading이라고 한다.</p>
<p>cascading은 다음 2가지의 원칙을 통해 어떤 요소에 스타일을 적용할지 결정한다.
<strong>1. 스타일 우선순위
2. 스타일 상속</strong></p>
<p>그리고, 스타일 우선 순위는 다시 <strong>중요도, 명시도, 코드 순서</strong>의 3가지로 나뉘어진다.</p>
<p>오늘 글에서는 순차적으로 다뤄보도록 하겠다.</p>
<hr>
<h2 id="1-스타일-우선순위">1. 스타일 우선순위</h2>
<h3 id="중요도">중요도</h3>
<blockquote>
<p>CSS가 어디에 선언되어 있는가?
<strong>스타일이 선언된 위치</strong>에 따라 우선순위를 매기는 것</p>
</blockquote>
<p>스타일 시트는 <strong>제작자(author), 사용자(user), 사용자 도구(user agent, 대표적으로 브라우저)가 작성한 세 종류</strong>로 나뉜다.
이 중 가장 중요도가 높은 것은 작성자의 CSS 파일이며, 각 스타일 시트의 우선순위는 아래와 같다.</p>
<blockquote>
<p><strong>사용자 스타일 시트 &gt; 제작자 스타일 시트 &gt; 사용자 도구 스타일 시트</strong></p>
</blockquote>
<ul>
<li><strong>사용자 스타일 시트</strong><ul>
<li>특별한 조건이 필요한 최종 사용자가 그들의 필요에 맞게 구성해둔 스타일 시트</li>
<li>Ex. 저시력자라면 윈도우의 &#39;고대비&#39; 설정을 지정 </li>
<li><blockquote>
<p>그 설정의 스타일이 시스템에 저장된다.
이 때의 스타일을 사용자 스타일 시트라고 한다.</p>
</blockquote>
</li>
<li>사용자가 시스템에 저장한 스타일이기 때문에, 
웹페이지 제작자가 스타일을 제어할 수 없다.</li>
</ul>
</li>
<li><strong>제작자 스타일 시트</strong><ul>
<li>웹 문서를 개발한 사람이 설정한 스타일,
CSS 파일이나 HTML 내의 스타일로 선언된 것들을 말한다.</li>
<li>제작자 스타일 시트 내에서의 우선순위<ol>
<li><code>&lt;head&gt;</code>의 <code>&lt;style&gt;</code></li>
<li><code>&lt;head&gt;</code>의 <code>&lt;style&gt;</code> 내의 <code>@import</code> 
(다른 스타일 시트에서 스타일 규칙을 가져올 때 사용한다.)</li>
<li><code>&lt;link&gt;</code>로 연결된 CSS 파일</li>
<li><code>&lt;link&gt;</code>로 연결된 CSS 파일 내의 <code>@import</code></li>
</ol>
</li>
<li><code>!important</code> 스타일 시트<ul>
<li><code>!important</code> 가 적용된 스타일 시트의 중요도<ol>
<li>!important 사용자 스타일 시트</li>
<li>!important 제작자 스타일 시트 속 !important 스타일</li>
<li>사용자 스타일 시트</li>
<li>제작자 스타일 시트</li>
<li>사용자 도구 스타일 시트</li>
</ol>
</li>
<li><code>!important</code>는 저번 시간에 배웠는데, 찾아보니 명시도보단 중요도에 더 가까운 것 같아 다시 수정하게 되었다.<ul>
<li>제작자가 스타일 시트에 스타일을 만들 때 속성값 뒤에 <code>!important</code> 라고 써 둔 것을 말한다.</li>
<li><code>!important</code>를 붙이게 되면 다른 일반 스타일보다 최우선해서 적용된다.</li>
<li><code>!important</code>는 명시도에 직접적인 영향을 끼친다.</li>
<li>남용하면 안됨! -&gt; cascading이 복잡해져 디버깅이 어렵다..ㅠㅠ</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li><strong>사용자 도구 스타일 시트 (브라우저의 User Agent 스타일 시트)</strong> <ul>
<li>브라우저들마다 기본적으로 지정하고 있는 스타일 시트</li>
</ul>
</li>
</ul>
<hr>
<h3 id="셀렉터-명시도-selector-specificity">셀렉터 명시도 (Selector Specificity)</h3>
<p><del>하...
솔직히 제일 화나는건, 저 specificity의 해석 때문이었다.
어디선 명시도라하고 어디선 적용범위라고 하고.,...으아악!!
아무튼 진정하고, 다시 정리하겠다.</del>
뭔가 적용 범위라고 하는 것이 더 이해에 쉬울 것 같아, 
명시도라는 단어 대신 적용 범위라고 하겠습니다. (어려운 한자보단 눈에 익숙한게 좋으니까)
<br>
중요도가 같을 경우, 스타일은 셀렉터가 얼마나 구체적으로 적용 범위를 지정하는 가?의 영향을 받게 된다. 
(단계적인거 확 느껴지쥬? 이것이 바로 cascading)
그래서 적용 범위가 우선순위에 어떤 영향을 준다는 것인가?</p>
<blockquote>
<p><strong>스타일 적용 범위가 좁을수록</strong> 우선순위가 높다.</p>
</blockquote>
<p>즉, 셀렉터가 가리키는 것이 명확할수록 우선순위를 높게 준다는 것이다.
모호하게 여러 요소를 가리키는 셀렉터보다는, <strong>적은 범위를 명확하게 가리키는</strong> 셀렉터 스타일의 우선 순위가 더 높다.</p>
<p>우선순위가 높은 범위는 아래와 같다.</p>
<ol>
<li><strong>인라인 스타일</strong></li>
</ol>
<ul>
<li>html 마크업에서 inline으로 바로 css를 넣어주는 것</li>
<li>즉, 태그 안쪽에 style 속성을 사용해 적용한 스타일</li>
<li>하나의 태그 내에서만 적용되기 때문에 높은 우선 순위를 갖는다.</li>
<li>Ex. <code>&lt;h1 style=&quot;color: blue;&quot;&gt; content &lt;/h1&gt;</code></li>
</ul>
<ol start="2">
<li><p><strong>id 선택자</strong></p>
<ul>
<li><code>id</code>는 문서 내에서 한 번만 사용할 수 있으므로 비교적 좁은 범위를 가지게 된다.</li>
<li>Ex. <code>#h1 {property: value;}</code></li>
</ul>
</li>
<li><p><strong>class 선택자, 속성 기반 선택자, 가상 클래스</strong></p>
<ul>
<li>여러 번 쓰일 수 있기 때문에 <code>id</code>보다는 넓은 범위를 갖는다.</li>
<li>Ex. <ul>
<li><code>.class {property: value;}</code></li>
<li><code>a[href=&quot;https://veamcamp.com&quot;]</code></li>
<li><code>:hover {property: value;}</code></li>
</ul>
</li>
</ul>
</li>
</ol>
<ol start="4">
<li><strong>태그 선택자, 가상 요소</strong><ul>
<li>문서 내 모든 태그를 가리키기 때문에, 범위가 제일 넓다.</li>
<li>Ex. </li>
<li><code>h1 {property: value;</code></li>
<li><code>::before</code></li>
</ul>
</li>
</ol>
<p>* 
그리고, 결합자는 적용 범위에 영향을 끼치지 않는다.
왜인지는... 모르겠다.
규칙이니까 그냥 이해하는 수 밖엔..</p>
<p>그리고 명시도를 점수화(specificity calculator 라고 한다.)
하여 보여주는 사이트가 있는데, 
한 번 참고해보시길!
<a href="https://specificity.keegan.st/">https://specificity.keegan.st/</a></p>
<hr>
<h3 id="코드-순서">코드 순서</h3>
<p>중요도를 거르고.. 적용 범위까지 걸렀는데.. 어라라 그래도 남은 넘들이 있네...?
중요도와 적용 범위 둘 다 같은 아이들.. 이 넘들은 우짭니까?! 를 결정하는 것.. 
바로 ,<strong>코드 순서</strong>이다.</p>
<blockquote>
<p>코드에서 <strong>가장 마지막에 등장한 속성을 최우선으로 적용</strong>한다.
이때, 나중에 작성한 스타일이 앞서 작성된 스타일을 &#39;덮어쓰기&#39; 한 형태로 적용된다.</p>
</blockquote>
<p>만약,</p>
<pre><code class="language-css">h1 { color: black; }
h1 { color: blue; }</code></pre>
<p>라는 상황을 가정해보자.
이때 <code>h1</code>은 한 문서 내에 있기 때문에 중요도도 같고, 적용 범위까지 같다.</p>
<p>이런 경우에는, <strong>코드 순서</strong>에 따라서 <strong>나중에 작성한 스타일</strong>을 적용한다.
즉, <code>h1</code>은 파란색이 나오게 되는 것이다.</p>
<p>더 구체적으로 보자면, <code>h1</code>은 검은색이라는 스타일을 먼저 적용 받은 후
나중에 선언된 파란색이라는 스타일로 덮어씌워진 것이다!</p>
<hr>
<h2 id="2-스타일-상속">2. 스타일 상속</h2>
<blockquote>
<p>태그들이 어떻게 포함되었는가?에 따라 스타일을 적용할지 결정하는 원칙</p>
</blockquote>
<p>태그의 포함 관계에 따라 요소들은 
부모와 자식, 혹은 조상과 자손 요소로 구분할 수 있다.</p>
<p>CSS에서 별도로 스타일을 지정하지 않으면,
<strong>부모 요소에 있는 스타일 속성이 자식, 자손 요소로 자동 전달된다.</strong>
상속 가능한 속성만 상속되는 것이며, 모든 속성이 상속된다는 말이 아니다!!</p>
<p>만약 다음과 같은 코드가 있다고 치자.</p>
<pre><code>&lt;div&gt;
        &lt;h1&gt;안녕&lt;hi&gt;
&lt;/div&gt;</code></pre><p><code>h1</code>은 <code>div</code>와 부모와 자식 관계이다.
이때, 상속이 가능한 color 속성으로 <code>div</code>에 <code>color: red;</code> 스타일을 주게 되면
<code>h1</code> 요소는 <code>div</code>에게 color 값을 상속받아 red 값이 적용된다.</p>
<p>이것이 스타일 상속이다.</p>
<hr>
<p>하...
드디어 cascading을 정복한 것 같다.
이렇게 한 주제에 대해 정리는 처음 해보는 것 같은데,
재미있다..</p>
<p>평소 쓰던 TIL은 살짝 여러 주제에 대해 찍먹하는 느낌이었는데,
이번엔 cascading에 대해 아주아주 심도있게 다룰 수 있어서 좋았다.</p>
<p>끝!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[멋쟁이사자처럼 프론트엔드스쿨 2-1]]></title>
            <link>https://velog.io/@930_10/%EB%A9%8B%EC%9F%81%EC%9D%B4%EC%82%AC%EC%9E%90%EC%B2%98%EB%9F%BC-%ED%94%84%EB%A1%A0%ED%8A%B8%EC%97%94%EB%93%9C%EC%8A%A4%EC%BF%A8-2-1</link>
            <guid>https://velog.io/@930_10/%EB%A9%8B%EC%9F%81%EC%9D%B4%EC%82%AC%EC%9E%90%EC%B2%98%EB%9F%BC-%ED%94%84%EB%A1%A0%ED%8A%B8%EC%97%94%EB%93%9C%EC%8A%A4%EC%BF%A8-2-1</guid>
            <pubDate>Mon, 11 Dec 2023 09:58:54 GMT</pubDate>
            <description><![CDATA[<h2 id="css-cascading-stylesheet">CSS (cascading stylesheet)</h2>
<blockquote>
<p><strong>웹페이지를 꾸미려고 작성하는 코드</strong>
html과 같은 실제 프로그래밍 언어도 아니고, 마크업 언어도 아닌
stylesheet 언어이다.</p>
</blockquote>
<p>css는 html 문서에 있는 요소들에 선택적으로 스타일을 적용할 수 있다.
그렇다면.. css는 어떤 기준으로 어떤 요소들을 선택해서 어떻게 적용시키는 것일까?
오늘은 &#39;어떤 기준으로 어떤 요소들을 선택하느냐에 대한 해답&#39;인 명시도에 대해 다뤄보았다.</p>
<h3 id="셀렉터-명시도-selector-specificity">셀렉터 명시도 (Selector Specificity)</h3>
<blockquote>
<p>웹브라우저가 셀렉터의 구조를 파악하여 구체적인 정도를 기반으로 적용 우선순위를 결정한다.</p>
</blockquote>
<ol>
<li>특징</li>
</ol>
<ul>
<li>주어진 CSS 선언에 적용되는 가중치로, 일치하는 선택자 내의 각 선택자 유형의 수에 의해 결정된다.</li>
<li>여러 선언의 명시도가 같을 때: CSS에서 맨 끝에 오는 선언이 요소에 적용된다.</li>
<li>같은 요소가 여러 선언의 대상이 되는 경우에만 적용된다.(선언 내부의 property가 겹칠 때!)</li>
<li>직접 대상 요소에 선언했을 때엔, 요소가 부모로부터 상속받는 규칙보다 항상 우선한다.</li>
</ul>
<p>vs code에서는 명시도를 바로 볼 수 있다.
css에서 셀렉터 위를 호버하면 작은 창이 뜨는데, 그 창 속에
<strong>명시도 (0,0,0)</strong>가 나타난다.</p>
<ul>
<li>( 0, 0, 0 ): 차례로 금, 은, 동 순위라고 생각하면 좀 더 이해가 쉽다.<ul>
<li>Ex. (0,1,0) vs (0,0,1) 둘 중에선 전자가 더 우선된다.</li>
<li>은메달이 5천개여도 금메달 1개는 못이기듯, 선택기 특이성도 마찬가지로 생각하면 된다.</li>
<li><del>선택자 우선순위를 계산할 때 기본적으로 결합자는 영향을 끼치지 않지만,
결합자마다 다르기 때문에 사용하기 전에 확인을 하고 사용하는 것을 권장한다.</del>
결합자는 명시도 점수에 영향을 끼치지 않는다!</li>
</ul>
</li>
</ul>
<ol start="2">
<li>예시와 설명
Ex 1.
<img src="https://velog.velcdn.com/images/930_10/post/ec981af3-9e1b-4160-93f0-c9e5623e81ec/image.png" alt="sp1">
<img src="https://velog.velcdn.com/images/930_10/post/2eb2ed60-c52b-4690-b097-ecde9c626b15/image.png" alt="sp1-1">
위 상황에서는 <code>.red</code> 선택자에 <code>color</code>와 <code>border-color</code>가 적용되지 않는다. 왤까?</li>
</ol>
<ul>
<li>강도가 높은 셀렉터를 많이 사용할수록 명시도가 높아져 적용 우선순위가 높기 때문이다.</li>
<li>해결 방법: <code>.red</code>를 <code>.colors .red</code>나 <code>.colors.item.red</code>로 바꿔주면 적용되는 모습을 볼 수 있다.</li>
</ul>
<p>Ex.2
<img src="https://velog.velcdn.com/images/930_10/post/61b1b980-c218-436e-856c-2799ea30c614/image.png" alt="sp2"></p>
<pre><code>/*아래는 위 css의 적용대상이 되는 html 마크업이다 */
&lt;h1 class=wow wow2&gt;contents&lt;/h1&gt;</code></pre><p>위 상황에서는 <code>.wow:hover</code>가 나타나지 않는다. 왜일까?</p>
<ul>
<li>명시도가 같을 때엔 CSS에서 맨 끝에 오는 선언이 요소에 적용되기 때문이다.</li>
<li>가상클래스도 class이기 때문에 <code>:hover</code> 또한 클래스 취급해서 명시도가 같다는 것이다.</li>
<li>해결 방법: <code>.wow:hover</code> 셀렉터를 끝으로 내려서 <code>.wow:hover</code>가 맨 끝에 오는 선언으로 만들면 된다.</li>
</ul>
<ol start="3">
<li>우선순위에 대하여</li>
</ol>
<ul>
<li>1순위: <code>!important</code><ul>
<li>Ex. <code>h1 { color: blue !important; }</code></li>
<li><code>!important</code> 끼리 있다면: 그 중 명시도가 더 높은 것이 우선된다.</li>
</ul>
</li>
<li>2순위 : html 마크업에서 inline으로 바로 css를 넣어주는 것(인라인 스타일)<ul>
<li>Ex. <code>&lt;h1 style=&quot;color: blue;&quot;&gt; content &lt;/h1&gt;</code></li>
</ul>
</li>
<li>3순위: id 선택자<ul>
<li>Ex. <code>#h1 {property: value;}</code></li>
</ul>
</li>
<li>4순위: class 선택자, 속성 기반 선택자, 가상 클래스, 가상 요소 등<ul>
<li>Ex. <ul>
<li><code>.class {property: value;}</code></li>
<li><code>a[href=&quot;https://veamcamp.com&quot;]</code></li>
<li><code>:hover {property: value;}</code></li>
<li><code>::before</code></li>
</ul>
</li>
</ul>
</li>
<li>5순위: 태그 선택자<ul>
<li>Ex. <code>h1 {property: value;</code></li>
</ul>
</li>
<li>꼴찌: 전체 선택자 <code>*</code><br>  
\* 멘토님께서 명시도를 그림으로 나타낸 사이트를 알려주셨다.
덕분에 더 쉽게 이해가 되었다. 
아래에 첨부합니다.
https://specifishity.com/

</li>
</ul>
<hr>
<h2 id="line-height-속성">line-height 속성</h2>
<blockquote>
<p>글 사이의 간격(행간)을 조정하는 속성
initial value: normal, inheritance: yes</p>
</blockquote>
<ul>
<li><code>line-height: normal</code>일 때: 한 줄의 높이가 폰트 종류에 종속적이다.
그러나 값을 정해주고 나면, 줄 높이가 고정되어 폰트 종류가 바뀌어도 줄 높이는 바뀌지 않는다.</li>
<li>Half Leading Area를 통해 줄 높이가 조정된다.
<img src="https://velog.velcdn.com/images/930_10/post/e4ccd922-77a8-4e4d-a051-5746ce2bc665/image.png" alt="line"><ul>
<li>그러니까, 폰트 크기+half leading 영역= line-height</li>
</ul>
</li>
<li>line-height는 텍스트 한 줄마다 적용되는 것이기 때문에, 만약 두 줄의 텍스트에 적용한다면 참사가..</li>
<li><code>line-height: 1;</code>: 폰트 사이즈와 줄 높이가 같아진다.</li>
</ul>
<hr>
<h2 id="자투리-지식">자투리 지식</h2>
<ol>
<li><code>img</code>에는 되도록 <code>class</code> 선언을 권장: 워낙 <code>img</code>를 쓸 일이 많음</li>
<li><code>:has</code> 가상클래스<ul>
<li>Ex. <code>div:has(:hover) {property: value;}</code>의 의미
: <code>div</code>에 <code>hover</code> 했을 때 property가 적용된다.</li>
<li>그러나 IE에서는 사용 불가</li>
<li>좀 더 빨리 알았다면 더 완성도 높은 과제를 제출했을 것 같은데.. 잉잉</li>
</ul>
</li>
<li><code>::before</code></li>
</ol>
<ul>
<li>css 차원에서 마크업을 추가할 수 있는 가상 요소</li>
<li>html에서 마크업을 또 하게 된다면 문서가 지저분해지니까..(?)
사용하는 것이 가독성 면에서는 더 좋을 것 같다.</li>
</ul>
<ol start="4">
<li><code>overflow: hidden</code></li>
</ol>
<ul>
<li>과제할 때  <code>border-radius</code> 값을 <code>header</code>랑 <code>footer</code>에 각각 준 사람 바로 저에요^^</li>
<li>부모 요소에 <code>overflow: hidden;</code> 을 주게 되면 자식 요소가 부모 요소 밖으로 넘쳐 흐른 것을 숨겨준다.</li>
</ul>
<ol start="5">
<li><code>&lt;nav&gt;</code></li>
</ol>
<ul>
<li>웹 사이트의 메뉴 구성은 주로 <code>&lt;ul&gt;</code>, <code>&lt;li&gt;</code>를 사용했었으나,
이것만으로는 해당 요소가 웹사이트의 네비게이션이라는 뜻으론 충분하지 않다!</li>
<li>따라서 사용하게 된 태그가 최근에 추가된 <code>&lt;nav&gt;</code>이다.</li>
<li>이는 해당 요소가 웹사이트의 네비게이션이라는 의미를 더 명확하게 한다.</li>
</ul>
<ol start="6">
<li><code>background-image</code> 고정하기</li>
</ol>
<ul>
<li><code>background-attachment: fixed;</code>하면 고정된다.</li>
<li>지난 과제에서 적용하지 못했는데 오늘 알게 되어서 햄복했듬 ^^ 
(대충 아저씨가 속이 파랗게 풀리는 짤)</li>
</ul>
<hr>
<h2 id="느낀점">느낀점</h2>
<p>오늘 처음 CSS가 어떤 단어의 약자인지 알게 되었다 ㄷㄷㄷㄷ
아니... 진짜.... 왜 이때까지 찾아볼 생각을 안했지?ㅋㅋㅋㅋ
가끔 마우스를 잘못 뒀을 때 선택기 특이성 창이 코드를 가릴 때가 있어서 에잉 성가셔! 했었는데
왜 적용이 안되나 볼 때... 아주 유용하겠다고 생각하자마자 써먹게 되었다 ㅎㅎ
오늘 과제에서 코드에 문제가 없는데! 적용이 안되어서 이상하다 생각하고
혹시몰라 확인해봤더니 정말 명시도가 같아서.. 순서에 따라 아래에 적은 값이 적용이 되어서
내가 원했던 윗 값은 적용이 되지 않은 것이었다 ㄷㄷㄷㄷ
오늘 안배웠으면 진짜 평생 모를뻔........</p>
<p>그리고 <code>overflow: hidden</code> 이 자식!!!!!
배경 이미지 고정하는 속성도!!!!
드디어 알게되어 너무너무너무너무너무너무 행복한 하루였다.</p>
<p>오늘 적은 것 외에도 짤막짤막하게 많은 것들이 나왔었는데,
뭔가 길게 설명을 안해주신 것을 보아하니
아... 지금 내 수준에서는 그렇게 깊게 안파도 되는 아이구나...(나의 이해도가 딸리니까)하는 생각에
정말 깊게 파지 않았다.
이러면 안되는데...........................
사실 오늘 정리한 것도 머리에 넣기 힘들었기 때문에..
정말 필요한 날에......다시 공부를.......
이러면 안되지만.......................
어쨌든</p>
<p>끝~! (발랄)</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[멋쟁이사자처럼 프론트엔드스쿨 1-5 ]]></title>
            <link>https://velog.io/@930_10/%EB%A9%8B%EC%9F%81%EC%9D%B4%EC%82%AC%EC%9E%90%EC%B2%98%EB%9F%BC-%ED%94%84%EB%A1%A0%ED%8A%B8%EC%97%94%EB%93%9C%EC%8A%A4%EC%BF%A8-1-5-TBD</link>
            <guid>https://velog.io/@930_10/%EB%A9%8B%EC%9F%81%EC%9D%B4%EC%82%AC%EC%9E%90%EC%B2%98%EB%9F%BC-%ED%94%84%EB%A1%A0%ED%8A%B8%EC%97%94%EB%93%9C%EC%8A%A4%EC%BF%A8-1-5-TBD</guid>
            <pubDate>Fri, 08 Dec 2023 15:52:19 GMT</pubDate>
            <description><![CDATA[<h2 id="section과-div-태그-사용에-관하여"><code>&lt;section&gt;</code>과 <code>&lt;div&gt;</code> 태그 사용에 관하여</h2>
<h3 id="1-div-태그">1. div 태그</h3>
<blockquote>
<ul>
<li>html에서 <code>div</code>요소는 플로우 콘텐츠를 위한 통용 컨테이너</li>
<li>CSS로 꾸미기 전에는 콘텐츠나 레이아웃에 영향을 주지 않는다.</li>
<li>보통 다른 요소 여럿을 묶어 <code>clss</code>나 <code>id</code> 속성으로 꾸미기 쉽도록 돕는다</li>
<li><code>&lt;div&gt;contents&lt;/div&gt;</code></li>
</ul>
</blockquote>
<ul>
<li>특징<ul>
<li>CSS로 꾸미기 전엔 콘텐츠나 레이아웃에 아무 영향을 주지 않는다.</li>
<li>의미가 없는 <strong>순수</strong> 컨테이너로서, 아무 것도 표현하지 않는다.</li>
<li>문서의 특정 구역이 다른 언어임을 표시하는 용도로 사용한다.</li>
<li>시각적인 영역을 나누는 것에 사용한다.<br></li>
</ul>
</li>
<li>잠깐, 플로우 콘텐츠란? <br>
모든 html  요소는 특성을 공유하는 요소끼리 묶는 콘텐츠 카테고리 한가지 이상에 속한다.
콘텐츠 카테고리는 느슨한 관계로, 서로 간에 어떤 관계를 형성하진 않으나
카테고리에서 공유하는 동작이나 관련 규칙을 정의하고 설명할 때 도움이 된다.
요소가 아무런 카테고리에도 속하지 않는 것 역시 가능하다.
콘텐츠 카테고리의 유형에는 메인 콘텐츠 카테고리, 폼 관련 콘텐츠 카테고리, 특정 콘텐츠 카테고리가 있다.
플로우 콘텐츠는 메인 콘텐츠 카테고리에 속하는 콘텐츠이다.
메인 콘텐츠 카테고리는 여러 요소가 서로 공유하는 일반적인 콘텐츠 규칙을 설명한다.
플로우 콘텐츠 카테고리에 속한 요소는 보통 텍스트나 내장 콘텐츠를 포함한다.

</li>
</ul>
<p><img src="https://developer.mozilla.org/ko/docs/Web/HTML/Content_categories/content_categories_venn.png" alt="contentcategory">
위는 메인 콘텐츠 카테고리를 도식화한 것으로,<code>div</code> 요소는 플로우 콘텐츠를 위한 통용 컨테이너이자 플로우 콘텐츠에 속한다.
<br>
<br>
하지만 우리는 저번 시간에 
<strong>의미 없는 태그를 남발하는 것보단 의미 있는 태그를 사용하는 것이 더 권장된다는 것을 알게 되었다.</strong>
무조건 의미없는 <code>div</code>만 고집하지 않아도 된다
의미없는 태그를 사용하기 보단 영역을 나눌 땐 <code>section</code> 태그를 사용하는 것이 더 좋을 수 있다. </p>
<h3 id="2-section-태그">2. section 태그</h3>
<blockquote>
<ul>
<li>html 문서의 독립적 구획을 나타내며, 더 적합한 의미를 가진 요소가 없을 때 사용한다.</li>
</ul>
</blockquote>
<ul>
<li><p>보통 제목을 포함하지만 항상 그런 것은 아니다.</p>
<blockquote>
<ul>
<li><code>&lt;section&gt;contents&lt;/section&gt;</code></li>
</ul>
</blockquote>
</li>
<li><p>특징</p>
<ul>
<li>요소의 콘텐츠를 따로 구분해야 할 필요가 있다면 <code>&lt;article&gt;</code> 태그를 고려할 수 있다.</li>
<li>단순한 스타일링이 목적이라면 <code>&lt;div&gt;</code> 태그를 사용하는 것 추천<ul>
<li>문서 요약에 해당 구획이  논리적으로 나타나야 한다면 <code>&lt;section&gt;</code> 사용 추천</li>
</ul>
</li>
</ul>
</li>
</ul>
<hr>
<h2 id="class-이름-작명">Class 이름 작명</h2>
<p>저번 글에서 잠깐이지만, BEM에 관해 언급한 적이 있다.
오늘은 그것에 대해 더 자세히 다루는 시간을 가졌다.
나는 <code>class</code> 이름을 선언할 때, 내부의 콘텐츠를 기준으로 줄여서 사용했었다.
그런데 만약 내부에 있는 콘텐츠가 달라진다면? 이란 질문을 들었을 때,
아.... 그럼 달라질 때마다 <code>class</code> 이름을 바꿔야겠구나... 라는 생각이 들었다.
따라서 오늘 글에서는 어떻게 <code>class</code> 이름을 작명하는게 좋을지 다뤄보겠다!</p>
<h3 id="1--좋은-class-작명하기">1.  좋은 <code>class</code> 작명하기</h3>
<ul>
<li><p>콘텐츠에 종속성이 있는 이름을  사용하기보단, 일관성 있는 이름을 사용한다.
: 내부의 콘텐츠를 기준으로 사용한다면 확장성이 떨어지므로, 일반적으로 통용되는 이름 사용을 권장한다.</p>
</li>
<li><p><code>class</code> 명의 시작에 숫자 기입은 되지 않는다. </p>
<pre><code>&lt;div class=&quot;1a&quot;&gt;멋사&lt;/div&gt; /*불가*/
&lt;div class=&quot;a1&quot;&gt;최고&lt;/div&gt; /*가능*/</code></pre><p>(근데 이모지는 된다는 사실이 신기했다..ㅋㅋ 
그치만 사용이 되어도, 되도록 사용하지 않는 것을 권장한다.</p>
</li>
<li><p>되도록 템플릿 개념으로 접근해서 일반적인 유형으로 작성한다.</p>
</li>
<li><p>알아보기 쉬운 이름으로 작성한다.
: 너무 짧은 이름이나 약자는 알아보기 어렵다.</p>
</li>
<li><p>나름의 규칙을 생각하며, 근거 있게 작성하는 것이 가장 바람직하다.</p>
<br>

</li>
</ul>
<h3 id="2-bem-block-element-modifier-방법론">2. BEM (Block Element Modifier) 방법론</h3>
<ul>
<li>항상 영어 소문자만을 사용. 카멜 케이스 등은 사용하지 않는다.</li>
<li>일반적으로 한 요소는 하이픈으로 연결
(Ex. <code>input-text</code>, <code>button-submit</code>, <code>modal-alert</code> 등)</li>
<li>네이밍의 조합: 형태-의미-순서-상태 순으로 사용
(Ex. <code>button-submit-03-disable</code>)</li>
<li>언더바는 파일, 폴더, 이미지 등에만 사용
(Ex. <code>image_elysia_asset_01.png</code>)</li>
<li>숫자를 사용할 때엔 확장성을 고려해 01, 02,... 혹은 001, 002,... 처럼 사용한다.
앞에 0을 붙이지 않으면 이미지 정렬 시 1다음 2가 오지 않고 10이 오는 것처럼 정렬 순서가 엉망이 될 수 있다.<br>
### 3. 케이스 스타일
- 카멜식 (Camel case): 낙타의 모양에서 따온 방법</li>
<li>첫 단어는 소문자로 시작하고, 두 번째 단어부터 대문자로 시작한다.</li>
<li>단어와 단어 사이는 붙여 쓴다.</li>
<li>Ex. <code>mainActivity.java</code>, <code>errorLog.txt</code> 등<ul>
<li>케밥식 (Kebab case): 케밥이 꼬챙이에 꽂힌 모습에서 생긴 방법</li>
</ul>
</li>
<li>모든 단어가 소문자로 시작한다.</li>
<li>단어와 단어 사이는 <code>-</code>로 연결된다.</li>
<li>Ex. <code>main-activity.java</code>, <code>error-log.txt</code> 등<ul>
<li>파스칼식 (Pascal case)</li>
</ul>
</li>
<li>카멜식과 비슷하지만, 파스칼식은 첫 단어도 대문자로 시작한다는 점에서 차이가 있다.</li>
<li>몇몇 언어의 경우 관습적으로 클래스명만 대문자로 시작하는 암묵적인 규칙이 있어 조심해야 한다.</li>
<li>Ex. <code>MainActivity.java</code>, <code>ErrorLog.txt</code> 등<ul>
<li>스네이크식 (Snake case): 뱀처럼 길게 이어진다.</li>
</ul>
</li>
<li>케밥식과 유사하지만, 각 단어가 <code>-</code>가 아니라 <code>_</code>로 연결된다.</li>
<li>Ex. <code>main_activity.java</code>, <code>error_log.txt</code> 등</li>
</ul>
<hr>
<h2 id="box-shadow-속성">Box-shadow 속성</h2>
<blockquote>
<ul>
<li>선택한 요소에 그림자 효과를 만들어주는 속성</li>
</ul>
</blockquote>
<ul>
<li><p>initial value: none, inherited: no</p>
</li>
<li><p>문법</p>
<pre><code class="language-css">box-shadow: none; /*그림자 효과를 없앰 */
box-shadow: x-position y-position blur spread color;
/* x-position: 가로 위치, 양수면 오른쪽, 음수면 왼쪽에 그림자
y-position: 세로 위치, 양수면 아래쪽, 음수면 위쪽에 그림자
blur: 그림자를 흐릿하게, 값이 클수록 흐려짐
spread: 양수면 그림자 확장, 음수면 축소
color: 그림자 색 */
box-shadow: inset; /* 그림자를 요소의 안쪽에 만듬 */</code></pre>
</li>
</ul>
<p>이때까지 나는 요소의 영역을 나타내기 위해서 <code>background-color</code>를 사용해서 나타냈다.
오늘 수업에서는 요소의 영역을 나타내기 위해서 <code>box-shadow</code> 속성을 사용했었는데,
이 때 이 속성에 대해 처음 알게 되었다. (신세계)
<code>box-shadow: inset 0 0 10px black;</code>으로 사용했었던 것 같은데 (맞나?)
요소 안으로 그림자가 생기니까 확실히.. 공간을 차지하지도 않고
(이건 백그라운드 컬러도 마찬가지지만)
<code>class</code>명이 같아도 콘텐츠 영역마다 적용이 되어, 
<code>border</code>나 <code>background-color</code>보다 영역 구분을 보기가 편했다.
<br></p>
<p>Ex. <img src="https://file.notion.so/f/f/4b4adfd2-4498-45dd-82d3-2d53ebe20d4b/6dd6ddf2-63df-4189-87c9-adfddf278c94/Untitled.png?id=80a0a079-8cd4-472e-ae87-3b28d3a29cf1&table=block&spaceId=4b4adfd2-4498-45dd-82d3-2d53ebe20d4b&expirationTimestamp=1702195200000&signature=urxav_Eo5zNMTo8zlp1ehdKPhSfL6YROuzxiAb0VPOo&downloadName=Untitled.png" alt="shadow">
(이건 마진 병합 현상 설명할 때 쓰려한 자료인데.. 중복으로 사용좀 해야겠다.
<del>파란 동그라미는 무시해주세욤 ^^.</del> 
아무튼 저 section1,2는 class명이 section으로 같은 요소들인데
확실히 좀 더 구분이 가는게.. 느껴지는가..?
background-color로 사용했을 때엔 같은 색으로 표현이 되어 구분이 확실히 가지 않았었지만
box-shadow는 지 요소 안으로 그림자가 져서 같은 class명을 가지든말든, 같은 색의 효과를 주든 훨씬 잘 보이는게 너무 마음에 들었다!)</p>
<p>이 기능을 이제 알게 되다니.. 덕분에 과제할 때 좀 더 뚜렷하게 영역 확인을 할 수 있었다.
앞으로도 계속 써야겠다!!</p>
<hr>
<h2 id="마진-병합-현상-margin-collapsing">마진 병합 현상 Margin Collapsing</h2>
<blockquote>
<p>CSS에서 인접하는 block-level element의 상하단 margin이 서로 병합되는 현상</p>
</blockquote>
<ul>
<li><p>자연스럽게 보일 수 있도록 하는 것</p>
</li>
<li><p>조건</p>
<ul>
<li>block-level 요소여야 적용된다.
(inline이나 inline-block은 적용 X)</li>
<li>인접해있는 block 요소의 상하단 마진만 겹친다.
(좌우 마진은 겹치지 않는다.)</li>
</ul>
</li>
<li><p>부모 자식 요소 관계에서 마진 병합 현상</p>
<ul>
<li>아래 코드에서 
① <strong>부모 자식 요소 간 인접</strong>해있고, 
② <strong>둘 다 block 요소</strong>이기 때문에 마진 병합 현상이 일어난다.</li>
<li><code>body</code>도 block 요소이기 때문에, <code>body</code>와 <code>parents</code> 사이 마진 병합이 일어난다.<pre><code>&lt;body&gt;
&lt;div class=&quot;parents&quot;&gt;
    &lt;div class=&quot;box&quot;&gt;A&lt;/div&gt;
    &lt;div class=&quot;box&quot;&gt;B&lt;/div&gt;
&lt;/div&gt;
&lt;/body&gt;</code></pre><img src="https://file.notion.so/f/f/4b4adfd2-4498-45dd-82d3-2d53ebe20d4b/34b4756e-dcf3-461e-b1ed-e95e7045cef0/Untitled.png?id=8873c1ef-f5df-48dc-86c4-61133f4b40af&table=block&spaceId=4b4adfd2-4498-45dd-82d3-2d53ebe20d4b&expirationTimestamp=1702195200000&signature=d85cgAFgtfwxYfnpIuNfN6u6new52IbRJ64yiX4Wdc4&downloadName=Untitled.png" alt="margin"></li>
</ul>
</li>
<li><p>마진 병합 현상을 피하는 방법</p>
<ul>
<li>CSS에서,  인접한 블럭 요소 중 
첫 블럭 요소 이름:first-child를 입력하고  margin에 큰 값을 부여한다.
-&gt; 사실 이 방법은 마진 병합 현상이 일어나지 않게 하려는 것이 아니라,
시각적으로만 마진 병합 현상이 일어나지 않은 것처럼 된다.
Ex.<pre><code>/*HTML*/
&lt;main class=&quot;contents&quot;&gt;
&lt;section class=&quot;section&quot;&gt;section1&lt;/section&gt;
&lt;section class=&quot;section&quot;&gt;section2&lt;/section&gt;
&lt;/main&gt;</code></pre></li>
</ul>
</li>
</ul>
<pre><code class="language-css">/*CSS*/
.section {
    background-color: blueviolet;
    box-shadow: inset 0 0 30px white;
    margin: 20px;
    padding: 20px;
} 
/* 여기서 끝나면 마진 병합 현상 일어남 */

.section:first-child {
    margin-bottom: 40px;
}
/* 마진 병합 현상 회피~ */</code></pre>
<p>Ex. <img src="https://file.notion.so/f/f/4b4adfd2-4498-45dd-82d3-2d53ebe20d4b/6dd6ddf2-63df-4189-87c9-adfddf278c94/Untitled.png?id=80a0a079-8cd4-472e-ae87-3b28d3a29cf1&table=block&spaceId=4b4adfd2-4498-45dd-82d3-2d53ebe20d4b&expirationTimestamp=1702195200000&signature=urxav_Eo5zNMTo8zlp1ehdKPhSfL6YROuzxiAb0VPOo&downloadName=Untitled.png" alt="shadow"></p>
<ul>
<li><ul>
<li><p>마진 병합 현상이 일어나는 블록 요소 사이에 <code>table</code> 요소를 넣는다.</p>
<ul>
<li>인접한 block 요소 사이에서 발생한다는 마진 병합 현상의 조건에 맞지 않기 때문에 (table은 table 요소이다.)<ul>
<li>그러나 내용 없이 시각적 목적의 html 마크업이기 때문에 사용 지양하는 것이 좋음</li>
</ul>
</li>
</ul>
</li>
<li><p>경계면에 공간을 차지하고 있는 요소를 삽입한다.</p>
<ul>
<li>ex. <code>border</code>나 <code>padding</code> 값을 주게 되면 마진 병합 현상이 일어나지 않는다.
: 부모의 마진과 자신의 마진 사이 경계면이 생기게 되기 때문이다.</li>
<li>Q. 마진 병합 현상이 일어나는 블럭 요소 사이에
빈 <code>div</code>(<code>display: inline;</code> 으로 바꾼)을 넣어도 마진이 안겹칠까요?
A. <code>div</code>에 콘텐츠가 없기 때문에 (속성을 inline으로 바꿨으니까) 마진 병합 현상이 일어납니다.</li>
</ul>
</li>
<li><p>부모 요소에 <code>display: flow-root;</code> 값을 주게 되면 마진 병합 현상이 일어나지 않는다.</p>
<ul>
<li>Q. 부모 요소가 아니라 서로 인접한 형제 요소들이라면 첫 번째 형제 요소에 <code>display: flow-root;</code> 값을 주면 되나요?
A.  아니오. <code>flow-root</code> 또한 block 계열 속성이기 때문에 여전히 마진 병합 현상이 일어납니다.</li>
</ul>
</li>
<li><p><code>overflow</code> 속성의 값이 <code>visible</code>이 아니라면 마진 병합 현상이 일어나지 않는다.</p>
</li>
<li><p>강사님과 멘토님의 방법</p>
<ul>
<li><code>margin-bottom</code> 으로 쓰고 <code>:last-child</code>로 맨 마지막 요소를 선택한 후, 
<code>margin-bottom: 0;</code>을 많이 사용하신다고 하셨다.</li>
</ul>
</li>
</ul>
<p>*
솔직히 마진이 겹치는 줄도 몰랐는데, 이 현상에 대해 알고나니 보였다 ㅎㅎ..ㅋㅋ
CSS에서 정해놓은 규칙(?) 같은 현상이라 이 현상을 마주치기 싫다면 내가 알아서 회피해야 할듯,,ㅋㅋ
근데 이 규칙 맘에 든다.. 이 현상이 없었다면 하나하나 마진을 계산했어야 한다는 생각에.. 어우 머리아퍼 </p>
</li>
</ul>
<hr>
<h2 id="형제-선택자의-종류">형제 선택자의 종류</h2>
<h3 id="1-일반-형제-선택자--general-sibling-selector">1. 일반 형제 선택자 (~) General sibling selector</h3>
<blockquote>
<p><code>a ~ b { property: value; }</code>
a와 b가 같은 계층에 있을 때, 지정한 요소의 형제인 모든 요소들을 선택한다.</p>
</blockquote>
<p>Ex.</p>
<pre><code>&lt;div&gt;
    &lt;h1&gt;멋사&lt;/h1&gt;
    &lt;p&gt;과제&lt;/p&gt;
    &lt;p&gt;재밌엉&lt;p&gt;
    &lt;p&gt;히힛&lt;p&gt;
&lt;/div&gt;</code></pre><pre><code class="language-CSS">h1 ~ p {
    color: white;
}</code></pre>
<p>일 때, <code>&lt;h1&gt;</code> 태그 뒤에 있는 모든 <code>&lt;p&gt;</code> 태그의 색을 흰 색으로 변경시킨다.</p>
<ul>
<li>지정된 요소가 앞에 존재하면 그 요소들의 형제들을 모두 선택한다.</li>
<li>a 뒤에 오는 b에 적용한다. (바로 뒤에 올 필요는 없다.)</li>
</ul>
<h3 id="2-인접-형제-선택자--adjacent-sibling-selector">2. 인접 형제 선택자 (+) Adjacent sibling selector</h3>
<blockquote>
<p><code>a + b { property: value; }</code>
a와 b가 같은 계층에 있을 떄, 지정한 요소의 바로 다음에 위치하는 형제 요소만 선택한다.
따라서, 다음에 위치한 형제 요소에만 값이 주어진다.
<strong>첫째 말고 둘째만 선택한다는 것</strong></p>
</blockquote>
<p>Ex.</p>
<pre><code>&lt;div&gt;
    &lt;h1&gt;멋사&lt;/h1&gt;
    &lt;p&gt;과제&lt;/p&gt;
    &lt;p&gt;재밌엉&lt;p&gt;
    &lt;p&gt;히힛&lt;p&gt;
&lt;/div&gt;</code></pre><pre><code class="language-CSS">h1 + p {
    color: white;
}</code></pre>
<p>일 때, <code>&lt;h1&gt;</code> 태그 바로 뒤에 있는 <code>&lt;p&gt;</code> 태그의 색을 흰 색으로 변경 시킨다.
(<code>&lt;p&gt;과제&lt;/p&gt;</code> 만 컬러가 흰 색으로 바뀐다.)</p>
<h3 id="3-일반-형제-선택자와-인접-형제-선택자의-차이">3. 일반 형제 선택자와 인접 형제 선택자의 차이</h3>
<ul>
<li>일반 형제 선택자: 지정한 요소 뒤의 형제 요소를 선택한다.</li>
<li>인접 형제 선택자: 지정한 요소 <strong>바로 뒤의</strong> 형제 요소만 선택한다.</li>
</ul>
<p>* 
얘네는 이해가 가면서도 막상 예시를 혼자 적다보면 이해가 안간다.
결합자 모양도 넘흐 헷갈림.. ㅠㅠ
혼동 없게 뜻을 정확히 알아둬야겠다.</p>
<hr>
<h2 id="hover">:hover</h2>
<blockquote>
<p><code>a:hover { property: value; }</code>
사용자가 포인팅 장치를 이용해 상호작용 중인 요소를 선택한다.
보통 사용자의 커서가 요소 위에 올라가 있으면 선택한다.</p>
</blockquote>
<p><strong>가상 클래스(의사 클래스)란?</strong></p>
<blockquote>
<p>선택자에 추가하는 키워드로, 선택한 요소가 특별한 상태여야 만족할 수 있다.
<code>:hover</code>를 사용하면 포인터를 올렸을 때에만 글씨 색을 바꾸고 싶을 때 사용할 수 있다.</p>
</blockquote>
<ul>
<li>예시<pre><code class="language-css">a:hover {
  color: orange;
}</code></pre>
라면, 마우스를 <code>a</code> 위에 올렸을 때 <code>a</code>의 색이 <code>orange</code>로 바뀐다.</li>
</ul>
<p><br> *
hover를 이용해서 과제할 때 더 풍부한 효과를 줄 수 있었다!
마우스를 올렸을 때와 안올렸을 때 너무 갑작스럽게 효과가 전환되는 것 같다면,</p>
<p><code>transition</code>에 값을 줘서 전환 시간을 바꿀 수 있다.
덕분에 글자가 뿅!!!!!하고 갑자기 커지는게 아니라 스르륵~ 커져서
더 만족스러운 결과를 얻었다 ^-^v</p>
<hr>
<h2 id="background-property">Background property</h2>
<h3 id="1-background-repeat">1. background-repeat</h3>
<blockquote>
<p>배경 이미지의 반복 방법을 지정한다.
initial value: repeat, inherited: no</p>
</blockquote>
<p>아래 값을 부여했을 때에</p>
<ul>
<li><code>background-repeat: repeat;</code>: 배경 이미지가 계속 반복된다.</li>
<li><code>background-repeat: repeat-x</code>: 배경 이미지가 x축을 따라 반복된다. (가로로)</li>
<li><code>background-repeat: repeat-y</code>: 배경 이미지가 y축을 따라 반복된다. (세로)</li>
<li><code>background-repeat: no-repeat</code>: 배경 이미지가 반복되지 않는다.</li>
</ul>
<h3 id="2-background-position">2. background-position</h3>
<blockquote>
<p>배경 이미지의 위치를 지정한다.
문법: <code>background-position: x-position y-position</code>
initial value: 0% 0%, inherited: no</p>
</blockquote>
<ul>
<li><p>위치 값으로 사용할 수 있는 것</p>
<ul>
<li>가로 위치 값: <code>left</code>, <code>center</code>, <code>right</code>, <code>백분율</code>, <code>길이</code></li>
<li>세로 위치 값: <code>top</code>, <code>center</code>, <code>bottom</code>, <code>백분율</code>, <code>길이</code></li>
</ul>
</li>
<li><p>Ex.
<code>background-position: right center</code>: 배경을 오른쪽 중앙에 배치한다.</p>
</li>
</ul>
<p>*
과제할 때 이 두 가지의 백그라운드 속성을 모두 사용해보았다.
근데 <code>no-repeat</code>으로 설정하니까 반복되지 않는 부분은 흰색 바탕으로 나와서,,..
이걸 어떻게 해결해야하지 찾아봤지만 결국 해결하진 못하였다 ㅠ
그래서 월요일에 여쭤볼 예정...!
그냥 다시 기본값으로 둘지 <code>no-repeat</code>으로 할지 1분 정도 고민하다가
<code>no-repeat</code>으로 뒀다 ^^
반복되는 것 보단 흰색 바탕이 나은 것 같아서..ㅋㅋ</p>
<hr>
<h2 id="자투리-지식">자투리 지식</h2>
<p><strong>1. 마진 상쇄 현상</strong></p>
<blockquote>
<p>여러 block-level 요소에 서로 다른 마진 값을 넣었을 때, 가장 큰 마진 값이 적용된다.</p>
</blockquote>
<ul>
<li>block-level 요소에 <code>padding</code>이나 <code>border</code> 속성을 부여한다면,
마진 상쇄 조건에 부합하지 않으므로 마진 상쇄 현상이 일어나지 않는다. (경계면 분리)</li>
</ul>
<p><strong>2. 목록의 컨텐츠 구성</strong></p>
<ul>
<li><code>ul</code>(unordered list): 순서가 그닥 중요하지 않은 목록을 나타낼 때 사용한다.</li>
<li><code>ol</code>(ordered list): 순서가 중요한 목록을 나타낼 때 사용한다.</li>
</ul>
<p><strong>3. 한 요소에 class 이름을 두 번 이상 선언할 수 있다.</strong></p>
<ul>
<li>Ex. <code>&lt;div class=&quot;section cat&quot;&gt; contents &lt;/div&gt;</code>
라면, 이 <code>div</code>는 <code>section</code>과 <code>cat</code> 두 가지의 class 이름을 가진다.</li>
</ul>
<p><strong>4. class 셀렉터</strong></p>
<ul>
<li><code>.wrapper.wow {property: value;}</code>와 <code>.wrapper .wow {property: value}</code>의 차이<ul>
<li><code>.wrapper.wow {property: value;}</code>: class 이름 중 <code>.wrapper</code>와 .<code>wow</code>을 포함한 요소를 선택한다.</li>
<li><code>.wrapper .wow {property: value}</code>: <code>.wrapper</code>의 하위 클래스인 <code>.wow</code>를 선택한다.</li>
</ul>
</li>
<li><code>a :hover {property: value;}</code>와 <code>a:hover {property: value;}</code>의 차이<ul>
<li><code>a :hover {property: value;}</code>: <code>a</code>의 하위 요소에 hover 효과를 준다.</li>
<li><code>a:hover {property: value;}</code>: <code>a</code>에 hover 효과를 준다.</li>
</ul>
</li>
</ul>
<br>

<hr>
<h2 id="느낀-점">느낀 점</h2>
<p>오늘은 마진 병합 현상으로 거의 한시간 반..? 정도 강의를 들은 것 같다
처음엔 이해가 잘 갔는데, 점점 딥해질 수록 이해도도 같이 떨어졌다..ㅋㅋㅠㅠㅠ
그래도 어떤 조건에 있을 때 이 현상을 볼 수 있는가? 에 대해서는 이해해서 다행이라는 생각.
오늘 수업에서 특히나 어려웠던건, 갑자기 display 속성에 cover를 주는 것이었는데
다행히 이런 방법이 있다~ 정도로만 알고 넘어가면 된다고 하셨...ㄷ....던가...........?
뭔가 다음에 제대로 배울 것 같아서 이게 어떤 값인지 살짝 알아보기만 했다..ㅎㅎ
그 외에는 9시 스터디에서 질문을 열심히 하며(?) 나름 이해를 했다 (오늘 배운 부분에 한해서)
근데 왜.. 과제 코드 짜는건 두시간이 걸리는건지...............
확실히 강사님이 코드를 짜실 땐 몰랐는데, 
실제로 내가 코드를 짜보니까 내가 모르는 것이 무엇인지 훨씬 잘 느껴진다.
오늘 예제를 보니 더 잘하고 싶어졌다. ㅎㅎ
이번주 토요일은 없는걸로... 😂😂😂</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[멋쟁이사자처럼 프론트엔드스쿨 1-4 ]]></title>
            <link>https://velog.io/@930_10/%EB%A9%8B%EC%9F%81%EC%9D%B4%EC%82%AC%EC%9E%90%EC%B2%98%EB%9F%BC-%ED%94%84%EB%A1%A0%ED%8A%B8%EC%97%94%EB%93%9C%EC%8A%A4%EC%BF%A8-1-4</link>
            <guid>https://velog.io/@930_10/%EB%A9%8B%EC%9F%81%EC%9D%B4%EC%82%AC%EC%9E%90%EC%B2%98%EB%9F%BC-%ED%94%84%EB%A1%A0%ED%8A%B8%EC%97%94%EB%93%9C%EC%8A%A4%EC%BF%A8-1-4</guid>
            <pubDate>Thu, 07 Dec 2023 12:04:46 GMT</pubDate>
            <description><![CDATA[<h2 id="개발자로서의-자세">개발자로서의 자세</h2>
<blockquote>
<ul>
<li>좋은 개발자가 되기 위해선 최대한 많은 방법론을 알고 있는 것이 도움된다</li>
</ul>
</blockquote>
<ul>
<li>코드 결과에서 내가 모르는 무언가가 발견되는 것: 공부의 시작이다!
<strong>사소할지라도, 동작에 대해 의문점을 가지자</strong></li>
<li>내가 모르는 결과물이 나오면 그것을 관찰해야 한다
<strong>문제 인식이 중요하다는 것</strong></li>
</ul>
<hr>
<h2 id="경로-구별을-확실하게-해야-한다">경로 구별을 확실하게 해야 한다.</h2>
<p>경로에 대해서는 어제 멘토님께서 주신 키워드 목록에 있어 미리 예습을 했던 부분이었다!
상대경로와 절대경로에 대해서 알아봤었는데, 오늘 수업에서는 HTML과 CSS 속에서의 경로 표현에 대해 배웠다.
.
.
수업 중간에 어떤 분께서 질문을 하셨다.</p>
<blockquote>
<p><em>Q. 폴더에 들어가서 <code>html</code> 파일을 열면 <code>div</code> 배경이 보이지 않고,
VS CODE 속 Open live를 통해 들어가면 <code>div</code> 배경이 보여요.</em></p>
</blockquote>
<p>Ex. 문제의 코드 (재현한게 이게 맞는지 모르겠지만.. 내 예상)</p>
<pre><code>&lt;!DOCTYPE html&gt;
&lt;html&gt;
    &lt;head&gt;
        &lt;title&gt;멋쟁이 사자처럼&lt;/title&gt;
        &lt;link rel=&quot;stylesheet&quot; href=&quot;style.css&quot;&gt;
    &lt;/head&gt;
    &lt;body&gt;
        &lt;div&gt;
                &lt;img src=&quot;/images/profile.png&quot;&gt;
                &lt;h1&gt;JANE DOE&lt;/h1&gt;
        &lt;/div&gt;
    &lt;/body&gt;
&lt;/html&gt;</code></pre><p>이 질문을 보고 예습을 조금 해서 그런지, 경로 문제라는 것을 알게 되었다.
그러나 어떤 이유로 다르게 나타날까? 에 대해서는 명확하게 알지 못하였다.
그래서 왜 그런가에 대해 강사님과 멘토님께서 설명을 해주셨고,
그것을 바탕으로 좀 더 살을 붙여 아래에서 설명을 해볼 것이다..! (내가 뭐라고....)</p>
<p><strong>먼저, &#39;경로&#39;란?</strong></p>
<blockquote>
<p>프로그래밍 언어, 운영체제 등에서 컴퓨터의 파일을 찾아가는 방법.
절대경로와 상대경로로 구분하여 사용할 수 있다.</p>
</blockquote>
<p>** 아래 경로는 다 다른 경로를 나타낸다. 무엇이 다를까? **</p>
<ul>
<li>./</li>
<li>../</li>
<li>/</li>
</ul>
<ol>
<li>./ 는 현재 디렉토리의 위치에 접근하는 방법이다.</li>
<li>../는 현재 디렉토리의 상위 디렉토리의 위치에 접근하는 방법이다.</li>
<li>/는 최상위 디렉토리(루트 디렉토리) 접근 방법이다.</li>
</ol>
<p>저게 뭔진 구분은 가는데.. 좀 자세히 알려줄래? 하는 분을 위해..
<del>(예를 들어 먼 미래의 나)</del></p>
<h3 id="1-절대경로-absolute-path">1. 절대경로 Absolute path</h3>
<blockquote>
<p>파일의 최상위 폴더(root)부터 해당 파일까지의 전체 경로
즉, ** 파일이나 폴더를 최상위 폴더로부터 전체 경로를 통해 지정**하는 방식이다.</p>
</blockquote>
<p>더 쉽게 풀어보자면, 해당 파일이나 이미지 등의 위치를 포함한 전체 주소를 말한다.</p>
<ul>
<li>특징<ul>
<li>다른 페이지로 이동해도, 링크된 자원을 찾을 수 있다.
: 항상 같은 위치를 가리키기 때문이다.</li>
<li>파일이나 폴더의 위치에 상관없이 항상 정확한 경로를 지정할 수 있다.</li>
<li>예시: <code>https://www.google.com/</code>, <code>C:/Users/username/desktop/Test/test/index.html</code></li>
</ul>
</li>
<li>장점<ul>
<li>폴더 구성을 눈으로 쉽게 볼 수 있다.</li>
<li>어느 곳에서든 경로에 접근할 수 있다.</li>
</ul>
</li>
<li>단점<ul>
<li>경로가 길고 복잡해질 수 있다.</li>
<li>파일이 다른 위치로 이동할 때마다 경로를 수정해주어야 한다.</li>
</ul>
</li>
</ul>
<h3 id="2-상대경로-relative-path">2. 상대경로 Relative path</h3>
<blockquote>
<p>현재 웹 페이지나 폴더의 위치를 기준으로 해당 파일까지의 위치를 작성한 경로
<strong>현재 위치를 기준으로 상대적인 위치를 표현하는 방식이다.</strong></p>
</blockquote>
<ul>
<li>특징<ul>
<li>웹 페이지나 폴더의 파일이 이동해도 자원의 상대적 위치가 변경되지 않는다면 정상적으로 작동한다.</li>
<li>항상 비교할 대상이 있어야 한다
: 기준 경로를 기준으로 상대경로가 구성되기 때문이다.<ul>
<li>예시: <code>./image/cat.png</code>: 현재 폴더와 같은 위치에 있는 파일
<code>../image/cat.png</code>: 현재 폴더의 상위 폴더에 위치한 image 폴더 속의 파일</li>
</ul>
</li>
</ul>
</li>
<li>장점<ul>
<li>폴더 구성이 상대적으로 지정되어 있기 때문에 서버나 폴더를 옮길 때 재설정이 필요없다.</li>
<li>경로가 자주 바뀌거나 최초 디렉토리가 서로 다른 OS에서 작동해야 하는 프로그램을 만드는 경우, 경로를 일일히 수정하지 않아도 된다.</li>
</ul>
</li>
<li>단점<ul>
<li>폴더의 구성을 눈으로 볼 수 없다.</li>
</ul>
</li>
</ul>
<h3 id="3-그렇다면-질문에-대한-답은">3. 그렇다면 질문에 대한 답은?</h3>
<p>이것은 절대경로 방식을 사용했을 때 생길 수 있는 문제이다.
위의 예시코드를 바탕으로 설명해보겠다.</p>
<p>*<em>vs code속 live server에서는 현재 작업 중인 폴더를 기준으로 최상위 폴더를 설정한다. *</em>
예를 들어, 현재 작업 중인 파일의 전체 경로가
<code>C:/Users/username/desktop/Day2/style.css</code> 이고,
현재 작업 중인 파일은 <code>style.css</code> 라고 하자.
또한, 내가 지금 필요한 이미지의 전체 경로는 <code>C:/Users/username/desktop/Day2/images/profile.png</code> 라고 가정한다.</p>
<p><code>&lt;img src=&quot;/images/profile.png&quot;&gt;</code> 를 입력하고,
css파일을 live server로 확인해 보면 당연히 이미지가 나올 것이다.
live server에서 최상위 폴더는 현재 작업 중인 폴더인 <code>Day2</code>로 설정되었기 때문이다.
<code>Day2</code> 폴더에는 <code>images</code>라는 하위 폴더가 있고, 이를 live server가 알아들었기 때문에 당연히 live server에서는 이미지가 나올 것이다.</p>
<p>그런데, <strong>작업 파일을 바로 여는 방식은 내 컴퓨터 전체 기준에서 최상위 폴더를 설정한다.</strong>
위의 가정과 똑같다고 생각했을 때, 당연히 <code>&lt;img src=&quot;/images/profile.png&quot;&gt;</code>를 입력하면 이미지가 나오지 않을 것이다.
작업 파일을 바로 여는 방식은 전체 기준에서 최상위니까..
<code>&lt;img src=&quot;/images/profile.png&quot;&gt;</code>를 html은 이미지 파일을 못찾았을 것이다.
그래서 이미지가 나오지 않았던 것이다.<br>
따라서 둘 다 이미지가 나오게 하기 위해서는 절대경로를 사용하기보단 상대경로를 지정해주는 것이 더 쉬울 수 있다.
간단히 <code>&lt;img src=&quot;./images/profile.png&quot;&gt;</code> 점 하나만 붙여주는 방법으로..ㅋㅋ</p>
<p>예시에서는 상대경로를 사용하는 것이 더 나은 방법으로 나왔지만,
사실 그때 그때 적재적소에 맞게 사용해주는 것이 더더 좋은 방법이다!
나를 괴롭게 만들었던 상대경로와 절대경로...</p>
<hr>
<h2 id="indexhtml">index.html</h2>
<blockquote>
<p>default html file.. 가장 유명한 처음 시작점 파일로, 웹사이트의 기본적 필수 값을 포함한다.
파일명은 관례적으로 index.html 을 사용한다.</p>
</blockquote>
<p><strong>왜 꼭 index로 해야하는가?</strong>
웹 서버에서는 원하는 모든 파일을 해당 사이트의 기본 값으로 인식하도록 구성한다.
그런데, 추가 구성 필요 없이 대부분의 웹 브라우저에서 즉시 인식되도록 한 것이 index.html 파일이기 때문에
index.html로 사용하는 것을 <strong>권장</strong>하는 것이다.</p>
<hr>
<h2 id="html과-css-코드-짜기의-시작">Html과 CSS 코드 짜기의 시작</h2>
<h3 id="1-가장-큰-덩어리-구조">1. 가장 큰 덩어리 구조</h3>
<blockquote>
<p>내가 만들고자하는 디자인에서, 가장 큰 덩어리 구조를 먼저 파악한 후 최소한의 컨텐츠로 시작한다.
언제나 전체적인 관점에서 레이아웃을 잡는 것이 좋다!</p>
</blockquote>
<p>가장 큰 덩어리를 <code>div</code>로 잡고, 더 이상의 html 마크업은 그만둔 후 css로 돌아간다</p>
<h3 id="2-영역-차지와-css-reset">2. 영역 차지와 CSS Reset</h3>
<p><code>div</code>가 얼마만큼의 영역을 차지하는지 가시화하기 위하여 <code>background-color</code>를 넣어준다.
그리고 브라우저에서 보면 내가 지정하지도 않은 <code>margin</code>이나 <code>padding</code> 값이 있다..?
이런 UA stylesheet를 삭제하기 위해 CSS Reset을 시작한다. (CSS Reset을 하는 이유: 서로 다른 브라우저 간의 기본 세팅값을 없애기 위하여)
Ex.</p>
<pre><code class="language-css">/* ua reset */
body {
    margin: initial; /* (혹은 unset;) */
}</code></pre>
<p><strong>Q. 왜 여기서 <code>margin</code>의 초기값인 0을 주지 않고 <code>initial</code>을 쓰나요?</strong>
-&gt; <code>margin</code>에 초기값을 주겠다는 나의 의도를 명확히 하기 위해서 입니다.</p>
<p><code>initial</code>을 하고보니.. caniuse가 말하길 IE 브라우저에서는 이 값을 사용할 수가 없단다..
그래서 대신 쓰는 것이 바로 <code>unset</code> 값이다.</p>
<h4 id="-unset">* Unset</h4>
<blockquote>
<p>각 브라우저에 지정된 세팅값을 없애겠다!</p>
</blockquote>
<p><code>initial</code>도 세팅값을 없애겠다는 의도를 줄 수 있지만, 
<code>unset</code>은 이름만 봐도 그렇듯이 더! CSS reset의 의도를 풍부하게 한다.</p>
<ul>
<li>상속 지원 속성: <code>unset;</code> -&gt; <code>inherit;</code> 으로 받아들인다.</li>
<li>상속 불가 속성: <code>unset;</code> -&gt; <code>initial;</code> 으로 받아들인다.</li>
<li>상속 가능 여부를 모른다면, <code>unset</code>을 사용해보자 
(그래도 MDN에서 한번 찾아보는걸 권장합니다)<br>
### 3. 관례적으로, 웹사이트를 3등분해서 보자.
`div`로 큰 덩어리를 구분하고.. 영역을 가시화해서 얼마나 차지하는지 보고.. CSS reset까지 했다면! 
이제 다시 큰 덩어리를 작은 덩어리로 분리해야 한다.
관례적으로, 엄청나게 세분화해서 보는 것보다는 3등분해서 보는 것이 좋다.</li>
<li><code>header</code>: 웹사이트의 이름, 카테고리 등이 들어가는 부분</li>
<li><code>contents</code>: 세부적인 내용, 3등분한 것 중 가장 많이 변화하는 부분이다.</li>
<li><code>footer</code>: 카피라이트 등이 들어가는 부분</li>
</ul>
<p>이렇게 레이아웃을 나누어주고, 가시화하고, 디자인 등을 수정하면서 html에 마크업해나가면 효율적으로 웹사이트를 만들 수 있다 ^___^!!</p>
<hr>
<h2 id="class-속성">Class 속성</h2>
<p>영역을 나눴는데 <code>div</code>가 너무 많아지니 구분하기도 어렵고,
무엇보다 <code>div</code> 셀렉터에 효과를 주면 모든 <code>div</code>에 효과가 적용이 된다.
<code>class</code>는 이것을 해결하기 위해 쓰는 속성(attriute)이다.</p>
<p><code>class</code> 속성은 원하는 이름을 넣고 css에서 <code>class</code> 이름을 선택자로 사용한다.
다른 모든 태그에도 <code>class</code>로 정의하여 사용할 수 있다.
이때, <code>class</code>이름은 알기 쉽고 의미에 맞게 짓는 것이 적합하다. 
(얼마나 이름 짓기에 고민했으면 BEM이라는 명칭도 생겼을까..
도움되는 사이트도 함께 첨부한다.
<a href="https://tech.elysia.land/%EB%84%A4%EC%9D%B4%EB%B0%8D-%EC%BB%A8%EB%B2%A4%EC%85%98-bem-b291ba7bff01">https://tech.elysia.land/%EB%84%A4%EC%9D%B4%EB%B0%8D-%EC%BB%A8%EB%B2%A4%EC%85%98-bem-b291ba7bff01</a>)</p>
<p>Ex 1. html에서 <code>class</code> 속성은 아래처럼 사용한다.</p>
<pre><code>&lt;body&gt;
        &lt;div class=&quot;wrapper&quot;&gt;
            &lt;div class=&quot;header&quot;&gt;header&lt;/div&gt;
            &lt;div class=&quot;contents&quot;&gt;contents&lt;/div&gt;
            &lt;div class=&quot;footer&quot;&gt;footer&lt;/div&gt;
        &lt;/div&gt;
    &lt;/body&gt;
&lt;/html&gt;</code></pre><p>Ex 2. css에서 <code>class</code>를 셀렉터로 지정할 때엔 아래처럼 한다.</p>
<pre><code class="language-css">div.header {
    background-color: black;
}</code></pre>
<p>이것은 <code>div</code>이면서 <code>header</code>이름을 가지고 있는 <code>class</code>만 셀렉터로 지정한다는 뜻이다.</p>
<p><strong><code>.header</code> 앞에 꼭 <code>div</code>를 써야 하는가?</strong>
난 이때까지 <code>class</code> 속성을 css에서 사용할 땐 당연히 <code>.</code>만 사용해도 되는줄 알았다.
그런데 <code>.</code> 앞에는 <code>*</code>(universal selector)가 생략되어 있었다!
그래서 <code>.header</code>라고 하면 타입과 상관없이 이름이 header인 모든 태그를 지정하는 것이다.
(너무 광범위하다... 타입 셀렉터 지정이 이렇게 중요하다는 것을 배웠다.)
만약 같은 이름을 가진 다른 타입의 태그가 없다면, 
보통 앞의 <code>div</code>를 생략해서 <code>.header</code>로 쓰긴 하지만..
나는 만약을 위해 모두 붙일 것 같다.</p>
<hr>
<h2 id="하위자손선택자-descendant-selector">하위(자손)선택자 Descendant Selector</h2>
<blockquote>
<p>셀렉터와 셀렉터 사이 descendant combinator(공백)를 삽입하여 만들어진 셀렉터
A 요소의 하위 B 요소를 선택하는 것이다. 두 요소는 공백으로 구분한다.</p>
</blockquote>
<p>Ex. 시각적으로 보자면, 아래는 css 코드이고</p>
<pre><code class="language-css">.A B {
    background-color: beige;
}</code></pre>
<p>아래는 html 코드이다.</p>
<pre><code>&lt;div class=&quot;A&quot;&gt;
        &lt;B&gt;contents&lt;/B&gt;
&lt;/div&gt;</code></pre><p>일 때, <code>.A B</code>의 의미는 A 요소의 하위인 B요소를 선택하겠다는 것이다.</p>
<p><code>header</code>와 <code>h1</code> 사이의 공백을 descendant combinator 라고 부른다.
헷갈릴 수 있는 것으로는 자식 선택자가 있다.</p>
<ul>
<li>자식 선택자: <code>.header &gt; h1</code>로 표현하며, &gt; 는 child combinator</li>
<li>자식 선택자와 하위 선택자의 차이점
: 하위 선택자는 자식 선택자에 비해 더 넓은 범위를 포함한다.
자식 선택자= 직계 부모-자식 관계에서만 가능
하위 선택자= 조상-자손 관계에서도 가능(부모-자식 관계도 당연히 포함)</li>
<li>사용 목적: 내가 원하는 셀렉터를 더 명확히 설정하기 위해</li>
</ul>
<hr>
<h2 id="자투리-지식">자투리 지식</h2>
<p>** 1. div가 많아질수록 덩어리의 구분이 어렵다면?**
<code>header</code>나 <code>footer</code>는 html 문서 내에서 여러 번 사용 가능한 태그이다.
(-&gt; 그렇기때문에 <code>class</code>로 정의하지 않으면 광범위해진다.)
식별을 용이하게 하기 위해 되도록이면 <code>div</code> 대신 의미가 있는 태그를 쓰는 것이 좋다.
그러나, <code>main</code>은 문서 내에서 한 번만 쓸 수 있기 때문에 <code>div</code>를 사용하는 것이 좋다.</p>
<p><strong>2. 상위 div가 하위 다른 div 태그들을 감싸는 관례적 class 이름</strong>
하위 <code>div</code>를 감싸는 <code>class</code> 이름은 <code>wrapper</code>로 사용하는 것을 권장함</p>
<p><strong>3. 이미지 짤림 현상</strong></p>
<ol>
<li><code>padding</code> 값으로 높낮이를 조절하면 이미지 값과 다르게 나온다</li>
</ol>
<p>-&gt; 이미지가 잘릴 수 있음
2. 따라서, <code>height</code> 값을 무조건 <code>auto</code>로 두기보단 고정값으로 설정하는 것이 때론 좋을 수 있다.
    ex. 고정된 이미지의 크기를 결정해야 할 때</p>
<hr>
<h2 id="느낀-점">느낀 점</h2>
<p>내가 두번째 타자로 블로그 리뷰를 받게 되었다... 와<del>!!👏👏
특강이 끝나고 3교시가 시작할 때까지 심장이.. 두근거렸음
~</del>협심증이 생긴줄 알았어요..<del>~
그리고 계속 보면서 틀린거 없나 자꾸 수정하게 됐다..ㅋㅋㅋ
그런 과정에서 공부가 또 되는거라고 합리화중🤓 
처음엔 벨로그 공개한 것이 좀 부끄러웠지만, 
리뷰를 받으면서 내가 미처 모르고 넘어갔던 것들과 오타들을 세세하게 집어내주셔서
공개하길 잘했다고 생각했다.
만약 나중에 공개했다면 오늘처럼 세세하게 피드백을 받지 못했을 것 같고, 
글쓰는 방식이 굳어진 시점에서 그 방식을 다시 고치기란 너무 어려울 것 같기 때문이다.
얼른 다른 동료분들 블로그도 보고싶다... 두근두근
.
.
.
확실히 하루하루 갈수록 이해하는 데에 시간을 오래 잡아먹는 내용들이 많이 생긴다.
하지만, 시간을 들여 이해하고 나면 너무너무 행복하고 희열이 넘쳐흘러서 계속 개발 공부가 하고 싶어진다!
학교 다닐 때도 이렇게 열심히는 안했는데.. 확실히 공부를 할 땐 내가 흥미있어하는 것을 해야 행복한 것 같다..
아직 4일차고, HTML과 CSS 기초를 하고 있어서 나중엔 더</del> 어려운게 더더~ 많이 나오겠지만
뭐.. 미래의 내가 하겠지
.
.
.</p>
<p>그리고 글쓰는 레이아웃을 바꿔보았다!
느낀 점을 맨 밑에 쓰는 것으로...ㅎㅎ
정보를 알기 위해 스크롤을 많이 내리기가 조금 힘들어서(는 구글링을 통해 얻은 경험담)
한 번 바꿔보았다....</p>
<p>그럼 오늘도 정리</p>
<h4 id="끝">끝.</h4>
]]></description>
        </item>
        <item>
            <title><![CDATA[멋쟁이사자처럼 프론트엔드스쿨 스터디 질문 정리- 1]]></title>
            <link>https://velog.io/@930_10/%EB%A9%8B%EC%9F%81%EC%9D%B4%EC%82%AC%EC%9E%90%EC%B2%98%EB%9F%BC-%ED%94%84%EB%A1%A0%ED%8A%B8%EC%97%94%EB%93%9C%EC%8A%A4%EC%BF%A8-%EC%8A%A4%ED%84%B0%EB%94%94-%EC%A7%88%EB%AC%B8-%EC%A0%95%EB%A6%AC-1</link>
            <guid>https://velog.io/@930_10/%EB%A9%8B%EC%9F%81%EC%9D%B4%EC%82%AC%EC%9E%90%EC%B2%98%EB%9F%BC-%ED%94%84%EB%A1%A0%ED%8A%B8%EC%97%94%EB%93%9C%EC%8A%A4%EC%BF%A8-%EC%8A%A4%ED%84%B0%EB%94%94-%EC%A7%88%EB%AC%B8-%EC%A0%95%EB%A6%AC-1</guid>
            <pubDate>Wed, 06 Dec 2023 10:54:01 GMT</pubDate>
            <description><![CDATA[<p>멋쟁이사자처럼 프론트엔드스쿨 9기</p>
<hr>
<h3 id="1-margin의-auto-값은-어떻게-적용되는가">1. margin의 auto 값은 어떻게 적용되는가?</h3>
<p>A. 
 auto값은 브라우저가 남은 너비의 공간을 자동으로 계산해서 좌우 균등하게 배분한다.
 <code>margin left: auto;</code> 또는
 <code>margin right: auto;</code>로 설정했다면,
 element는 지정된 width만큼의 공간을 차지하고,
 남은 공간은 균등하게 나누어져 좌, 우 margin이 갖게 되는 것이다.</p>
<hr>
<h3 id="2-margin과-padding의-차이">2. margin과 padding의 차이</h3>
<p> A.</p>
<ul>
<li><p>margin</p>
<ul>
<li>콘텐츠와 화면과의 여백 (바깥 여백)</li>
<li>주변 요소와 거리를 두기 위한 영역임</li>
<li>음수 값과 auto 값이 가능하다</li>
</ul>
</li>
<li><p>padding</p>
<ul>
<li>콘텐츠 내의 내부 여백 (안쪽 여백)
으로, 콘텐츠와 border사이의 여백임</li>
</ul>
</li>
</ul>
<hr>
<h3 id="3-css에서-상속이란">3. css에서 상속이란?</h3>
<p>A.
부모 요소에게 지정된 속성 중 몇  가지가 자식 요소로 값이 전달되는 것이다.
<span style="color:#d3d3d3">이것은 1-3 수업 정리에 예제와 함께 정리해두었다!</span></p>
<hr>
<h3 id="4-css-property의-기본값">4. css property의 기본값</h3>
<p>A.
margin: 0
padding: 0
background-color: transparent
background-image: none 
font-size: 16px
display: inline
width: auto</p>
<p>등등...이 있다.</p>
<hr>
<h3 id="5-doctype을-사용해야-하는-이유는">5. Doctype을 사용해야 하는 이유는?</h3>
<p>A.</p>
<blockquote>
<p>doctype은 최신의 html 버전(living standard)에 맞게 코드를 작성하겠다고 선언하는 것이다.</p>
</blockquote>
<ul>
<li>doctype 사용하지 않으면
:  서로 다른 브라우저 환경에 따라 다른 결과물을 출력하는 경우 발생한다</li>
<li>역할<ul>
<li>브라우저가 html 문서를 동일하게 인식할 수 있게 한다.</li>
<li>문서간 호환성을 높이기 위한다</li>
</ul>
</li>
</ul>
<hr>
<h3 id="6-indexhtml-파일이-가지는-의미">6. index.html 파일이 가지는 의미</h3>
<p>A.</p>
<blockquote>
<p>index.html 파일이 뭔데?</p>
</blockquote>
<ul>
<li>웹 사이트의 기본 페이지에 표시되는 파일, 웹 사이트의 기본적인 필수 값을 포함</li>
<li>가장 일반적으로 사용되는 파일 이름임</li>
</ul>
<p>웹 서버에서는 원하는 모든 파일을 해당 사이트의 기본값으로 인식하도록 구성하는데, 추가 구성 필요 없이 대부분의 서버에서 즉시 인식되는 파일=index.html 이기 때문에 index.html로 사용하는 것을 권장한다.</p>
<hr>
<h3 id="7-html-요소들의-부모형제-관계">7. html 요소들의 부모/형제 관계</h3>
<p>A.</p>
<blockquote>
<p>부모 요소: 해당 요소를 포함하는 가장 가까운 상위 요소
형제 요소: 같은 부모를 가지고 있는 요소</p>
</blockquote>
<ul>
<li><p>부모 요소의 특징</p>
<ul>
<li>그 요소의 부모 요소는 단 하나</li>
<li>자식 요소는 이와 반대로, 자식 요소는 여러 개 일 수 있다.</li>
</ul>
</li>
<li><p>형제 요소의 특징</p>
<ul>
<li>인접한 관계: 형제 관계에 있는 요소 중 바로 뒤이어 나오는 요소를 인접한 관계에 있다고 한다.</li>
</ul>
</li>
<li><p>조상과 자손 관계</p>
<ul>
<li>부모와 자식의 관계를 포함해서, 더 확장된 관계</li>
<li>조상 요소: 그 요소를 포함하는 모든 요소, 부모 요소를 포함하여 여러 개 일 수 있음</li>
<li>자손 요소: 그 요소가 포함하고 있는 모든 요소</li>
</ul>
</li>
</ul>
<p>Ex. </p>
<pre><code>&lt;html&gt;
    &lt;head&gt;
        &lt;title&gt;aaa&lt;/title&gt;
    &lt;/head&gt;
    &lt;body&gt;
        &lt;h1&gt;멋사&lt;/h1&gt;
        &lt;p&gt;프론트엔드 스쿨&lt;/p&gt;
    &lt;/body&gt;
&lt;/html&gt;</code></pre><p>부모-자식 관계: <code>&lt;body&gt;</code>(부모), <code>&lt;h1&gt;, &lt;p&gt;</code>(자식)
형제 관계: <code>&lt;h1&gt;, &lt;p&gt;</code></p>
<hr>
<h3 id="8-css에서-타입-셀렉터란">8. css에서 타입 셀렉터란?</h3>
<p>A.</p>
<blockquote>
<p>html 문서에서 지정된 태그를 지칭하는 선택자</p>
</blockquote>
<p>Ex.</p>
<pre><code class="language-css">&lt;html&gt;
    &lt;head&gt;
        &lt;title&gt;aaa&lt;/title&gt;
        &lt;style&gt;
            h1 {
                    color: red;
                    }
            p {
                    background-color: grey;
                }
        &lt;/style&gt;

    &lt;/head&gt;
    &lt;body&gt;
        &lt;h1&gt;멋사&lt;/h1&gt;
        &lt;p&gt;프론트엔드 스쿨&lt;/p&gt;
    &lt;/body&gt;
&lt;/html&gt;</code></pre>
<p>타입 셀렉터: <code>h1, p</code></p>
<hr>
<h3 id="9-div-요소와-h1-요소의-차이점은">9. div 요소와 h1 요소의 차이점은?</h3>
<p>A.</p>
<ul>
<li>div<ul>
<li>아무 것도 나타내지 않는 콘텐츠의 영역을 설정</li>
<li>Ex. <code>&lt;div&gt;나는 감자&lt;/div&gt;</code>를 작성했을 때, 웹 사이트에서 보면 &#39;나는 감자&#39; 라는 글자만 나타남</li>
<li>이유: div는 영역을 나타내는 역할 외에는 특정한 의미가 없다</li>
<li>다른 요소를 포함시키는 용도로도 사용(h1은 X)</li>
</ul>
</li>
<li>h1<ul>
<li>이 페이지에서 최상위 제목인 텍스트를 감싸는 역할</li>
<li>보통 검색 엔진에서 h1 같은 경우는 대제목으로 받아 들임<pre><code>-&gt; 알고리즘에서 중요하게 보는 부분</code></pre></li>
<li><code>&lt;h1&gt;나는 감자&lt;/h1&gt;</code> 코드를 웹 사이트에서 실행시키면 div와는 다르게 텍스트가 크고 굵게 나타난다.</li>
</ul>
</li>
<li>따라서, div는 영역을 구분할 때, h1은 제목을 표시할 때 사용</li>
<li>div(block 속성)와 span(inline): 검색엔진에서 중요한 의미를 갖지 않음</li>
<li><blockquote>
<p>보통 레이아웃을 잡을 때 div나 span을 사용</p>
</blockquote>
</li>
</ul>
<p><span style="color:#d3d3d3">내가 착각했던 것: div가 문단을 나누는 용도로도 사용되는 줄 알았는데, 문단/문장/글의 내용을 갖는 것은 <code>&lt;p&gt;</code>였다. 또한 주제를 나타낼 땐 <code>&lt;article&gt;</code>도 사용한다.</span></p>
<p>  끝.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[멋쟁이사자처럼 프론트엔드스쿨 1-3]]></title>
            <link>https://velog.io/@930_10/%EB%A9%8B%EC%9F%81%EC%9D%B4-%EC%82%AC%EC%9E%90%EC%B2%98%EB%9F%BC-%ED%94%84%EB%A1%A0%ED%8A%B8%EC%97%94%EB%93%9C%EC%8A%A4%EC%BF%A8-1-3</link>
            <guid>https://velog.io/@930_10/%EB%A9%8B%EC%9F%81%EC%9D%B4-%EC%82%AC%EC%9E%90%EC%B2%98%EB%9F%BC-%ED%94%84%EB%A1%A0%ED%8A%B8%EC%97%94%EB%93%9C%EC%8A%A4%EC%BF%A8-1-3</guid>
            <pubDate>Wed, 06 Dec 2023 09:53:21 GMT</pubDate>
            <description><![CDATA[<h1 id="느낀-점">느낀 점</h1>
<p>오늘 수업은 어제보다 더 재미있게 들었다!
수업시간에 간간히 정리하며 이해했지만, 확실히 벨로그로 한 번 더 정리를 하게 되니 더 기억에 오래 남는 것 같다.
앞으로도 꾸준히 써야지</p>
<hr>
<h2 id="html-문서에서-css파일-연동하기">html 문서에서 css파일 연동하기</h2>
<p>Ex</p>
<pre><code>&lt;!doctype html&gt;
&lt;html&gt;
    &lt;head&gt;
        &lt;link rel=&quot;stylesheet&quot; href=&quot;CSS 파일위치&quot;&gt;
    &lt;/head&gt;
    &lt;body&gt;
    &lt;/body&gt;
&lt;/html&gt;</code></pre><br>

<ul>
<li>./ 현재 경로 위치
../ 이전 경로 위치</li>
<li>초보자라면 html을 완성해서 css로 꾸미기보단,
html로 간단한 영역만 나누고(최소한의 html 구축), 
css로 레이아웃을 어느정도 내 눈에 보이게 직관적으로(Ex. h1이 어느 정도의 영역을 가지는지) 고친 후,
내가 원하는 디자인을 대강 적용해두고 다시 html을 수정하는 것이 더 편할 수 있다고 하셨다!
html 문서의 내용은 계속 변할 수 있기 때문이다!
<span style="color:#d3d3d3">(확실히 과제 내주셨을 때 그렇게 해봤는데 시간도 단축되고 속성 값이 어떻게 나타나는지도 시각적으로 더 쉽게 보여서 좋았다.)</span></li>
<li>html과 css를 분리했을 때<ul>
<li>관리가 용이하다</li>
<li>여러 페이지를 하나의 css 파일로 컨트롤 할 수 있다</li>
<li>html 마크업이 더 명확하게 보인다.</li>
</ul>
</li>
</ul>
<hr>
<h2 id="브라우저-기본-세팅값을-없애고-시작하자-css-reset">브라우저 기본 세팅값을 없애고 시작하자 (CSS Reset)</h2>
<blockquote>
<p>브라우저마다 각각의 기본 세팅값이 다르다.(User Agent Stylesheet)
css reset을 하는 이유는 브라우저 간 세팅값이 각각 다르기 때문에 이 차이를 최대한 없애는 코드를 넣어서
브라우저 요소들의 스타일이 0인 상태에서 시작하기 위한 것이다.</p>
</blockquote>
<p>Ex</p>
<pre><code class="language-css"> /* UA Reset */    
body {
        margin: 0; 
            }
/* Componets */
body {
        background-color: orange;
            }</code></pre>
<p><span style="color:#d3d3d3">예제에서는 margin을 사용했기 때문에 margin으로 설명한다</span></p>
<p>(0) 내가 쓰는 크롬 브라우저에서는 <code>body</code>의 <code>margin</code> 기본 세팅값은 8px로 지정되어 있기 때문에, 
이것을 아예 <code>margin</code>의 초기값(initial value)으로 지정하고 시작한다.
(1) <code>margin</code>의 초기값으로 세팅한 후,
(2) 같은 type selector라도, reset한 selector와 Components가 있는 selector는 따로 표기한다.
(3) 초기값으로 셋팅한 부분엔 위에 주석으로 UA Reset으로 구분해두면 나중에 보기 편하다!</p>
<hr>
<h2 id="block-level-element의-width나-margin-값이-auto일-때">Block-level element의 width나 margin 값이 auto일 때,</h2>
<h2 id="브라우저는-auto-값을-어떻게-계산할까">브라우저는 auto 값을 어떻게 계산할까?</h2>
<blockquote>
<p>직계 부모가 제공해주는 콘텐츠 영역(Containing block)의 너비,
즉, 부모의 너비만큼 가득 차게 자동으로 계산해서 적용한다.
그렇다면 width나 margin의 값을 지정해준 후 남는 공간은 어떤 공간인가?
<strong>→ 사용 가능한 여유 공간 (available space)</strong></p>
</blockquote>
<p><span style="color:#d3d3d3">오늘 수업에서 앞뜰, 정원 등등 다양한 비유가 나왔다. 정확한 명칭은 사용가능한 공간! 앞으론 이렇게 알기</span></p>
<p>Ex 1. <code>width</code> 값 지정 후 사용 가능한 공간은?</p>
<pre><code class="language-css">div {
        width: auto;
        }</code></pre>
<p>일 경우: <code>div</code>의 너비는 브라우저가 부모 요소가 제공해주는 컨텐츠 영역을 자동으로 계산한다.
따라서, 사용 가능한 공간은 전체 너비로 사용된다.
(집(눈에 보이는 것)과 마당(눈에 보이지 않는 것)으로 비유하자면, 집이 마당 영역을 다 차지하고 있는 것이다.)</p>
<p>* width: 100%;와 width: auto; 다른 점</p>
<ul>
<li>width: 100%;: 100%로 픽스한다. 마진/패딩을 넣게 된다면 전체 크기가 커져서 옆으로 삐져나가는 현상 발생.</li>
<li>width: auto;: 브라우저가 자동으로 계산해서 마진/패딩을 넣게 되어도, 브라우저가 이것을 고려하여 컨테이너 블록의 크기에 맞게 지정한다.</li>
</ul>
<p>Ex 2.</p>
<pre><code class="language-css">div {
        margin: auto;
        }</code></pre>
<p>일 경우: 사용 가능한 공간은 <code>div</code>의 여백으로 사용된다.
(집과 마당으로 비유하자면, 여백이 되어 보이지 않을 뿐, 여전히 마당이 내 소유인 것처럼, 여백 공간도 <code>div</code> 소유)</p>
<hr>
<h2 id="상속-inheritance">상속 Inheritance</h2>
<blockquote>
<p>부모 요소에게 지정된 속성 중 몇 가지는 자식 요소로 값이 전달되는 것
<strong>상속의 우선 순위: 부모의 지정 값 &lt; 자식의 지정 값</strong></p>
</blockquote>
<ul>
<li>상속이 되는 property: <code>text-align</code>, <code>line-height</code>, <code>color</code>, <code>font</code>  등</li>
<li>상속 불가한 property: <code>width</code>, <code>height</code>, <code>padding</code>, <code>margin</code>, <code>border</code>, <code>display</code>, <code>background</code> 등<br>

</li>
</ul>
<p>Ex 1.</p>
<pre><code class="language-css">부모 {
            color: black;
}
자식 {

}</code></pre>
<p>위의 상황에서 <code>color</code>속성은 상속이 가능한 속성이다.
-&gt; 자식의 <code>color</code> 값= 부모에게 상속된 black</p>
<p>Ex 2.</p>
<pre><code class="language-css">부모 {
            color: black;
}
자식 {
            color: red;
}</code></pre>
<p>위 상황에서 자식의 <code>color</code> 값은 red로 지정되었기 때문에
-&gt; 부모 요소에서 <code>color</code>값 상속되지 않음</p>
<p>Ex 3. 만약 부모요소가 <code>div</code>이고 <code>img</code>가 자식요소일 때</p>
<pre><code class="language-css">div {
        display: block;
        }
img {
        display: 뭘까요?
        }</code></pre>
<p>위 상황에서 <code>div</code> 내부에 <code>display: block</code>이 설정되어 있더라도 <strong><code>display</code> 속성은 상속이 되지 않기 때문에</strong> <code>img</code>에 상속이 되지 않는다. 
따라서 <code>img</code>의 <code>display</code> 값은 <code>inline</code>(기본값)이다.</p>
<p>(그러나, <code>img</code>에 <code>display: inherit;</code> 을 추가하면 강제로 상속이 되게 할 수 있다.)</p>
<hr>
<h2 id="block-level-element와-inline-element의-차이점">block-level element와 inline element의 차이점</h2>
<ul>
<li><p><strong><code>Block</code> (Container)</strong></p>
<blockquote>
</blockquote>
<p>* 모든 <code>inline</code> 요소를 포함할 수 있고, 다른 <code>block</code> 요소 또한 일부 포함 가능
* 기본적으로 가로폭 전체의 넓이를 가지는 직사각형 형태
* 한 줄 전체 공간을 차지 <span style="color:#d3d3d3">(한 줄에 하나씩)</span></p>
</li>
<li><blockquote>
<p><code>block-level element</code> 뒤에는 줄바꿈 O</p>
</blockquote>
<ul>
<li>box-model 정상 적용</li>
<li><code>width</code>와 <code>height</code>를 통해 사이즈 조절 가능<ul>
<li>지정이 되지 않을 때:
 <code>width</code>: 화면에서 한 줄을 다 차지함 (100&amp;와 전부를 구별하자)
 <code>height</code>: 컨텐츠만큼 차지</li>
<li><code>&lt;div&gt;</code>, <code>&lt;ul&gt;</code>, <code>&lt;h1~6&gt;</code>, <code>&lt;p&gt;</code>, <code>&lt;article&gt;</code>, <code>&lt;section&gt;</code> 등<br></li>
</ul>
</li>
</ul>
</li>
<li><p><strong><code>inline</code> (Contents)</strong></p>
<blockquote>
</blockquote>
<p>* 항상 <code>block</code> 요소 안에 포함되어 있으며, 
<code>inline</code> 요소 안 다른 <code>inline</code> 요소가 포함될 수 있다.
* 컨텐츠만큼의 크기를 가진다.
(컨텐츠가 끝나는 지점까지 넓이로 가짐=줄바꿈X)</p>
</li>
<li><blockquote>
<p>각 줄 안에서 <code>inline element</code>는 쓰기 모드에 따라 수직or수평 모드로 정렬</p>
</blockquote>
<ul>
<li>box-model 부분 적용</li>
<li><code>width</code>와 <code>height</code>의 개념 자체가 없다. 
왜? 컨텐츠만큼 너비가 잡히니까!</li>
<li>상하 <code>margin</code> 적용X, 공간도 차지하지 않음</li>
<li>상하 <code>padding</code> 적용X, 시각적으론 보이지만 공간을 차지하진 않는다. <del>그래서 예제 떄 겹쳐보였던 것</del></li>
<li>따라서 box-model이 부분 적용된다.</li>
<li>부모에게 <code>line-height</code>나 <code>text-align</code>을 줌으로써 텍스트의 중앙, 좌&amp;우측 정렬 가능</li>
<li><strong>예외: <code>img</code>  요소</strong><ul>
<li><code>inline element</code>지만 <code>width</code> 값, <code>height</code> 값이 이미 적용되어 있다.</li>
<li>상하 <code>margin</code>, <code>padding</code> 또한 적용 가능</li>
<li><code>&lt;a&gt;</code>, <code>&lt;img&gt;</code>, <code>&lt;span&gt;</code>,<code>&lt;script&gt;</code>, <code>&lt;em&gt;</code>, <code>&lt;map&gt;</code> 등<br> 

</li>
</ul>
</li>
</ul>
<ul>
<li><p><strong><code>inline-block</code></strong></p>
<blockquote>
<p>* <code>inline</code>의 특성과 <code>block</code>의 특성을 합친 것
* 컨텐츠 만큼의 크기를 가진다
* 줄바꿈 X</p>
</blockquote>
<ul>
<li>내부: <code>block</code> 취급, 외부: <code>inline</code> 취급
: 자기 자신을 봤을 땐 <code>block</code>이지만, 배치된 바깥 레벨에서는 <code>inline</code>으로 취급함</li>
<li><code>inline</code>의 특성을 가지기 때문에<ul>
<li>컨텐츠 양만큼 전체 너비가 자동 조절된다</li>
<li>부모에게 지정된 <code>text-align</code> 속성에 영향 받는다</li>
<li>정렬에 용이하나 한계를 안고 있다</li>
</ul>
</li>
<li><code>block</code>의 특성을 가지기 때문에<ul>
<li>원하는 <code>width</code>값과 <code>height</code>값을 지정 가능</li>
<li>margin과 padding의 상하 간격 지정 가능</li>
</ul>
</li>
<li><code>inline</code> or <code>block</code> or <code>inline-block</code> element 라도 <code>display</code> 속성에 원하는 값을 넣으면 바꿀 수 있다!
Ex. <code>inline</code>을 <code>block</code>으로 바꿀 때
: 원하는 셀렉터에 <code>display: block;</code> 을 추가한다</li>
</ul>
</li>
</ul>
</li>
</ul>
<br>
<span style="color:#d3d3d3">어제 과제에서 이거 때문에 정말 머리가 아팠다... 
  일단 `block`과 `inline`의 차이도 몰랐었기도 하고, 레이아웃을 제대로 짜지도 않고 시작해서 
  막상 꾸미려고 보니 `h1`과 `p`의 여백 및 가운데 정렬이 해결이 안됐다ㅡㅡ; 
  겨우 검색해서 대충 이해하고 넘어갔었으나, 막상 원리를 설명해보라면 왜인지 설명할 수가 없었다.
하지만 오늘 수업을 통해 `block`과 `inline`의 차이점을 정확하게 알게 되었고, 내가 무엇을 착각했는지와 해결 원리도 이해할 수 있었다.</span>

<hr>
<h2 id="자투리-지식">자투리 지식</h2>
<ol>
<li><br>

</li>
</ol>
<blockquote>
<p><em>Q. <code>h1</code>에 <code>text-align: center</code>를 넣었는데, <code>h1</code>의 위치는 그대로고 안의 내용(콘텐츠)만 중앙 정렬이 되었어요!</em></p>
</blockquote>
<p>A.</p>
<ul>
<li><code>h1</code>은 <code>block-level element</code> 이다. 
또한, <code>text-align</code>은 <code>h1</code> 자체를 가운데로 옮기는 것이 아닌 <strong><code>h1</code>의 콘텐츠만 가운데로 정렬</strong>한다.</li>
<li>따라서, <code>h1</code> 뿐만 아니라 <code>p</code>, ... 등등의 <code>block</code> 속성을 가진 셀렉터에도 <code>text-align</code> 속성을 사용하고 싶다면,
그 요소의 부모 요소에 적용해야 한다.</li>
<li>!!! <code>block</code> 속성을 가진 태그에는 <strong>콘텐츠만</strong> 가운데로 정렬이 된다!!!</li>
</ul>
<ol start="2">
<li><code>margin</code>의 단축속성</li>
</ol>
<blockquote>
<ul>
<li><code>margin: 0 auto 40px;</code>: 상 | 좌우 | 하</li>
<li><code>margin: 5% auto;</code>: 상하 | 좌우</li>
</ul>
</blockquote>
<ul>
<li><code>margin: 2px 1em 0 auto;</code>: 상 | 우 | 하 | 좌</li>
<li><code>margin: 100px;</code>: 네 면 모두 적용
<strong>시계방향</strong>으로 돌아간다고 생각하면 된다</li>
</ul>
<p>끝.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[멋쟁이사자처럼 프론트엔드스쿨 1-2]]></title>
            <link>https://velog.io/@930_10/%EB%A9%8B%EC%9F%81%EC%9D%B4%EC%82%AC%EC%9E%90%EC%B2%98%EB%9F%BC-%ED%94%84%EB%A1%A0%ED%8A%B8%EC%97%94%EB%93%9C%EC%8A%A4%EC%BF%A8-1-2</link>
            <guid>https://velog.io/@930_10/%EB%A9%8B%EC%9F%81%EC%9D%B4%EC%82%AC%EC%9E%90%EC%B2%98%EB%9F%BC-%ED%94%84%EB%A1%A0%ED%8A%B8%EC%97%94%EB%93%9C%EC%8A%A4%EC%BF%A8-1-2</guid>
            <pubDate>Tue, 05 Dec 2023 10:47:31 GMT</pubDate>
            <description><![CDATA[<h1 id="느낀점">느낀점</h1>
<p>멋쟁이 사자처럼 프론트엔드 스쿨에 참여하게 되면서 벨로그를 시작했다.
노션으로 1차 정리하고, 강사님께서 블로그를 왕추천해주셔서 많은 블로그 플랫폼 중 벨로그를 개설하여 2차 정리를 하게 되었다.
<del>두 번 정리하는만큼 머릿속에 좀 들어오면 좋겠다</del>
아무튼 html과 css 둘다 발만 담군... 아니 물방울만 떨어뜨린 내 입장에선 오늘 강의를 통해 의미를 잘 몰랐던 용어와 역할들에 대해 알게 되었다.
과연 내가 9-6에 적응할 수 있을지 걱정했었는데 (집중력 부족)🤷‍♀️ 생각보다 점심먹고 졸린거 말곤 집중 잘했었던 것 같다
오늘 과제도 나름 할만했다....!
나중에 js 시작하면 할만할진 모르겠지만 😂
일단 끝까지 해보자!!!!</p>
<hr>
<p>* html과 css 기초 1강에 대한 내용을 담고 있습니다
** 오늘 배운 것과 혼자 찾아보며 짬뽕된 지식을 정리합니다!
잘못된 내용은 알려주시면 감사하겠습니다 🙏</p>
<hr>
<h2 id="doctype에-대한-이해">Doctype에 대한 이해</h2>
<p><code>&lt;!doctype html&gt;</code></p>
<blockquote>
<p>Document Type Declaration, 문서 형식 선언
선언된 페이지의 HTML 버전이 무엇인지를 웹 브라우저에 알려주는 역할을 하는 선언문 
최신의 기준(html5)으로 코드를 작성하겠다는 뜻</p>
</blockquote>
<p>반드시 작성해야하며, 지정하지 않고 코드를 작성할 경우
→ 정석적 방법이 아님에도 올바르게 코드를 작성했다고 착각할 수 있음 
<del>(나중에 엄청 열심히 짜놓고 엎으면 눈물날듯)</del></p>
<hr>
<h2 id="html-tag">HTML Tag</h2>
<pre><code>&lt;!DOCTYPE html&gt;
&lt;html&gt;   (&lt;-Start tag)
    &lt;head&gt;&lt;/head&gt;
    &lt;body&gt;
        &lt;ul&gt;
            &lt;li&gt;orange&lt;/li&gt;
        &lt;/ul&gt;
    &lt;/body&gt;
&lt;/html&gt;  (&lt;-Endtag)</code></pre><p><code>&lt;html&gt;</code>태그는 부모요소, <code>&lt;head&gt;,&lt;body&gt;</code>는 자식요소, 
<code>&lt;head&gt;</code>와 <code>&lt;body&gt;</code>는 형제관계(siblings), 
<code>&lt;body&gt;</code>와 <code>&lt;li&gt;</code>는 상위/하위 관계이자, <code>&lt;body&gt;</code>는 <code>&lt;li&gt;</code>의 조상 관계이다.
<a href="https://juheeexx.tistory.com/5">https://juheeexx.tistory.com/5</a> 님의 블로그를 참고하면 더 쉽게 이해가 가능하다!
이건 틈날 때 벨로그에 다시 정리할 것.</p>
<hr>
<pre><code>&lt;!DOCTYPE html&gt;
&lt;html&gt;
    &lt;head&gt;
        &lt;title&gt;Fruits&lt;/title&gt;  &lt;-홈페이지의 이름(탭에 나타남)
    &lt;/head&gt;
    &lt;body&gt;
        Orange &lt;- 홈페이지의 내용
    &lt;/body&gt;
&lt;/html&gt;</code></pre><ul>
<li>Fruit, Orange 등 요소 안의 내용: 컨텐츠
img는 자체가 컨텐츠(Empty tag)</li>
<li><code>&lt;head&gt;</code>에는 홈페이지 이름, 썸네일, 검색을 위한 문서 설명, 파비콘 등 문서가 가지고 있는 부차적인 정보가 담긴다. <span style="color:#d3d3d3">(데이터를 꾸미는 데이터)</span></li>
</ul>
<hr>
<h2 id="css의-동작-방식">CSS의 동작 방식</h2>
<p>Html 문서 내에서는 아래로 표시(<code>&lt;style&gt;...&lt;/style&gt;</code>)</p>
<pre><code>&lt;!DOCTYPE html&gt;
&lt;html&gt;
    &lt;head&gt;
        &lt;style&gt;
            h1 {
                background-color: orange;
                        }
        &lt;/style&gt;
    &lt;/head&gt;
    &lt;body&gt;
        &lt;h1&gt;ORANGE&lt;/h1&gt;
    &lt;body&gt;</code></pre><p>style 태그 내에서 
<code>h1</code>: <strong>타입 셀렉터(Type selector)</strong>,
<code>background-color</code>: <strong>Property(속성)</strong>,
<code>orange</code>: <strong>value값</strong>
<span style="color:#d3d3d3">Q. 지훈님: h1은 body에 종속된 개념으로 이해했는데 타입셀렉터에서 body에 지정해주는 값들은 h1에 어떤 영향도 주지 않는다고 봐야 하는 건가요?
A. 직접적인 영향은 X, Property에 따라 다름
  <img src="https://velog.velcdn.com/images/930_10/post/eeede501-c381-411b-9201-7228809ee4c6/image.png" alt="">
조상 중 지정된 color: blue;는 상속된 것을 보면 이해가 된다. 
  (h1에 만약 color: orange;가 적용되어 있다면 상속되지 않는다!)<br>
  <del>나도 확실히 알게 되어서 좋은 질문이었다고 생각함! 역시 나쁜 질문은 없다..</del>
</span></p>
<hr>
<ul>
<li>순위<pre><code class="language-css">body {
      background-color: orange;
      background-image: url(images/orange-bg.png);
          }</code></pre>
에서, <code>background-image</code>의 property가 <code>backgroun-color</code>보다 더 우선된다.</li>
<li><ul>
<li>그러나 같은 property일 땐 하위 property가 더 우선됨</li>
</ul>
</li>
</ul>
<hr>
<h2 id="초기값-initial-value와-브라우저-기본-스타일">초기값 Initial value와 브라우저 기본 스타일</h2>
<ul>
<li><strong>초기값(Initial value)</strong>: 각 property에 직접 지정하지 않아도 이미 지정되어 있는 기본값<pre><code class="language-css">h1 {
  background-color: transparent;
      }</code></pre>
<code>background-color</code>를 지정하지 않아도 투명으로 나오는 이유: 초기값이 transparent로 설정되어 있기 때문
<span style="color:#d3d3d3">** background-image의 초기값: none</span></li>
</ul>
<hr>
<p><code>&lt;h1&gt;, &lt;h2&gt;, &lt;h3&gt;, &lt;h4&gt;, &lt;h5&gt;, &lt;h6&gt;</code> 
<strong>heading 태그</strong>: html 문서에서 제목을 정의할 때 사용,
1~6단계로 나뉘며 <code>&lt;h1&gt;</code> 태그가 가장 단계가 높다.</p>
<ul>
<li>크기가 다르게 나오는 이유: 브라우저의 기본 설정때문이다.<ul>
<li>사용자 에이전트 스타일시트<ul>
<li>브라우저가 사용자에게 기본으로 넣어준 설정</li>
<li>브라우저에 종속적</li>
</ul>
</li>
</ul>
</li>
<li>마크업 언어를 사용하는 이유: 데이터에 추가적인 정보를 제공하기 위하여 사용함</li>
</ul>
<hr>
<ul>
<li>div 영역: body 직계 부모가 제공해주는 컨텐츠 영역의 너비만큼 가득 차 있음
__ 직계 부모가 제공해주는 컨텐츠 영역: Containing block__<pre><code>&lt;!DOCTYPE html&gt;
&lt;html&gt;
  &lt;head&gt;
      &lt;title&gt;Fruits&lt;/title&gt;
      &lt;style&gt;
          body {
              background-color: orange;
              background-image: url(images/orange-bg.png);
          }
          div {
              background-color: white;
              width: auto;
                              height: auto;
          }
      &lt;/style&gt;
  &lt;/head&gt;
  &lt;body&gt;
      &lt;div&gt;
          &lt;img src=&quot;./images/orange.png&quot;&gt;
          &lt;h1&gt;ORANGE&lt;/h1&gt;
          &lt;ul&gt;
              &lt;li&gt;Orange&lt;/li&gt;
              &lt;li&gt;Kiwi&lt;/li&gt;
              &lt;li&gt;Strawberry&lt;/li&gt;
          &lt;/ul&gt;
      &lt;/div&gt;
  &lt;/body&gt;</code></pre>** 
width: auto; 값: 직계 부모가 제공해주는 컨텐츠 영역의 너비만큼 브라우저가 자동으로 계산(가득차게), <strong>부모 너비 만큼</strong>
   height: auto; 값: 내부에 있는 <strong>자식들의 높이 만큼</strong> -&gt; auto로 두는 것이 유지보수에 효과적이다<span style="color:#d3d3d3">
벨로그에 쓰기 위해 구글링을 하던 중, 좋은 벨로그를 발견했다!
같은 이종찬 강사님의 강의를 들으신 분이 적어놓으신 벨로그를 보며 더욱 이해가 잘 되었음
참고)  https://velog.io/@kimconut/Day20.-CSS-스터디</span>

</li>
</ul>
<hr>
<ul>
<li>div 컨텐츠가 두 개일 때, width를 조절해도 옆으로 나란히 놓지 못하는 이유: 부모(body)에게 상속받은 영역을 그대로 사용하기 때문</li>
</ul>
<hr>
<h2 id="css-박스모델">CSS 박스모델</h2>
<ul>
<li>margin: 바깥 여백<pre><code class="language-css">margin-left: auto;
margin-right: auto;
margin: 0 auto;</code></pre>
<code>margin: 0 auto;</code>: 단축속성(Shorthands)
<code>margin-left:auto</code>와 <code>margin-right:auto</code>를 한줄로 표현<span style="color:#d3d3d3">
참고) https://hansolcha.tistory.com/4 </span>

</li>
</ul>
<hr>
<ul>
<li>padding: 안쪽 여백<pre><code class="language-css">width: 400px;
padding: 60px;</code></pre>
padding은 전체 width에 +@되는 특성을 가진다
=자신의 너비, 높이에 더해진다
예시에서, 전체 너비=400px+60px로 계산</li>
</ul>
<hr>
<ul>
<li>border: 테두리, 자신의 너비 및 높이에 더해진다<pre><code class="language-css">border-width: 4px;     -&gt; 테두리의 두께
border-style: solid;   -&gt; 테두리 모양
border-color: orange;  -&gt; 테두리 색
</code></pre>
</li>
</ul>
<p>*** 단축속성을 활용하면
border: 4px solid orange;</p>
<p>```</p>
<ul>
<li>border-radius: 테두리의 각진 부분을 조절하는 property<span style="color:#d3d3d3">
border-radius 사용) https://developer.mozilla.org/en-US/docs/Web/CSS/border-radius</span>


</li>
</ul>
<hr>
<h2 id="용어정리">용어정리</h2>
<p><del>라고 쓰고 어디에 넣어야 할 지 모르는 것들...모음</del></p>
<ul>
<li>selector 셀렉터: 선택을 해주는 요소, 특정 요소를 선택하여 스타일을 적용할 수 있음<ul>
<li>부모, 부모의 형제, 부모 형제의 자식을 선택하는 선택자는 존재x</li>
</ul>
</li>
<li>inheritance 상속: 부모 요소에게 지정된 속성 중 몇 가지는 자식 요소로 값이 전달</li>
<li><code>&lt;ul&gt;</code>: unordered list</li>
<li>img src에서 src : Attribute; 속성, 특성</li>
<li>경로에서 ./→ 현재 위치, 생략가능</li>
<li>*: Universal Selector: 전체 선택자<ul>
<li>html페이지 내부의 모든 태그를 선택<ul>
<li>모든 형태의 모든 요소를 선택함</li>
<li>문서 전체에 한번에 적용해야하는 스타일이 있을 때 사용</li>
</ul>
</li>
</ul>
</li>
</ul>
<hr>
<p>끝 </p>
<span style="color:#d3d3d3">
 벨로그는 처음 써봤는데 역시 노션에 익숙해져 있어서 그런가 마크다운 찾아보며 열심히 써봤는데.. 너무 힘들었다.<br>
 스터디도 처음 하게 되었는데, 생각과는 다르게 내가 말을 너무 못해서 같이 하신 분들이 내 생각을 이해하셨을지도 모르겠다. 죄송합니다.. 내일은 더 정리해서 올게요 😅
  <br>
  그리고 멘토님께서 스터디 처음부터 끝까지 너무 많은 도움을 주셔서 감사했다. 특히 마치기 전에 질문 목록을 주셔서 한 번 더 공부를 할 수 있게 되었다. 🤓<br>
  주신 질문 목록에는 내가 안다고 생각하고 대충 넘겼으나 정작 제대로 된 답을 낼 수 없는 질문들이 수두룩했다..ㅋㅋㅋ 그래서 다시 찾아보면서 열심히 공부하게 되었다.<br>
  멋사 시작한지 아직 2일차지만, 정말 강사님과 멘토님, 매니저님께서 모두를 위해 열심히 도와주고 계신다는 생각이 들었다. 이런 분들과 함께라면 정말 끝까지 할 수 있을 것 같다..!!! 감사합니다  ❤️<br>
  나는 이제.... 정말 벨로그 정리를 끝내고, 멘토님께서 주신 질문 목록의 답변도 정리하고 내일을 위해 휴식을..... 취해야징!!!! 내일은 오늘보다 더 질문도 많이 하고 답변도 많이 해야겠다~~~
  </span>
  <br>
  <br>
 <span style="color:#d3d3d3">
  **그리고 오늘 과제하면서 참고한 블로그 첨부<br>
과제하면서 어려운 점은 없었으나, 예제에는 h1 글자 밑에 분명 밑줄인 것 같은데 밑줄과 글자 사이 여백이 더 넓어서 찾아보다가 엄청 유용한 정보 발견함<br>글써주셔서 감사합니다..
나중에 더 지식이 쌓이면 이 곳의 모든 내용을 이해할 수 있겠지..?<br>
https://selinak.tistory.com/49
  </span>]]></description>
        </item>
    </channel>
</rss>