½ÃÀÛÆäÀÌÁö·Î Áñ°Üã±âÃß°¡
·Î±×ÀÎ
ȸ¿ø°¡ÀÔ l Ã⼮üũ l ¸¶ÀÌÆäÀÌÁö l CGIMALL
3D´À³¦ÀÇ À̹ÌÁö ½½¶óÀ̵å Voyage Slider : happycgi
ÀÚ·á½Ç »çÀÌÆ®µî·Ï ·©Å·100 ÇÁ·Î±×·¥¸®ºä °ü¸®ÀÚÃßõÀÚ·á Ãʺ¸°¡À̵å
Ä¿¹Â´ÏƼ
Àüü ÆîÃ帱â
Äü¸Þ´º¸µÅ© jquery , CSS , PHP , Javascript , ¹«·áÆùÆ® , ASP
»ó¼¼°Ë»ö
Ȩ > CSS > À̹ÌÁö > 3D´À³¦ÀÇ À̹ÌÁö ½½¶óÀ̵å Voyage Slider »ó¼¼Á¤º¸
»çÀÌÆ®µî·Ï
Ŭ¶ó¿ìµåű×
Javascript
HTML
PHP
CSS
ASP
API
mysql
jquery
image
slide
Mobile
¸Þ´º
°Ô½ÃÆÇ
ÇöÀçÁ¢¼ÓÀÚ ¸í »õ·Î°íħ
3D´À³¦ÀÇ À̹ÌÁö ½½¶óÀ̵å Voyage Slider
¼Ò½ºÅë°èÁ¤º¸ ¿À·ù½Å°í ¹× ¹®ÀÇ
ÇØÇÇÆÀ
³×ƼÁð
Æ®À§ÅÍ·Î º¸³»±â ÆäÀ̽ººÏÀ¸·Î º¸³»±â
¼Ò½ººÐ·ù À̹ÌÁö
´Ù¿î·Îµå Ƚ¼ö 2 ȸ
°£´Ü¼³¸í ½½¶óÀÌµå ¹öưÀ» Ŭ¸¯Çϸé À̹ÌÁö¿Í ÅØ½ºÆ®°¡ º¯°æµÇ´Â 3D ´À³¦ÀÇ À̹ÌÁö ½½¶óÀ̵åÀÔ´Ï´Ù
Æò°¡Çϱâ ÈǸ¢ÇÔ ¸Å¿ìÁÁÀ½ ÁÁÀ½ ±¦ÂúÀ½ º¸Åë º°·Î
ȨÆäÀÌÁö¹Ù·Î°¡±â ¼Ò½º´Ù¿î·Îµå µ¥¸ð ¹Ì¸®º¸±â ½ºÅ©·¦Çϱâ
  

½½¶óÀÌµå ¹öưÀ» Ŭ¸¯Çϸé À̹ÌÁö¿Í ÅØ½ºÆ®°¡ º¯°æµÇ´Â 3D ´À³¦ÀÇ À̹ÌÁö ½½¶óÀ̵åÀÔ´Ï´Ù.

À̹ÌÁö¸¦ º¯°æÇÏ¿© ´Ù¾çÇÏ°Ô ÀÀ¿ë °¡´ÉÇÕ´Ï´Ù.


HTML ±¸Á¶

<div class="slider">

<button class="slider--btn slider--btn__prev">

<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">

<path d="m15 18-6-6 6-6" />

</svg>

</button>


<div class="slides__wrapper">

<div class="slides">

<!-- slide 1 -->

<div class="slide" data-current>

<div class="slide__inner">

<div class="slide--image__wrapper">

<img class="slide--image" src="https://devloop01.github.io/voyage-slider/images/scotland-mountains.jpg" alt="Image 1" />

</div>

</div>

</div>

<div class="slide__bg" style="--bg: url(https://devloop01.github.io/voyage-slider/images/scotland-mountains.jpg); --dir: 0" data-current></div>


<!-- slide 2 -->

<div class="slide" data-next>

<div class="slide__inner">

<div class="slide--image__wrapper">

<img class="slide--image" src="

https://devloop01.github.io/voyage-slider/images/machu-pichu.jpg" alt="Image 2" />

</div>

</div>

</div>

<div class="slide__bg" style="--bg: url(https://devloop01.github.io/voyage-slider/images/machu-pichu.jpg); --dir: 1" data-next></div>

.
.
.



CSS ¼Ò½º

@import url("https://api.fontshare.com/v2/css?f[]=archivo@100,200,300,400,500,750,700,800,900&f[]=clash-display@200,300,400,500,750,700&display=swap");


:root {

--slide-width: min(25vw, 300px);

--slide-aspect: 2 / 3;


--slide-transition-duration: 800ms;

--slide-transition-easing: ease;


--font-archivo: "Archivo", sans-serif;

--font-clash-display: "Clash Display", sans-serif;

}


* {

box-sizing: border-box;

margin: 0;

padding: 0;

}


html,

body {

width: 100%;

height: 100%;

}


body {

display: grid;

place-items: center;

overflow: hidden;


background: rgba(0, 0, 0, 0.787);

}


button {

border: none;

background: none;

cursor: pointer;

&:focus {

outline: none;

border: none;

}

}


/* ------------------------------------------------ */

/* -------------------- SLIDER -------------------- */

/* ------------------------------------------------ */


.slider {

width: calc(3 * var(--slide-width));

height: calc(2 * var(--slide-height));

display: flex;

align-items: center;

}


.slider--btn {

--size: 40px;


display: inline-flex;

justify-content: center;

align-items: center;

opacity: 0.7;

transition: opacity 250ms cubic-bezier(0.215, 0.61, 0.355, 1);

z-index: 999;


& svg {

width: var(--size);

height: var(--size);

stroke: white;

}


&:hover {

opacity: 1;

}

}


.slides__wrapper {

width: 100%;

height: 100%;


display: grid;

place-items: center;


& > * {

grid-area: 1 / -1;

}

}

.
.
.


JS ¼Ò½º

import imagesLoaded from "https://esm.sh/imagesloaded";


console.clear();


// -------------------------------------------------

// ------------------ Utilities --------------------

// -------------------------------------------------


// Math utilities

const wrap = (n, max) => (n + max) % max;

const lerp = (a, b, t) => a + (b - a) * t;


// DOM utilities

const isHTMLElement = (el) => el instanceof HTMLElement;


const genId = (() => {

let count = 0;

return () => {

return (count++).toString();

};

})();


class Raf {

constructor() {

this.rafId = 0;

this.raf = this.raf.bind(this);

this.callbacks = [];


this.start();

}


start() {

this.raf();

}


stop() {

cancelAnimationFrame(this.rafId);

}


raf() {

this.callbacks.forEach(({ callback, id }) => callback({ id }));

this.rafId = requestAnimationFrame(this.raf);

}


add(callback, id) {

this.callbacks.push({ callback, id: id || genId() });

}


remove(id) {

this.callbacks = this.callbacks.filter((callback) => callback.id !== id);

}

}


class Vec2 {

constructor(x = 0, y = 0) {

this.x = x;

this.y = y;

}


set(x, y) {

this.x = x;

this.y = y;

}


lerp(v, t) {

this.x = lerp(this.x, v.x, t);

this.y = lerp(this.y, v.y, t);

}

}


const vec2 = (x = 0, y = 0) => new Vec2(x, y);


export function tilt(node, options) {

let { trigger, target } = resolveOptions(node, options);


let lerpAmount = 0.06;


const rotDeg = { current: vec2(), target: vec2() };

const bgPos = { current: vec2(), target: vec2() };


const update = (newOptions) => {

destroy();

({ trigger, target } = resolveOptions(node, newOptions));

init();

};


let rafId;


function ticker({ id }) {

rafId = id;


rotDeg.current.lerp(rotDeg.target, lerpAmount);

bgPos.current.lerp(bgPos.target, lerpAmount);


for (const el of target) {

el.style.setProperty("--rotX", rotDeg.current.y.toFixed(2) + "deg");

el.style.setProperty("--rotY", rotDeg.current.x.toFixed(2) + "deg");


el.style.setProperty("--bgPosX", bgPos.current.x.toFixed(2) + "%");

el.style.setProperty("--bgPosY", bgPos.current.y.toFixed(2) + "%");

}

}


.
.
.


ÇØ´ç »çÀÌÆ®·Î À̵¿Çؼ­ Àüü ¼Ò½º¸¦ È®ÀÎÇÏ½Ç ¼ö ÀÖ½À´Ï´Ù.


³×ƼÁð ÀÇ°ß   ÀÌ¿ëÇϽŠÀÚ·áÀÇ Èı⸦ ÀÚÀ¯·Ó°Ô ÀÛ¼ºÇϼ¼¿ä. (»ó¾÷ÀûÀÎ ±¤°í ¹× µµ¹è¼º ±Û µîÀº »çÀüÅ뺸¾øÀÌ »èÁ¦µÉ ¼ö ÀÖ½À´Ï´Ù.)
³»¿ë ¾ÆÀ̵ð Àǰ߳²±â±â
µî·ÏµÈ ÀǰßÀÌ ¾ø½À´Ï´Ù.
1
À̸§
³»¿ë
:³×¸Â¾Æ¿ä: :È­³ª´Â±º¿ä: :Àá¿Í: :¿ì¿ïÇØ: :À̰ǾƳÄ: :¿ÕÇÏÇÏ: ¿Õ¿ôÀ½~ ³î·¥~
Æò°¡Çϱâ ÈǸ¢ÇÔ ¸Å¿ìÁÁÀ½ ÁÁÀ½ ±¦ÂúÀ½ º¸Åë º°·Î
µµ¹è¹æÁöŰ
 88499316 º¸ÀÌ´Â µµ¹è¹æÁö۸¦ ÀÔ·ÂÇϼ¼¿ä.