Index: arms/html/pdService =================================================================== diff -u -r1e25ccd74c0591e9b41bd26ab3794a09cec53dc6 -r8b0bd57ce590cb98c7c9b6bbf9bb5c17788b58aa --- arms/html/pdService (.../pdService) (revision 1e25ccd74c0591e9b41bd26ab3794a09cec53dc6) +++ arms/html/pdService (.../pdService) (revision 8b0bd57ce590cb98c7c9b6bbf9bb5c17788b58aa) @@ -213,32 +213,29 @@ // 초기 개발 및 확인 용도 $(function () { const navWrap = document.querySelector(".navi-wrap"); - const navToggle = document.querySelector(".navi-toggle"); const toggleIcon = document.querySelector(".mobile-nav-toggle"); function isMobile() { return /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent); } function btnNavToggle() { + console.log("???"); if (toggleIcon.classList.contains("bi-list")) { - navToggle.classList.add("active"); toggleIcon.classList.remove("bi-list"); toggleIcon.classList.add("bi-x"); navWrap.classList.add("on"); } else { - navToggle.classList.remove("active"); toggleIcon.classList.remove("bi-x"); toggleIcon.classList.add("bi-list"); navWrap.classList.remove("on"); } } - navToggle.addEventListener("click", btnNavToggle); + toggleIcon.addEventListener("click", btnNavToggle); navWrap.addEventListener("click", btnNavToggle); if (!isMobile()) { - navToggle.classList.remove("active"); toggleIcon.classList.remove("bi-x"); toggleIcon.classList.add("bi-list"); navWrap.classList.remove("on"); @@ -1743,6 +1740,6 @@ - + Index: arms/js/main.js =================================================================== diff -u --- arms/js/main.js (revision 0) +++ arms/js/main.js (revision 8b0bd57ce590cb98c7c9b6bbf9bb5c17788b58aa) @@ -0,0 +1,272 @@ +/** + * Template Name: MyResume - v4.5.0 + * Template URL: https://bootstrapmade.com/free-html-bootstrap-template-my-resume/ + * Author: BootstrapMade.com + * License: https://bootstrapmade.com/license/ + */ +(function () { + "use strict"; + + /** + * Easy selector helper function + */ + const select = (el, all = false) => { + el = el.trim(); + if (all) { + return [...document.querySelectorAll(el)]; + } else { + return document.querySelector(el); + } + }; + + /** + * Easy event listener function + */ + const on = (type, el, listener, all = false) => { + let selectEl = select(el, all); + if (selectEl) { + if (all) { + selectEl.forEach((e) => e.addEventListener(type, listener)); + } else { + selectEl.addEventListener(type, listener); + } + } + }; + + /** + * Easy on scroll event listener + */ + const onscroll = (el, listener) => { + el.addEventListener("scroll", listener); + }; + + /** + * Navbar links active state on scroll + */ + let navbarlinks = select("#navbar .scrollto", true); + const navbarlinksActive = () => { + let position = window.scrollY + 200; + navbarlinks.forEach((navbarlink) => { + if (!navbarlink.hash) return; + let section = select(navbarlink.hash); + if (!section) return; + if (position >= section.offsetTop && position <= section.offsetTop + section.offsetHeight) { + navbarlink.classList.add("active"); + } else { + navbarlink.classList.remove("active"); + } + }); + }; + window.addEventListener("load", navbarlinksActive); + onscroll(document, navbarlinksActive); + + /** + * Scrolls to an element with header offset + */ + const scrollto = (el) => { + let elementPos = select(el).offsetTop; + window.scrollTo({ + top: elementPos, + behavior: "smooth" + }); + }; + + /** + * Back to top button + */ + let backtotop = select(".back-to-top"); + if (backtotop) { + const toggleBacktotop = () => { + if (window.scrollY > 100) { + backtotop.classList.add("active"); + } else { + backtotop.classList.remove("active"); + } + }; + window.addEventListener("load", toggleBacktotop); + onscroll(document, toggleBacktotop); + } + + /** + * Mobile nav toggle + */ + // on('click', '.mobile-nav-toggle', function(e) { + // select('body').classList.toggle('mobile-nav-active') + // this.classList.toggle('bi-list') + // this.classList.toggle('bi-x') + // }) + + /** + * Scrool with ofset on links with a class name .scrollto + */ + on( + "click", + ".scrollto", + function (e) { + if (select(this.hash)) { + e.preventDefault(); + + let body = select("body"); + if (body.classList.contains("mobile-nav-active")) { + body.classList.remove("mobile-nav-active"); + let navbarToggle = select(".mobile-nav-toggle"); + navbarToggle.classList.toggle("bi-list"); + navbarToggle.classList.toggle("bi-x"); + } + scrollto(this.hash); + } + }, + true + ); + + /** + * Scroll with ofset on page load with hash links in the url + */ + window.addEventListener("load", () => { + if (window.location.hash) { + if (select(window.location.hash)) { + scrollto(window.location.hash); + } + } + }); + + /** + * Preloader + */ + let preloader = select("#preloader"); + if (preloader) { + window.addEventListener("load", () => { + preloader.remove(); + }); + } + + /** + * Hero type effect + */ + const typed = select(".typed"); + if (typed) { + let typed_strings = typed.getAttribute("data-typed-items"); + typed_strings = typed_strings.split(","); + new Typed(".typed", { + strings: typed_strings, + loop: true, + typeSpeed: 100, + backSpeed: 50, + backDelay: 2000 + }); + } + + /** + * Skills animation + */ + let skilsContent = select(".skills-content"); + if (skilsContent) { + new Waypoint({ + element: skilsContent, + offset: "80%", + handler: function (direction) { + let progress = select(".progress .progress-bar", true); + progress.forEach((el) => { + el.style.width = el.getAttribute("aria-valuenow") + "%"; + }); + } + }); + } + + /** + * Porfolio isotope and filter + */ + window.addEventListener("load", () => { + let portfolioContainer = select(".portfolio-container"); + if (portfolioContainer) { + let portfolioIsotope = new Isotope(portfolioContainer, { + itemSelector: ".portfolio-item" + }); + + let portfolioFilters = select("#portfolio-flters li", true); + + on( + "click", + "#portfolio-flters li", + function (e) { + e.preventDefault(); + portfolioFilters.forEach(function (el) { + el.classList.remove("filter-active"); + }); + this.classList.add("filter-active"); + + portfolioIsotope.arrange({ + filter: this.getAttribute("data-filter") + }); + portfolioIsotope.on("arrangeComplete", function () { + AOS.refresh(); + }); + }, + true + ); + } + }); + + /** + * Initiate portfolio lightbox + */ + const portfolioLightbox = GLightbox({ + selector: ".portfolio-lightbox" + }); + + /** + * Initiate portfolio details lightbox + */ + const portfolioDetailsLightbox = GLightbox({ + selector: ".portfolio-details-lightbox", + width: "90%", + height: "90vh" + }); + + /** + * Portfolio details slider + */ + new Swiper(".portfolio-details-slider", { + speed: 400, + loop: true, + autoplay: { + delay: 5000, + disableOnInteraction: false + }, + pagination: { + el: ".swiper-pagination", + type: "bullets", + clickable: true + } + }); + + /** + * Testimonials slider + */ + new Swiper(".testimonials-slider", { + speed: 600, + loop: true, + autoplay: { + delay: 5000, + disableOnInteraction: false + }, + slidesPerView: "auto", + pagination: { + el: ".swiper-pagination", + type: "bullets", + clickable: true + } + }); + + /** + * Animation on scroll + */ + window.addEventListener("load", () => { + AOS.init({ + duration: 1000, + easing: "ease-in-out", + once: true, + mirror: false + }); + }); +})();