티스토리 뷰

코딩/JavaScript

[7주 5일차] JavaScript

ehzim 2023. 11. 24. 17:57

 

 

 

요소 삭제 설명 및 특징
removeChild() 요소를 제거해 주는 메서드이다. 부무요소.removeChild(자식 요소)

 

 

 

속성 추가 및 제거 설명 및 특징
getAttribute() 요소의 속성 값을 취득할 수 있다.
setAttribute() 요소의 속성을 설정할 수 있다.
removeAttribute() 요소의 속성 값을 제거할 수 있다.

 

 

 

HTML

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        div{
            position: fixed;
            left: 100px;
            top:10px;
            width: 200px;
            height: 200px;
            background:#718c00;
        }
    </style>
    <script>
        function createEle(){
            var bt=document.getElementById('bt');
            function popup(){
                var div=document.createElement('div');
                var a=document.createElement('a');
                var txt=document.createTextNode('아이콕스');
                a.appendChild(txt);
                a.setAttribute('href','http://icoxpublish.com');
                a.setAttribute('target','_black');
                a.setAttribute('title','새창');
                div.appendChild(a);
                document.body.appendChild(div);
            }
            bt.onclick=popup;
        }
        addEventListener('load',createEle);
    </script>
</head>
<body>
    <button id="bt">요소생성</button>
</body>
</html>

 

 

 

 

1. 요소생성 버튼 클릭 전

 

 

 

 

요소생성 버튼을 클릭하면 html 구문을 추가하도록 구성하였다.

하지만 요소 생성 버튼을 클릭 하기 전에는 html 구문이 추가되지 않은 것을 볼 수 있다.

 

 

 

 

2. 요소생성 버튼 클릭 후

 

 

 

 

 

 

 

요소생성 버튼을 클릭하면 html구문이 추가된 것을 볼 수 있다.

 

 

 

 

 

속성은 태그 안에 들어가는 것이다.

ex) <a  (속성)> 

 

* text는 속성이 없다. → 상속되어야한다.

 

 

1. 태그생성

2. 부모요소 연결

3. 자기 자신 속성

 

 

 

 

 

 

 

요소 생성 설명 및 특징
innerHTML 문자 방식으로 요소를 생성하는 방법

 

 

 

 

ex) innerhtml 예제

 

 

HTML

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        div{
            position: fixed;
            left: 100px;
            top:0px;
            width: 200px;
            height: 200px;
            background:lightblue;
        }
        .m1{
            background:#fff;
        }
    </style>
    <script>
        function createEle(){
            var content=document.getElementById('content');
            content.innerHTML='<p class="m1">자바스크립트</p>';
        }
        addEventListener('load',createEle);
    </script>
</head>
<body>
    <div id="content"></div>
</body>
</html>

 

 

 

 

innerHTML을 사용하여 html 구문을 추가하였다.

html 구문에는 작성하지 않았지만 javascript에서 innerHTML 메서드를 사용하여 구문을 추가해주었다.

실행하여 F12번으로 html을 확인하면 구문이 추가되어 있는 것을 볼 수 있다.

 

innerHTML을 사용할 시 추가하고자하는 html 구문을 전체적으로 작성하여 추가해야한다.

ex) content.innerHTML='<p class="m1">자바스크립트</p>';

 

 

 

 

 

 

 

ex) 

 

HTML

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        span{
            cursor: pointer;
        }
    </style>
</head>
<body>
    <div id="container">
        <h1>참가 신청</h1>
        <form action="">
            <input type="text" id="userName" placeholder="이름" required autocomplete="off">
            <button onclick="newRegister()" return false;>신청</button>
        </form>
        <hr>
        <div id="nameList"></div>
    </div>
    <script src="this.js"></script>
</body>
</html>

 

 

JS

function newRegister(){
    var newP=document.createElement("p");  //새로운 요소 p생성
    var userName = document.querySelector("#userName");
    var newText=document.createTextNode(userName.value);
    //새로운 텍스트노트 만듬

    newP.appendChild(newText);
	//텍스트 노드를 p요소의 자식 요소로 연결한다.
    
    var delBttn=document.createElement("span");
    var delText = document.createTextNode("X");
    delBttn.setAttribute("class","del");  //버튼에 del이름의 class 속성 설정
    delBttn.append(delText);

    newP.appendChild(delBttn);
    var nameList=document.querySelector("#nameList");
    nameList.insertBefore(newP, nameList.childNodes[0]);

    userName.value="";  //텍스트 필드 지움
    var removeBttns=document.querySelectorAll(".del");
    for(var i=0; i<removeBttns.length; i++){
        removeBttns[i].addEventListener("click",function(){
            if (this.parentNode.parentNode){
            this.parentNode.parentNode.removeChild(this.parentNode);
            //this는 현재 선택된 노드(=span)의 부모이므로 p를 의미
            }
        });
    }
}

 

 

결과

 

 

 

 nameList.insertBefore(newP, nameList.childNodes[0]); 코드의 inserBefore은 css의 가상 선택자 :before와 유사하다.

위의 코드를 사용하면 새로 입력될때 마다 첫번째 자식으로 입력하게 된다.

위의 코드는 입력할때마다 첫번째 요소로 입력되고 span 요소인 X를 클릭하면 p의 요소인 내용들을 삭제한다.

 

 

 

* querySelectorAll은 모든 요소를 가져온다. 그러므로 배열로 저장된다.

 

* required 

공백이 있을 수 없다. 내용이 필수이다.

 

 

 

 

 

 

 

 

ex) js로 style 주기

 

 

HTML

 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script>
        window.onload=function(){
            var content=document.getElementById('content');
            content.style.width='200px';
            content.style.height='200px';
            content.style.border='4px solid pink';
            content.style.textAlign='center';
            content.style.lineHeight='200px';
        }
    </script>
</head>
<body>
    <div id="content">내용</div>
</body>
</html>

 

 

 

결과

 

 

 

 

 

 

ex) form객체 예시

 

HTML

 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script>
        window.onload=function(){
            var frm1=document.frm1;
            var frm2=document.frm2;
            console.log(frm1.search.placeholder);
            console.log(frm2.subject.placeholder);
            console.log(frm2.credit.placeholder);
            console.log(document.forms[0].elements[0].placeholder);
            console.log(document.forms[1][1].placeholder);
            console.log(document.forms['frm1'].elements['search'.placeholder]);
            console.log(document.forms['frm2']['subject'].placeholder)
        }
    </script>
</head>
<body>
    <form action="#" name='frm1'>
        <input type="search" name="search" placeholder="검색어입력">
        <input type="submit" value="확인">
    </form>
    <form action="#" name='frm2'>
        <input type="text" name="subject" placeholder="과목입력">
        <input type="password" name="credit" placeholder="학점입력">
        <input type="submit" value="확인">
    </form>
</body>
</html>

 

 

 

 

 

form 프로퍼티 / 메서드 설명 및 특징
value input, textarea 요소의 value 값을 반환한다.
checked checkbox 나 radio가 체크되어 있으면 true, 아니면 false
disabled 요소가 활성화되면 false 비활성화면 true
defaultValue 초기 설정 값을 반환한다.
length 요소의 개수를 반환한다.
focus() 요소에 포커스를 맞춘다.
blur() 요소에 포커스를 없애 준다.
submit() form의 요소 값들을 전송한다.
reset() form의 요소 값들을 리셋한다.

 

 

 

 

 

 

 

 

ex) id pw 예시

 

HTML

 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script>
        window.onload=function(){
            var login=document.login;
            login.onsubmit=function(){
                if(!login.id.value){
                    alert('아이디를 입력해주세요!');
                    login.id.focus();
                    return false;
                }
                if(!login.pw.value){
                    alert('비밀번호를 입력해주세요!');
                    login.pw.focus();
                    return false;
                }
            }
        }
    </script>
</head>
<body>
    <form action="#" method="post" name="login">
        <div>
            <label for="id">아이디</label>
            <input type="text" name="id" id="id">
        </div>
        <div>
            <label for="pw">비밀번호</label>
            <input type="password" name="pw" id="pw">
        </div>
        <div>
            <input type="submit" value="확인">
        </div>
    </form>
</body>
</html>

 

 

결과

 

 

 

 

 

 

 

ex) 색깔 바꿈

 

 

HTML

  <!DOCTYPE html>
  <html lang="en">
    <head>
      <meta charset="UTF-8" />
      <meta name="viewport" content="width=device-width, initial-scale=1.0" />
      <title>Color Flipper</title>
      <!-- styles -->
      <link rel="stylesheet" href="styles.css" />
    </head>
    <body>
      <nav>
        <div class="nav-center">
          <h4>color flipper</h4>
          <ul class="nav-links">
            <li><a href="index.html">simple</a></li>
            <li><a href="hex.html">hex</a></li>
          </ul>
        </div>
      </nav>
      <main>
        <div class="container">
          <h2>background color : <span class="color">#f1f5f8</span></h2>
          <button class="btn btn-hero" id="btn">click me</button>
        </div>
      </main>
      <!-- javascript -->
      <script src="app.js"></script>
    </body>
  </html>

 

 

CSS

*{
    margin: 0;
    padding: 0;
    text-decoration: none;
    list-style: none;
    /* box-sizing: border-box; */
    /* 부가서비스 */
    /* font-family  (글자체)
        font-size   (글자 사이즈)
     */
}
nav{  
    /* 실무에서는 고정값을 주고 시작하는 경우가 많음 (패딩으로 크기 조절하는 방법도 존재) */
    background: white;
    height: 100px;
}
.nav-center{
    width: 60vw;
    border: 1px solid red;
    margin: 0 auto; 
    /* 중앙으로 맞춤 */
    display: flex;
    align-items: center;
    justify-content: space-between;
    height: 100%;
}
h4{
    color: lightblue;
}
ul{
    display: flex;
    width: 30%;
    align-items: center;
    justify-content: space-evenly;

}
nav a:hover{
    color:red;
}
main{
    text-align: center;
    /* 가운데 정렬 (자식이 하나일때는 display 잘안씀 */
}
.container{
    width: 100vw;
}
h2{
    background-color: black;
    color: white;
    padding: 20px;
    margin-bottom: 20px;
}
.btn{
    background: transparent;
    color: black;
    padding: 10px;
    border-radius: 10px;
    
}

 

 

JS

const colors=["green","red","rgba(133,122,200)","#f15025"];
/*const=final*/
const btn=document.getElementById("btn");
const color=document.querySelector(".color");
// 이벤트 줌
btn.addEventListener("click", function(){
    const randomNumber=getRandomNumber();

    document.body.style.backgroundColor=colors[randomNumber];
    color.textContent=colors[randomNumber];
});

function getRandomNumber(){
    return Math.floor(Math.random()*colors.length);
}

 

 

 

 

 

 

 

 

ex) 슬라이더

 

 

HTML

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Slider</title>

    <!-- styles -->
    <link rel="stylesheet" href="styles.css" />
  </head>
  <body>
    <div class="slider-container">
      <div class="slide">
        <img src="./img-1.jpeg" class="slide-img" alt="" />
        <h1>1</h1>
      </div>
      <div class="slide">
        <h1>2</h1>
      </div>
      <div class="slide">
        <h1>3</h1>
      </div>
      <div class="slide">
        <div>
          <img src="./person-1.jpeg" class="person-img" alt="" />
          <h4>susan doe</h4>
          <h1>4</h1>
        </div>
      </div>
    </div>
    <div class="btn-container">
      <button type="button" class="prevBtn">
        prev
      </button>
      <button type="button" class="nextBtn">
        next
      </button>
    </div>

    <!-- javascript -->
    <script src="app.js"></script>
  </body>
</html>

 

 

CSS

/*
=============== 
Fonts
===============
*/
@import url("https://fonts.googleapis.com/css?family=Open+Sans|Roboto:400,700&display=swap");

/*
=============== 
Variables
===============
*/

:root {
  /* dark shades of primary color*/
  --clr-primary-1: hsl(205, 86%, 17%);
  --clr-primary-2: hsl(205, 77%, 27%);
  --clr-primary-3: hsl(205, 72%, 37%);
  --clr-primary-4: hsl(205, 63%, 48%);
  /* primary/main color */
  --clr-primary-5: #49a6e9;
  /* lighter shades of primary color */
  --clr-primary-6: hsl(205, 89%, 70%);
  --clr-primary-7: hsl(205, 90%, 76%);
  --clr-primary-8: hsl(205, 86%, 81%);
  --clr-primary-9: hsl(205, 90%, 88%);
  --clr-primary-10: hsl(205, 100%, 96%);
  /* darkest grey - used for headings */
  --clr-grey-1: hsl(209, 61%, 16%);
  --clr-grey-2: hsl(211, 39%, 23%);
  --clr-grey-3: hsl(209, 34%, 30%);
  --clr-grey-4: hsl(209, 28%, 39%);
  /* grey used for paragraphs */
  --clr-grey-5: hsl(210, 22%, 49%);
  --clr-grey-6: hsl(209, 23%, 60%);
  --clr-grey-7: hsl(211, 27%, 70%);
  --clr-grey-8: hsl(210, 31%, 80%);
  --clr-grey-9: hsl(212, 33%, 89%);
  --clr-grey-10: hsl(210, 36%, 96%);
  --clr-white: #fff;
  --clr-red-dark: hsl(360, 67%, 44%);
  --clr-red-light: hsl(360, 71%, 66%);
  --clr-green-dark: hsl(125, 67%, 44%);
  --clr-green-light: hsl(125, 71%, 66%);
  --clr-black: #222;
  --ff-primary: "Roboto", sans-serif;
  --ff-secondary: "Open Sans", sans-serif;
  --transition: all 0.3s linear;
  --spacing: 0.25rem;
  --radius: 0.5rem;
  --light-shadow: 0 5px 15px rgba(0, 0, 0, 0.1);
  --dark-shadow: 0 5px 15px rgba(0, 0, 0, 0.2);
  --max-width: 1170px;
  --fixed-width: 620px;
}
/*
=============== 
Global Styles
===============
*/

*,
::after,
::before {
  margin: 0;
  padding: 0;
  box-sizing: border-box;
}
body {
  font-family: var(--ff-secondary);
  background: var(--clr-grey-10);
  color: var(--clr-grey-1);
  line-height: 1.5;
  font-size: 0.875rem;
}
ul {
  list-style-type: none;
}
a {
  text-decoration: none;
}
img:not(.person-img) {
  width: 100%;
}
img {
  display: block;
}

h1,
h2,
h3,
h4 {
  letter-spacing: var(--spacing);
  text-transform: capitalize;
  line-height: 1.25;
  margin-bottom: 0.75rem;
  font-family: var(--ff-primary);
}
h1 {
  font-size: 3rem;
}
h2 {
  font-size: 2rem;
}
h3 {
  font-size: 1.25rem;
}
h4 {
  font-size: 0.875rem;
}
p {
  margin-bottom: 1.25rem;
  color: var(--clr-grey-5);
}
@media screen and (min-width: 800px) {
  h1 {
    font-size: 4rem;
  }
  h2 {
    font-size: 2.5rem;
  }
  h3 {
    font-size: 1.75rem;
  }
  h4 {
    font-size: 1rem;
  }
  body {
    font-size: 1rem;
  }
  h1,
  h2,
  h3,
  h4 {
    line-height: 1;
  }
}
/*  global classes */

.btn {
  text-transform: uppercase;
  background: transparent;
  color: var(--clr-black);
  padding: 0.375rem 0.75rem;
  letter-spacing: var(--spacing);
  display: inline-block;
  transition: var(--transition);
  font-size: 0.875rem;
  border: 2px solid var(--clr-black);
  cursor: pointer;
  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);
  border-radius: var(--radius);
}
.btn:hover {
  color: var(--clr-white);
  background: var(--clr-black);
}
/* section */
.section {
  padding: 5rem 0;
}

.section-center {
  width: 90vw;
  margin: 0 auto;
  max-width: 1170px;
}
@media screen and (min-width: 992px) {
  .section-center {
    width: 95vw;
  }
}
main {
  min-height: 100vh;
  display: grid;
  place-items: center;
}
/*
=============== 
Slider
===============
*/

.slider-container {
  border: 5px solid var(--clr-primary-5);
  width: 80vw;
  margin: 0 auto;
  height: 40vh;
  max-width: 80rem;
  position: relative;
  border-radius: 0.5rem;
  overflow: hidden;
  margin-top: 4rem;
}
.slide {
  position: absolute;
  width: 100%;
  height: 100%;
  background: var(--clr-primary-9);
  color: var(--clr-white);
  display: grid;
  place-items: center;
  transition: all 0.25s ease-in-out;
  text-align: center;
}
.slide-img {
  height: 100%;
  object-fit: cover;
}
.slide h1 {
  font-size: 5rem;
}
.person-img {
  border-radius: 50%;
  width: 6rem;
  height: 6rem;
  margin: 0 auto;
  margin-bottom: 1rem;
}
.slide:nth-child(1) h1 {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
}
.slide:nth-child(3) {
  background: linear-gradient(rgba(0, 0, 0, 0.4), rgba(0, 0, 0, 0.4)),
    url("./img-2.jpeg") center/cover no-repeat;
}
.btn-container {
  display: flex;
  justify-content: center;
  margin-top: 0.75rem;
}
.prevBtn,
.nextBtn {
  background: transparent;
  border-color: transparent;
  font-size: 1.75rem;
  cursor: pointer;
  margin: 0 0.25rem;
  text-transform: capitalize;
  letter-spacing: 2px;
  color: var(--clr-grey-5);
  transition: var(--transition);
}
.prevBtn:hover,
.nextBtn:hover {
  color: var(--clr-grey-3);
}

@media screen and (min-width: 576px) {
  .slider-container {
    height: 45vh;
  }
}
@media screen and (min-width: 768px) {
  .slider-container {
    height: 55vh;
  }
}
@media screen and (min-width: 992px) {
  .slider-container {
    height: 65vh;
  }
}

 

 

JS

const slides = document.querySelectorAll(".slide");
const nextBtn = document.querySelector(".nextBtn");  
const prevBtn = document.querySelector(".prevBtn");

slides.forEach(function(slide, index){
    slide.style.left = `${index * 100}%`;  //esc 밑에 있는``
});

let counter=0;
nextBtn.addEventListener("click",function(){
    counter++;
    carousel();
});

prevBtn.addEventListener("click",function(){
    counter--;
    carousel();
});

function carousel() {
    if(counter<0){
        counter=0;
    }
    if(counter<slides.length-1){
        nextBtn.style.display="block";
    }
    else{
        nextBtn.style.display="none";
    }
    if(counter>0){
        prevBtn.style.display="block";
    }
    else{
        prevBtn.style.display="none";
    }
    slides.forEach(function(slide){
        slide.style.transform = `translateX(-${counter * 100}%)`;
    });
}
prevBtn.style.display="none";

 

 

 

결과

 

'코딩 > JavaScript' 카테고리의 다른 글

[JacaScript] 셀렉터  (0) 2023.12.17
사이트 클론코딩  (0) 2023.11.28
[8주 1일차] javascript  (1) 2023.11.27
[7주 4일차] JavaScript  (1) 2023.11.23
[7주 3일차] JavaScript  (0) 2023.11.22
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday