Apple iPhone14 clone 1ํƒ„

sealkimยท2023๋…„ 3์›” 28์ผ
1
post-thumbnail

Apple iPhone14 clone

ํ‹ˆํ‹ˆํžˆ ๋“ค์–ด๊ฐ€๋Š” ์• ํ”Œ ๊ณต์‹ ํ™ˆํŽ˜์ด์ง€์—์„œ iPhone 14 ํŽ˜์ด์ง€์˜ ๋ชจ์…˜๋“ค์ด ํฅ๋ฏธ๋กœ์›Œ ํ•œ ๋ถ€๋ถ„์„ ํด๋ก  ์ฝ”๋”ฉ ํ•ด๋ณด์•˜๋‹ค!
์ด์ „ ๋ชจ์…˜๋“ค์€ ์Šคํฌ๋กค ๋ชจ์…˜์— ์ค‘์ ์„ ๋‘์–ด gsap ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋งŽ์ด ํ™œ์šฉํ–ˆ๋Š”๋ฐ ์ด๋ฒˆ ๋ชจ์…˜์€ ํด๋ฆญ ์ด๋ฒคํŠธ๋“ค์ด๋ผ jQuery, JavaScript๋ฅผ ์ด์šฉํ•ด ๊ตฌํ˜„ํ–ˆ๋‹ค.

โšก๏ธ ๊ฒฐ๊ณผ ํ™”๋ฉด



1. ๋จผ์ € ๋ชจ์…˜์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์ „์— ์•„์ดํฐ ์ด๋ฏธ์ง€๋“ค์— `mask`๋ฅผ ์”Œ์–ด์ฃผ๊ณ  ์œ„์น˜๊ฐ’์„ ์ •ํ•ด์ฃผ์–ด์•ผ ํ–ˆ๋‹ค.

โฌœ๏ธ HTML

<section class="sc-main">
    <div class="group-title">
        <h2 class="title">๋†€๋ผ์›€ ํ•œ๊ฐ€๋“.</h2>
    </div>
    <div class="grouo-color">
        <div class="color-txt">
            <span class="txt">๋ฏธ๋“œ๋‚˜์ดํŠธ</span>
            <span class="txt">์Šคํƒ€๋ผ์ดํŠธ</span>
            <span class="txt">๋ ˆ๋“œ</span>
            <span class="txt">๋ธ”๋ฃจ</span>
            <span class="txt">ํผํ”Œ</span>
            <span class="txt">์˜๋กœ</span>
        </div>
        <ul class="color-list">
            <li class="color-item"><a href="" class="color-link midnight-btn"></a></li>
            <li class="color-item"><a href="" class="color-link starlight-btn"></a></li>
            <li class="color-item"><a href="" class="color-link red-btn"></a></li>
            <li class="color-item"><a href="" class="color-link blue-btn on"></a></li>
            <li class="color-item"><a href="" class="color-link purple-btn"></a></li>
            <li class="color-item"><a href="" class="color-link yellow-btn"></a></li>
        </ul>
    </div>
    <div class="group-phone">
        <div class="inner">
            <figure class="ph midnight"></figure>
            <figure class="ph starlight"></figure>
            <figure class="ph red"></figure>
            <figure class="ph blue on"></figure>
            <figure class="ph purple"></figure>
            <figure class="ph yellow"></figure>
        </div>
    </div>
</section>

โฌœ๏ธ CSS

.group-phone .inner {
    position: relative;
    top: 110px;
    left: 50%;
    transform: translateX(-50%);
    width: 1144px;
    height: 574px;
    margin: auto 0;
    transform-origin: 50% 50%;
    transform: matrix(1.60574, 0.269279, -0.269279, 1.60574, -510.662, 196.845);
    transition: transform 1s cubic-bezier(0.645,0.045,0.355,1);
}
.group-phone .inner.on {
    transform: matrix(1.04327, -0.464493, 0.464493, 1.04327, -768.586, 130.872);
}
.group-phone .ph {
    transform-origin: 0 0;
    transition: transform 1s cubic-bezier(0.645,0.045,0.355,1);
}
.group-phone .midnight {
    position: absolute;
    transform: scale(0.51);
    top: 233px;
    left: 8px;
    width: 532px;
    height: 562px;
    background-image: url(../img/midnight.jpg);
    background-size: 532px 562px;
    background-repeat: no-repeat;
    mask-image: url(../img/mask_midnight.png);
    -webkit-mask-image: url(../img/mask_midnight.png);
    mask-repeat: no-repeat;
    -webkit-mask-repeat: no-repeat;
    mask-size: 532px 562px;
    -webkit-mask-size: 532px 562px;
}
.group-phone .starlight {
    position: absolute;
    transform: scale(0.52);
    top: 118px;
    left: 111px;
    width: 518px;
    height: 582px;
    background-image: url(../img/starlight.jpg);
    background-size: 518px 582px;
    background-repeat: no-repeat;
    mask-image: url(../img/mask_midnight.png);
    -webkit-mask-image: url(../img/mask_starlight.png);
    mask-repeat: no-repeat;
    -webkit-mask-repeat: no-repeat;
    mask-size:  518px 582px;
    -webkit-mask-size:  518px 582px;
}
/*...์ƒ๋žต*/

๋งˆํฌ์—…์€ ํฌ๊ฒŒ ์•„์ดํฐ ์ปฌ๋Ÿฌ ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ์ค„ ์˜์—ญ๊ณผ ์•„์ดํฐ ์ด๋ฏธ์ง€๊ฐ€ ๋‚˜์˜ฌ ์˜์—ญ์œผ๋กœ ๋‚˜๋ˆ„์—ˆ๊ณ  ์ปฌ๋Ÿฌ ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ์ค„ ์˜์—ญ์€ ํ…์ŠคํŠธ, ์ปฌ๋Ÿฌ ๋ฆฌ์ŠคํŠธ๋กœ ๋‹ค์‹œ ํ•œ๋ฒˆ ๋‚˜๋ˆ„์–ด ์ฃผ์—ˆ๋‹ค.(ํ…์ŠคํŠธ ์œ„์น˜๊ฐ’์„ ๋”ฐ๋กœ ์žก๊ธฐ ์œ„ํ•ด ๋ถ„๋ฆฌ)
ใ…ค
css์—์„œ ์•„์ดํฐ ์ด๋ฏธ์ง€์— mask๋ฅผ ์”Œ์–ด์ค€ ํ›„ size์™€ repeat๊นŒ์ง€ ์„ค์ •ํ•ด์ฃผ์—ˆ๋‹ค. transform-origin, transform ์†์„ฑ์„ ์ด์šฉํ•ด ์ดˆ๊ธฐ ์œ„์น˜๋ฅผ ์žก์•„์ฃผ์—ˆ๊ณ  (์ด๋•Œ matrix๊ฐ’์€ ์• ํ”Œ ์‚ฌ์ดํŠธ์˜ ์ ˆ๋Œ€๊ฐ’์„ ์ด์šฉํ–ˆ๋‹ค.)

โ—ป mask์†์„ฑ๊ณผ transform์„ ์ ์šฉํ•œ ๊ฒฐ๊ณผ



  1. ์›ํ•˜๋Š” ์•„์ดํฐ ์ปฌ๋Ÿฌ๋ฅผ ๋ˆ„๋ฃจ๋ฉด ํ•ด๋‹น ์ปฌ๋Ÿฌ๋ฐ•์Šค์— border๊ฐ€ ์ƒ๊ธฐ๋Š” ๋ถ€๋ถ„์„ foreach ๋ฐ˜๋ณต๋ฌธ์œผ๋กœ ๊ตฌํ˜„ํ–ˆ๋‹ค.

โฌœ๏ธ JS

const colorLink = document.querySelectorAll('.color-link');

colorLink.forEach(function(event) {

	event.addEventListener('click', function() {
        colorLink.forEach(function(e) {
            e.classList.remove('on')
        });
        event.classList.add('on')
	});
});

โฌœ๏ธ CSS

.grouo-color .color-link {
    display: block;
    position: relative;
    width: 20px;
    height: 20px;
    border-radius: 50%;
    background: #f5f5f7 50%;
}
.grouo-color .color-link.on::after {
    content: '';
    display: block;
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%,-50%);
    width: 28px;
    height: 28px;
    border: 2px solid #0071e3;
    border-radius: 50%;
    box-sizing: border-box;
} 
.color-link.midnight-btn {
    background-color: #31353a;
}
.color-link.starlight-btn {
    background-color: #f0ece8;
}
.color-link.red-btn {
    background-color: #e11c2a;
}
.color-link.blue-btn {
    background-color: #c0cfec;
}
.color-link.purple-btn {
    background-color: #e7d7e9;
}
.color-link.yellow-btn {
    background-color: #f5e488;
}

์ปฌ๋Ÿฌ ๋งํฌ์— ํŒŒ๋ž€์ƒ‰ border๊ฐ€ ์ƒ๊ธด๋Š” onํด๋ž˜์Šค๋ฅผ ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด ์ค€ ํ›„, ์ž๋ฐ”์Šคํฌ๋ฆฝ์—์„œ classListํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด onํด๋ž˜์Šค๋ฅผ ๊ฐ€์ ธ์™€์ฃผ๋Š”๋ฐ ์ด๋•Œ foreach๋ฌธ์„ ์‚ฌ์šฉํ–ˆ๋‹ค. ์›ํ•˜๋Š” ์ปฌ๋Ÿฌ๋ฅผ ๋ˆ„๋ฃจ๋ฉด ํ•ด๋‹น ์ปฌ๋Ÿฌ์— border๊ฐ€ ์ƒ๊ธฐ๊ณ  ๋‚˜๋จธ์ง€ ์ปฌ๋Ÿฌ ๋ฒ„ํŠผ์€ border๊ฐ€ ์‚ฌ๋ผ์ง€๋Š” ๊ฒƒ์„ ๋ฐ˜๋ณต์‹œ์ผฐ๋‹ค.

const colorLink = document.querySelectorAll('.color-link');
ใ…ค
colorLink.forEach(function(event) {
ใ…ค
	event.classList.add('on')
});

์ฒ˜์Œ js์ฝ”๋“œ์ด๋‹ค. ๋‹จ์ˆœํžˆ ๋ฐ˜๋ณต๋ฌธ ์•ˆ์— ํด๋ž˜์Šค๋งŒ ๋„ฃ์–ด์ฃผ๋ฉด ๋ ๊ฑฐ๋ผ ์ƒ๊ฐํ–ˆ๋‹ค๊ฐ€ ๊ตฌํ˜„๋˜์ง€ ์•Š์•„ ๊ตฌ๊ธ€๋ง์„ ํ•˜๋ฉฐ ๋ฐ˜๋ณต๋ฌธ ์‚ฌ์šฉํ•ด ๋Œ€ํ•œ ์ดํ•ด๋ฅผ ๋†’์—ฌ ๋‹ค์‹œ ์ฝ”๋“œ๋ฅผ ์งœ ๊ฒฐ๊ณผ๋ฌผ์„ ๋งŒ๋“ค์—ˆ๋‹ค.

  1. ์ปฌ๋Ÿฌ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฃจ๋ฉด ์•„์ดํฐ ์ด๋ฏธ์ง€๋ฅผ ๊ฐ์‹ธ๊ณ  ์žˆ๋Š” ๋ฐ•์Šค์˜ transform์„ ๋ณ€๊ฒฝ ์‹œํ‚ค๊ณ , ํ•จ๊ป˜ ๊ฐ ์ด๋ฏธ์ง€์˜ ์Šค์ผ€์ผ๊ณผ transform๋„ ๋ฐ”๊พธ์–ด ์ฃผ์—ˆ๋‹ค.
$('.midnight-btn').click(function(){
    $('.group-phone .inner').css("transform","matrix(1.24651, 1.43395, -1.43395, 1.24651, -109.06, 498.232)");
    $('.midnight').addClass('on').siblings().removeClass('on');
})
$('.starlight-btn').click(function(){
    $('.group-phone .inner').css("transform","matrix(1.50347, 1.10184, -1.10184, 1.50347, -224.817, 414.932)")
    $('.starlight').addClass('on').siblings().removeClass('on');
})
$('.red-btn').click(function(){
    $('.group-phone .inner').css("transform","matrix(1.64561, 0.755092, -0.755092, 1.64561, -364.436, 307.051)")
    $('.red').addClass('on').siblings().removeClass('on');
})
$('.blue-btn').click(function(){
    $('.group-phone .inner').css("transform","matrix(1.60574, 0.269279, -0.269279, 1.60574, -510.662, 196.845)")
    $('.blue').addClass('on').siblings().removeClass('on');
})
$('.purple-btn').click(function(){
    $('.group-phone .inner').css("transform","matrix(1.3532, -0.192071, 0.192071, 1.3532, -649.839, 140.245)")
    $('.purple').addClass('on').siblings().removeClass('on');
})
$('.yellow-btn').click(function(){
    $('.group-phone .inner').css("transform","matrix(1.04327, -0.464493, 0.464493, 1.04327, -768.586, 130.872)")
    $('.yellow').addClass('on').siblings().removeClass('on');
})

์ œ์ด์ฟผ๋ฆฌ๋กœ click์ด๋ฒคํŠธ์—์„œ css์†์„ฑ ๋ณ€ํ™”์™€ addclass() ํ˜•์ œ ์„ ํƒ์ž siblings() ๋“ฑ์„ ์‚ฌ์šฉํ–ˆ๋‹ค. ์ปฌ๋Ÿฌ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฃจ๋ฉด ํ•ด๋‹น ์ปฌ๋Ÿฌ ์ด๋ฏธ์ง€์˜ transform์ด ๋ณ€๊ฒฝ๋˜๊ณ , ํ•จ๊ป˜ ์ปฌ๋Ÿฌ์˜ ํ…์ŠคํŠธ์™€ ์œ„ ์ฝ”๋“œ์—์„œ ์„ค์ •ํ•ด ์ฃผ์—ˆ๋˜ ํŒŒ๋ž€์ƒ‰ border๊ฐ€ ์ž…ํ˜€์ง€๋„๋ก ํ–ˆ๋‹ค.
ํ•ด๋‹น ์ปฌ๋Ÿฌ ์™ธ์— ๋‹ค๋ฅธ ๋ฒ„ํŠผ์˜ onํด๋ž˜์Šค๋ฅผ ์‚ญ์ œํ•ด์ฃผ๊ธฐ ์œ„ํ•ด removeclass๋ฅผ ์ถ”๊ฐ€ํ•ด์ฃผ์—ˆ๋‹ค.

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ๋งŒ ๋™์ ์œผ๋กœ ๋ฒ„ํŠผ๊ณผ ์ด๋ฏธ์ง€๋“ค์ด ํ•จ๊ป˜ ์›€์ง์ผ ์ˆ˜ ์žˆ๋„๋ก ๊ตฌํ˜„ํ•˜๊ณ  ์‹ถ์—ˆ์ง€๋งŒ ๋ง‰ํžˆ๋Š” ๋ถ€๋ถ„๋“ค์ด ์žˆ์–ด ์•„์‰ฌ์› ๋‹ค. ์ž‘์—…๋งˆ๋‹ค ์—ฌ์œ ๊ฐ€ ์žˆ๋‹ค๋ฉด ์ˆœ์ˆ˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ๋งŒ ๊ตฌํ˜„ํ•˜๋ ค๊ณ  ๊ณ„์† ๊ณต๋ถ€ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, ๋‹ค์Œ๋ฒˆ์—” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋„ ์ด๋Ÿฐ ๋ชจ์…˜์„ ๊ตฌํ˜„ํ•ด ๋ณผ์ˆ˜ ์žˆ๋„๋ก ํ•ด์•ผ๊ฒ ๋‹ค.๐Ÿ˜ธ

profile
๐Ÿš€ DevLog

0๊ฐœ์˜ ๋Œ“๊ธ€