CSS로 미니어처 책 만들기
프론트엔드 연습으로 금요일마다 UI 컴포넌트를 만드는 습관을 들였습니다.
과거에 내가 만든 구성 요소 중 일부를 태그에서 볼 수 있습니다.
미니어처 같은 작고 귀여운 것을 좋아하는데, 어제는 CSS와 Vue.js로 Miniature Book 컴포넌트를 만들었습니다.
1. 일부 div를 절대 위치에 배치
2. 퍼스펙티브 속성으로 3차원 페이지 추가
div를 3D로 회전하려면 perspective
및 transform-style
속성을 사용합니다.
싸개:
perspective: 300px;
transform-style: preserve-3d;
안건:
transform-origin: left center;
transform: rotateY(30deg);
transform-origin
및 position: absolute
를 사용하여 위치를 조정할 수 있습니다.
3. 페이지 가장자리 구부리기
CSS를 사용하여 공동 애니메이션을 만들 수 있습니다. 나는 이것을 s14garnet에서 배웠다.
변환은 상위 요소의 영향을 받습니다. preserve-3d
를 사용하여 연결할 수 있습니다.
4. 드래그 상호 작용을 추가하여 페이지를 계속 넘길 수 있습니다.
드래그 상호 작용의 구현은 간단합니다. offsetX의 차이를 추적하고 회전 각도에 반영하기만 하면 됩니다.
modulo를 사용하여 책을 반복할 수 있지만 JavaScript modulo는 음수 값을 반환할 수 있습니다.
HTML:
<div id="app"
@pointerdown="down"
@pointermove="move"
@pointerup="up">
...
</div>
자바스크립트:
Number.prototype.mod = function (n) {
return ((this % n) + n) % n;
};
new Vue({
el: "#app",
data: {
rotateRaw: 40,
rotateOld: 0,
offset: null
},
methods: {
down(ev) {
this.$el.setPointerCapture(ev.pointerId);
this.offset = ev.offsetX;
this.rotateOld = this.rotate;
},
up(ev) {
this.offset = null;
},
move(ev) {
if (this.offset) {
this.rotateRaw = this.rotateOld - (ev.offsetX - this.offset);
}
}
},
computed: {
rotate() {
return this.rotateRaw.mod(180);
}
}
});
pointerdown, pointermove 및 pointerup 이벤트에는 iOS Safari에서 polyfill이 필요합니다.
래퍼의 div 요소가 드래그로 선택되지 않도록 하려면 pointer-events: none
를 사용하여 포인터 이벤트를 투명하게 만듭니다.
.wrapper {
...
pointer-events: none;
user-select: none;
}
데모는 다음과 같습니다.
https://codepen.io/hashrock/pen/RwrxeKe
Vue.js와 input type="range"는 친구입니다.
나는 input type="range"로 UI의 모양과 느낌을 조정하는 것을 좋아합니다. 일회성 UI 편집기입니다. 집을 짓기 위해 비계를 만드는 것과 비슷합니다.
input type="range"가 유용하지만 값을 숫자로 변환하기 위해 v-model.number
를 작성하는 것을 잊지 마십시오.
<input type="range" min=0 max=180 step=1 v-model.number="rotate">
Reference
이 문제에 관하여(CSS로 미니어처 책 만들기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://dev.to/hashrock/making-miniature-book-with-css-590p
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
div를 3D로 회전하려면
perspective
및 transform-style
속성을 사용합니다.싸개:
perspective: 300px;
transform-style: preserve-3d;
안건:
transform-origin: left center;
transform: rotateY(30deg);
transform-origin
및 position: absolute
를 사용하여 위치를 조정할 수 있습니다.3. 페이지 가장자리 구부리기
CSS를 사용하여 공동 애니메이션을 만들 수 있습니다. 나는 이것을 s14garnet에서 배웠다.
변환은 상위 요소의 영향을 받습니다. preserve-3d
를 사용하여 연결할 수 있습니다.
4. 드래그 상호 작용을 추가하여 페이지를 계속 넘길 수 있습니다.
드래그 상호 작용의 구현은 간단합니다. offsetX의 차이를 추적하고 회전 각도에 반영하기만 하면 됩니다.
modulo를 사용하여 책을 반복할 수 있지만 JavaScript modulo는 음수 값을 반환할 수 있습니다.
HTML:
<div id="app"
@pointerdown="down"
@pointermove="move"
@pointerup="up">
...
</div>
자바스크립트:
Number.prototype.mod = function (n) {
return ((this % n) + n) % n;
};
new Vue({
el: "#app",
data: {
rotateRaw: 40,
rotateOld: 0,
offset: null
},
methods: {
down(ev) {
this.$el.setPointerCapture(ev.pointerId);
this.offset = ev.offsetX;
this.rotateOld = this.rotate;
},
up(ev) {
this.offset = null;
},
move(ev) {
if (this.offset) {
this.rotateRaw = this.rotateOld - (ev.offsetX - this.offset);
}
}
},
computed: {
rotate() {
return this.rotateRaw.mod(180);
}
}
});
pointerdown, pointermove 및 pointerup 이벤트에는 iOS Safari에서 polyfill이 필요합니다.
래퍼의 div 요소가 드래그로 선택되지 않도록 하려면 pointer-events: none
를 사용하여 포인터 이벤트를 투명하게 만듭니다.
.wrapper {
...
pointer-events: none;
user-select: none;
}
데모는 다음과 같습니다.
https://codepen.io/hashrock/pen/RwrxeKe
Vue.js와 input type="range"는 친구입니다.
나는 input type="range"로 UI의 모양과 느낌을 조정하는 것을 좋아합니다. 일회성 UI 편집기입니다. 집을 짓기 위해 비계를 만드는 것과 비슷합니다.
input type="range"가 유용하지만 값을 숫자로 변환하기 위해 v-model.number
를 작성하는 것을 잊지 마십시오.
<input type="range" min=0 max=180 step=1 v-model.number="rotate">
Reference
이 문제에 관하여(CSS로 미니어처 책 만들기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://dev.to/hashrock/making-miniature-book-with-css-590p
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
드래그 상호 작용의 구현은 간단합니다. offsetX의 차이를 추적하고 회전 각도에 반영하기만 하면 됩니다.
modulo를 사용하여 책을 반복할 수 있지만 JavaScript modulo는 음수 값을 반환할 수 있습니다.
HTML:
<div id="app"
@pointerdown="down"
@pointermove="move"
@pointerup="up">
...
</div>
자바스크립트:
Number.prototype.mod = function (n) {
return ((this % n) + n) % n;
};
new Vue({
el: "#app",
data: {
rotateRaw: 40,
rotateOld: 0,
offset: null
},
methods: {
down(ev) {
this.$el.setPointerCapture(ev.pointerId);
this.offset = ev.offsetX;
this.rotateOld = this.rotate;
},
up(ev) {
this.offset = null;
},
move(ev) {
if (this.offset) {
this.rotateRaw = this.rotateOld - (ev.offsetX - this.offset);
}
}
},
computed: {
rotate() {
return this.rotateRaw.mod(180);
}
}
});
pointerdown, pointermove 및 pointerup 이벤트에는 iOS Safari에서 polyfill이 필요합니다.
래퍼의 div 요소가 드래그로 선택되지 않도록 하려면
pointer-events: none
를 사용하여 포인터 이벤트를 투명하게 만듭니다..wrapper {
...
pointer-events: none;
user-select: none;
}
데모는 다음과 같습니다.
https://codepen.io/hashrock/pen/RwrxeKe
Vue.js와 input type="range"는 친구입니다.
나는 input type="range"로 UI의 모양과 느낌을 조정하는 것을 좋아합니다. 일회성 UI 편집기입니다. 집을 짓기 위해 비계를 만드는 것과 비슷합니다.
input type="range"가 유용하지만 값을 숫자로 변환하기 위해 v-model.number
를 작성하는 것을 잊지 마십시오.
<input type="range" min=0 max=180 step=1 v-model.number="rotate">
Reference
이 문제에 관하여(CSS로 미니어처 책 만들기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://dev.to/hashrock/making-miniature-book-with-css-590p
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
<input type="range" min=0 max=180 step=1 v-model.number="rotate">
Reference
이 문제에 관하여(CSS로 미니어처 책 만들기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/hashrock/making-miniature-book-with-css-590p텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)