Reputation: 156
I am trying to make an image filter like isotope.js because I can't and I don't want to use Isotope.js.
The Problem is that onclick function is not working with document.getElementsByClassName();
All I want to do is that when I click on a link with onclick function that function should set the style of other classes to display:none;
Here is my HTML:
<div id="CategoriesContainer" class="col l12 m12 s12">
<div id="Categories" class="col l4 m6 s12 offset-l4 offset-m3">
<a href="#" class="cat-inner" onclick="showcatall()">All</a>
<a href="#" class="cat-inner" onclick="showcatweb()">Web</a>
<a href="#" class="cat-inner" onclick="showcatmobile()">Mobile</a>
<a href="#" class="cat-inner" onclick="showcatgraphics()">Graphics</a>
</div>
</div>
<div id="Portfolio" class="col l12 m12 s12">
<div id="PortfolioItem" class="col l4 web all"><img src="Images/web1.jpg" class="portfolio-img"></div>
<div id="PortfolioItem" class="col l4 mobile web"><img src="Images/web2.jpeg" class="portfolio-img"></div>
<div id="PortfolioItem" class="col l4 graphics web"><img src="Images/web3.jpg" class="portfolio-img"></div>
<div id="PortfolioItem" class="col l4 graphics mobile"><img src="Images/graphics1.jpg" class="portfolio-img"></div>
<div id="PortfolioItem" class="col l4 graphics"><img src="Images/graphics2.jpg" class="portfolio-img"></div>
<div id="PortfolioItem" class="col l4 web"><img src="Images/web1.jpg" class="portfolio-img"></div>
<div id="PortfolioItem" class="col l4 mobile"><img src="Images/graphics2.jpg" class="portfolio-img"></div>
<div id="PortfolioItem" class="col l4 graphics web"><img src="Images/graphics1.jpg" class="portfolio-img"></div>
<div id="PortfolioItem" class="col l4 web mobile"><img src="Images/web2.jpeg" class="portfolio-img"></div>
</div>
Can anyone suggest me Javascript for this?
Thanks.
Upvotes: 0
Views: 821
Reputation: 8210
Alright, you should be good with a single function for this, so first, in your HTML:
<div class="col l4 m6 s12 offset-l4 offset-m3" id="Categories">
<a class="cat-inner" href="#" onclick="show('all')">All</a>
<a class="cat-inner" href="#" onclick="show('web')">Web</a>
<a class="cat-inner" href="#" onclick="show('mobile')">Mobile</a>
<a class="cat-inner" href="#" onclick="show('graphics')">Graphics</a>
</div>
(as graciously provided by Kirmayr Tomaz).
Second, create a function in javascript that responds to this with the parameter you provide:
function show(className) {
// Select and hide all items
var all = document.querySelectorAll('.list-item');
for (var i = 0; i < all.length; i++) {
all[i].style.display = 'none';
}
// Display selected items
var selection = document.querySelectorAll('.' + className);
for (var j = 0; j < selection.length; j++) {
selection[j].style.display = 'block';
}
}
A working codepen example can be found here
General feedback on your code:
col l4 m6 s12
-> col-lg-4 col-md-6 col-xs-12
You're using the idea 'PortfolioItem' multiple times. an id
isn't supposed to be used more than once on a page. You should make a class out of it, and call it portfolio-item
or something like that.
Include your javascript in a seperate file, it's good practice to spread HTML
, CSS
and `JavaScript in their own file.
Upvotes: -1
Reputation: 130
Try with jquery is more simple, when you use vanilla, you need sweep array tith dom elements
function show(cat){
//hide alll
$(".web ,.all, .mobile,.graphics").hide()
var categorySearch = "." + cat;
var domElements = document.querySelectorAll(categorySearch);
//show only category
$(categorySearch).show()
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js"></script>
<div id="CategoriesContainer" class="col l12 m12 s12">
<div id="Categories" class="col l4 m6 s12 offset-l4 offset-m3">
<a href="#" class="cat-inner" onclick="show('all')">All</a>
<a href="#" class="cat-inner" onclick="show('web')">Web</a>
<a href="#" class="cat-inner" onclick="show('mobile')">Mobile</a>
<a href="#" class="cat-inner" onclick="show('graphics')">Graphics</a>
</div>
</div>
<div id="Portfolio" class="col l12 m12 s12">
<div id="PortfolioItem" class="col l4 web all"><img src="http://lorempicsum.com/futurama/350/200/1" class="portfolio-img"></div>
<div id="PortfolioItem" class="col l4 mobile web"><img src="http://lorempicsum.com/futurama/350/200/2" class="portfolio-img"></div>
<div id="PortfolioItem" class="col l4 graphics web"><img src="http://lorempicsum.com/futurama/350/200/3" class="portfolio-img"></div>
<div id="PortfolioItem" class="col l4 graphics mobile"><img src="http://lorempicsum.com/futurama/350/200/4" class="portfolio-img"></div>
<div id="PortfolioItem" class="col l4 graphics"><img src="http://lorempicsum.com/futurama/350/200/5" class="portfolio-img"></div>
<div id="PortfolioItem" class="col l4 web"><img src="http://lorempicsum.com/futurama/350/200/6" class="portfolio-img"></div>
<div id="PortfolioItem" class="col l4 mobile"><img src="http://lorempicsum.com/futurama/350/200/7" class="portfolio-img"></div>
<div id="PortfolioItem" class="col l4 graphics web"><img src="http://lorempicsum.com/futurama/350/200/8" class="portfolio-img"></div>
<div id="PortfolioItem" class="col l4 web mobile"><img src="http://lorempicsum.com/futurama/350/200/9" class="portfolio-img"></div>
</div>
Upvotes: 0
Reputation: 42054
My proposal is:
// on DOMContentLoaded
window.addEventListener('DOMContentLoaded', function (e) {
// get all "cat-inner" elements and attach the click handler
Array.prototype.slice.call(document.getElementsByClassName('cat-inner')).forEach(function (ele, index) {
ele.addEventListener('click', function (e) {
e.preventDefault();
// get the current text content of the anchor
var txt = this.textContent.toLowerCase();
// for each children element set the appropriate visibility
Array.prototype.slice.call(document.getElementById('Portfolio').children).forEach(function (ele, index) {
switch (txt) {
case 'all':
ele.style.display = 'block';
break;
default:
if (ele.className.indexOf(txt) != -1) {
ele.style.display = 'block';
} else {
ele.style.display = 'none';
}
break;
}
});
});
});
});
<div id="CategoriesContainer" class="col l12 m12 s12">
<div id="Categories" class="col l4 m6 s12 offset-l4 offset-m3">
<a href="#" class="cat-inner">All</a>
<a href="#" class="cat-inner">Web</a>
<a href="#" class="cat-inner">Mobile</a>
<a href="#" class="cat-inner">Graphics</a>
</div>
</div>
<div id="Portfolio" class="col l12 m12 s12">
<div id="PortfolioItem1" class="col l4 web all">All<img src="Images/web1.jpg" class="portfolio-img"></div>
<div id="PortfolioItem2" class="col l4 mobile web">Web<img src="Images/web2.jpeg" class="portfolio-img"></div>
<div id="PortfolioItem3" class="col l4 graphics web">Web<img src="Images/web3.jpg" class="portfolio-img"></div>
<div id="PortfolioItem4" class="col l4 graphics mobile">Mobile<img src="Images/graphics1.jpg" class="portfolio-img"></div>
<div id="PortfolioItem5" class="col l4 graphics">Graphics<img src="Images/graphics2.jpg" class="portfolio-img"></div>
<div id="PortfolioItem6" class="col l4 web">Web<img src="Images/web1.jpg" class="portfolio-img"></div>
<div id="PortfolioItem7" class="col l4 mobile">Mobile<img src="Images/graphics2.jpg" class="portfolio-img"></div>
<div id="PortfolioItem8" class="col l4 graphics web">Web<img src="Images/graphics1.jpg" class="portfolio-img"></div>
<div id="PortfolioItem9" class="col l4 web mobile">Mobile<img src="Images/web2.jpeg" class="portfolio-img"></div>
</div>
Upvotes: 1
Reputation: 4112
I would suggest that you use jquery and do something like this:
$(document).ready(function() {
$('.portfolio-img').click(function() {
$('.portfolio-img').css('display', 'none');
});
});
or use jquery's hide function like this:
$(document).ready(function() {
$('.portfolio-img').click(function() {
$('.portfolio-img').hide();
});
});
I created a working snippet for you : https://jsfiddle.net/m0o9u8u1/
Upvotes: -1
Reputation: 483
function showcatweb() {
var webs = document.getElementsByClassName('web');
for (var i = 0; i < webs.length; i++) {
var imgCnr = webs[i];
imgCnr.style.display = 'block'; //to hide, imgCnr.style.display = 'none';
}
}
If you dont want to use Jquery
Upvotes: 1
Reputation: 19
As i correctly understood, you can create css class with "display: none" and using
classList
to manipulate with it. It`s pure JS.
Upvotes: 1