Mostrando las entradas con la etiqueta Desarrollo. Mostrar todas las entradas
Mostrando las entradas con la etiqueta Desarrollo. Mostrar todas las entradas

27-01-2012

CSS Cascading Style Sheets (Hojas de Estilo en Cascada)

Si bien las hojas de estilo son algo básico en el trabajo de HTML actual, es muy poca la gente que consigue recordar otras cosas básicas, como los nombres de sus partes y algunos datos útiles, como la especificidad.

Recuerdo haber leído algo acerca de los CSS cuando estaba navegando Cnet.com en algún minuto del año 96-8. Esa primera vez que vi las definiciones y un CSS descrito, no entendí nada. Para ser franco, tampoco entendía mucho el HTML así que la relación entre uno y otro me hacía menos sentido aún y las ventajas de tener la “presentación” separada de la “programación” para mi era sólo una frase retórica.

Durante el año 2001 ya estaba trabajando en una empresa de desarrollo de soluciones de ingeniería, lo que me permitió dedicarme tiempo completo a comprender tanto el HTML como el CSS. Claro, siempre desde el punto de vista de diseñador, que le interesa que las cosas funcionan y poco le importa el cómo. Sin embargo, a medida que ha pasado el tiempo, más interesante se vuelve el cómo y el conocerlo te entrega el poder de manipular las tecnologías a tu antojo. No saberlo, o denegar su importancia sólo te permite quedarte en la vereda del que se admira con un efecto a causa de su espectacularidad, obviando la belleza que implican las soluciones pequeñas que le dan sentido al comprender el sistema.

CSS – Reglas

Los CSS funcionan haciendo declaraciones, las declaraciones son reglas y cada una funciona en base a 2 partes:

  1. Selector
  2. Bloque de Declaración

Selector

Especifica a qué elementos del HTML va a dar estilo la regla.

Bloque de Declaración

Especifica el estilo que será aplicado a los elementos que la regla seleccione.
El bloque de declaración contiene una o más declaraciones.
Una declaración está compuesta por el nombre de una propiedad y un valor.

Ej: Declaración de CSS

 

 

 

 

 

Especificidad

Muchas veces, cuando se hacen las declaraciones de CSS y se está trabajando en una plataforma que no fue desarrollada inicialmente por uno, pasa que revisamos el efecto de nuestro trabajo en el navegador favorito y ¡Sorpresa! No hay nada. Revisamos y revisamos y la declaración está ok, el navegador es el apropiado, etc. Borramos el caché, reiniciamos el navegador. Incluso, reiniciamos el computador (absolutamente ridículo), y nada. ¿Por qué si mi declaración es la apropiada no estoy consiguiendo el efecto deseado?
La respuesta corta, posiblemente un problema de especificidad.
¿Qué?

En una declaración de CSS, la idea de “cascada”, es justamente el hecho de que la declaración hecha al principio, pueda ser complementada por posteriores adiciones o modificaciones a dicha declaración. Es decir, si en la línea 1 de mi hoja de estilo tengo la siguiente declaración:

p { color: red; font-weight: bold; }


Todo los párrafos de la página serán rojos y en negrita. Si en la línea 5 tengo esta declaración:



div p { color: green; font-size: 10px; }


Todos los párrafos de la página serán rojos y en negrita excepto los que vayan dentro de un DIV, que serán verdes, en negrita y tamaño 10 pixeles.



Hasta aquí no hay problema, la cascada funciona perfecto. Pero, qué pasa si la declaración de la línea 1 es:



#rojos p { color: red; font-weight: bold; }


Todos los párrafos serán rojos y en negrita cuando vayan dentro de un elemento con ID=rojos. Si ese ID es el de, para este ejemplo, el BODY, de tal manera que afecta a toda la página, entonces, cuando en la línea 5 coloquemos:



div p { color: green; font-size: 10px; }


Pasará que nuestro resultado será: texto de color rojo, en negrita y cuando vayan dentro de un DIV, será en tamaño 10px, pero ¡ROJOS!



¿Por qué? Especificidad.



A pesar de que según la cascada debería reemplazarse el valor “red” por el de “green”, sólo funciona cuando la especificidad de la declaración tiene valor predominante. En el caso de no ser así, por ser más específica la primera declaración, entonces la segunda es “recesiva”. ¿Cómo? Para entenderlo, los valores de las declaraciones se dan de esta forma:



# > .xxx > tag    /    ID > CLASE > ELEMENTO

(el ID de un elemento es mayor que la CLASE de un elemento y este a su vez, mayor que el ELEMENTO).



Si en un ID declaro color negro, en una CLASE declaro color verde y al ELEMENTO lo declaro con color azul, existiendo los 3 selectores, el color va a ser siempre NEGRO. Porque el ID predomina por sobre la CLASE y el ELEMENTO.




Para comprenderlo mejor, y poder calcular la especificidad cuando hay múltiples selectores, se usa la siguiente fórmula:



ELEMENTO = 1

CLASE = 10


ID = 100



De esta forma, en nuestro ejemplo del ID “rojos” sobre el párrafo, tenemos:



#rojos p { … }

ID + ELEMENTO = 100+1 = 101 (valor de especificidad)



En nuestro ejemplo comparativo siguiente, tenemos:



div p { … }

ELEMENTO + ELEMENTO = 1+1 = 2 (valor especificidad)



Por lo tanto, aunque nuestra segunda declaración, por selector debería haber pintado de verde todos los párrafos dentro de los DIV, por tener un valor de especificidad menor que la declaración anterior, en el conflicto gana dicha declaración. El conflicto no es en el tamaño ni en las negritas. El conflicto es en el color. La declaración 1 gana con 101 puntos contra 2 de especificidad de la segunda declaración.



Las declaraciones con muchos selectores son más difíciles de modificar cuando se está realizando un proyecto ajeno y cuesta encontrarlas de manera rápida. Por lo general, se descubren cuando se trata de modificar un ELEMENTO y ningún acercamiento parece afectarlo. Lo común es hacer una búsqueda en el CSS y podremos descubrir si existe una especificidad muy alta para algún ELEMENTO.



Ej:



ul li { … } = 2

ul ul li { … } = 3


ul.menu ul ul li { … } = 14


#main ul.menu ul ul li { … } = 114


#main.top ul.menu ul ul li { … } = 124



¡Happy Coding!



19-04-2011

Mejoramiento Progresivo

Resolviendo el problema de ser accesible a través de navegadores, a pesar de las versiones y el tiempo, sin dejar de mejorar.

(Partes pensadas en base a Developing with Web Standards, de John Allsopp)

La idea poder desarrollar y diseñar los sitios web de tal forma que se consiguiera la interoperabilidad a través de navegadores e incluso entre sus propias versiones (lamentablemente me refiero a IE más que a ningún otro en esto último), no es nada nuevo para quienes hemos estado metidos en este mundo del metalenguaje hipertextual de la red.

Recuerdo que alrededor del año 2000 la discusión se centraba en las incongruencias entre IE5 y Netscape 4, con IE6 haciendo entrada triunfal y destronando a sus competidores, tanto en la estandarización de sus métodos, como en la forma de llamarlos.

Hoy, el escenario ha cambiado tanto que en pocos años Microsoft ha sacado 3 versiones de su navegador, siendo la última uno de sus mejores logros, Firefox se ha posicionado como una opción muy atendible (sobre todo en su calidad de software libre de desarrollo no propietario), Chrome es ya un nuevo jugador en el mercado y Safari y Opera se mantienen como una buena opción, a una buena distancia del resto, pero no por ello menos merecedores de ser nombrados y tomados en cuenta.

Sin embargo, dichos cambios han demostrado que cada día es más importante tener en cuenta no sólo qué se diseña y cómo, sino que, de qué forma y hacia quiénes para producir qué. Para eso, hay que entender por qué hoy se habla tanto de algo que hasta hace poco era sólo campo para los especialistas en lenguas y para los diseñadores gráficos que se quedaron fascinados por el lenguaje y la comunicación: la semántica.

X/HTML

El HyperText Markup Language, publicado por Tim Berners Lee en 1991, fue creado con el fin de marcar y denotar internamente texto, principalmente, científico. La idea original fue marcar/denotar el significado y la estructura del documento (su semántica).

Las definiciones no ayudan mucho a comprender la idea, pero podríamos resumirla en que la semántica es el significado de varias partes del lenguaje y que para el caso del HTML, consiste en aplicar reglas de Sintaxis (reglas que los desarrolladores deben seguir para producir lenguaje válido y significativo), como que nunca puede haber una etiqueta sin cerrar (mediante los corchetes <h1></h1>) y que estas etiquetas dan un orden de significado respecto al contenido (semántica) de tal manera que, por ejemplo, nunca puede haber un encabezado H1 dentro de una sección iniciada por un texto H1 que, originalmente tenga menor valor en el documento que el H1 inicial. Me refiero a:

1) H1---H2---H3---H4
                H2---H3
                           H3---H4---H5---H6

2) H1---H2---H3---H4
                H1---H2
                           H6---H3---H1---H2

Donde 1) está correcto y 2) tiene errores en la semántica.

Mejoramiento Progresivo

Lo importante a la hora de comprender el Mejoramiento Progresivo, es que su propósito es definir, la información y funcionalidad del documento, comenzando desde un enfoque macro, para luego ir dando paso a mejoras en la apariencia y el comportamiento del documento relacionados con navegadores y herramientas más modernas: lo micro.

Los pasos que podríamos definir para ello son:

  1. Revisar la Semántica del documento.
  2. Revisar la Sintaxis del documento.
  3. Aplicar la gráfica general básica, separada del lenguaje.
  4. Mejorar la gráfica, diagramación y programación.
  5. Revisar para no alterar lo conseguido en los puntos anteriores. Si se rompe volver al 4, si no, dar por terminado o pasar a un nuevo nivel de mejoramiento.

Para conseguir esto, actualmente contamos con dos aliados que han venido a salvar lo que antes, sólo podía conseguirse con tediosas horas de buscar scripts de java, hacks y cosas por el estilo. HTML5 y CSS3.

Si bien, ambos pertenecen a tecnologías que llevan años de desarrollo y que esperan estar listas (terminadas y absolutamente documentadas) en unos 5-6 años, no hay para qué esperar. Todos los navegadores en este momento presentan un nivel de funcionamiento bastante bueno de ambas. Su aplicación no choca con la tecnología anterior y se puede desarrollar fácilmente mediante el mejoramiento progresivo.

El futuro es brillante y no hay excusas para no abrazar la nueva paradoja. Si quieren esperar 5 años para recién comenzar a usar estas tecnologías y estos métodos de trabajo, adelante, pero no digan que nadie les avisó.

19-01-2011

Reglas de Contención en HTML

Block Elements: Headings, Paragraphs, Preformatted Text, Divs, Ordered Lists, Unordered Lists, Definition Lists.

Block Elements pueden contener otros Block Elements e Inline Elements.

Block Elements sólo pueden ser contenidos dentro de Block Elements.

Inline Elements sólo pueden contener Inline Elements.

Inline Elements pueden ser contenidos tanto en Block Elements como en Inline Elements.

Paragraphs son Block Elements, pero no pueden contener otros Block Elements.


10-02-2009

Moogrle II: Modificando el “tema”.

Compartir! :
Technorati Tags: ,,,
Blogger Labels: Moogrle,arquitectura,Diseño,Moodle

Ahora que está listo el CSS para modificar el tema que decidimos alterar, debemos tener claro el diseño que aplicaremos, así que si no hay diseño aún, es decir, colores, arquitectura, concepto, etc. debemos volver un paso atrás para generar la propuesta de diseño antes que ponerse a modificar sin ton ni son.

Diseño

Lamentablemente para este proyecto en especial (obviamente por ser el primero) no tenía  muy clara la gráfica que debía aplicar, aunque más correcto sería decir que no tenía claro el CÓMO y DÓNDE en la gráfica para Moodle. A pesar de ello, la partida la había dado mi compañero de trabajo que realizó la propuesta de arquitetura de navegación y en base a ella comenzó mi trabajo de diseño. No quiero extenderme en el tema pues no viene al caso en este post. El resultado es el siguiente:

Propuesta de diseño para moodle.

Obviamente se nota que de Moodle no entendíamos nada desde el punto de vista de ubicaciones, estructura, funcionamiento interno, etc. De todas formas conseguí llegar a algo bastante cercano.

Moodle Original Standard Theme

Lo primero fue tratar de descubrir como agregaba ese lindo banner superior al sitio. En un comienzo pensé que la zona superior se armaba en un CSS. Pronto me di cuenta que dicha zona se arma completamente en un html llamado header.html que se encuentra en la carpeta STANDARD, PAGE y FLEX_MROOMS !!! Aquí es donde hay que revisar mediante la alteración de cada uno de los header.html para ver cuál correspondía al que estaba usando en realidad Moodle para fabricar la zona superior.

Banner Superior

Depués de las correspondientes pruebas descubrí el responsable de la zona superior, no sin antes darme cuenta de las cosas raras de Moodle.

En el tema de flex_mrooms me encontré conque el header.html decía:

<?php



/** * Theme Header * * @author Mark Nielsen * @version $Id$ **/



/** * @package theme_cisco **/



include($CFG->themedir.'/'.$THEME->parent.'/header.html');



?>




Lo que dice en esas líneas es que cuando vaya a ocupar el header.html, entonces use el de su padre. UF! como el padre de flex_mrooms es el tema page, fui a la carpeta del tema para revisar su header.html y bueno, ese SÍ era el que contenía las instrucciones de la zona superior. Debo decir que de todas formas, el header.html que está en STANDARD también tiene la información, pero cualquier cambio que hagan ahí no afectará el banner superior pues el tema PAGE se superpone a STANDARD. Lo mismo FLEX_MROOMS pero la diferencia es que este último le dice que use el de su padre.



Hay una pequeña sección donde están las instrucciones para comprender el armado del banner superior.



Luego de los encabezados de php viene esta línea:





<div id="header-home" class="clearfix">



<h1 class="headermain"><?php echo $heading ?></h1>



<div class="headermenu"><?php echo $menu ?></div>



</div>




Justo después de esto, uno puede darle forma al banner superior, ya sea por medio de imágenes, div’s, tablas, texto, etc. En el caso del sitio que estaba armando, la solución consistía en otro trozo de código que armé en html antes. Una vez colocado en el php del header.html hice la prueba para ver cómo se veía:



Banner Superior



Se veía increíble. Al menos a mi me pareció, especialmente después del trabajo que me había dado saber dónde y cómo hacerlo. Lo importante es que la modificación no sólo debía hacerse ahí. En el mismo header.html y un poco más abajo de las instrucciones para este banner aparece otra información que es en el caso de que la página que carga PHP sea cualquier página que NO SEA EL HOME de Moodle.



Como resumen, tenemos que para cambiar el banner superior de Moodle, hay que modificar header.html, que se encuentra en el tema que está controlando el sitio, en este caso FLEX_MROOMS y por orden de él mismo, PAGE. Al modificar la zona correspondiente en el PHP de header.html, debemos recordar modificar lo mismo en dos partes, justo después de:





<?php //Accessibility: 'headermain' is now H1,



//see theme/standard/styles_layout.css: .headermain



if ($home) {  // ESTO SÓLO APARECE SI ES EL HOME EL QUE SE ARMA



?>



<div id="header-home" class="clearfix">



<h1 class="headermain"><?php echo $heading ?></h1>



<div class="headermenu"><?php echo $menu ?></div>



</div>




y luego después de:





<?php } else if ($heading) {  // ESTO APARECE SI ES CUALQUIER



//OTRA PÁGINA CON ENCABEZADO



?>



<div id="header" class="clearfix"><h1 class="headermain">



<?php echo $heading ?></h1>



<div class="headermenu"><?php echo $menu ?></div>



</div>




Una vez hechos los cambios (¡cuidado al cerrar los tags!), el banner superior modificado aparecerá en todas las páginas de Moodle. A pesar de lo que ven, la funcionalidad no estaba lista y los botones tenían # para representar las funciones. Más tarde la funcionalidad de cada uno sería tarea del programador a cargo de ello. A continuación el código modificado para la dupla PAGE-FLEX_MROOMS (para el caso de que trabajen con STANDARD, es lo mismo, hacen los cambios en el header.html de STANDARD).





<div id="page">



<?php //Accessibility: 'headermain' is now H1,



// see theme/standard/styles_layout.css: .headermain



      if ($home) {  // This is what gets printed on the home page only



?>



    <div id="header-home" class="clearfix">



        <h1 class="headermain"><?php echo $heading ?></h1>



        <div class="headermenu"><?php echo $menu ?></div>



</div>



<div id="menu_topbar">



  <a href="#home">



  <img src="<?php echo $CFG->themewww .'/'. current_theme() ?>/pix/b_binicio_a.gif" 



alt="inicio" class="img_topbar" width="29" height="14"  id="mtb01" 



onmouseout="FP_swapImgRestore()" 



onmouseover="FP_swapImg(1,1,/*id*/'mtb01',/*url*/'<?php echo $CFG->themewww .'/'. current_theme() 



?>/pix/b_binicio_b.gif')" />



</a>



<a href="#">



<img src="<?php echo $CFG->themewww .'/'. current_theme() ?>/pix/b_bescritorio_a.gif" 



alt="mi escritorio" class="img_topbar" width="59" height="14"  id="mtb02" 



onmouseout="FP_swapImgRestore()" 



onmouseover="FP_swapImg(1,1,/*id*/'mtb02',/*url*/'<?php echo $CFG->themewww .'/'. current_theme() 



?>/pix/b_bescritorio_b.gif')" />



</a>



<a href="#">



<img src="<?php echo $CFG->themewww .'/'. current_theme() ?>/pix/b_bfaq_a.gif" 



alt="preguntas frecuentes" class="img_topbar" width="97" height="14" id="mtb04" 



onmouseout="FP_swapImgRestore()" 



onmouseover="FP_swapImg(1,1,/*id*/'mtb04',/*url*/'<?php echo $CFG->themewww .'/'. current_theme() 



?>/pix/b_bfaq_b.gif')" />



</a>



<a href="#">



<img src="<?php echo $CFG->themewww .'/'. current_theme() ?>/pix/b_bsalircv_a.gif" 



alt="salir del campus virtual" class="img_topbar" width="105" height="14" id="mtb05" 



onmouseout="FP_swapImgRestore()" 



onmouseover="FP_swapImg(1,1,/*id*/'mtb05',/*url*/'<?php echo $CFG->themewww .'/'. current_theme() 



?>/pix/b_bsalircv_b.gif')" />



</a>



</div>



<div id="menu_navbarbig">



<div class="avatarsup">



<img src="<?php echo $CFG->themewww .'/'. current_theme() ?>/pix/b_tutorial.jpg" 



alt="TUTORIAL" class="avatarimg" width="132" height="54" />



<a href="#">



<img src="<?php echo $CFG->wwwroot .'/user/pix.php/'. $USER->id;?>/f1.jpg" 



alt=".:AVATAR:." class="avatar1" width="48" height="48" />



</a>



</div>



<a href="#">



<img src="<?php echo $CFG->themewww .'/'. current_theme() ?>/pix/b_mdatos_a.jpg" 



alt="mis datos" class="nbbimg" width="50" height="54" id="mnb01" 



onmouseout="FP_swapImgRestore()" 



onmouseover="FP_swapImg(1,1,/*id*/'mnb01',/*url*/'<?php echo $CFG->themewww .'/'. current_theme() 



?>/pix/b_mdatos_b.jpg')" />



</a>



<a href="#">



<img src="<?php echo $CFG->themewww .'/'. current_theme() ?>/pix/b_mcursos_a.jpg" 



alt="mis cursos" class="nbbimg" width="50" height="54" id="mnb02" 



onmouseout="FP_swapImgRestore()" 



onmouseover="FP_swapImg(1,1,/*id*/'mnb02',/*url*/'<?php echo $CFG->themewww .'/'. current_theme() 



?>/pix/b_mcursos_b.jpg')" />



</a>



<a href="#">



<img src="<?php echo $CFG->themewww .'/'. current_theme() ?>/pix/b_mporta_a.jpg" 



alt="mi portafolio" class="nbbimg" width="50" height="54" id="mnb03" 



onmouseout="FP_swapImgRestore()" 



onmouseover="FP_swapImg(1,1,/*id*/'mnb03',/*url*/'<?php echo $CFG->themewww .'/'. current_theme() 



?>/pix/b_mporta_b.jpg')"  />



</a>



<a href="#">



<img src="<?php echo $CFG->themewww .'/'. current_theme() ?>/pix/b_magenda_a.jpg" 



alt="mi agenda" class="nbbimg" width="50" height="54" id="mnb04" 



onmouseout="FP_swapImgRestore()" 



onmouseover="FP_swapImg(1,1,/*id*/'mnb04',/*url*/'<?php echo $CFG->themewww .'/'. current_theme() 



?>/pix/b_magenda_b.jpg')" />



</a>



<a href="#" target="_blank" >



<img src="<?php echo $CFG->themewww .'/'. current_theme() ?>/pix/b_mcorreo_a.jpg" 



alt="mi correo" class="nbbimg" width="50" height="54" id="mnb05" 



onmouseout="FP_swapImgRestore()" 



onmouseover="FP_swapImg(1,1,/*id*/'mnb05',/*url*/'<?php echo $CFG->themewww .'/'. current_theme() ?>/pix/b_mcorreo_b.jpg')" />



</a>



<a href="#">



<img src="<?php echo $CFG->themewww .'/'. current_theme() ?>/pix/b_mbiblio_a.jpg" 



alt="mi biblioteca" class="nbbimg" width="50" height="54" id="mnb06" 



onmouseout="FP_swapImgRestore()" 



onmouseover="FP_swapImg(1,1,/*id*/'mnb06',/*url*/'<?php echo $CFG->themewww .'/'. current_theme() 



?>/pix/b_mbiblio_b.jpg')" />



</a>



<a href="#">



<img src="<?php echo $CFG->themewww .'/'. current_theme() ?>/pix/b_mnotas_a.jpg" 



alt="mis calificaciones" class="nbbimg" width="50" height="54" id="mnb07" 



onmouseout="FP_swapImgRestore()" 



onmouseover="FP_swapImg(1,1,/*id*/'mnb07',/*url*/'<?php echo $CFG->themewww .'/'. current_theme() 



?>/pix/b_mnotas_b.jpg')" />



</a>



<a href="#">



<img src="<?php echo $CFG->themewww .'/'. current_theme() ?>/pix/b_cvirtual_a.jpg" 



alt="mi buscador" class="nbbimg" width="50" height="54" id="mnb08" 



onmouseout="FP_swapImgRestore()" 



onmouseover="FP_swapImg(1,1,/*id*/'mnb08',/*url*/'<?php echo $CFG->themewww .'/'. current_theme() 



?>/pix/b_cvirtual_b.jpg')" />



</a>



</div>






<div id="menu_topbar">



<a href="#home">



<img src="<?php echo $CFG->themewww .'/'. current_theme() ?>/pix/b_binicio_a.gif" 



alt="inicio" class="img_topbar" width="29" height="14"  id="mtb01" 



onmouseout="FP_swapImgRestore()" 



onmouseover="FP_swapImg(1,1,/*id*/'mtb01',/*url*/'<?php echo $CFG->themewww .'/'. current_theme() 



?>/pix/b_binicio_b.gif')" />



</a>



<a href="#">



<img src="<?php echo $CFG->themewww .'/'. current_theme() ?>/pix/b_bescritorio_a.gif" 



alt="mi escritorio" class="img_topbar" width="59" height="14"  id="mtb02" 



onmouseout="FP_swapImgRestore()" 



onmouseover="FP_swapImg(1,1,/*id*/'mtb02',/*url*/'<?php echo $CFG->themewww .'/'. current_theme() 



?>/pix/b_bescritorio_b.gif')" />



</a>



<a href="#">



<img src="<?php echo $CFG->themewww .'/'. current_theme() ?>/pix/b_bfaq_a.gif" 



alt="preguntas frecuentes" class="img_topbar" width="97" height="14" id="mtb04" 



onmouseout="FP_swapImgRestore()" 



onmouseover="FP_swapImg(1,1,/*id*/'mtb04',/*url*/'<?php echo $CFG->themewww .'/'. current_theme() 



?>/pix/b_bfaq_b.gif')" />



</a>



<a href="#">



<img src="<?php echo $CFG->themewww .'/'. current_theme() ?>/pix/b_bsalircv_a.gif" 



alt="salir del campus virtual" class="img_topbar" width="105" height="14" id="mtb05" 



onmouseout="FP_swapImgRestore()" 



onmouseover="FP_swapImg(1,1,/*id*/'mtb05',/*url*/'<?php echo $CFG->themewww .'/'. current_theme() 



?>/pix/b_bsalircv_b.gif')" />



</a>



</div>



<div id="menu_navbarbig">



<div class="avatarsup">



<img src="<?php echo $CFG->themewww .'/'. current_theme() ?>/pix/b_tutorial.jpg" 



alt="TUTORIAL" class="avatarimg" width="132" height="54" />



<a href="#">



<img src="<?php echo $CFG->wwwroot .'/user/pix.php/'. $USER->id ?>/f1.jpg" 



alt=".:AVATAR:." class="avatar1" width="48" height="48" />



</a>



</div>



<a href="#">



<img src="<?php echo $CFG->themewww .'/'. current_theme() ?>/pix/b_mdatos_a.jpg" 



alt="mis datos" class="nbbimg" width="50" height="54" id="mnb01" 



onmouseout="FP_swapImgRestore()" 



onmouseover="FP_swapImg(1,1,/*id*/'mnb01',/*url*/'<?php echo $CFG->themewww .'/'. current_theme() 



?>/pix/b_mdatos_b.jpg')" />



</a>



<a href="#">



<img src="<?php echo $CFG->themewww .'/'. current_theme() ?>/pix/b_mcursos_a.jpg" 



alt="mis cursos" class="nbbimg" width="50" height="54" id="mnb02" 



onmouseout="FP_swapImgRestore()" 



onmouseover="FP_swapImg(1,1,/*id*/'mnb02',/*url*/'<?php echo $CFG->themewww .'/'. current_theme() 



?>/pix/b_mcursos_b.jpg')" />



</a>



<a href="#">



<img src="<?php echo $CFG->themewww .'/'. current_theme() ?>/pix/b_mporta_a.jpg" 



alt="mi portafolio" class="nbbimg" width="50" height="54" id="mnb03" 



onmouseout="FP_swapImgRestore()" 



onmouseover="FP_swapImg(1,1,/*id*/'mnb03',/*url*/'<?php echo $CFG->themewww .'/'. current_theme() 



?>/pix/b_mporta_b.jpg')"  />



</a>



<a href="#">



<img src="<?php echo $CFG->themewww .'/'. current_theme() ?>/pix/b_magenda_a.jpg" 



alt="mi agenda" class="nbbimg" width="50" height="54" id="mnb04" 



onmouseout="FP_swapImgRestore()" 



onmouseover="FP_swapImg(1,1,/*id*/'mnb04',/*url*/'<?php echo $CFG->themewww .'/'. current_theme() 



?>/pix/b_magenda_b.jpg')" />



</a>



<a href="#" target="_blank" >



<img src="<?php echo $CFG->themewww .'/'. current_theme() ?>/pix/b_mcorreo_a.jpg" 



alt="mi correo" class="nbbimg" width="50" height="54" id="mnb05" 



onmouseout="FP_swapImgRestore()" 



onmouseover="FP_swapImg(1,1,/*id*/'mnb05',/*url*/'<?php echo $CFG->themewww .'/'. current_theme() 



?>/pix/b_mcorreo_b.jpg')" />



</a>



<a href="#">



<img src="<?php echo $CFG->themewww .'/'. current_theme() ?>/pix/b_mbiblio_a.jpg" 



alt="mi biblioteca" class="nbbimg" width="50" height="54" id="mnb06" 



onmouseout="FP_swapImgRestore()" 



onmouseover="FP_swapImg(1,1,/*id*/'mnb06',/*url*/'<?php echo $CFG->themewww .'/'. current_theme() 



?>/pix/b_mbiblio_b.jpg')" />



</a>



<a href="#">



<img src="<?php echo $CFG->themewww .'/'. current_theme() ?>/pix/b_mnotas_a.jpg" 



alt="mis calificaciones" class="nbbimg" width="50" height="54" id="mnb07" 



onmouseout="FP_swapImgRestore()" 



onmouseover="FP_swapImg(1,1,/*id*/'mnb07',/*url*/'<?php echo $CFG->themewww .'/'. current_theme() 



?>/pix/b_mnotas_b.jpg')" />



</a>



<a href="#">



<img src="<?php echo $CFG->themewww .'/'. current_theme() ?>/pix/b_cvirtual_a.jpg" 



alt="mi buscador" class="nbbimg" width="50" height="54" id="mnb08" 



onmouseout="FP_swapImgRestore()" 



onmouseover="FP_swapImg(1,1,/*id*/'mnb08',/*url*/'<?php echo $CFG->themewww .'/'. current_theme() 



?>/pix/b_cvirtual_b.jpg')" />



</a>



</div>




Con esto resuelto, al menos en parte (no les he dado los CSS de lo que hice en el header.html), podemos pasar justamente a lo más complejo, los CSS.



continúa…