πŸ‘¨‍πŸ’»κ°œλ°œ/🌐Front-End

[javascript] bottom navbar / ν•˜λ‹¨ λ‚΄λΉ„κ²Œμ΄μ…˜ λ°” / bottom navigation bar

kimtongting μž…λ‹ˆλ‹€ 2022. 1. 11. 14:45

 

 

 

μ„œλ‘ 

ν•˜λ‚˜μ˜ ν”„λ‘œμ νŠΈμ—μ„œ κ΄€λ¦¬μžμš© ν™”λ©΄κ³Ό μ‚¬μš©μžμš© 화면을 λ™μ‹œμ— 같이 μ“°λŠ” κ²½μš°κ°€ κ°„ν˜Ή μžˆλ‹€.

 

κ΄€λ¦¬μž ν™”λ©΄μ˜ 경우, μ‚¬μš©ν•˜λŠ” 메뉴가 λ§Žμ•„ (심지어 λ“œλ‘­λ‹€μš΄ 메뉴가 ν—ˆλ‹€ν•˜λ‹€.)

μ‚¬μ΄λ“œλ©”λ‰΄(버거메뉴 Burger Menu) 둜 κ΅¬ν˜„ν•˜μ˜€λ‹€.

κ΄€λ¦¬μž ν™”λ©΄ μ‚¬μ΄λ“œ 메뉴(Burger Menu)

 

μ΄μ™€λŠ” λ‹€λ₯΄κ²Œ μ‚¬μš©μž ν™”λ©΄μ˜ 경우 νŽ˜μ΄μ§€κ°€ λͺ‡ 개 μ—†μ–΄ μ•„λž˜μ™€ 같이 Navigation bar둜 κ΅¬ν˜„ν•˜μ˜€λ‹€.

 

μ‚¬μš©μž ν™”λ©΄ ν•˜λ‹¨ 메뉴 (Navigator Menu)

 

#Lib

jquery.min.js
bootstrap.min.css
fontawesome.all.css

 

html

 

<div class="navigation">
	<ul class="bottom-nav">
		<div class="slider"></div>
		<li>
			<a href="#">
				<i class="far fa-user" style="margin-left:0px;"></i>
				<span>내정보</span>
			</a>
		</li>
		<li>
			<a href="#" class="active-icon" id="defaultActive">
				<i class="fas fa-qrcode" style="margin-left:0px;"></i>
				<span>QRcode</span>
			</a>
		</li>
		<li>
			<a href="#">
				<i class="fas fa-shopping-cart" style="margin-left:0px;"></i>
				<span>κ±°λž˜λ‚΄μ—­</span>
			</a>
		</li>
        ...
		<li>
			<a href="${root}/logout.do" class="text-danger">
				<i class="fas fa-sign-out-alt" style="margin-left: 0px;"></i>
				<span>λ‘œκ·Έμ•„μ›ƒ</span>
			</a>
		</li>
	</ul>
</div>
//page init μ‹œ 초기 μ„ΈνŒ…μ„ κ°•μ œν™” ν•˜κΈ° μœ„ν•΄ μ„ μ–Έ
<script type="text/javascript">
	$(function () {
		let position = $("#defaultActive").position();
		const margin = 51;
		$(".slider").css({
			left: +position.left + margin,
			transform: "translateX(-50%)"
		});
		$(".bottom-nav li a").removeClass("active-icon");
		$("#defaultActive").addClass("active-icon");
	})
</script>

 

 

javascript

μ΄ν•΄ν•˜κΈ° μ‰¬μš΄ μ½”λ“œμ΄λ‹€.

this의 position 값을 읽은 후에, 값을 κ³„μ‚°ν•˜μ—¬ css 값을 μˆ˜μ •μ‹œν‚¨λ‹€.

$(function () {
    $(".bottom-nav li a").click(function () {
        let position = $(this).position();
        const margin = 51;
        $(".slider").css({
            left: +position.left + margin,
            transform: "translateX(-50%)"
        });
        $(".bottom-nav li a").removeClass("active-icon");
        $(this).addClass("active-icon");
    });
})

 

 

css

.bottom-nav {
    border-top: 2px solid #f2f2f2;
    z-index: 999;
    width: 50%;
    height: 80px;
    position: fixed;
    bottom: 0px;
    left: 25%;
    display: flex;
    justify-content: center;
    align-items: center;
    background-color: #fff;
    margin: 0px;
    padding: 15px 0px 15px;
    box-shadow: 0px 8px 10px rgba(130, 43, 97, 0.19);
    list-style: none;
}
.bottom-nav li{
    width: 25%;
}
.bottom-nav li a {
    height: 40px;
    color: #6777ef;
    text-align: center;
    font-size: 20px;
    display: block;
    transition: 1s;
    position: relative;
}
.bottom-nav li a i {
    width: 100%;
    position: absolute;
    font-size: 20px;
    top: 0;
    left: 0;
    transition-delay: 0.3s;
    transition: 1s cubic-bezier(0.49, -0.35, 0.77, 1.44);
    z-index: 9;
}
.bottom-nav li a span {
    display: block;
    font-size: 12px;
    width: 100%;
    position: absolute;
    bottom: -16px;
    transition-delay: 0.3s;
    transition: 1s cubic-bezier(0.49, -0.35, 0.77, 1.44);
    z-index: 9;
    opacity: 0;
}
.bottom-nav li a.active-icon i {
    top: 0%;
    transition-delay: 0.3s;
    transition: 1s cubic-bezier(0.49, -0.35, 0.77, 1.44);
}
.bottom-nav li a.active-icon span {
    bottom: 35px;
    transition-delay: 0.5s;
    transition: 1s cubic-bezier(0.49, -0.35, 0.77, 1.44);
    opacity: 1;
}
.bottom-nav .slider {
    width: 40px;
    height: 40px;
    position: absolute;
    left: 37%;
    transform: translateX(-50%);
    top: 30%;
    background-color: #fff;
    border: 2px solid #6777ef;
    box-shadow: 0px 0px 0px 5px #6777ef;
    transition: 1s;
    border-radius: 50%;
}

@media (max-width: 900px) {
    .bottom-nav {
        width: 100%;
        left: 0;
    }
}

 

 

 

 

 

λ°˜μ‘ν˜•