먼저 이미지 4개를 준비합니다. 사이즈는 비슷한게 좋아요.

저는 1280x485px로 작업하였어요.

 

슬라이드 구현되는 방법을 서술하자면,

prev, next 버튼을 누르면 4개의 이미지가 하나씩 X좌표 이동하는 거예요.

그리고 첫 이미지 때는 이전 이미지가 없기 때문에 prev 버튼이 비활성화 되고

마지막 이미지 때는 이후 이미지가 없기 때문에 next 버튼이 비활성화 됩니다.

 

추가로 css images 태그에 transition: transform 0.5s; 추가하여

좌우 이미지 슬라이드에 자연스러운 애니메이션 효과를 주었습니다.

 

 

HTML

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <link rel="stylesheet" href="style.css">
  <title>slider</title>
</head>
<body>
  <div class="container">
    <h1>SLIDER</h1>
    <div class="album">
      <div class="images">
        <img src="images/img-1.jpg" alt="">
        <img src="images/img-2.jpg" alt="">
        <img src="images/img-3.jpg" alt="">
        <img src="images/img-4.jpg" alt="">
      </div>
    </div>
    <button class="prev">prev</button>
    <button class="next">next</button>
  </div>  
  <script src="script.js"></script>
</body>
</html>

 

CSS

.container{width:1280px;margin: 0 auto;}

h1{text-align: center;}

.album{width: 1280px;height: 485px;overflow: hidden;}

.images{position: relative;display: flex;height: 485px; transition: transform 0.5s;}

img{width: 1280px;height: 485px;}

button, button:active, button:focus{width: 100px; height: 30px; border: none;color: white; background-color: teal; outline: none;}

button:hover{background-color: turquoise;}

button:disabled{background-color: gray;}

.prev{float: left;}

.next{float: right;}

 

JS

 

let curPos = 0; // 현재 보여주는 이미지의 인덱스 번호
let positionValue = 0; // 이미지 태그의 위치 값 지정할 변수
const IMAGE_WIDTH = 1280;

const prevBtn = document.querySelector(".prev");
const nextBtn = document.querySelector(".next");
const images = document.querySelector(".images");

// 다음 이미지로 이동하는 함수
function next(){
  // 현재 이미지가 마지막 이미지가 아닌 경우에만 이동 가능
  if(curPos < 3){
    prevBtn.removeAttribute('disabled'); // 이전 버튼 활성화
    positionValue -= IMAGE_WIDTH; // 다음 이미지 위치로 이동
    images.style.transform = `translateX(${positionValue}px)`; // 이미지 이동 애니메이션
    curPos += 1; // 현재 이미지 인덱스 증가
  }
  if(curPos === 3){
    nextBtn.setAttribute('disabled','true');
  }
}

// 이전 이미지로 이동하는 함수
function prev(){
  if(curPos > 0){
    nextBtn.removeAttribute('disabled'); // 다음 버튼 활성화
    positionValue += IMAGE_WIDTH; // 이전 이미지 위치로 이동
    images.style.transform = `translateX(${positionValue}px)`; // 이미지 이동 애니메이션
    curPos -= 1; // 현재 이미지 인덱스 감소
  }
  if(curPos === 0){
    prevBtn.setAttribute('disabled','true');
  }
}


function init(){
  prevBtn.setAttribute('disabled','true'); // 페이지 로드 시 이전 버튼 비활성화
  prevBtn.addEventListener("click", prev); // 이전 버튼에 클릭 이벤트 추가
  nextBtn.addEventListener("click", next); // 다음 버튼에 클릭 이벤트 추가
}

init(); // 초기화 함수 호출

 

반응형

반응형 요소의 가변성

  • em - 부모 폰트 사이즈에 자식요소 폰트가 결정
  • rem - root 폰트 사이즈에 폰트가 결정(주로 root는 16px)

 

  • vw - 100vw 뷰포트의 전체 너비
  • vh - 100vh 뷰포트의 전체 높이

 

  • vmin - 너비와 높이 중 더 작은 값을 적용
  • vmax - 너비와 높이 중 더 큰 값을 적용

ex1) 너비 100px, 높이 500px = 1vmin = 1px / 1vmax = 5px

ex2) 요소 50vw x 50vw - viewport가 1000px x 300px 이라면 요소 크기가 500px x 500px 로 잘려 보이게 됨

그 때 방법으로 요소를 50vmin x 50vmin 로 하게 되면 (1vmin은 3px) 요소 크기가 150px x 150px이 되어

화면에 요소 전체가 잘 보이게 된다.

 


가변그리드(레이아웃)  

  • % 단위는 백분율 값으로 부모 요소와의 상대적 크기로 자식 요소가 정해집니다.
  • 너비와 여백은 부모 요소의 너비에 비례해 계산됩니다.
  • 글자 크기는 부모 요소의 글자 크기에 비례해 계산됩니다.
  • 특이한 점으로 부분 너비에 따라 패딩 또한 %에 영향을 받음

ex)

<style>

    .container{width:90%; marign: 0 auto;}

    .main{float : left;  width:70%; padding: 10%; marign: 0 auto; }

    .aside{float : right;  width:30%; padding: 10%;  marign: 0 auto;}

</style>

<body>

    <div class="container">

         <div class="main">main</div>

         <div class="aside">aside</div>

    </div

</body>

 


calc(칼크)

padding과 width % 의 복잡한 사용 방법 대신 간편하게 사이즈를 조절하는 방법입니다.

 

ex)

div{ width: calc(100% - 90px);}

가변이미지 

ex 1) max-width 로 기본 이미지 사이즈보다 더 커져서 깨지지 않도록 해야한다

<style>

    img{width:100%;  max-width: 640px;}

</style>

<body>

    <img src="img1.png">

</ body >

 

 

ex 2) div 의 크기에 따른 이미지 사이즈 지정하는 방법도 있다. 

<style>

div{ width:50%;}
img{ max-width: 640px;}

</style>

<body>

    <img src="img1.png">
    
</body>

 

 

ex 3) picture 태그를 이용해서 viewport 사이즈에 따른 이미지 변경이 가능하다.

<body>

    <picture>

        <source src set="img3.png" media="(min-width:1280px)">

        <source src set="img2.png" media="(min-width:768px)">

        <img src="img1.png">

    <picture>

</ body >

 

 

ex 4)

슬라이드배너 형태(이미지와 그림이 한 배너로 제작된 경우)에는

이미지와 그림이 분리가 되면서 가변이미지 효과를 얻기가 어렵다.(종횡비의 문제점)

그때 아래 방법으로 해결이 되었다.

 

img 태그에 object-fit:cover; width:100%; height:100%;

 

 

ex 5) 미디어쿼리 @media

<style>

    @media (max-width: 767px){

        .pc{display:none}

    }

    @media (min-width: 1280px){

        .mo{display:none}

    }

</style>

<body>

    <img class="pc" src="img1.png">

    <img class="mo" src="img2.png">   

</ body >

가변동영상

 

종횡비를 css의 padding-top으로 준다. 그러면 여백에 따른 공백부분이 padding 으로 해결 된다

 

ex) 315 / 560 = 0.5625 

<style>

    .video{padding-top: 56.25%;  position: relative; }

</style>

<body class="video">

    <iframe width="560' height="315" src="https://www.youtube.com/-----">

    }

</ body >

 

반응형

div태그에 float를 적용 시 div 해당 요소의 margin이 사라지고, float라는 이름처럼 div 해당 요소를 띄어지면서

div의 다음요소들이 위로 올라가진다.

 

그리고 문제가 되는 점은,

 

<header>

<div="a_float">

</div>

<p>장문의 글</p>

</header>

 

a_float의 css로 float가 적용되었을 때,

그 다음 요소인 <p>가 위로 올라가지고 그리고 header 태그의 영억을 넘어 범람하게 된다.

 

그때 header의 범람하는 요소를 막기 위해 아래와 같은 css를 적용해보자

 

p::after{

content:" ";

display:block;

clear:both;}

 

 

반응형

HTML

<!-- 앱으로 가기 배너 시작 -->
<div class="app_banner">
  <div class="grid">
    <div class="margin">
      <div class="btn_today_close">
        <div class="svg">
          <svg style="border-radius:0%;width:2.2em;height:2.2em;padding:0.2em;background-color:rgba(255, 255, 255, 0)" viewBox="0 0 24 24" fill="none">
            <path d="M19 6.41L17.59 5L12 10.59L6.41 5L5 6.41L10.59 12L5 17.59L6.41 19L12 13.41L17.59 19L19 17.59L13.41 12L19 6.41Z" fill="rgba(51, 51, 51, 1)"></path>
          </svg>
        </div>
      </div>
    </div>
    <div class="app_cont">
      <div class="logo">
        <!-- 로고 -->
      </div>
      <div class="benefit">
        <div class="benefit_1">
          <div class="title">
            <span>신규 회원 10%</span>
          </div>
          <div class="sub">
            <span>+ 모든 회원 3종 할인쿠폰</span>
          </div>
        </div>
      </div>  
    </div>
    <div class="go_app">
      <div class="cont">
        <div class="border">
          <!-- onclick 이벤트 -->
          <button type="button" onclick="location.href='#';">자세히보기</button>
        </div>
      </div>
    </div>
  </div>
</div>
<!-- 앱으로 가기 배너 종료 -->

JS

<script>
  // 로컬 스토리지 지원 여부 확인
  function isLocalStorageSupported() {
    try {
      localStorage.setItem("test", "test");
      localStorage.removeItem("test");
      return true;
    } catch (e) {
      return false;
    }
  }

  // 닫기 버튼 클릭 시
  $(document).ready(function () {
    if (isLocalStorageSupported()) {
      $(".btn_today_close").on("click", function () {
        $(".app_banner").hide();
        localStorage.setItem("app_banner_closed", "true");
      });

      // 페이지 로드 시 체크
      if (localStorage.getItem("app_banner_closed") === "true") {
        $(".app_banner").hide();
      } else {
        $(".app_banner").show();
      }
    }
  });
</script>



반응형

1시간 코스로 웹사이트를 만드는 걸 설명하기도 힘든데,

html, css, js를 활용한다니! 무료라고 해서 들어보기를 결심!

 

설치 없이 replit.com  코드 작성툴로 진행

초반에는 html css js에 대한 설명으로 이해도를 높힘

 

그리곤 제공되는 코드를 복사붙여넣기가 무한 반복...

간간히 코드에 대한 설명을 해주긴 하지만 정말 1,2개만 알려줌..

 

js코드를 활용하여

D-day 카운트다운, 음악 컨드롤(play/stop),  클릭 action 등

다음번에 하나씩 파서 알아봐야겠다.

 

신기하긴 했지만..너무 수박 겉할기라서..

그냥 그 기능 중 1개만 실행해서 알려주는 것만으로도

좋은 강의가 되지 않을까 싶다..

반응형

html 파일로 확인해보자

(js 스크립트 인입 처리)

 

<div>안녕</div> 의 '안녕'은 꼭 적어야 한다.

아무 글씨가 없다면

"자바스크립트로 변경한 데이터"가 나타나지 않음

(공백으로 처리해도 괜찮음)

 

 

<!DOCTYPE html>
<html>

<body>

<div class="title">

    <div>안녕</div>

</div>  

 

<script>
    const titleDiv = document.querySelector(".title");
    titleDiv.innerText = "자바스크립트로 변경한 데이터"
  </script>

 

</body>

</html>

 

반응형

+ Recent posts