Pontianak Web & Open Source

Jasa Buat Website Pontianak. Pontianak Web & Open Source

Drupal 7: Memberi Efek Lava Lamp pada Primary Menu dengan jQuery

Sen, 2012-11-12 08:14 -- mbahlol

Bangun subuh memang banyak manfaatnya. Contohnya subuh ini aku cobain efek jquery lava lamp pada primary menu di website aku dan setelah garuk kepala berapa kali hasilnya buat hati senang. Memang banyak kendala yang aku hadapi. seperti bagaimana sih nambah elemen div pada primary menu drupal, kemudian kenapa function javascript yang dipanggil malah munculkan pesan $ is not a function.

Awalnya googling sana sini, cari yang paling sederhana untuk buat lava lamp ini. Dari sekian banyak aku cobain tutorial Queness.com

Pertama aku harus buat struktur HTML menu seperti dibawah.

Tapi masih ada kendala. Seperti <div id="lava"> dan <div id="box"><div class="head"></div> ini tidak ada dari bawaan themes. Terus pada <li class="menu-411 first selected"> masih tertulis <li class="menu-411 first active">. Terpaksa aku ganti jadi selected biar di css dan javascript tidak perlu ganti banyak baris. Jadi aku edit file template.php.
 
function NAMATHEMES_links__system_main_menu($variables){
  $links = $variables['links'];
  $attributes = $variables['attributes'];
  $heading = $variables['heading'];
  global $language_url;
  $output = '';
  if (count($links) > 0) {
    $output = '';
    if (!empty($heading)) {
      if (is_string($heading)) {
        $heading = array(
          'text' => $heading,
          'level' => 'h2',
        );
      }
      $output .= '<' . $heading['level'];
      if (!empty($heading['class'])) {
        $output .= drupal_attributes(array('class' => $heading['class']));
      }
      $output .= '>' . check_plain($heading['text']) . '</' . $heading['level'] . '><div id="lava">';
    }
    $output .= '<ul' . drupal_attributes($attributes) . '>';
    $num_links = count($links);
    $i = 1;
    foreach ($links as $key => $link) {
      $class = array($key);
      if ($i == 1) {
        $class[] = 'first';
      }
      if ($i == $num_links) {
        $class[] = 'last';
      }
      if (isset($link['href']) && ($link['href'] == $_GET['q'] || ($link['href'] == '<front>' && drupal_is_front_page()))
          && (empty($link['language']) || $link['language']->language == $language_url->language)) {
        $class[] = 'selected'; /* sebelumnya active*/
      }
      $output .= '<li' . drupal_attributes(array('class' => $class)) . '>';
      if (isset($link['href'])) {
        $output .= l($link['title'], $link['href'], $link);
      }
      elseif (!empty($link['title'])) {
        if (empty($link['html'])) {
          $link['title'] = check_plain($link['title']);
        }
        $span_attributes = '';
        if (isset($link['attributes'])) {
          $span_attributes = drupal_attributes($link['attributes']);
        }
        $output .= '<span' . $span_attributes . '>' . $link['title'] . '</span>';
      }
      $i++;
      $output .= "</li>\n";
    }
    /* penambahan div box */
    $output .= '</ul><div id="box"><div class="head"></div></div></div>';
  }
  return $output;
}
Nah setelah edit file template.php. Berikutnya adalah CSS yang aku pakai

/* lava menu*/
#lava {
    position:relative;
    text-align:center;
    height:20px;
}
#lava ul {
    margin:0;
    padding:0;
    position:absolute;
    top:0;
    right:0;
    z-index:100;
}
#lava ul li {
    margin:0 15px;
    float:left;
}
#lava #box {
    position:absolute;
    left:0;
    bottom:0;
    z-index:50;
    background:#ff5500;
    height:2px;
    padding-right:8px;
    margin-left:-6px;
}
#lava #box .head {
    background:#ff9900;
    height:2px;
    padding-left:10px;
}

Kemudian untuk Javascript. Aku download jQuery Easing dan aku simpan di dalam folder ../namathemes/js/easing.js. Terus aku buat file script.js dengan folder yang sama dengan easing.js. Isi dari script.js seperti dibawah. Disini yang aku maksud kenapa class active aku ganti jadi selected. Maksudnya biar tidak merubah satu persatu selected menjadi active.

jQuery(document).ready(function () {
    var style = 'easeOutElastic';
    var default_left = Math.round(jQuery('#lava li.first').offset().left - jQuery('#lava').offset().left);
    var default_width = jQuery('#lava li.selected').width();
    jQuery('#box').css({left: default_left});
    jQuery('#box .head').css({width: default_width});
    jQuery('#lava li').hover(function () {
        left = Math.round(jQuery(this).offset().left - jQuery('#lava').offset().left);
        width = jQuery(this).width();
        jQuery('#box').stop(false, true).animate({left: left},{duration:1000, easing: style});  
        jQuery('#box .head').stop(false, true).animate({width:width},{duration:1000, easing: style});   
    }).click(function () {
        jQuery('#lava li').removeClass('selected');   
        jQuery(this).addClass('selected');
    });   
    jQuery('#lava').mouseleave(function () {
        default_left = Math.round(jQuery('#lava li.selected').offset().left - jQuery('#lava').offset().left);
        default_width = jQuery('#lava li.selected').width();
        jQuery('#box').stop(false, true).animate({left: default_left},{duration:1500, easing: style});  
        jQuery('#box .head').stop(false, true).animate({width:default_width},{duration:1500, easing: style});       
    }); 
});

Pada kode diatas juga aku melakukan perubahan tanda dollar ($) aku ganti menjadi jQuery. Karena sempat muncul error $ is not a function. Solusinya cuman googling dulu. Ketemunya di Using Jquery in Drupal. Terakhir menambahkan kedua file javascript tersebut di themes dan clear cache. Untuk menambahkan file javascript tersebut aku edit file namatheme.info.

 
Jangan lupa clear cache. CMIIW :)

Sumber: Queness.com | Drupal Theme Development | Drupal Add JS | Using Jquery in Drupal.(thanks eaton)