Sākums » Datubāzes, JavaScript, Lejupielādes, Programmēšana, css, mysql, php

Akordeona tipa izvēlne paša rokām

26.02.2009 15:25 930 skatījumi 6 komentāri

acardion1

Šinī rakstā mēģināšu izstāstīt kā es veidotu akordeona tipa navigācijas izvēlni. Centos rakstīt tā lai arī tiem, kuri vēlas apgūt šo to jaunu būtu no kā smelties kādu ideju, kā arī tiem, kuri jau ilgāku laiku darbojas web jomā. Protams ka manis piedāvātais risinājums noteikti ir uzlabojams, ja ir kādi ierosinājumi labprāt tos uzklausītu.

Uzreiz jāpiebilst, ka dizaina noformējumam šoreiz ir atstāta otrā plāna loma. Pamata akcents likts uz jQuery iespējām, kā arī uz to kā es risinu šādas situācijas ar php un DB.


Sāksim izmantojot tikai css, html un javascript
Starp ievietojam atsauces uz mūsu css un javascript failiem, manā gadījumā tie izskatās šādi

<script src="jquery-1.3.2.min.js" type="text/javascript"></script>
<script src="main.js" type="text/javascript"></script>

izveidojam html ul li sarakstu, kurš izskatās šādi:

<ul id="menu">
	<li><a href="#">Menu item 1 (no subcats)</a></li>
	<li><a href="javascript:;">Menu item 2</a>
<ul>
	<li><a href="#">Sumbenu item 1</a></li>
	<li><a href="#">Sumbenu item 2</a></li>
</ul>
</li>
	<li><a href="javascript:;">Menu item 3</a>
<ul>
	<li><a href="#">Sumbenu item 1</a></li>
	<li><a href="#">Sumbenu item 2</a></li>
	<li><a href="#">Sumbenu item 2</a></li>
</ul>
</li>
	<li><a href="javascript:;">Menu item 4</a>
<ul>
	<li><a href="#">Sumbenu item 1</a></li>
	<li><a href="#">Sumbenu item 2</a></li>
	<li><a href="#">Sumbenu item 2</a></li>
</ul>
</li>
	<li><a href="javascript:;">Menu item 5</a>
<ul>
	<li><a href="#">Sumbenu item 1</a></li>
	<li><a href="#">Sumbenu item 2</a></li>
	<li><a href="#">Sumbenu item 2</a></li>
</ul>
</li>
</ul>

Vienkārša html versija gatava, bet ja vēlamies šo te visu padarīt dinamisku, proti ieviest php un kādu no datubāzēm lasām tālāk.

main.css

*{
    font-size: 12px;
    font-family: verdena serif;
}
a{
    text-decoration: none;
    color: #333;
    display: block;
    margin: 0;
    outline: none;
}
#menu{
    list-style: none;
    width: 200px;
}
#menu li{
    border: 1px solid #dcdcdc;
    margin: 2px;
    padding: 2px;
}
#menu ul{
    list-style: none;
    padding: 0;
    display: none;
}
#menu ul li{
    padding-left: 2px;
    margin: 0;
    border: none;
}

main.css nodrošina tikai vienkāršu silu ieviešu, vienīgais kam patiešām ir vērts pievērts uzmanību ir

#menu ul{
    list-style: none;
    padding: 0;
    display: none;
}

Noslēpjam visus apakšmenu, proti visus ul elementus iekš mūsu galvenā ul (#menu)

Javascript daļ, kura nodrošina atvēršanas/aizvēršanas animācijas lietas

$(document).ready(function(){
	// atrodam iekš elamenta #menu a tagu un piešķiram click eventu 
	$('#menu a').click(function() { 
		//noslēpjam visus ul iekš #menu
		$("#menu ul").slideUp('slow'); 
		// pārvietojam kursoru no a taga uz li tagu, meklējam ul un parādam to
		$(this).parent().find('ul').slideDown('slow'); 
		return false;
	});
})
;

Es izmantoju mysql, bet tik pat labi var izmantot jebkuru citu no datubāzēm.
Tātad izveidojam mūsu izvēlētajā datubāzē tabulu, kura pēc principa izskatās aptuveni šādi:

CREATE TABLE `test1` (
        `id` INT( 11 ) NOT NULL AUTO_INCREMENT ,
        `name` VARCHAR( 255 ) NOT NULL ,
        `parentid` INT( 11 ) NOT NULL ,
        PRIMARY KEY ( `id` )
  );

Tā kā mums jau ir css un javascripts gatavs papildinām ul#menu izveidi ar php.
mans risinājums ir izmantot rekursīvu funkciju

/**
* 
* Html struktūras ģenerācija
* 
* @param integer 
* @return string
*/
 
function GetMenu($parentID=0){
    $return ='';
	// Pieprasījums datubāzei pēc datiem
    $query = mysql_query("SELECT id,name,parentid FROM test1 WHERE parentid=".intval($parentID)); 
    $count = mysql_num_rows($query);
    if($count > 0){
		// Ja parent ID ir 0 tad piešķiram ul ID
        $return .='<ul id="menu">';  
        while($dataRow = mysql_fetch_array($query)){
            // Izsaucam šo pašu funkciju rekursīvi
            $return .='
			<li>
                <a onclick="OpenMneu(this);" href="javascript:;">
                	'.htmlspecialchars($dataRow['name']).'
                </a>
                '.GetMenu(intval($dataRow['id'])).'
            </li>';
 
        }
        // Noslēdzam UL
        $return .='</ul>'; 
    }
	//Izvadam savāktos datus
	return $return; 
}
// Izsaucam mūsu izveidoto menu
  echo GetMenu();

Lejupielādēt visus izmantotos failus [download#2]

Autors: Roberts Mozgis (rob)

Web izstrādātājs ar vairāku gadu pieredzi. Esmu strādājis pie daudziem interesantiem projektiem Latvijā un ārpus tās. Specializācija PHP, JavaScript, CSS, Html, kā viss ap datubāzēm.

VN:F [1.2.3_620]
Rating: 4.3/5 (3 votes cast)
  • Piu www

    un kas notiek, ja nospiež uz jau atvērta parenta?
    childi aizveras un atveras no jauna. Nesmuki!
    Šito vajag novērst…!

    VA:F [1.2.3_620]
    Rating: 0.0/5 (0 votes cast)
    1
  • Piu www

    Jā – un uzpiežot uz jebkura čailda – ie aizveras. Arī gļuks…
    Pēc idejas viss, ko esi uztaisījis – ka uz jebkuru eventu aizveras viss un atveras tas, ko vajag.
    Es to būtu savādāk taisījis… bet nu tas lai paliek manā ziņā…

    VA:F [1.2.3_620]
    Rating: 0.0/5 (0 votes cast)
    2
  • rob www

    Labprāt uzklausītu tavu risinājumu

    VN:F [1.2.3_620]
    Rating: 0.0/5 (0 votes cast)
    3
  • nelietis www

    Uz katru sadaļu un apakšsadaļu izpildās viens sql vaicājums, vaitad nebūtu labāk visus datus izvilkt masīvā ar vienu vaicājumu un tad no tā masīva vērtībām veidot koku? :)

    VA:F [1.2.3_620]
    Rating: 5.0/5 (2 votes cast)
    4
  • Roberts

    Aww šitais ir tiešām draņķis. Jquery? Paši savu mini-freimworku nemākam saveidot kas izpilditu sito bez liekas alien interupcijas? Un nelietim taisnība, uz katru pa sql pieprasijumam? Cmoon, 1 pieprasijums uz piemēram 2000 hitiem dienā tikai menu ir nepieļaujami.

    VA:F [1.2.3_620]
    Rating: 0.0/5 (0 votes cast)
    5
  • banesto

    off-topics – kāpēc netiek rādīti rakstu autori? tas palīdzētu nākotnē saprast pēc autora – vai rakstam ir potence būt sakarīgam vai nē, manuprāt.

    VA:F [1.2.3_620]
    Rating: 0.0/5 (0 votes cast)
    6
  • Nav nevienas atsauces

Ir ko teikt?

Vari izmantot:

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="">

Raksta komentāru RSS