자바스크립트에서(파이썬이나 다른 프로그래밍 언어에서도 마찬가지일 것이다) 조건이 충족되면 어떤 코드가 실행될 수 있도록 제어할 수 있다.

if (false) {
	console.log("Hello, world");
}

위의 console.log는 실행되지 않는다. ()안에 들어오는 코드가 조건인데, 이미 조건이 false로 전제되어 있기 때문이다. true로 되어 있다면 console.log는 실행된다. 하지만 false와 true로 조건문을 실행하는 것은 무의미하다. false라면 그냥 코드를 안적으면 되는 것이고 true라면 if 없이 쓰면 되기 때문이다.

 

이렇게 if문을 통해서 ()안의 조건이 충족되면 {}의 코드가 실행되도록 할 수 있다. 더 나아가 else if, else를 써서 'A라면 B를 해주세요, 하지만 C라면 D를 해주세요. 이도저도 아니면 E를 해주세요'라는 조금 더 복잡한 조건문을 만들 수 있다.

if (A) {
	B
} else if (C) {
	D
} else {
	E
}

물론 위의 A, B, C, D, E는 아무것도 정의되지 않은 코드이기 때문에 정상적으로 실행되지 않는다. console로 실행해보니 에러가 뜬다.

 

var something = true;
var moreSomething = true;

if (something) {
	console.log("I am inside something");

	if (moreSomething) {
    	console.log("I am inside moreSomething)";
    } else {
    	console.log("I never gets called");
    }
} else {
	console.log("I never gets called either");
}

// 위와 같이 실행할 경우
// I am inside something
// I am inside moreSomething
// 만 출력된다.

이렇게 서로 if문에 if문이 들어가도록 중첩되게 사용할 수도 있다.

 

if (A) {
  // one..
} else if (B) {
  // two..
} else if (C) {
  // three..
} else if (D) {
  // four..
} else if (E) {
  // five..
} else {
  // six..
}

유의할 점으로, 위와 같이 코드를 짰을 때 A랑 C가 true더라도 A 조건의 one만 실행된다. else는 '~~가 아니면 ~~을 해라'라는 뜻이기 때문에, 앞의 것이 true이면 뒤의 것은 실행되지 않는다.

 

  • Quiz
if (true) {
  console.log(1);
} else if (true) {
  console.log(2);
} else {
  console.log(3);
}

if ("") {
  console.log(1);
} else if ("a") {
  console.log(2);
} else {
  console.log(3);
}

if (null) {
  console.log(1);
} else if (5) {
  console.log(2);
} else {
  console.log(3);
}

맨 위의 if문은 맨 처음부터 true이므로 1이 출력된다. 두 번째 if문에서는 처음에는 Falsy값인 ""이 조건으로, false로 인지하기 때문에 두 번째에서 Truthy 값인 "a"가 true로 인식되어 2가 출력된다. 3번째도 마찬가지로 처음에 Falsy값인 null로 인해 false로 인지하여 1이 출력되지 않고 두 번째에서 Truthy값인 5를 true로 인지하여 2가 출력된다.

 

  • Switch

if문과 비슷한 것이 switch문인데 switch문은 case를 사용한다.

var expr = 'Bananas'

switch (expr) {
  case 'Oranges':
    console.log('Oranges are $0.59 a pound.');
    break;
  case 'Apples':
    console.log('Apples are $0.32 a pound.');
    break;
  case 'Bananas':
    console.log('Bananas are $0.48 a pound.');
    break;
  case 'Cherries':
    console.log('Cherries are $3.00 a pound.');
    break;
  case 'Mangoes':
  case 'Papayas':
    console.log('Mangoes and papayas are $2.79 a pound.');
    break;
  default:
    console.log('Sorry, we are out of ' + expr + '.');
}

console.log("Is there anything else you'd like?");

// 위의 코드를 실행할 경우
// 'Bananas are $0.48 a pound.'
// "Is there anything else you'd like?")
// 가 출력된다.

말그대로 해당되는 case를 찾아간다. 

var expr = 'Bananas';
switch (expr) {
  case 'Oranges':
    console.log('Oranges are $0.59 a pound.');
    break;
  case 'Apples':
    console.log('Apples are $0.32 a pound.');
    break;
  case 'Bananas':
    console.log('Bananas are $0.48 a pound.');

  case 'Cherries':
    console.log('Cherries are $3.00 a pound.');
    break;
  case 'Mangoes':
  case 'Papayas':
    console.log('Mangoes and papayas are $2.79 a pound.');
    break;
  default:
    console.log('Sorry, we are out of ' + expr + '.');
}

console.log("Is there anything else you'd like?");

// 'Bananas' case에 break가 빠져있다.
// Bananas are $0.48 a pound.
// Cherries are $3.00 a pound.
// Is there anything else you'd like?
// 가 출력된다.

이 때 주의할 것이 break인데, break를 각 case마다 설정해두지 않는다면 다음 case문이 실행된다.

var expr = 'Pineapple';
switch (expr) {
  default:
    console.log('Sorry, we are out of ' + expr + '.');
  case 'Oranges':
    console.log('Oranges are $0.59 a pound.');
    break;
  case 'Apples':
    console.log('Apples are $0.32 a pound.');
    break;
  case 'Bananas':
    console.log('Bananas are $0.48 a pound.');
    break;
  case 'Cherries':
    console.log('Cherries are $3.00 a pound.');
    break;
  case 'Mangoes':
  case 'Papayas':
    console.log('Mangoes and papayas are $2.79 a pound.');
    break;
}

console.log("Is there anything else you'd like?");

// 위 코드를 실행할 경우
// 'Sorry, we are out of Pineapple.'
// 'Oranges are $0.59 a pound.'
// "Is there anything else you'd like?"
// 가 출력된다.

또 다른 주의점은 default문이다. 아무것도 해당하지 않을 경우 기본적인 문구가 나오도록 설정하는 것인데, 위와 같이 맨 마지막에 위치한 경우가 아닐 경우 defauly문에는 break가 없기 때문에 break를 만나기 전까지의 코드가 실행된다. 따라서 default는 마지막에 넣어주는 것이 좋다.

 

switch 참고 출처 : https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Statements/switch

  • Truthy and Falsy

자바스크립트에서 7가지로 값을 나누는 기준과 별개로, 다른 기준이 한 가지 더 존재하는데 Truthiness와 Falsiness다. 진실성과 거짓성인데 자바스크립트의 모든 값들은 이 둘 중 한 가지에 속한다.

0
-0
false
undefined
null
""
''
``
NaN

위의 값들은 Falsy이고 그 외의 모든 값들은 Truthy이다. 자바스크립트가 문맥을 파악할 때, false라고 여겨지는 것들이 falsy이다. 위의 값들이 if문의 조건 부분에 들어갈 경우 false를 반환한다.

 

  • Logical NOT Operator
!true; // false
!2; // false
!"abc"; // false
!(function foo () {}); // false
!{ name: 'jun' }; // false

!false; // true
!""; // true
!0; // true

!연산자를 사용할 때, Boolean(true); 혹은 Boolean(2); 등등 ! 뒤에 오는 값으로 Boolean을 실행했을 때 false가 반환된다면, false가 반환된다. Boolean(false); 혹은 Boolean(0);과 같이 false가 반환되는 값들에게 !연산자를 사용하면 true가 반환된다. 값이 뒤바뀐다.

 

  • Logical OR Operator

|| 로 표현된다. true나 false 값이 아닌, 연산되지 않은 값인 피연산자 값이 반환된다.

 

 - 연산방식

1. 연산자를 기준으로 '왼쪽'부터 Truthy 값을 찾는다.

2. Truthy 값을 찾은 경우, 연산을 중지하고 '해당 값'(true나 false가 아닌)을 반환다.

3. 마지막까지 Truthy 값을 찾지 못한 경우, 마지막에 위치한 값을 반환다.

true || true; // 맨 처음인 맨 왼쪽에서 이미 Truthy 값인 true를 찾았기 때문에 해당 값인 true 반환
true || false; // 마찬가지로 맨 처음 Truthy 값을 찾아서 맨 처음 해당 값인 true 반환
false || true; // 두 번째에서 Truthy 값인 true를 찾았기 때문에 두 번째 해당 값인 true 반환
false || false; // 둘 다 Truthy가 아니기 때문에 마지막까지 Truthy를 못 찾은 경우이다. 따라서 마지막에 위치한 값인 false 반환
"hello" || {}; // 맨 처음부터 Truthy 값인 "hello"를 찾았기 때문에 "hello" 반환
[] || "hello" // 맨 처음부터 Truthy 값인 []을 찾았기 때문에 [] 반환
(function foo() {}) || "hello"; // 맨 처음부터 Truthy 값인 function을 찾았기 때문에 function foo() {} 반환
false || ""; // 둘 다 Truthy가 아니기 때문에 마지맊가지 Truthy를 못 찾은 경우이다. 따라서 마지막 값인 ""을 반환

 

  • Logical AND Operator

&&으로 표현된다. 마찬가지로 true나 false 값이 아닌, 연산되지 않은 값인 피연산자 값이 반환된다.

 

 - 연산방식

1. 연산자를 기준으로 '왼쪽'부터 Falsy값을 찾는다.

2. Falsy 값을  찾은 경우, 연산을 중지하고 해당 값을 반환다.

3. 마지막까지 Falsy 값을 찾지 못한 경우, 마지막에 위치한 값을 반환다.

true && true; // 맨 마지막까지 Falsy인 값을 못 찾았기 때문에 마지막 값인 true를 반환
true && false; // 맨 마지막에서 Falsy를 찾았기 때문에 해당 값인 false 반환
false && true; // 맨 처음부터 Falsy를 찾았기 때문에 해당 값인 false 반환
false && false; // 마찬가지로 맨 처음부터 Falsy를 찾았기 때문에 해당 값인 false 반환
"hello" && {}; // 맨마지막까지 Falsy를 못 찾았기 때문에 마지막 값인 {} 반환
[] && "hello"; // 맨마지막까지 Falsy를 못 찾았기 때문에 마지막 값인 "hello" 반환
"" && "hello"; // 맨 처음부터 Falsy를 찾았기 때문에 해당 값인 "" 반환
(function foo() {}) && "hello"; // 맨마지막까지 Falsy를 못 찾았기 때문에 마지막 값인 "hello" 반환
false && ""; // 맨 처음부터 Falsy를 찾았기 때문에 해당 값인 false 반환

 

하나라도 Truthy가 있다면 그 해당 값을 반환하는 것이 OR이고(논리 연산을 할 때 1 OR 1 OR 0 OR 0 하면 값은 1이지 않는가) 하나라도 Falsy가 있다면 그 해당 값을 반환하는 것이 AND라고 생각하면 될 것 같다.(논리 연산할 때 1 AND 1 AND 1 AND 0 AND 1은 1이지 않는가!)

 

눈으로만 볼 때는 이해가 안됐는데 console로 직접 하나하나 실행해보니까 이해가 된다. 내가 생각했던 논리 연산자 NOT, OR, AND랑 달라서 헷갈렸던 것 같다.

'프로그래밍 > 바닐라코딩_Prep Guide' 카테고리의 다른 글

Step 2. JavaScript(5) - for, 반복문  (0) 2021.11.25
Step 2. JavaScript(4) - if, 조건문 + switch  (0) 2021.11.25
Step 2. JavaScript(2)  (0) 2021.11.25
Step 2. JavaScript(1)  (0) 2021.11.24
Step 1. Google Clone  (0) 2021.11.14
  • Numbers

자바스크립트에서는 숫자를 이용해서 많은 연산이 가능하다.

var num = 1;
console.log(num); // 1

var num2 = num * 2;
console.log(num2); // 2

// %는 나머지를 구해주는 연산자이다.
var remainder1 = 30%4;
console.log(remainder1); // 2

var remainder2 = 100%5;
console.log(remainder2); // 0

// 알다시피 곱셈과 나눗셈이 더하기, 빼기보다 우선시로 실행된다.
var result = 3 + 7*2;
console.log(result); // 17

// 비교 또한 가능하다.
var result = 3 > 7;
console.log(result); // false

var result = 3 >= 1;
console.log(result); // true

var one = 5;
var two = 5;
console.log(one === two); // true

// 코드 길이를 줄일 수 있는 간단한 연산자들
var a = 1;
a += 1; // a = a + 1;
console.log(a); // 2

a += 2; // 4
a -= 1; // 3
a *= 3; // 9
a /= 3; // 3

a++; // 4
a--; // 3
a** // 실행 안됨
a// // 실행 안됨

// 유효하지 않은 연산
var a = 0;
var b = 0;
var c = a/b;
console.log(a/b); // NaN

// NaN인지 판별해주는 함수
console.log(isNaN(c)); // true

// 연산자가 어떤 종류의 값인지 판별해주는 연산자
var a = typeof 10; // 10의 유형이 무엇이느냐 -> number -> a = number
console.log(a); // number

 

  • String, 문자열
var a = typeof 3;
console.log(a); // number

var number = 30;
var something = typeof number; // 30의 유형이 something에 저장되므로 something은 "number"이다.
console.log(number === something); // false
console.log(number == something); // false

큰따옴표, "" 혹은 작은 따옴표, ''로 표현되는 문자들을 String, 문자열이라고 한다. 위에서 3의 유형은 number이고 console.log로 a를 확인했을 때 문자열인 "number"가 출력된다.

 

something에는 30이라는 값이 저장된 number의 유형이 대입되는데, 30의 유형은 number라는 문자열이다. 따라서 console.log로 확인했을 때 30이라는 숫자가 저장된 number와 "number"라는 문자열이 저장된 something의 유형 자체부터 다르므로 false가 뜬다. 값 또한 30과 "number"로 다르기 때문에 ==으로 비교해도 false가 뜬다.

 

 - 문자열 붙이기

var s1 = "something";
var s2 = "else";
var result = s1 + s2;

console.log(result); // "somethingelse"

문자열을 더했을 때는 위의 결과처럼 서로 '붙여진다'.

 

 - 문자열 비교

var s1 = "abc";
var s2 = "abc";

var result = s1 === s2;
console.log(result) // true;

var s3 = "abc "; // 공백 포함
var s4 = "abc"; // 공백 미포함

var result2 = s3 !== s4; // !==는 서로 다른지 물어보는 연산자이다.
console.log(result2); // 서로 다르므로 true

 

 - 문자열 길이

var str1 = "abc";
console.log(str1.length); // 3

var str2 = "   "; // 공백 3칸
console.log(str2.length); // 3

console.log("graph-ql".length); // 8

 

 - 문자열 인덱스

var str = "abcdef";
console.log(str[0]); // "a"

console.log("cde"[2]); // "e"

인덱스는 위치를 나타낸다고 보면 된다. 인덱스는 항상 0부터 시작하므로 abcdef의 0번째는 a가 되고, cde의 2번째는 e가 된다.

 

 - 문자열 메서드

'6'.repeat(3); // 문자열 '6'을 3번 반복해 붙인다. '666'
'hi jun'.includes(' ju'); // ' ju'을 포함하고 있는가? true
'what are you doing?'.startsWith('what '); // 'what '으로 시작하는가? true
'I am doing FiNe'.endsWith('iNe'); // 'iNe'로 끝나는가? true
'Are you sure?'.indexOf(' yo'); // ' yo'가 시작되는 index는? 3
'Are you sure?'.indexOf('z'); // z가 포함되지 않다. indexOf는 이럴 때 -1을 반환한다.
'Are you sure?'.indexOf('are'); // indexOf는 대소문자를 구분한다. 따라서 이때도 -1을 반환한다.
'Yeah I am sure'.slice(2, 5); // 2번째와 5번째(5번째는 미포함)사이의 값들을 반환한다. 'ah '
'I?doubt?that'.split('?'); // ?을 기준으로 분리한다. (3) ['I', 'doubt', 'that']
'Why would you doubt my word?'.split(''); // ''안의 값들을 하나하나씩 분리한다.
// (28) ['W', 'h', 'y', ' ', 'w', 'o', 'u', 'l', 'd', ' ', 'y', 'o', 'u', ' ', 'd', 'o', 'u', 'b', 't', ' ', 'm', 'y', ' ', 'w', 'o', 'r', 'd', '?']
'You hAve BeEn DiSHonest'.toLowerCase(); // 소문자로 반환한다. 'you have been dishonest'
'No wAy!'.toUpperCase(); // 대문자로 반환한다. 'NO WAY!'

 

  • Types, 유형들

자바스크립트에서 다뤄지는 값들의 종류는 총 7가지가 있다.

 

 - String, 문자열

var s1 = 'ju';
var s2 = 'n';
console.log(s1 + s2); // jun

console.log((s1 + s2)[1]); // u

var s3 = s1 + s2;
console.log(s3[2]); // n

따옴표를 이용해 표현하고, 문자열끼리는 더해질 수 있다.(정확히는 붙여지는 것)

 

또한 index를 사용해서 문자열의 각 부분에 접근할 수 있다.

 

 - Number, 숫자

덧셈과 뺄셈, 곱셈과 나눗셈이 가능하며 연산 우선 순위 또한 우리가 아는 바와 같다. Infinity나 -Infinity로 무한대 또한 표현 가능하다.

var i = Infinity;
console.log(typeof i); // number
console.log(i/1); // Infinity

 - Boolean, 논리값

true와 false 두 가지 값이 있다.

 

 - Undefined, 정의되지 않은 값

 

 - Null, 없음

undefined와 null이 '없음'을 나타내는 용도로 쓰인다는 점이 비슷해도, 대입한 적이 없는 변수(undefined)와 의도적으로 '없음'을 나타내는 경우(null)는 구분되어 사용된다.

 

 - Object, 객체

배열이나 함수와 같은 객체. 무언가로 이루어진 집단이라고 표현해도 될지 모르겠다.

const person = []; // 빈 객체 생성
person.name = 'jun'; // 빈 객체 내에 key와 value 생성(name이 key이고, 'jun'이 value다)
console.log(person.name); // 'jun'
console.log(person); // [name: 'jun']
console.log(typeof person); // object

const list = [1, 2, 3];
console.log(typeof list); // object

function foo() {};
console.log(typeof foo); // function

 

 

Javascript는 웹 페이지의 컨텐츠가 바뀌는 등 동적인 움직임을 줄 때 주로 사용된다.

 

  • Variable

어떠한 값을 저장하여 불필요한 중복을 줄여주고 재사용할 수 있다. 이것을 가능케 하는 것이 변수(Variable)이다.

var one = 1;
var something = function hello() {};
var array = [1, 2, 3];
var name = 'Jun';

위와 같이 숫자, 함수, 배열, 문자열 등을 넣을 수 있다. 자바스크립트에서 '='는 오른쪽에 위치한 값을 왼쪽 변수에 대입하겠다는 의미이다. 자바스크립트에서 변수로 선언하기 위해서는 위와 같이 앞에 var(혹은 const)를 붙여주어야 한다.

 

  • Identifiers
var jun; // valid
var _jun; // valid
var $jun; // valid
var 7jun; // invalid
var if; // invalid
var for; // invalid

변수를 선언할 때 우리가 지어주는 이름을 Identifier라고 칭한다. 자바스크립트에서는 Identifier를 정할 때 몇 가지 규칙이 있다.

 

숫자, 알바펫, $, _가 포함될 수 있다. 허나 숫자로 시작해서는 안된다.(var 7jun; // invalid) 그리고 for, if, function과 같이 이름만으로 자바스크립트에서 어떠한 기능을 수행 중인 단어(예약어)는 Identifier로 사용할 수 없다.

 

참고로 위와 같이, 대입 연산자 없이 그저 변수를 선언하기만 하면 변수에는 undefined라는 값이 설정된다.

 

  • Boolean

Boolean, 불린이라고 발음하며 true(참) 혹은 false(거짓) 값만을 가질 수 있는, 참 혹은 거짓으로 논리를 따지는 논리적인 데이터 유형이다. 기호 논리학 분야의 선구자인 영국 수학자, 조지 불의 이름을 따와 만들어졌다.

var t = true;

 

  • null & undefined

null과 undefined 모두 자바스크립트에서 '없음'을 표현할 때 사용된다. 비슷한 의미이지만 다른 용도로 사용된다.

var nothing1 === null;
console.log(nothing1 === null); // true

var nothing2 === undefined;
console.log(nothing2 === undefined); // true;

console.log(nothing1 === nothing2); // false;

위와 같이 null과 undefined가 같냐고 자바스크립트로 물었을 때 false가 뜨는 것을 알 수 있다. 이는 자바스크립트에서 둘을 다르게 인식한다는 것이다. 당연히 다르게 쓸거니까 이름을 다르게 만들지 않았을까.

 

undefined는 말처럼 정의되지 않았다는 뜻으로 우리가 어떠한 값도 지정해주지 않았을 때 사용된다. 값이 대입되지 않은 상태인 것이다.

var k;
console.log(k); // undefined

var k = 'something'이 아닌, 그저 var k;로 끝났기 때문에 우리는 k에게 아무런 값도 지정해주지 않은 셈이다. 따라서 console.log로 k를 확인해보면 정의되지 않았다는 뜻인 undefined가 뜬다.

 

굳이 var k = undefined;를 해주지 않아도 var k;만으로 undefined가 되니 var k = undefined;라고 쓰진 않는다.

var k;
console.log(k); // undefined

var l = undefined;
console.log(l); // undefined

undefined와 비슷하지만 다르게도, null은 '의도적으로! 값이 없음'을 표현할 때 사용된다.

var obj = {
	name: 'jun'
};

// 위 obj를 활용한 작업 실행

// 더 이상 obj를 사용하지 않을 것이기 때문에 obj를 의도적으로 '없음'으로 만듦

obj = null;

인터넷 쇼핑몰에서 자신이 사고 싶은 것들을 장바구니에 담아 구입하고 난 뒤, 장바구니를 클릭했을 때 '없음'이 뜨는 예가 바로 null을 활용한 것이 아닐까?

'프로그래밍 > 바닐라코딩_Prep Guide' 카테고리의 다른 글

Step 2. JavaScript(3) - Truthy and Falsy + Logical Operator  (0) 2021.11.25
Step 2. JavaScript(2)  (0) 2021.11.25
Step 1. Google Clone  (0) 2021.11.14
Step 1. CSS  (0) 2021.11.02
Step 1. HTML  (0) 2021.10.29

배웠으면 적용을 해보는 것이 지식을 몸에 베게하는 가장 좋은 습관인 것 같다. Step 1의 마지막 내용으로 Google Clone이 있는데, Google 홈페이지가 Naver 처럼 복잡하지 않고 간단하다보니 비교적 배운 지식을 써먹기 좋을 것 같다.

 

일단 틀만 잡아보았다.

조금 어거지인 면도 있는 것 같은데 일단 시멘틱 구조를 최대한 적용해보고자 해당 사진처럼 구조를 잡았다. ㅎㅎㅎ

 

  • header - HTML
    <header>
      <div class="icon">
        <a href="#" class="icons gmail">Gmail</a>
        <a href="#" class="icons image">이미지</a>
        <a href="#" class="icons"
          ><img src="application.png" id="application"
        /></a>
        <button class="icons user">Jun</button>
      </div>
    </header>

 

gmail, icon, application, user를 '같이' 오른쪽 상단에 나란히 배치하기 위해 class="icon"의 div 태그에 포함시켰다. application은 flaticon에서 따왔다.

  •  header - CSS
      .icon {
        display: flex;
        justify-content: flex-end;
        margin-top: 10px;
        margin-right: 15px;
      }

      .icons {
        margin: 10px;
      }

      .gmail,
      .image {
        font-size: 13px;
        text-decoration: none;
        color: black;
      }

      .gmail:hover,
      .image:hover {
        text-decoration: underline;
      }

      #application {
        width: 20px;
      }

      .user {
        border: 1px solid white;
        border-radius: 100px;
        background-color: red;
        color: white;
        height: 35px;
        width: 35px;
        margin-top: 5px;
      }

 

 

class="icon"인 div 태그에 flex를 부여하고 justify-content: flex-end;를 통해 오른쪽 상단에 위치하도록 하였다. class="icons"인 div 태그들에게는 margin: 10px;를 줘서 서로 일정 간격 떨어지게 해주었다. gmail과 image는 링크 태그이지만 마우스를 갖다대지 않은 상태에선 밑줄이 안보기이게 text-decoration: none;으로 해주었다. 마우스를 갖다댔을 때는 밑줄이 생기기에 :hover를 이용하여 text-decoration: underline;을 부여해주었다.

 

개인적으로 user 모양(Jun의 글자가 들어간 빨간색 원 모양 icon)을 맞추는 것이 가장 어려웠다. 원의 특성상 지름이 어디서든 같기 때문에 height와 width를 똑같이 35px로 맞추고 border-radius: 100px;로 모서리를 없애 원을 만들었다.

 

  • section - HTML
        <section>
          <article>
            <div class="google-logo">
              <img
                src="https://www.google.com/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png"
              />
            </div>
            <div class="searching-bar">
              <i id="magnifier"><img src="magnifier.png" /></i>
              <input type="search" />
              <i id="keyboard"><img src="keyboard.png" /></i>
              <i id="microphone"><img src="microphone.png" /></i>
            </div>
            <div class="rest">
              <button>Google 검색</button>
              <button>I'm Feeling Lucky</button>
            </div>
            <div class="covid">
              <a href="#" style="text-decoration: none"
                >가까운 코로나19 선별진료소를 확인하세요</a
              >
            </div>
            <div class="language">
              Google 제공 서비스 :
              <a href="#" style="text-decoration: none">English</a>
            </div>
          </article>
        </section>​
     

class="searching-bar"인 div 태그 안에 돋보기, input(search type), 키보드, 마이크를 넣었다.

 

  • section - CSS
      .google-logo {
        margin-top: 240px;
        text-align: center;
      }

      .searching-bar {
        margin-top: 20px;
        text-align: center;
      }

      .searching-bar img {
        width: 20px;
      }

      .searching-bar input {
        border-radius: 45px;
        width: 550px;
        height: 40px;
      }

      #magnifier {
        position: relative;
        top: 5px;
        left: 40px;
      }

      #keyboard,
      #microphone {
        position: relative;
        top: 5px;
        right: 65px;
      }

      #keyboard {
        right: 70px;
      }

      .rest,
      .covid,
      .language {
        margin-top: 25px;
        text-align: center;
        font-size: 13px;
      }

      .rest {
        display: flex;
        justify-content: center;
      }

      .rest button {
        border: none;
        border-radius: 5px;
        height: 40px;
        margin: 5px;
      }

google-logo는 header와 240px 만큼의 상단 마진이 남게 해주어 차이를 주었고 text-align을 통해 중앙에 배치하였다. searching-bar 또한 text-align을 통해 중앙에 배치시켰고, searching-bar img { width: 20px; }를 통해 class="searching-bar"인 div 태그 안의 img 태그들의 크기는 20px로 통일시켰다.(돋보기, 키보드, 마이크의 크기가 20px이 된 셈이다) 그리고 돋보기와 키보드, 마이크에 position: relative;를 부여해 searching-bar 안에 들어오도록 조정했다. 이 때 이 3개의 이미지는 부모 태그인 <div class="searching-bar">를 기준으로 위치가 정해진다.

 

  • footer - HTML
    <footer>
      <div class="country">대한민국</div>
      <div class="realfooters">
        <div class="realfooter">
          <button>Google 정보</button>
          <button>광고</button>
          <button>비즈니스</button>
          <button>검색의 원리</button>
        </div>
        <div class="realfooter2">
          <button>개인정보처리방침</button>
          <button>약관</button>
          <button>설정</button>
        </div>
      </div>
    </footer>

Google 정보, 광고, 비즈니스, 검색의 원리 이 4개와 개인정보처리방침, 약관, 설정은 이 3개는 각각 오른쪽, 왼쪽에 배치되기 때문에 나누어서 div 태그에 담아주었다.(realfooter : 4개, realfooter2 : 3개)

 

  • footer - CSS
      footer {
        background-color: rgb(241, 238, 238);
        width: 100%;
        position: fixed;
        bottom: 0;
        left: 0;
      }

      .country {
        border-bottom: 1px solid rgb(214, 211, 211);
        padding-top: 15px;
        padding-bottom: 15px;
        padding-left: 15px;
      }

      .realfooters {
        padding-top: 15px;
        padding-bottom: 15px;
        padding-left: 10px;
        display: flex;
      }

      .realfooters button {
        border: none;
      }

      .realfooters button:hover {
        text-decoration: underline;
      }

      .realfooter2 {
        position: absolute;
        right: 15px;
      }

footer가 화면에서 맨 밑에 나오도록 position: fixed;를 부여하고 bottom: 0;와 left: 0;을 부여했다. 3개의 항목으로 이루어진 realfooter2는 display: flex;가 부여되어 있기 때문에 realfooter와 나란히 배치되고 position: absolute와 right: 15px 를 통해 오른쪽에 배치된다.

 

완성본!

생각보다 비슷하게 만든 것 같다!

 

하지만 해결하지 못한 문제점도 있다.

보다시피 크기가 줄어들면 searching-bar 안의 이미지들이 엇나가기 시작한다... CSS를 좀 더 이용해보고 언젠가 다시 해보아야겠다.

 

그래도 Google 홈페이지를 Clone하면서 flex, margin, position에 대해 더 자세히 검색하면서 익숙해질 수 있었다.

 

참고 출처 : https://velog.io/@shanells/Google-clone-coding

'프로그래밍 > 바닐라코딩_Prep Guide' 카테고리의 다른 글

Step 2. JavaScript(2)  (0) 2021.11.25
Step 2. JavaScript(1)  (0) 2021.11.24
Step 1. CSS  (0) 2021.11.02
Step 1. HTML  (0) 2021.10.29
준비를 위한 준비  (0) 2021.10.28

직장인이라는 핑계가 있음에도 불구하고 너무 속도가 처지는 것 같다. 이럴 땐 조금은 강제성이 필요하다고 보는데 마침 노마드 코더의 챌린지를 찾게 되었다. '코코아톡 클론 코딩' 챌린지에 참여해보려고 하는데 예습은 물론이고 하루 3 ~ 5시간의 할당은 필요하다고 한다. 마침 야간 교대조와 겹쳐서 일 끝나면 쥐죽은 듯이 코딩하자는 마음가짐도 생긴다.

 

노마드코더 챌린지 : https://nomadcoders.co/challenges

 

Challenges – 노마드 코더 Nomad Coders

멱살 잡고 캐리하는 챌린지? 무료로 시작하세요!

nomadcoders.co

 

 

+++ 21-11-24

 

후... 야속하게도 실패했다. 포기했다는 것이 맞겠다. 예습도 없이 했던 게 조금 힘들었던 것 같다. 야간 근무를 끝내고 돌아오면 쉬고자 하는 마음도 컸다... 하지만 과제도 실력 발전에 상당히 도움이 되는 과제였어서 다시 해보고 싶다. 12월 13일에 다시 열리던데 그 때 또 도전해봐야겠다.

 

+++ 21-12-12

 

좋아. 11월 24일에 다시 마음 먹은 것처럼 챌린지에 재지원 해놓았다. 솔직히 이번에도 끝까지 달릴 수 있을지 모르겠다. 바닐라JS도 신청해놨기 때문... 그래도 안하는 것보단 일단 해놓는 것이 나를 발전시킬 것이다.

+ Recent posts