Hi everyone,
I’m working on my portfolio website project in the full stack engineer program. There are no specific designs to follow, but it must be interactive using JS.
I decided to create a skills slide show, which I’m now starting to regret, since I have been struggling to get it to work properly.
The arrows that should display the next or prior skill are unresponsive when clicked, despite two event handlers.
In the JS code below, the CheckArrows and skillDisplay functions work properly when I manually adjust the skill number. The issue is the leftClick and rightClick functions don’t execute at all, so the skillNumber variable and associated skill write-up never change.
The last item to note is the icons are from font awesome. It may be irrelevant, but it’s worth mentioning.
Any help is much appreciated!
-John
HTML Code
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Code Portfolio Website</title>
<link rel="stylesheet" href="style.css" >
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Roboto:wght@400;500;700&display=swap" rel="stylesheet">
<script src="https://kit.fontawesome.com/c65ff74c63.js" crossorigin="anonymous"></script>
</head>
<body>
<header>
<h1>John Smith</h1>
<nav>
<a href="./index.html">About Me</a>
<a href="./projects.html">Projects</a>
<a href="./skills.html">Skills</a>
<a href="./contact">Contact</a>
</nav>
</header>
<section>
<h2>Skills</h2>
<div id="skills_container">
<i id="left_arrow" class="fa-solid fa-chevron-left fa-2xl "></i>
<div id="skill_1" class="skills">
<h3 class="subhead">HTML 5</h3>
<p >Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa.
Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis,
ultricies nec, pellentesque eu, pretium quis, sem.
</p>
<p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa.
Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis,
ultricies nec, pellentesque eu, pretium quis, sem.
</p>
</div>
<div id="skill_2" class="skills">
<h3 class="subhead">CSS</h3>
<p >Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa.
Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis,
ultricies nec, pellentesque eu, pretium quis, sem.
</p>
<p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa.
Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis,
ultricies nec, pellentesque eu, pretium quis, sem.
</p>
</div>
<div id="skill_3" class="skills">
<h3 class="subhead">JavaScript</h3>
<p >Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa.
Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis,
ultricies nec, pellentesque eu, pretium quis, sem.
</p>
<p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa.
Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis,
ultricies nec, pellentesque eu, pretium quis, sem.
</p>
</div>
<div id="skill_4" class="skills">
<h3 class="subhead">GitHub</h3>
<p >Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa.
Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis,
ultricies nec, pellentesque eu, pretium quis, sem.
</p>
<p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa.
Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis,
ultricies nec, pellentesque eu, pretium quis, sem.
</p>
</div>
<div id="skill_5" class="skills">
<h3 class="subhead">Figma</h3>
<p >Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa.
Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis,
ultricies nec, pellentesque eu, pretium quis, sem.
</p>
<p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa.
Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis,
ultricies nec, pellentesque eu, pretium quis, sem.
</p>
</div>
<i id="right_arrow" class="fa-solid fa-chevron-right fa-2xl"></i>
</div>
</section>
<script src="./script.js"></script>
</body>
</html>
JavaScript Code
const skills = document.getElementsByClassName('skills');
const leftArrow = document.getElementById('left_arrow');
const rightArrow = document.getElementById('right_arrow');
//Sets initial skill number
let skillNumber = 0;
// Removes arrows when additional skills are unavailable
function checkArrows () {
if(skillNumber === 0) {
leftArrow.style.display = 'none';
} else {
leftArrow.style.display = 'inline-block';
}
if(skillNumber === skills.length -1) {
rightArrow.style.display = 'none';
} else {
rightArrow.style.display = 'inline-block';
}
}
// Sets click event handler on arrows
leftArrow.addEventListener('click', leftClick);
rightArrow.addEventListener('click', rightClick);
// Sets the appropriate skill to be displayed and hides the others
function skillDisplay () {
for (let i=0; i < skills.length; i++) {
if (i === skillNumber) {
skills[i].style.display = 'inline-block';
} else {
skills[i].style.display = 'none';
}
}}
//Sets initial skills and arrow displays
skillDisplay ();
checkArrows ();
//Click event handlers for arrows
function leftClick () {
skillNumber -= 1;
checkArrows();
skillDisplay();
}
function rightClick () {
skillNumber += 1;
checkArrows();
skillDisplay();
console.log("test"); //Fails to print "test" when clicked
}