<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Wil McGill </title>
    <description>The latest articles on DEV Community by Wil McGill  (@afkjr).</description>
    <link>https://dev.to/afkjr</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3599983%2F54cf55da-12ff-4397-9ff1-055d2d7b4c03.jpeg</url>
      <title>DEV Community: Wil McGill </title>
      <link>https://dev.to/afkjr</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/afkjr"/>
    <language>en</language>
    <item>
      <title>The CarnEvil of Horrors</title>
      <dc:creator>Wil McGill </dc:creator>
      <pubDate>Fri, 07 Nov 2025 21:25:34 +0000</pubDate>
      <link>https://dev.to/afkjr/the-carnevil-of-horrors-118o</link>
      <guid>https://dev.to/afkjr/the-carnevil-of-horrors-118o</guid>
      <description>&lt;p&gt;Joined Dev.to literally yesterday, and one of the first things I came across was this Halloween challenge, and I immediately said "cool". I've been messing around with web development for a while now, so figured I'll try it, why not? I built "The CarnEvil of Horrors". It's based on one of my favorite childhood book series, Goosebumps, the landing page taking direct inspiration from the Give Yourself Goosebumps series - "Escape from the Carnival of Horrors", by R.L Stine. It's a book I still have in my collection today. &lt;/p&gt;

&lt;p&gt;The tech stack I used was HTML, CSS, and vanilla JS.&lt;/p&gt;

&lt;p&gt;Check out the site: &lt;a href="https://afkjr.github.io/CarnEvil-of-Horrors/" rel="noopener noreferrer"&gt;https://afkjr.github.io/CarnEvil-of-Horrors/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The CarnEvil of Horrors is a responsive single-page site with three sections (About, Scares, Tickets) that features smooth scrolling navigation, unique horror-themed styling for each section, and a bit of JavaScript effects. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9mvasw0zty3a4z13pcrp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9mvasw0zty3a4z13pcrp.png" alt="1st section of landing" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I found a carnival interior image from Freepik.com (royalty-free) and created three distinct themes using CSS custom properties:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;:root {
    --color-blood-red: #8b0000;
    --color-toxic-green: #39ff14;
    --color-shadow-purple: #4a0e4e;
    --transition-speed: 0.3s;
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For the background, I implemented an overlay to darken the image for readability:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;body {
    background-image:
        linear-gradient(
            rgba(5, 2, 0, 0.7),
            rgba(5, 2, 0, 0.7)
        ),
        url('IMG_0473.jpg');
    background-attachment: fixed;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I created animated blood drips using CSS animations and JavaScript. The CSS defined the drip animation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.blood-drip {
    position: absolute;
    width: 2px;
    background: linear-gradient(to bottom, var(--color-blood-red), transparent);
    animation: drip 3s linear infinite;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwsih8xv79oogys6vhby6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwsih8xv79oogys6vhby6.png" alt="2nd section of landing" width="800" height="367"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdeimqxvvkc4skbztpywo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdeimqxvvkc4skbztpywo.png" alt="3rd section of landing" width="800" height="373"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@keyframes drip {
    0% { opacity: 0; height: 0; top: 0; }
    10% { opacity: 1; }
    100% { opacity: 0; height: 100px; top: 100%; }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The JavaScript dynamically creates drips at random positions:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function createBloodDrip() {
    const bloodContainer = document.getElementById('bloodDripsContainer');
    const drip = document.createElement('div');
    drip.className = 'blood-drip';
    drip.style.left = Math.random() * 100 + '%';
    bloodContainer.appendChild(drip);

    setTimeout(() =&amp;gt; drip.remove(), 3000);
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For the glitch effect on titles, I created CSS animations with pseudo-elements:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.glitch.active::before {
    content: attr(data-text);
    animation: glitch-1 0.3s both infinite;
    color: var(--color-toxic-green);
}

@keyframes glitch-1 {
    0% { transform: translateX(0); }
    20% { transform: translateX(-2px); }
    40% { transform: translateX(2px); }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;JavaScript triggers the effect randomly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function triggerGlitchEffect(element) {
    element.classList.add('active');
    setTimeout(() =&amp;gt; element.classList.remove('active'), 300);
}

function startRandomGlitch() {
    const glitchElements = document.querySelectorAll('.glitch');
    setInterval(() =&amp;gt; {
        const randomElement = glitchElements[Math.floor(Math.random() * glitchElements.length)];
        triggerGlitchEffect(randomElement);
    }, 8000);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This was a fun project. My favorite challenges I faced were getting the blood drops to flow properly and the shaking effect when a user hovers over a ride (scares). This project also reinforced my learning in that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;File Paths Matter: Always use forward slashes or relative paths in CSS&lt;/li&gt;
&lt;li&gt;Syntax is Critical: A single missing comma can break an entire effect&lt;/li&gt;
&lt;li&gt;CSS and JS Must Align: JavaScript effects require corresponding CSS animations developed together

&lt;ul&gt;
&lt;li&gt;Incremental Testing: Test each feature as you build to catch issues immediately&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;CSS Custom Properties are Powerful: Variables make adjustments quick and consistent&lt;/li&gt;

&lt;/ul&gt;

</description>
      <category>devchallenge</category>
      <category>frontendchallenge</category>
      <category>webdev</category>
      <category>javascript</category>
    </item>
  </channel>
</rss>
