- slick js 다운로드 받기 (CDN 가능 -> 공식사이트에 있다)

https://kenwheeler.github.io/slick/

 

slick - the last carousel you'll ever need

slick is a responsive carousel jQuery plugin that supports multiple breakpoints, CSS3 transitions, touch events/swiping & much more!

kenwheeler.github.io

 

menu > get it now 클릭 

 

다운로드 후  

우리가 필요한 파일은 맨위 slick폴더이다. (나머지는 지우기)

 

- slick 폴더에서 필요한 파일만 나두고 지우기 

(필수) slick.css(또는 min.css) /slick.js/slick-theme.css/ 

(선택) ajax-loader.gif, fonts폴더

 

 

내 워크스페이스에 slick폴더 추가 (link로 연결하기 위해서)

<!-- <head></head> 안에 연결 -->
	<!-- Slick.js -->
	<link rel="stylesheet" href="plugin/slick/slick-theme.css">
	<link rel="stylesheet" href="plugin/slick/slick.css">
	<script src="plugin/slick/slick.js"></script>

 

 

- 기본 사용법

(slick-thmem.css를 연결하지 않으면 dots:true 일 때 모양이 안예쁘게 나옴)

	<div class="slider">
		<div>content 1</div>
		<div>content 2</div>
		<div>content 3</div>
		<div>content 4</div>
		<div>content 5</div>
		<div>content 6</div>
		<div>content 7</div>
		<div>content 8</div>
		<div>content 9</div>
	</div>

	<script>
		$('.slider').slick();
	</script>
		.slider {
			width: 800px;
			margin: auto;
		}
		.slider div {
			border: 1px solid #000;
			height: 300px;
			line-height: 300px;
			text-align: center;
			background: #ddd;
		}

 

 

 

- (옵션)

$('.slider').slick({
	// 디폴트
	// infinite: true, 
	
	slidesToShow: 3, // 몇개씩 보여줄건지	
	slidesToScroll: 3, // 몇개씩 넘길건지

	//자동재생 2s
	autoplay: true,
	autoplaySpeed: 2000,

	// fade
	// speed: 500,
	// fade: true,
	// cssEase: 'linear'

	dots: true, // dots 아이콘

	// 반응형
	responsive: [
	{
		breakpoint: 1024,
		settings: {
			slidesToShow: 3,
			slidesToScroll: 3,
			infinite: true,
			dots: true
		}
	},
	{
		breakpoint: 600,
		settings: {
			slidesToShow: 2,
			slidesToScroll: 2
		}
	},
	{
		breakpoint: 480,
		settings: {
			slidesToShow: 1,
			slidesToScroll: 1
		}
	}
	]
});
		@media (max-width: 768px) {
			.slider {
				width: 100%;
			}
			.slider .slick-arrow {
				display: none !important;
				/* 슬릭슬라이더가 우선순위를 가지고 있기 때문에 변경이 안되면 !important 필요 */
			}
			.slider .slick-dots {
				border: 1px solid #000;
				bottom: 0;
			}

 

css수정할 때 개발자도구에서 클래스명을 보고 바꾸면 된다.

 

 

스크롤하면 헤더, btn-top버튼에 active클래스를 추가하여 변경하기

<head>안에 폰트어썸, 제이쿼리 연결 !!!

	<div class="container">
		<header>
			<div class="lnb-inner">lnb-inner</div>
			<div class="gnb-inner">gnb-inner</div>
		</header>
		<section class="main">
			<p>lorem100</p>
		</section>
		<a href="#" class="btn-top">
			<i class="fas fa-arrow-up"></i>
		</a>
	</div>
		* {
			box-sizing: border-box;
		}
		body {
			margin: 0;
			padding: 0;
		}
		header {
			position: fixed;
			width: 100%;
			top: 0;
			left: 0;
			color: #fff;
			text-align: center;
		}
		.lnb-inner, 
		.gnb-inner {
			transition: .5s;
		}
		.lnb-inner {
			background-color: crimson;
			height: 40px;
			line-height: 40px;
			overflow: hidden;
		}
		.gnb-inner {
			background-color: #000;
			height: 80px;
			line-height: 80px;
		}

		/* Active Class */
		header.act .lnb-inner {
			height: 0;
		}
		header.act .gnb-inner {
			background-color: #fff;
			color: #000;
			box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
		}

		section.main {
			font-size: 3em;
			line-height: 2em;
			color: #bbb;
		}
		.btn-top {
			opacity: 0;
			bottom: 0px;
			/* opacity: 0;
			transform: translateY(80px); */
			transition: .5s;
			
			position: fixed;
			/* bottom: 20px; */
			right: 20px;
			width: 40px;
			height: 40px;
			line-height: 44px;
			text-align: center;
			background-color: #000;
			border-radius: 50%;
		}
		.btn-top i {
			font-size: 25px;
			color: #fff;
		}
		.btn-top.act {
			opacity: 1;
			bottom: 20px;
			/* transform: translateY(0); */
		}

 

// btn-top 버튼이 아래에서 위로 올라오는효과 

1. translateY()

2. bottom: 

		.btn-top {
			opacity: 0;
			bottom: 0px;
			transition: .5s;

			/* 또는 */

			opacity: 0;
			transform: translateY(80px);
			transition: .5s;
		}

		.btn-top.act {
			opacity: 1;
			bottom: 20px;

			/* 또는 */

			opacity: 1;
			transform: translateY(0);
		}

 

 

 

// 제이쿼리

window가 scroll될 때 스크롤탑이 50보다 크면 (스크롤한 상태) >> active클래스추가

else >> remove .active

 

$(window).scrollTop() : 스크롤에 따라 변하는 세로좌표, 맨위(0) ~ 맨아래(max)

 

	<script>
		$(window).scroll(function() {
			if($(window).scrollTop() > 50) {
				$('header, .btn-top').addClass('act');
			} else {
				$('header, .btn-top').removeClass('act');
			}
		});
	</script>

- 제이쿼리 연결 

<head>
	<!-- Jquery -->
	<script src="js/jquery-3.4.1.min.js"></script>
 </head>

 

1. 모달창 만들기

.modal-open 클릭 -> 모달창 열리고 

.overlay .btn-close 클릭 -> 모달창 닫힘 

 

 

 

<button class="modal-open">뉴스레터 구독하기</button>
<div class="modal">
	<div class="modal-wrap">
		<div class="img"></div>
		<div class="modal-content">
			<div class="content-header">
				<h2>소식을 어디로 보내드릴까요?</h2>
				<button class="btn-close">&times;</button>
			</div>
			<div class="content-desc">
				<input type="email" placeholder="이메일 주소를 입력하세요.">
				<button>뉴스레터 구독하기</button>
				<p>
					바쁜 일상, 필요한 정보만을 찾을 시간이 없기에 늘 한두 달 소식이 늦는 월간잡지로 만족하지 않기에 매주 월요일 아침9시 당신께 소식을 전달합니다.
				</p>
			</div>	
		</div>
	</div>
</div>
<div class="overlay"></div>
	* {
		box-sizing: border-box;
	}
	body {
		padding: 0;
		margin: 0;
		font-size: 16px;
		line-height: 1.5em;
	}
	.modal-open {
		cursor: pointer;
	}
	.modal {
		opacity: 0;
		transition: .5s;

		position: fixed;
		top: 50%;
		left: 50%;
		transform: translate(-50%, -50%);
		z-index: 10;
	}
	.modal.act {
		opacity: 1;
	}
	.modal-wrap {
		display: flex;
		width: 600px;
		background-color: #fff;
		box-shadow: 0 0 10px rgba(0, 0, 0, 0.2);
		border-radius: 5px;
		overflow: hidden;
	}
	.modal-wrap > div {
		padding: 25px;
	}
	.modal-wrap .img {
		flex: 1;
		background: url(images/person/office.jpg) no-repeat right center;
		background-size: cover;
	}
	.modal-content {
		flex: 2;
		text-align: center;
	}
	.content-header {
	}
	.content-header h2 {
		margin: 20px 0px 10px;
		font-size: 23px;
		font-weight: bold;
	}
	.btn-close {
		cursor: pointer;

		position: absolute;
		top: 10px;
		right: 10px;
		font-size: 30px;
		border: none;
		background-color: transparent;
		color: #ccc;
	}
	.content-desc input[type=email] {
		display: block;
		width: 100%;
		border: 1px solid #ccc;
		outline: none;
		padding: 8px;
		margin-bottom: 6px;
		text-align: center;
	}
	.content-desc input[type=email]::placeholder {
		color: #bbb;
		transition: .5s;
	}
	.content-desc input[type=email]:focus::placeholder {
		color: transparent;
		opacity: 0;
	}
	.content-desc button {
		cursor: pointer;
		display: block;
		width: 100%;
		padding: 8px;
		background-color: crimson;
		color: #fff;
		border: none;
	}
	.overlay {
		opacity: 0;
		pointer-events: none;

		position: fixed;
		top: 0;
		left: 0;
		width: 100%;
		height: 100vh;
		background: rgba(0, 0, 0, 0.2);
	}
	.overlay.act {
		opacity: 1;
		pointer-events: all;
	}

** input button은 블럭요소로 변경해도 width:100%가 되지 않는다.

** .overlay { pointer-events: none;(존재하지만 마우스 클릭을 받지 않게) 또는 visibility: hidden; 이 필요하다.

오버레이가 화면 전체에 감싸져 있어서 opacity:0이라도 존재하기 때문에 클릭이벤트가 발생하지 않는다.

 

 

	<script>
		$('.modal, .overlay').addClass('act');
		$('.modal-open').click(function() {
			$('.modal, .overlay').addClass('act');
		});
		$('.btn-close, .overlay').click(function() {
			$('.modal, .overlay').removeClass('act');
		});
	</script>

 

 

 

 

2. 반응형 

 

		@media (max-width: 767px) {
			.modal-wrap {
				flex-direction: column;
				width: 100%;
			}
			/* 아이폰6기준 375px > 350px로 설정하면 약간의 여유가 생긴다. */
			.modal-wrap > div {
				width: 350px;
			}
			.modal-wrap .img {
				flex-basis: 250px;
			}
			.content-header h2 {
				margin: 0px 0px 20px;
				font-size: 22px;
			}
		}

처음에 .img에 flex:1로 높이를 잡아놔서 height가 안먹힌다.

flex:1 == flex-grow:1 flex-shrink:0 flex-basis:auto

 

flex 속성에서 값이 1개일 때: flex:1 (number를 지정하면 flex-grow);

flex: 10em | 30% (length | % 를 지정하면 flex-basis); 

 

 

 

 

3. translate 속성

.modal {
	opacity: 0;
	transition: .5s;

	position: fixed;
	top: 50%;
	left: 50%;

	/* 위 -> 아래 */
	transform: translate(-50%, -80%);

	/* 아래 -> 위 */
	transform: translate(-50%, -20%);
	/* 왼 -> 오른쪽, 오른쪽 -> 왼쪽 */
	transform: translate(-80%, -50%);
	transform: translate(-20%, -50%);

	z-index: 10;
}

.modal.act {
	opacity: 1;
	transform: translate(-50%, -50%);
}
		.modal {
			opacity: 0;
			transition: .5s;

			position: fixed;
			top: 50%;
			left: 50%;
			
            /* 작았다가 커지는 효과 */
			transform: translate(-50%, -50%) scale(.8);
			z-index: 10;
		}
		.modal.act {
			opacity: 1;
			transform: translate(-50%, -50%) scale(1);
		}

// 현재 시간 출력

 

 

 

 

- Date 객체를 이용해 현재 시간을 출력

const today = new Date();

today.getHours()
today.getMinutes()
today.getSeconds()

// 1초마다 갱신
setInterval(함수명, 1000);

 

 

- html

<div class="date-wrap">
	<div class="js"></div>
	<div class="date">
		<p class="date-tit">digital clock</p>
		<div class="now">
			<div class="time hour">00</div>
			<div class="divider">:</div>
			<div class="time min">00</div>
			<div class="divider">:</div>
			<div class="time sec">00</div>
		</div>
		<div class="date-desc">
			html, css & javascript
		</div>
	</div>
</div>

 

- css

* {
	box-sizing: border-box;
	margin: 0;
	padding: 0;
}
.date-wrap {
	position: relative;
	display: flex;
	justify-content: center;
	align-items: center;
	width: 100%;
	height: 100vh;
	background: #000;

}
.js {
	position: absolute;
	top: 0;
	left: 0;
	width: 240px;
	height: 240px;
	background: #F7DF1D;
}
.js:after {
	position: absolute;
	right: 20px;
	bottom: 0;
	content: 'JS';
	font-size: 120px;
	font-weight: bold;
}
.date {
	display: flex;
	width: 100%;
	height: 100%;
	flex-flow: column;
	justify-content: space-evenly;
	align-items: center;
	color: #fff;
	text-align: center;
}
.now {
	display: flex;
	justify-content: center;
	align-items: center;
	column-gap: 30px;
	font-family: Rajdhani;
	font-size: 100px;
}
.time {
	width: 150px;
	font-weight: bold;
	letter-spacing: 8px;
	text-align: center;
	text-shadow: 0px 0px 60px mediumturquoise;
}
.date-tit {
	text-transform: uppercase;
	font-family: Permanent Marker;
	font-size: 65px;
	color: #B5115A;
}
.date-desc {
	text-transform: uppercase;
	font-size: 30px;
	font-weight: bold;
	letter-spacing: 5px;
	color: #fff;
	opacity: .6;
	width: 100%;
	margin-top: 70px;
}

 

 

- js

<script>

	// const date = document.querySelector('.date h1');
	const hour = document.querySelector('.hour');
	const min = document.querySelector('.min');
	const sec = document.querySelector('.sec');
	
    function clock() {
		const now = new Date();
		hour.innerText = now.getHours();
		min.innerText = now.getMinutes();
		sec.innerText = now.getSeconds();
	}
	setInterval(clock, 1000);

</script>

 

 

- 간단한 todolist 

 

- html

<div class="container">
	<form action="" class="todolist-form">
		<input type="text" placeholder="할 일을 입력하세요.">
		<button class="btn save-todolist">등록</button>	
	</form>
	<ul class="todolist">
	</ul>		
</div>

 

- css

* {
	box-sizing: border-box;
}
.container {
	position: absolute;
	width: 600px;
	height: 550px;
	padding: 25px 50px;
	top: 50%;
	left: 50%;
	transform: translate(-50%, -50%);
	text-align: center;

	background: rgb(250, 250, 250);
	box-shadow: 3px 5px 20px rgba(0, 0, 0, 0.3);
	border-radius: 25px;
}
.todolist-form {
	display: flex;
	align-items: center;
}
.todolist-form input {
	width: 400px;
	padding: 10px 0 10px 20px;
	margin-right: 10px;
	background: #fff;
	border: 1px solid rgb(90, 90, 90);
	border-radius: 20px;
	outline: none;
}
.todolist-form input:focus::placeholder {
	color: transparent;
}

.btn {
	cursor: pointer;
	width: 90px;
	padding: 10px;
	border: none;
	border-radius: 15px;
	background: #b0dbf1;
	font-weight: bold;
}
ul {
	margin: 20px 0 0 0;
	padding: 0;
	text-align: left;
}
li {
	padding: 3px 5px;
	width: 100%;
	border-bottom: 1px dotted rgb(136, 156, 177);
	list-style: none;
	font-weight: bold;
}

 

 

- js 

<script>
	const todolist_form = 
    document.querySelector('.todolist-form');
	
    const todolist_input = 
    document.querySelector('.todolist-form input');
	
    const btn_save = document.querySelector('.save-todolist');
	const ul = document.querySelector('ul');

	todolist_form.addEventListener('submit', (e) => {
		e.preventDefault();
		if(todolist_input.value !== '') {
			const li = document.createElement('li');
			li.innerText = todolist_input.value;
			ul.appendChild(li);
			todolist_input.value = '';
		}
	});
</script>

 

 

  // form이벤트 처리 :

  form안에 input필드에서 엔터를 입력하거나 타입이 submit인 버튼을 클릭한 경우에 
  폼을 제출하는 submit 이벤트가 발생한다.
  이벤트를 핸들링할 요소들의 부모인 form에만 submit 이벤트 리스너를 추가한다.

 

 

form.addEventListener('submit', (e) => { });

 

  폼을 제출하는 submit이벤트가 발생하면 페이지가 새로 고침된다.  (기본 동작)
  input 필드에 있는 값도 초기화된다.
  event.preventDefault(); // 새로고침 막기 

 

 

※ 자바스크립트 독학백서 정리

 

// 객체 심화

 

1.  축약 표현 

 

// 프로퍼티 축약 표현
const name = "kim";
const age = 20;

const obj = {
  name: name,
  age: age
};
obj // {name: 'kim', age: 20}

// 축약
const obj = {
  name,
  age
};
 
name, age라는 변수를 obj객체에 프로퍼티 값으로 할당할 때 각 변수이름과 똑같은 키값을 사용하고 있다.

 

 

키값과 변수 값이 동일한 경우 키값(프로퍼티 이름) 생략 가능
 

 

// 메서드 축약 표현
객체는 변수, 값, 함수를 프로퍼티로 가질 수 있다. 객체의 프로퍼티로 선언된 함수를 메서드라고 한다.
const obj = {
	greeting: function() {
		console.log('Hi!');
  	}
    // or
	greeting() {
		console.log('Hi!');
	}
};
obj.greeting();

 

 
*연습 문제*  유저 객체 - 이름 나이 직업, 이름출력메서드
const user = {
  name: 'John',
  age: '20',
  job: 'Designer',
  getName() {
    console.log(this.name);
  }
}
user.getName();

 

 

 

 

2. 객체 반복
// for in : 객체의 키 개수만큼 반복 첫번째 키값부터 마지막 키값까지 순회하는 반복문
// 배열은 forEach() map() 사용
const obj = {
  x: 10,
  y: 20,
  z: 30
};
for (value in obj) {
  console.log(value); // x y z
}

 

3. 열거
// Object.keys() : 주어진 객체의 키값들을 배열로 반환
// Object.values() : 객체의 값을 배열로 반환
// Object.entries() : 키와 값의 쌍을 각각의 배열로 반환

// hasOwnProperty() : 객체가 주어진 프로퍼티를 가지고 있는지 t f

const obj = {
  x: 10,
  y: 20,
  z: 30
};
// Object.keys(obj)
Object.keys(obj); // ['x', 'y', 'z']

// Object.values(obj)
Object.values(obj); // [10, 20, 30]

// Object.entries(obj)
Object.entries(obj);
// [['x', 10], ['y', 20], ['z', 30]];

// hasOwnProperty()
obj.hasOwnProperty('x'); // t

 

4. 선택적 연결 연산자
// optional chaining
// 존재하지 않을수도 있는 프로퍼티에 안전하게 접근할 수 있도록 해주는 ?.  연산자
const data = {};
console.log(data.user.name); // 타입에러
console.log(data.user?.name);

// ?. 연산자 앞에 위치한 대상이 null 또는 undefined인 경우 
// 더이상 하위객체로 접근하지 않고 undefined를 반환한다. 
// 에러는 발생 x

 

5. 프로퍼티 키 동적생성
const arr = ['name', 'age', 'job'];
const obj = {
	arr[0]: 'John',
} // 에러

// 프로퍼티 값 동적 생성 
const obj = {};
obj[arr[0]] = 'John';
obj[arr[1]] = 20;
obj[arr[2]] = 'Rock star';
obj // {name: 'John', age: 20, job: 'Rock star'}

 

// 사용자가 입력한 값을 사용해 프로퍼티 키를 동적으로 생성하는 코드
const obj = {};
const key = prompt();
obj[key] = key;
 
 
 

※ 자바스크립트 독학백서 정리

 

+ Recent posts