vephelp
vephelp

Reputation: 542

Toggle .active class with jquery

I'm trying to toggle the class .active with jquery, heres what I've got so far:

html

<div class="downloadButtons">
            <div class="download-button-wrapper">
                    <div id="dd" class="desktopBackground downloadFontIcons" tabindex="1">DESKTOP
                        <ul class="dropdown">
                            <li><a href="#">2560 x 1440</a></li>
                            <li><a href="#">1800 x 900</a></li>
                        </ul>
                    </div>
            </div>

            <div class="download-button-wrapper">
                    <div id="de" class="tabletBackground downloadFontIcons" tabindex="1">PHONE
                        <ul class="dropdown">
                            <li><a href="#">640 x 960</a></li>
                            <li><a href="#">1136 x 640</a></li>
                            <li><a href="#">720 x 1280</a></li>

                        </ul>
                    </div>
            </div>  


            <div class="download-button-wrapper">
                    <div id="df" class="phoneBackground downloadFontIcons" tabindex="1">TABLET
                        <ul class="dropdown">
                            <li><a href="#">2560 x 1600</a></li>
                            <li><a href="#">2048 x 1536</a></li>
                        </ul>
                    </div>
            </div>
        <div style="clear:both"></div>
        </div>

css

.downloadButtons{
    display: block;
    width: 780px;
    height: 200px;
    margin-left: 40px;
    margin-top: 30px;
}

/* GLOBALS - Dropdowns*/
.downloadFontIcons{
    /* Size and position */
    position: relative; /* Enable absolute positionning for children and pseudo elements */
    width: 184px;
    height: 44px;
    margin: 0 auto;
    text-align: center;
    line-height: 44px;
    margin-right: 68px;
    font-size: .7em;
    color: #9ea7b3;
    background-color: #F9FAFC;
    cursor: pointer;
    outline: none;
    border: 1px solid #eaedf1;
}   
.downloadFontIcons .dropdown{
    /* Size & position */
    position: absolute;
    top: 110%;
    left: 0px;
    right: 0px;

    /* Styles */
    background: white;
    -webkit-transition: all 0.3s ease-out;
    -webkit-transition-delay: 0s;
    -moz-transition: all 0.3s ease-out;
    -moz-transition-delay: 0s;
    -ms-transition: all 0.3s ease-out;
    -o-transition: all 0.3s ease-out;
    -o-transition-delay: 0s;
    transition: all 0.3s ease-out;
    transition-delay: 0s;
    list-style: none;

    /* Hiding */
    opacity: 0;
    pointer-events: none;
}

::selection {
    background: transparent; 
}

::-moz-selection {
    background: transparent; 
}

.download-button-wrapper {
    *zoom: 1;
    float: left;
}

.downloadFontIcons  .dropdown li a {
    display: block;
    height: 44px;
    text-decoration: none;
    color: #9ea7b3;
    -webkit-transition: all 0.3s ease-out;
    -webkit-transition-delay: 0s;
    -moz-transition: all 0.3s ease-out;
    -moz-transition-delay: 0s;
    -ms-transition: all 0.3s ease-out;
    -o-transition: all 0.3s ease-out;
    -o-transition-delay: 0s;
    transition: all 0.3s ease-out;
    transition-delay: 0s;
}


/* Hover state */
.downloadFontIcons .dropdown li:hover a {
    color: #FFFFFF;
    background-color:#FF562A;
}

/* Active state */

.downloadFontIcons.active .dropdown {
    opacity: 1;
    pointer-events: auto;
}

/* No CSS3 support */

.no-opacity       .downloadFontIcons .dropdown,
.no-pointerevents .downloadFontIcons .dropdown {
    display: none;
    opacity: 1; /* If opacity support but no pointer-events support */
    pointer-events: auto; /* If pointer-events support but no pointer-events support */
}

.no-opacity       .downloadFontIcons.active .dropdown,
.no-pointerevents .downloadFontIcons.active .dropdown {
    display: block;
}

js

       function DropDown(el) {
                this.dd = el;
                this.initEvents();
            }
            DropDown.prototype = {
                initEvents : function() {
                    var obj = this;

                    obj.dd.on('click', function(event){
                        $(this).toggleClass('active');
                        event.stopPropagation();
                    }); 
                }
            }

            $(function() {

                var dd = new DropDown( $('#dd') );

                $(document).click(function() {
                    // all dropdowns
                    $('.wrapper-dropdown-2').removeClass('active');
                });

            });



            $(function() {

                var de = new DropDown( $('#de') );

                $(document).click(function() {
                    // all dropdowns
                    $('.wrapper-dropdown-2').removeClass('active');
                });

            });

            $(function() {

                var df = new DropDown( $('#df') );

                $(document).click(function() {
                    // all dropdowns
                    $('.wrapper-dropdown-2').removeClass('active');
                });

            }); 

jsFiddle

I need to toggle the active state of the buttons, for example as I click on the desktop button the dropdown list appears, then when I click on the phone button, I want the desktop list to disappear. I think the changes needed to be on this part of the code as with this code I think I'm only targeting dd elements:

function DropDown(el) {
  this.dd = el;
  this.initEvents();
}
DropDown.prototype = {
  initEvents : function() {
    var obj = this;

    obj.dd.on('click', function(event){
      $(this).toggleClass('active');
      event.stopPropagation();
    });
  }
}

I have very little knowledge of javascript so not sure what do to. Need your help.

Upvotes: 2

Views: 18831

Answers (1)

Trevor
Trevor

Reputation: 16116

In your initEvents function you can look for and remove all active classes on your buttons excluding the clicked button. That should give you the functionality your looking for.

initEvents : function() {
  var obj = this;

  obj.dd.on('click', function(event){
    $('.active').not($(this)).removeClass('active');
    $(this).toggleClass('active');
    event.stopPropagation();
  });
}

http://jsfiddle.net/UhSqd/1/

Upvotes: 7

Related Questions