<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Bootstrap &#8211; Matthew Petroff</title>
	<atom:link href="https://mpetroff.net/tag/bootstrap/feed/" rel="self" type="application/rss+xml" />
	<link>https://mpetroff.net</link>
	<description>mpetroff.net</description>
	<lastBuildDate>Sun, 05 Jul 2020 23:57:02 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	
	<item>
		<title>Bootstrap Navbar without jQuery</title>
		<link>https://mpetroff.net/2015/03/bootstrap-navbar-without-jquery/</link>
					<comments>https://mpetroff.net/2015/03/bootstrap-navbar-without-jquery/#comments</comments>
		
		<dc:creator><![CDATA[Matthew Petroff]]></dc:creator>
		<pubDate>Sat, 28 Mar 2015 02:47:00 +0000</pubDate>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Bootstrap]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQuery]]></category>
		<guid isPermaLink="false">http://mpetroff.net/?p=1772</guid>

					<description><![CDATA[While I&#8217;m fond of Bootstrap in general, I dislike how much it relies on JavaScript and particularly dislike its dependency on jQuery. I have nothing against using JavaScript for creating interactive content, e.g. web applications, or progressive enhancement, e.g. lightboxes &#8230; <a href="https://mpetroff.net/2015/03/bootstrap-navbar-without-jquery/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
										<content:encoded><![CDATA[<p><span class="dropcap">W</span>hile I&#8217;m fond of <a href="http://getbootstrap.com/">Bootstrap</a> in general, I dislike how much it relies on JavaScript and particularly dislike its dependency on jQuery. I have nothing against using JavaScript for creating interactive content, e.g. web applications, or progressive enhancement, e.g. lightboxes or copying text to the clipboard, but I do take issue with requiring JavaScript for basic site functionality as is the case with Bootstrap&#8217;s navbar and dropdowns. What I particularly dislike is that not only does this require JavaScript, but it requires a 32kB JavaScript library, jQuery, to do what would otherwise take less than 1kB of JavaScript. To avoid this when <a href="/2014/01/camp-workcoeman-website-redesign/" title="Camp Workcoeman Website Redesign">redesigning campworkcoeman.org</a>, I made some modifications to open the navbar&#8217;s dropdowns on hover on larger devices and used a small piece of plain JavaScript to operate the menu on small, mobile devices. Unfortunately, this didn&#8217;t work properly under iOS, but I recently fixed this. I&#8217;m detailing the changes I made in case someone finds them useful.</p>
<p><span id="more-1772"></span></p>
<p>As far as HTML goes, the only change is using <code>&lt;div&gt;</code> elements instead of <code>&lt;a&gt;</code> elements for the <code>dropdown-toggle</code> class. In the CSS, a media query is used to open the dropdowns on hover on larger devices, and some code is added to restore the appearance of the dropdowns due to the HTML change.</p>
<div class="highlighted-source default css">
<pre><span></span><span class="c">/*</span>
<span class="c"> * Open dropdowns on hover instead of click.</span>
<span class="c"> */</span><span class="w"></span>
<span class="p">@</span><span class="k">media</span><span class="w"> </span><span class="o">(</span><span class="nt">min-width</span><span class="o">:</span><span class="w"> </span><span class="nt">768px</span><span class="o">)</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
<span class="w">  </span><span class="p">.</span><span class="nc">dropdown</span><span class="p">:</span><span class="nd">hover</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
<span class="w">    </span><span class="k">background</span><span class="p">:</span><span class="w"> </span><span class="mh">#e7e7e7</span><span class="p">;</span><span class="w"></span>
<span class="w">  </span><span class="p">}</span><span class="w"></span>
<span class="w">  </span><span class="p">.</span><span class="nc">dropdown</span><span class="p">:</span><span class="nd">hover</span><span class="w"> </span><span class="o">&gt;</span><span class="w"> </span><span class="p">.</span><span class="nc">dropdown-menu</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
<span class="w">    </span><span class="k">display</span><span class="p">:</span><span class="w"> </span><span class="kc">block</span><span class="p">;</span><span class="w"></span>
<span class="w">  </span><span class="p">}</span><span class="w"></span>
<span class="p">}</span><span class="w"></span>

<span class="c">/*</span>
<span class="c"> * The following is needed since the dropdowns are &lt;div&gt;</span>
<span class="c"> * elements instead of &lt;a&gt; elements</span>
<span class="c"> */</span><span class="w"></span>
<span class="p">.</span><span class="nc">nav</span><span class="w"> </span><span class="o">&gt;</span><span class="w"> </span><span class="nt">li</span><span class="w"> </span><span class="o">&gt;</span><span class="w"> </span><span class="nt">div</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
<span class="w">  </span><span class="k">position</span><span class="p">:</span><span class="w"> </span><span class="kc">relative</span><span class="p">;</span><span class="w"></span>
<span class="w">  </span><span class="k">display</span><span class="p">:</span><span class="w"> </span><span class="kc">block</span><span class="p">;</span><span class="w"></span>
<span class="w">  </span><span class="k">padding</span><span class="p">:</span><span class="w"> </span><span class="mi">10</span><span class="kt">px</span><span class="w"> </span><span class="mi">15</span><span class="kt">px</span><span class="p">;</span><span class="w"></span>
<span class="w">  </span><span class="k">cursor</span><span class="p">:</span><span class="w"> </span><span class="kc">default</span><span class="p">;</span><span class="w"></span>
<span class="p">}</span><span class="w"></span>
<span class="p">.</span><span class="nc">navbar-nav</span><span class="w"> </span><span class="o">&gt;</span><span class="w"> </span><span class="nt">li</span><span class="w"> </span><span class="o">&gt;</span><span class="w"> </span><span class="nt">div</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
<span class="w">  </span><span class="k">padding-top</span><span class="p">:</span><span class="w"> </span><span class="mi">15</span><span class="kt">px</span><span class="p">;</span><span class="w"></span>
<span class="w">  </span><span class="k">padding-bottom</span><span class="p">:</span><span class="w"> </span><span class="mi">15</span><span class="kt">px</span><span class="p">;</span><span class="w"></span>
<span class="w">  </span><span class="k">line-height</span><span class="p">:</span><span class="w"> </span><span class="mi">20</span><span class="kt">px</span><span class="p">;</span><span class="w"></span>
<span class="p">}</span><span class="w"></span>
<span class="p">.</span><span class="nc">navbar-default</span><span class="w"> </span><span class="p">.</span><span class="nc">navbar-nav</span><span class="w"> </span><span class="o">&gt;</span><span class="w"> </span><span class="nt">li</span><span class="w"> </span><span class="o">&gt;</span><span class="w"> </span><span class="nt">div</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
<span class="w">  </span><span class="k">color</span><span class="p">:</span><span class="w"> </span><span class="nb">rgb</span><span class="p">(</span><span class="mi">119</span><span class="p">,</span><span class="w"> </span><span class="mi">119</span><span class="p">,</span><span class="w"> </span><span class="mi">119</span><span class="p">);</span><span class="w"></span>
<span class="p">}</span><span class="w"></span>
<span class="p">.</span><span class="nc">navbar-collapse</span><span class="p">.</span><span class="nc">collapse</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
<span class="w">  </span><span class="k">display</span><span class="p">:</span><span class="w"> </span><span class="kc">none</span><span class="p">;</span><span class="w"></span>
<span class="p">}</span><span class="w"></span>
<span class="p">.</span><span class="nc">dropdown-open</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
<span class="w">  </span><span class="k">background</span><span class="p">:</span><span class="w"> </span><span class="mh">#e7e7e7</span><span class="p">;</span><span class="w"></span>
<span class="p">}</span><span class="w"></span>
</pre>
</div>
<p>Finally, a small script replaces the default Bootstrap <code>bootstrap.js</code> version.</p>
<div class="highlighted-source default javascript">
<pre><span></span><span class="c1">// Navbar and dropdowns</span>
<span class="kd">var</span> <span class="nx">toggle</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">getElementsByClassName</span><span class="p">(</span><span class="s1">&#39;navbar-toggle&#39;</span><span class="p">)[</span><span class="mf">0</span><span class="p">],</span>
    <span class="nx">collapse</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">getElementsByClassName</span><span class="p">(</span><span class="s1">&#39;navbar-collapse&#39;</span><span class="p">)[</span><span class="mf">0</span><span class="p">],</span>
    <span class="nx">dropdowns</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">getElementsByClassName</span><span class="p">(</span><span class="s1">&#39;dropdown&#39;</span><span class="p">);;</span>

<span class="c1">// Toggle if navbar menu is open or closed</span>
<span class="kd">function</span> <span class="nx">toggleMenu</span><span class="p">()</span> <span class="p">{</span>
    <span class="nx">collapse</span><span class="p">.</span><span class="nx">classList</span><span class="p">.</span><span class="nx">toggle</span><span class="p">(</span><span class="s1">&#39;collapse&#39;</span><span class="p">);</span>
    <span class="nx">collapse</span><span class="p">.</span><span class="nx">classList</span><span class="p">.</span><span class="nx">toggle</span><span class="p">(</span><span class="s1">&#39;in&#39;</span><span class="p">);</span>
<span class="p">}</span>

<span class="c1">// Close all dropdown menus</span>
<span class="kd">function</span> <span class="nx">closeMenus</span><span class="p">()</span> <span class="p">{</span>
    <span class="k">for</span> <span class="p">(</span><span class="kd">var</span> <span class="nx">j</span> <span class="o">=</span> <span class="mf">0</span><span class="p">;</span> <span class="nx">j</span> <span class="o">&lt;</span> <span class="nx">dropdowns</span><span class="p">.</span><span class="nx">length</span><span class="p">;</span> <span class="nx">j</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
        <span class="nx">dropdowns</span><span class="p">[</span><span class="nx">j</span><span class="p">].</span><span class="nx">getElementsByClassName</span><span class="p">(</span><span class="s1">&#39;dropdown-toggle&#39;</span><span class="p">)[</span><span class="mf">0</span><span class="p">].</span><span class="nx">classList</span><span class="p">.</span><span class="nx">remove</span><span class="p">(</span><span class="s1">&#39;dropdown-open&#39;</span><span class="p">);</span>
        <span class="nx">dropdowns</span><span class="p">[</span><span class="nx">j</span><span class="p">].</span><span class="nx">classList</span><span class="p">.</span><span class="nx">remove</span><span class="p">(</span><span class="s1">&#39;open&#39;</span><span class="p">);</span>
    <span class="p">}</span>
<span class="p">}</span>

<span class="c1">// Add click handling to dropdowns</span>
<span class="k">for</span> <span class="p">(</span><span class="kd">var</span> <span class="nx">i</span> <span class="o">=</span> <span class="mf">0</span><span class="p">;</span> <span class="nx">i</span> <span class="o">&lt;</span> <span class="nx">dropdowns</span><span class="p">.</span><span class="nx">length</span><span class="p">;</span> <span class="nx">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
    <span class="nx">dropdowns</span><span class="p">[</span><span class="nx">i</span><span class="p">].</span><span class="nx">addEventListener</span><span class="p">(</span><span class="s1">&#39;click&#39;</span><span class="p">,</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
        <span class="k">if</span> <span class="p">(</span><span class="nb">document</span><span class="p">.</span><span class="nx">body</span><span class="p">.</span><span class="nx">clientWidth</span> <span class="o">&lt;</span> <span class="mf">768</span><span class="p">)</span> <span class="p">{</span>
            <span class="kd">var</span> <span class="nx">open</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">classList</span><span class="p">.</span><span class="nx">contains</span><span class="p">(</span><span class="s1">&#39;open&#39;</span><span class="p">);</span>
            <span class="nx">closeMenus</span><span class="p">();</span>
            <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">open</span><span class="p">)</span> <span class="p">{</span>
                <span class="k">this</span><span class="p">.</span><span class="nx">getElementsByClassName</span><span class="p">(</span><span class="s1">&#39;dropdown-toggle&#39;</span><span class="p">)[</span><span class="mf">0</span><span class="p">].</span><span class="nx">classList</span><span class="p">.</span><span class="nx">toggle</span><span class="p">(</span><span class="s1">&#39;dropdown-open&#39;</span><span class="p">);</span>
                <span class="k">this</span><span class="p">.</span><span class="nx">classList</span><span class="p">.</span><span class="nx">toggle</span><span class="p">(</span><span class="s1">&#39;open&#39;</span><span class="p">);</span>
            <span class="p">}</span>
        <span class="p">}</span>
    <span class="p">});</span>
<span class="p">}</span>

<span class="c1">// Close dropdowns when screen becomes big enough to switch to open by hover</span>
<span class="kd">function</span> <span class="nx">closeMenusOnResize</span><span class="p">()</span> <span class="p">{</span>
    <span class="k">if</span> <span class="p">(</span><span class="nb">document</span><span class="p">.</span><span class="nx">body</span><span class="p">.</span><span class="nx">clientWidth</span> <span class="o">&gt;=</span> <span class="mf">768</span><span class="p">)</span> <span class="p">{</span>
        <span class="nx">closeMenus</span><span class="p">();</span>
        <span class="nx">collapse</span><span class="p">.</span><span class="nx">classList</span><span class="p">.</span><span class="nx">add</span><span class="p">(</span><span class="s1">&#39;collapse&#39;</span><span class="p">);</span>
        <span class="nx">collapse</span><span class="p">.</span><span class="nx">classList</span><span class="p">.</span><span class="nx">remove</span><span class="p">(</span><span class="s1">&#39;in&#39;</span><span class="p">);</span>
    <span class="p">}</span>
<span class="p">}</span>

<span class="c1">// Event listeners</span>
<span class="nb">window</span><span class="p">.</span><span class="nx">addEventListener</span><span class="p">(</span><span class="s1">&#39;resize&#39;</span><span class="p">,</span> <span class="nx">closeMenusOnResize</span><span class="p">,</span> <span class="kc">false</span><span class="p">);</span>
<span class="nx">toggle</span><span class="p">.</span><span class="nx">addEventListener</span><span class="p">(</span><span class="s1">&#39;click&#39;</span><span class="p">,</span> <span class="nx">toggleMenu</span><span class="p">,</span> <span class="kc">false</span><span class="p">);</span>
</pre>
</div>
<p>I modified Bootstrap&#8217;s navbar example to <a href="http://bl.ocks.org/mpetroff/4666657beeb85754611f">demonstrate this</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://mpetroff.net/2015/03/bootstrap-navbar-without-jquery/feed/</wfw:commentRss>
			<slash:comments>8</slash:comments>
		
		
			</item>
		<item>
		<title>Camp Workcoeman Website Redesign</title>
		<link>https://mpetroff.net/2014/01/camp-workcoeman-website-redesign/</link>
					<comments>https://mpetroff.net/2014/01/camp-workcoeman-website-redesign/#comments</comments>
		
		<dc:creator><![CDATA[Matthew Petroff]]></dc:creator>
		<pubDate>Tue, 21 Jan 2014 00:04:26 +0000</pubDate>
				<category><![CDATA[Design]]></category>
		<category><![CDATA[Bootstrap]]></category>
		<category><![CDATA[Camp Workcoeman]]></category>
		<category><![CDATA[Jekyll]]></category>
		<category><![CDATA[SVG]]></category>
		<category><![CDATA[web design]]></category>
		<guid isPermaLink="false">http://www.mpetroff.net/?p=1277</guid>

					<description><![CDATA[I spent the last few weeks redesigning the Camp Workcoeman website. The site design is based on Bootstrap, without the jQuery components, and makes heavy use of SVGs. In addition, the header dynamically responds to the time of day&#8212;the sun&#8217;s &#8230; <a href="https://mpetroff.net/2014/01/camp-workcoeman-website-redesign/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
										<content:encoded><![CDATA[<p><span class="dropcap">I</span> spent the last few weeks redesigning the <a href="http://campworkcoeman.org/">Camp Workcoeman website</a>. The site design is based on Bootstrap, without the jQuery components, and makes heavy use of SVGs. In addition, the header dynamically responds to the time of day&#8212;the sun&#8217;s out during the day, and the stars are out at night. Using <a href="https://github.com/mourner/suncalc">SunCalc.js</a>, it fairly accurately displays the sun and moon. <a href="http://jekyllrb.com/">Jekyll</a> is used for templating and site generation.</p>
<p><a href="https://cdn0.mpetroff.net/wp-content/uploads/2014/01/new-site.png" data-sbox="1277"><img decoding="async" class="aligncenter size-large wp-image-1278" alt="New Site" src="https://cdn0.mpetroff.net/wp-content/uploads/2014/01/new-site-640x375.png" width="640" height="480" /></a><span id="more-1277"></span></p>
<p>Compare this to the old site, which was completely static HTML and Flash, making updates difficult.</p>
<p><a href="https://cdn0.mpetroff.net/wp-content/uploads/2014/01/old-site.png" data-sbox="1277"><img loading="lazy" decoding="async" class="aligncenter size-large wp-image-1279" alt="Old Site" src="https://cdn0.mpetroff.net/wp-content/uploads/2014/01/old-site-640x375.png" width="640" height="480" /></a></p>
]]></content:encoded>
					
					<wfw:commentRss>https://mpetroff.net/2014/01/camp-workcoeman-website-redesign/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
	</channel>
</rss>

<!--
Performance optimized by W3 Total Cache. Learn more: https://www.boldgrid.com/w3-total-cache/?utm_source=w3tc&utm_medium=footer_comment&utm_campaign=free_plugin

Page Caching using Disk: Enhanced 
Content Delivery Network via Amazon Web Services: CloudFront: cdn0.mpetroff.net
Minified using Disk

Served from: mpetroff.net @ 2026-03-31 01:35:18 by W3 Total Cache
-->