var lastScrollTop = 0;
    var delta = 5;
    var fix = document.querySelector('.category-banner');
    var fixWrap = document.querySelector('.wraper');
    var fixHeight = fix.offsetHeight;
    var didScroll;

    window.onscroll = function(e){
        didScroll = true;
    }
    // 반복 0.25초마다 스크롤 여부 체크하여 scroll() 호출
    setInterval(function(){
        if(didScroll){
            scroll();
            didScroll = false;
        }
    }, 250);
    function scroll(){
        var nowScrollTop =  window.scrollY;
        console.log(nowScrollTop);
        if(Math.abs(lastScrollTop - nowScrollTop) <= delta){
            return;
            // 0 - 세로 높이가 크거나 같을경우 숫자 반환?
        }
        if(nowScrollTop > lastScrollTop && nowScrollTop > fixHeight){
            // 세로 높이 > 0 and 세로높이 > body 높이
            // 상단 고정 헤더 효과 주기
            fix.classList.add('active');
            fixWrap.classList.add('active');
        }else{
            if(nowScrollTop + window.innerHeight < document.body.offsetHeight){
            // 세로 높이 + 브라우저 창의 높이(창의 크기) < body 값(body의 컨텐츠가 많아지면 커짐)
                fix.classList.remove('active');
                fixWrap.classList.remove('active');
            }
        }
        lastScrollTop = nowScrollTop;
    }

 

HTMLElement.offsetHeight();

offsetHeight 의 속성은 읽기 전용

정수로서 수직 패딩 및 경계를 포함하는 요소의 높이를 반환

 

 

https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/offsetHeight

 

HTMLElement.offsetHeight - Web APIs | MDN

The HTMLElement.offsetHeight read-only property returns the height of an element, including vertical padding and borders, as an integer.

developer.mozilla.org

브라우저 관련 

https://baeharam.github.io/posts/javascript/js-window/

 

[Javascript] 브라우저의 창에 대한 이해

개발을 기록하는 블로그 '[Javascript] 브라우저의 창에 대한 이해'을 한 번 살펴보세요.

baeharam.github.io

 

setInterval();

각 호출 사이에 고정된 시간 지연으로 함수를 반복적으로 호출하거나 코드 조각을 실행

나중에 호출하여 제거할 수 있음 - clearInterval();

 

 

https://developer.mozilla.org/en-US/docs/Web/API/setInterval

 

setInterval() - Web APIs | MDN

The setInterval() method, offered on the Window and Worker interfaces, repeatedly calls a function or executes a code snippet, with a fixed time delay between each call.

developer.mozilla.org

 

 

window.scrollY

window 문서가 세로로 된 픽셀 수 반환

window.scrollW

가로로 된 픽셀 수 반환

 

 

math.abs()

함수 수치의 절대 값을 반환 - 반환 값(주어진 숫자의 절대값)

math.abs(x)

Math.abs('-1');     // 1
Math.abs(-2);       // 2
Math.abs(null);     // 0
Math.abs('');       // 0
Math.abs([]);       // 0
Math.abs([2]);      // 2
Math.abs([1,2]);    // NaN
Math.abs({});       // NaN
Math.abs('string'); // NaN
Math.abs();         // NaN

function test(a,b){
  return Math.abs(a, -b);
}

console.log(test(3,5));
// 2
console.log(test(5,3));
// 2
console.log(test(1.23456, 7.89012));
// 6.655555~

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/abs

 

Math.abs() - JavaScript | MDN

The Math.abs() function returns the absolute value of a number. That is, it returns x if x is positive or zero, and the negation of x if x is negative.

developer.mozilla.org

 

 

Element.classList

읽기 전용 속성

클래스 목록을 조작하는데 사용

var elementClass = element.classList;

classList.add
// 클래스 값 추가, 추가하려는 클래스가 class 속성에 존재한다면 무시
classList.remove
// 클래스 값 제거, 존재하지 않는 클래스 제거 시 에러발생하지 않음
classList.item(number);
// 콜렉션의 인덱스를 이용하여 클래스 값 반환
classList.toggle(String)
// 클래스 값을 토글(클래스 값이 존재한다면 제거 후 false 반환, 존재하지 않으면 추가하고 true를 반환한다)
// 두번째 인수가 있을 때 - 두번째 인수가 true로 평가되면 지정한 클래스 값을 추가하고 false로 평가되면 제거
classList.contains(String)
// 지정한 클래스 값이 element의 class 속성에 존재하는지 확인
classList.replace(oldClass, newClass);
// 존재하는 클래스를 새로운 클래스로 교체한다
const div = document.createElement('div');
div.className = 'foo';

// our starting state: <div class="foo"></div>
console.log(div.outerHTML);

// use the classList API to remove and add classes
div.classList.remove("foo");
div.classList.add("anotherclass");

// <div class="anotherclass"></div>
console.log(div.outerHTML);

// if visible is set remove it, otherwise add it
div.classList.toggle("visible");

// add/remove visible, depending on test conditional, i less than 10
div.classList.toggle("visible", i < 10 );

console.log(div.classList.contains("foo"));

// add or remove multiple classes
div.classList.add("foo", "bar", "baz");
div.classList.remove("foo", "bar", "baz");

// add or remove multiple classes using spread syntax
const cls = ["foo", "bar"];
div.classList.add(...cls);
div.classList.remove(...cls);

// replace class "foo" with class "bar"
div.classList.replace("foo", "bar");

 

비슷하게 Element.className로 대체할 수 있음

클래스명을 변경할 수 있음

var el = document.getElementById('item');

if (el.className === 'active'){
  el.className = 'inactive';
} else {
  el.className = 'active';
}

빈속성이 있는 경우 가반환 됨 ?

 

아이디로 찾기 클래스로 찾기 태그명으로로 찾기

 

css 선택자로 찾기

var id = document.querySelector('#id'); 
var class = document.querySelector('.class');

선택자를 만족하는 첫번째 element 반환, 일치하는 요소가 없을경우 null을 반환
id 선택자인데 문서내에 같은 아이디를 여러번 사용한 경우 첫번째 id 값을 가진 element 반환

var classList = document.querySelectorAll('.class');

선택자를 만족하는 모든 요소의 리스트 반환, 결과가 없을경우 빈 리스트를 반환

var classMany = document.querySelectorAll('.class1, .class2');

위와 같지만 !여러개!를 반환

var divInnerClass = document.querySelector('div.class.class input[name=class]')

복잡한 선택자도 선택 가능 - css에서 선택할때랑 비슷함

 

 

아이디로 찾기

var id = document.getElementById('id');

//ex) 매개변수 대소문자 구분
<div class="Main"></div>

var id = document.getElementById('main');
// null
var id = document.getElementById('Main');
// <div class="Main"></div> 반환

문자열과 일치하는 id 속성을 가진 요소를 찾아 element 객체를 반환함, 결과가 없을경우 null을 반환

id의 대소문자가 정확해야함 ID로 입력할 경우 유효하지 않은 이름이기때문에 사용 불가능함

id가 없는 요소에 접근 하려면 document.querySelector()로 찾기

특정 요소를 빠르게 찾을 때 유용하다

 

 

클래스로 찾기

var class = document.getElementByClassName('class');

// ex) 클래스명 모두 포함하고 있는 요소 탐색 가능
<div class="class class2"></div>
var class_class2 = document.getElementByClassName('class class2');

// ex) 다중 선택은 불가
<div class="class"></div>
<div class="class2"></div>

 

결과가 없을경우 뭘 반환하는거지 - HTMLCollection ?

위와 마찬가지로 id의 대소문자가 정확해야함(매개변수, 메소드명)

var id_class = document.getElementById('id').getElementsByClassName('class');

문자열과 일치하는 id 속성 내 class라는 클래스를 가진 모든 요소 탐색

 

var class_class = document.getElementsByClassName('class').getElementsByClassName('class');
// 요거는 왜 안될까
var class_id = document.getElementsByClassName('class').getElementById('id');
// 이것도 안됨

// document.getElementsByClassName 이 배열 함수기때문

 

 

http://daplus.net/javascript-%EC%97%AC%EB%9F%AC-%ED%81%B4%EB%9E%98%EC%8A%A4%EA%B0%80%EC%9E%88%EB%8A%94-%EC%9A%94%EC%86%8C%EB%A5%BC-%EA%B0%80%EC%A0%B8-%EC%98%A4%EB%8A%94-%EB%B0%A9%EB%B2%95/

 

[javascript] 여러 클래스가있는 요소를 가져 오는 방법 - 리뷰나라

내가 이것을 가지고 있다고 말하십시오. <div class="class1 class2"></div> 이 div요소를 어떻게 선택 합니까? document.getElementsByClassName('class1')[0].getElementsByClassName('class2')[0] 작동하지 않습니다. jQuery에서는

daplus.net

 

태그명으로 찾기

var tag = document.getElementsByTagName('tag');

element가 호출되면 소문자로 변환함 - 카멜케이스로 이루어진 element를 호출하려면 getElementsByTagNameNs() 사용해야함

 

 

지원되는 브라우저

chrome4.0+, edge9.0+, Firefox3.5+, internet Expolrer, opera7.0+, safari6.0+, samsung internet

 

객체를 다른 위치로 드래그 할 때 사용

기본적으로 텍스트 선택 영역, 이미지, 링크 외 드래그 불가능,

하지만 draggable="true" 속성을 설정할 경우 어떤 요소에서도 사용 가능하다

XUL 요소에 대해서는 draggable 속성을 사용할 필요가 없으며, 모든 XUL 요소는 드래그가 가능하다

다른 요소에 드래그 앤 드롭을 적용하려면 이벤트 처리가 필요함

 

해당 속성으로(드래그 앤 드롭) 사용

- 파일 업로드

- 데이터 삭제 또는 추가

- 그 외 

 

예시

<p draggable="true">가능</p>
<!-- 요소 드래그 가능 -->
<div draggable="false">불가능</div>
<!-- 드래그 불가능 -->
<div draggable="auto">a, img 태그만 가능</div>
<!-- 브라우저의 기본 동작을 따름(href 속성이 지정된 a, src 속성이 지정된 img는 드래그 가능) -->

 

 

 

확인하기

 

가능 불가능 auto a tag auto

 

 

<script>
    // 드롭 영역
    function allowDrop(event) {
        event.preventDefault();
        // 드롭을 허용하려면 요소의 기본 처리를 방지해야함
        // 어떤 이벤트를 명시적으로 처리하지 않은 경우, 해당 이벤트에 대한 기본 동작을 실행하지 않도록 지정 
        // 기본적으로 데이터/요소는 다른 요소에 삭제할 수 없음
    }
    function drop(event) {
        event.preventDefault();
        // 기본 처리 방지를 위해 호출(기본값은 드롭 시 링크로 열려 있음)
        // 드랍 될 요소에 해당 메소드가 없을경우 브라우저에서 드랍 이벤트를 허용하지 않을 수 있음
        var data = event.dataTransfer.getData("text");
        // 드래그 한 데이터를 가져옴
        event.target.appendChild(document.getElementById(data));
        // 객체의 아이디값, 아이디값을 드롭 요소에 추가
    }
    // 개체 영역
    function drag(event) {
        event.dataTransfer.setData("text", event.target.id);
        // 데이터의 유형과 값을 설정
        // 데이터 유형은 text, 드래그 요소의 아이디값(예시, drag1, drag2)
    }
    
</script>
<style>
  .div{
    position: relative; 
    width: 100%; height: 100%; 
    display: flex; justify-content: space-between; align-items: center; 
    margin: 0 auto;
  }
  .drag{
    display: inline-flex; align-items: center; justify-content: center; 
    background: rgba(252, 216, 213, .3); 
    width: 80px; height: 80px; 
    border-radius: 50%;
  }
</style>
<body>
  <div class="div" ondrop="drop(event)" ondragover="allowDrop(event)">
    <span class="drag" id="drag1" draggable="true" ondragstart="drag(event)">가능</span> 
    <span class="drag" id="drag2" draggable="true" ondragstart="drag(event)">불가능</span> 
    <span class="drag" id="drag3" draggable="true" ondragstart="drag(event)">auto</span> 
    <a class="drag" id="drag4" href="#" draggable="true" ondragstart="drag(event)">a tag auto</a>
  </div>
</body>

 

- 드래그 할 수 있는 부분과 할 수 없는 부분으로 나누기( 드래그 할 객체, 드래그 할 객체 드랍 영역)

- 드래그 할 영역은 draggable="true" 속성 추가

- 드랍 될 영역은 event.preventDefault() 추가

- 요소에 position: absolute 있으면 안움직임

 

ondragstart();
// 사용자가 요소를 끌어 시작할 때 발생
ondrag();
// 요소가 드래그 될 때 발생
ondragend();
// 드래그가 완료되면 발생
ondragenter();
// 드래그 소자 드롭 타겟을 입력 할 때마다
ondragover();
// 드래그 요소가 드롭 영역 위에 있을 때 발생
ondrop();
// 드래그 요소가 드롭 영역내에 드롭 될 때 발생
ondragleave();
// 드래그 요소가 드롭 대상을 떠날 때 발생

 

 

좀더 자연스럽게 원하는 위치에 옮기기

- jquery ui 를 써야하나본디,, 

 

 

 

 

참고

https://gahyun-web-diary.tistory.com/21

 

[JAVASCRIPT/JQUERY] Jquery UI (draggable/droppable)옵션설정하기

https://jqueryui.com jQuery UI를 쓰기 위해서는 다음과 같은 js 파일이 필요하다. //jQuery버전맞추기 https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js //jQuery UI http://code.jquery.com..

gahyun-web-diary.tistory.com

https://shxrecord.tistory.com/165

 

[jQuery UI]드래그 기능

화면 개발을 주로 jQuery를 이용해서 했었는데 얼마 전 jQuery UI란 것을 알게 되었습니다. jQuery UI는 드래그, 드롭, 리사이즈 등 다양한 기능뿐 아니라 CSS를 이용하여 UI를 손쉽게 구현할 수 있도록

shxrecord.tistory.com

 

event.preventDefault();

https://developer.mozilla.org/ko/docs/Web/API/Event/preventDefault

 

Event.preventDefault() - Web API | MDN

Event 인터페이스의 preventDefault() 메서드는 어떤 이벤트를 명시적으로 처리하지 않은 경우, 해당 이벤트에 대한 사용자 에이전트의 기본 동작을 실행하지 않도록 지정합니다.

developer.mozilla.org

 

http://www.w3bai.com/ko/html/html5_draganddrop.html

 

HTML5의 드래그 앤 드롭

드래그 앤 드롭은 HTML5 표준의 일부입니다. 직사각형으로 상기 이미지를 드래그. HTML에서 HTML5의 작업 초안 사양은 드래그 앤 드롭을 지원합니다. HTML5는 드래그 기능을 포함하여 낙하의 다른 종

www.w3bai.com

 

https://developer.mozilla.org/ko/docs/Web/API/HTML_Drag_and_Drop_API/Drag_operations

 

Drag Operations - Web API | MDN

다음은 드래그 & 드랍(drag & drop) 동작 실행 시 각 단계에 대한 설명입니다.

developer.mozilla.org

 

html 드래그 앤 드롭 api

https://developer.mozilla.org/ko/docs/Web/API/HTML_Drag_and_Drop_API

 

HTML 드래그 앤 드롭 API - Web API | MDN

HTML 드래그 앤 드롭 인터페이스는 파이어폭스와 다른 브라우저에서 어플리케이션이 드래그 앤 드롭 기능을 사용하게 해줍니다.

developer.mozilla.org

 

https://www.w3schools.com/html/html5_draganddrop.asp

 

HTML Drag and Drop API

W3Schools offers free online tutorials, references and exercises in all the major languages of the web. Covering popular subjects like HTML, CSS, JavaScript, Python, SQL, Java, and many, many more.

www.w3schools.com

https://webisfree.com/2019-11-22/html5%EC%9D%98-%EB%93%9C%EB%9E%98%EA%B7%B8%EC%95%A4%EB%93%9C%EB%9E%8D-%EA%B5%AC%ED%98%84-%EB%B0%A9%EB%B2%95-%EB%B0%8F-%EC%98%88%EC%A0%9C-drag-and-drop

 

HTML5의 드래그앤드랍 구현 방법 및 예제, Drag and Drop

HTML5, 자바스크립트를 사용하여 드래그앤드랍(Drag and Drop)을 구현하는 방법에 대하여 알아봅니다.

webisfree.com

 

https://jqueryui.com/draggable/

 

Draggable | jQuery UI

Draggable Allow elements to be moved using the mouse. Enable draggable functionality on any DOM element. Move the draggable object by clicking on it with the mouse and dragging it anywhere within the viewport. view source 1 2 3 4 5 6 7 8 9 10 11 12 13 14 1

jqueryui.com

 

https://api.jqueryui.com/draggable/#event-drag

 

Draggable Widget | jQuery UI API Documentation

Description: Allow elements to be moved using the mouse. Make the selected elements draggable by mouse. If you want not just drag, but drag & drop, see the jQuery UI Droppable plugin, which provides a drop target for draggables. Theming The draggable widge

api.jqueryui.com

 

'개발 > html & CSS' 카테고리의 다른 글

meta tag  (0) 2022.01.26
코드펜(Codepen) 소스코드 티스토리 올리기  (0) 2022.01.14
[CSS] -webkit-tap-highlight-color 알아보기!  (0) 2021.12.22
[CSS] clip 알아보기!  (0) 2021.12.10

CSS Preprocessor

css 전(예비)처리기이며 sass, scss, less 등을 말한다

css가 동작하기 전 사용하는 기능으로 css의 불편함(불필요한 선택자, 연산 기능의 한계, 구문의 부재 외)을 전처리기로 상쇄한다

가독성과 재사용성을 높여주며 유지보수가 쉬움

선택자의 중첩이나 조건문, 반복문, 다양한 단위의 연산 등 표준 css 보다 많은 기능으로 편리하게 작성할 수 있음

css에는 없는 Mixin기능 사용

쉽게 말하면 css의 확장판 같은 느낌 !

 

 

사용방법

웹에서는 css만 동작

sass, less, stylus 외 전처리기는 직접 동작할 수 없기 때문에 전처리기로 코드 작성 후 css로 컴파일

 

 

컴파일방법

전처리기 종류마다 다르며 여러 방식을 제공함

컴파일러 사용

 

node.js

 

 

$ npm install -g node-sass

npm으로 설치

& node-sass [옵션] <입력파일경로> [출력파일경로]

옵션 - 컴파일하려는 파일의 경로 - 컴파일 된 파일이 저장될 경로 순으로 입력해줌

$ node-sass styles/common.scss styles/common.css

위에 옵션 이라고 적었는데

$ node-sass --watch styles/common.scss styles/common.css

옵션으로 --watch or -w 를 입력해주면 파일을 감시하여 저장시 자동으로 변경 사항을 컴파일 한다

저장 시 컴파일 확인 / css 파일에서도 확인할 수 있었다

 

다른 옵션 내용 확인

-w, --watch 디렉토리 또는 파일 감시
-r, --recursive 재귀적으로 디렉토리나 파일을 감시합니다.
-o, --output 출력 디렉토리
-x, --omit-source-map-url 출력에서 소스 맵 URL 주석 생략
-i, --indented-syntax stdin의 데이터를 sass 코드로 처리(scss와 비교)
-q, --quiet 오류가 발생한 경우를 제외하고 로그 출력을 억제합니다.
-v, --version 버전 정보를 출력합니다.
--output-style CSS 출력 스타일(중첩 | 확장 | 압축 | 압축)
들여 쓰기 --indent - 입력 유형  에 대한 출력 CSS를 (공간 | 탭)
--indent-width 들여쓰기 너비 ; 공백 또는 탭 수(최대값: 10)
--linefeed 줄바꿈 스타일(cr | crlf | lf | lfcr)
--source-코멘트 디버그 정보 포함 에서 출력을
--source-map 소스 맵을 내 보냅니다.
--source-지도-내용 퍼가기는 내용을 포함 에서 지도를
--source-map-embed sourceMappingUrl을 데이터 URI로 포함
--source-map-root 기본 경로, 있는 그대로 소스 맵 에서 내 보냅니다.
보기에 --include 경로 경로 에 대한 가져온 파일
--follow 심볼릭 링크된 디렉토리를 따릅니다.
--precision 십진수에 허용 되는 정밀도의 양
--error-bell 오류 발생 시 벨 문자 출력
--importer 사용자 지정 가져오기 도구가 포함된 .js 파일의 경로
--functions 사용자 정의 함수가 포함된 .js 파일의 경로
--help 사용 정보 인쇄

https://github.com/sass/node-sass#command-line-interface

 

GitHub - sass/node-sass: Node.js bindings to libsass

:rainbow: Node.js bindings to libsass. Contribute to sass/node-sass development by creating an account on GitHub.

github.com

 

 

Sass와 Scss의 차이점

Scss는 Sass의 3버전에서 css 구문과 완전히 호환되도록 새로운 구문을 도입해 만든 css의 상위집합

Scss는 css와 거의 같은 문법으로 Sass 기능을 지원한다

 

 

sass

.main-tab
    background: white
    width: 100%
    height: 66px
    .main-tab ul
        display: flex
        width: 100%
        height: 100%
        .main-tab ul li
            width: 100%

 

- 선택자의 유효범위를 들여쓰기로 구분

- =와 + 기호로 Mixin 기능 사용(추가예정)

 

scss

.main-tab{
    background: white;
    width: 100%;
    height: 66px;
    .main-tab ul{
        display: flex;
        width: 100%;
        height: 100%;
        .main-tab ul li{
            width: 100%
        }
    }
}

 

- 선택자의 유효범위를 {}로 구분

- 가독성이 좋음(실무에서 많이 사용)

- 코드 한줄작성 가능

- css와 유사한 문법

- @Mixin와 @include 기능 사용(추가예정)

 

 

 

 

 

 

 

mixin 사용하기

/* 기본 */
@include mixin-name;
/* 인자가 있는 mixin */
@include mixin-name(value1, value2, value3, ..);

 

예시1

/* scss 작성시 */ 
@mixin red { 
  p { 
    color: red;
  }
} 
@include red;
/* css */
p {
  color: red;
}

 

예시2

/* scss 작성시 */ 
@mixin red {
  color: red; 
} 
p {
  @include red;
}
/* css */
p {
  color: red;
}

 

예시3

/* scss 작성시 */ 
@mixin space($margin, $padding) {
  margin: $margin; padding: $padding; 
} 
p {
  @include space(20px 0, 30px);
}
/* css */
p {
  margin: 20px 0; padding: 30px; 
}

 

예시4

/* scss 작성시 */
@mixin space($margin, $padding : 30px) {
  margin: $margin; padding: $padding; 
} 
p {
  @include space(20px 0);
  /* padding 고정값 */
}
/* css */
p {
  margin: 20px 0; 
  padding: 30px; 
  /* padding 고정값 */
}

 

참고

https://heropy.blog/2018/01/31/sass/

 

Sass(SCSS) 완전 정복!

Style(CSS) 작업 시 필수가 되어버린 CSS Preprocessor(전처리기) Sass(SCSS)에 대해서 이해하고, CSS로 컴파일하는 방법부터 자세한 SCSS 문법까지 살펴봅니다.

heropy.blog

 

지원되는 브라우저

chrome1.0+, edge, opera7.0+, safari1.0+, samsung internet

 

모바일에서 a태그 클릭시 하이라이트 효과

꾹 눌렀을 때 또는 터치했을 때 영역 색상을 변경할 수 있다

 

-webkit-tap-highlight-color 문법

 

-webkit-tap-highlight-color : unset; 

-webkit-tap-highlight-color : 색상; 

 

 

예시

-webkit-tap-highlight-color : unset; (기본)

 

 

터치 및 꾹 눌렀을 때

 

 

색상변경 후 터치 및 꾹 눌렀을 때

-webkit-tap-highlight-color : rgba(252, 213, 216. .8); 

 

 

css 제거

-webkit-tap-highlight-color : transparent;

 

안드로이드 일 경우

outline: none;

-webkit-tap-highlight-color: rgba(0, 0, 0, 0);

속성을 추가해줘야 함

 

a 태그 외 div에서는 css 적용안됨

'개발 > html & CSS' 카테고리의 다른 글

meta tag  (0) 2022.01.26
코드펜(Codepen) 소스코드 티스토리 올리기  (0) 2022.01.14
html 기본속성 draggable 사용 & 드래그 앤 드롭  (0) 2022.01.07
[CSS] clip 알아보기!  (0) 2021.12.10

+ Recent posts