DouroAventura

From Labmm2

Jump to: navigation, search

Contents

Grupo

Marco Nunes - 61179

Rui Leite - 41752

Apresentação

Este website destina-se a divulgar livre e gratuitamente informações relativas a vários locais e estruturas da zona do Douro e vai permitir ao utilizador ter uma ideia global sobre o que pode fazer, visitar e degustar na região. O público–alvo é o grupo de turistas que gostam de aventura e descoberta de novos locais de interesse, sendo a faixa etária entre os 18 e os 35 anos. São disponibilizadas fotos panorâmicas de alguns locais e também Google Maps integrados na página, para melhor localização dos locais em questão.

Fluxograma

FluxogramaDouroAventura.jpg

Layouts


Estrutura XHTML implementada

A estrutura base do website desenvolvido foi criada com recurso a tabelas, sendo estas complementadas com divs quando necessário. Utilizamos a tecnologia HTML5 para facilitar a integração de outras tecnologias, nomeadamente CSS3. Abrir a página no Internet Explorer causa alguns problemas devido à baixa compatibilidade com estas tecnologias. Não foi utilizado o atributi "float" em nenhuma das divs.

É de notar o uso da tag "<nav>" para a criação dos menus (superior e inferior), cuja aparência foi depois editada com recurso a CSS3.

<body>
<table width="1024" id="tabela" border="0" align="center">
  <tr>
    <td width="244" align="center" valign="top" id="logo"></td>
    <td width="724" height="118" colspan="2" align="center" valign="middle" id="header"></td>
  </tr>
  <tr>
    <td colspan="3" align="center" id="menu" valign="center">
    <nav>
      <ul class="menu">
           <li><a href="index.html" class="homeIcon"></a></li>
           <li><a href="pedestres.html">Percursos Pedestres</a></li>
           <li><a href="radicais.html">Percursos Radicais</a></li>
           <li><a href="monumentos.html">Monumentos</a></li>
           <li><a href="gastronomia.html">Gastronomia</a></li>
           <li><a href="galeria.html">Galeria de Fotos</a></li>
     </ul>
    </nav>
    </td>
  </tr>
  <tr>
   
  </tr>
  <tr>
    <td colspan="3" align="center" valign="top" id="content" bgcolor="#000000">
	<!-- TemplateBeginEditable name="content" -->

	<!-- TemplateEndEditable -->
	</td>
  </tr>
  <tr>
  
    <td colspan="3" align="center" valign="middle" id="footer">
    <nav>
      <ul class="footermenu">
           <li><a href="faqs.html">FAQ'S</a></li>
           <li><a href="mapasite.html">Mapa do Site</a></li>
           <li><a href="links.html">Links</a></li>
           <li><a href="contactos.html">Contactos</a></li>
      </ul>
    </nav> 
  </tr>
</table>
</body>

Folhas de estilos

Como já foi dito, recorremos à tecnologia CSS3 para a formatação das páginas. Uma vez que há problemas de compatibilidade com o Internet Explorer 9, recorremos a um processo de decisão inserido num comentário que obriga a que o estilo usado no Internet Explorer 9 seja diferente e, por isso, compatível.

Para os botões dos menus, o tipo de letra foi importado através do servidor de fontes da Google, com o recurso a background e com cores formato rgba. Utilizando a nova tecnologia de gradientes e borders arredondadas, foi possível utilizar backgrounds feitos somente em CSS sem recurso a imagens, o que aumenta a velocidade de carregamento da página. Para criação do sombreado sobre os botões quando se passa o rato sobre eles é utilizada a instância ":after", assim dando relevo 3D aos botões.

O background foi colocado com recurso a comando "position: fixed", assim o utilizador não irá ver a imagem com aumentos que a tornem distorcida e tornando sempre agradável e criar ambiente de natureza, que é o principal objectivo a desenvolver no projecto

Para tornar o website compativel para dispositivos móveis e impressão foram atribuidas novas folhas de estilos às páginas, com a indicação correcta.

body {
	background-image:url(../imagens/background.jpg);
	background-size:100%;
	background-attachment:fixed;
	color:#FFF;
	font-family:Arial, Helvetica, sans-serif;
	font-style:inherit;
	font-size:12px;
	text-align:left;
}
p {
	margin:10px;
}

h1 {
	margin:10px;
}
img {
	margin:10px;
}

#noticias {
	padding-left: 10px;
	border-left-width: 5px;
	border-left-style: groove;
	border-left-color: #F00;
}

a:link{
	color:#fff;
	font-family:Arial, Helvetica, sans-serif;
	text-decoration: none;
}
a:active{
	color:#fff;
	font-family:Arial, Helvetica, sans-serif;
}
a:hover{
	color:fff;
	font-family:Arial, Helvetica, sans-serif;
	text-decoration:underline;
}
a:visited{
	color:#fff;
	font-family:Arial, Helvetica, sans-serif;
	text-decoration: none;
}


.menu{
	overflow: hidden;
	display: inline-block;
}

.menu li{
	background-color: #f0f0f0;
	background-image: -webkit-gradient(linear,left top, left bottom,from(#fefefe), color-stop(0.5,#f0f0f0), color-stop(0.51, #e6e6e6));
	background-image: -moz-linear-gradient(#fefefe 0%, #f0f0f0 50%, #e6e6e6 51%);
	background-image: -o-linear-gradient(#fefefe 0%, #f0f0f0 50%, #e6e6e6 51%);
	background-image: -ms-linear-gradient(#fefefe 0%, #f0f0f0 50%, #e6e6e6 51%);
	background-image: linear-gradient(#fefefe 0%, #f0f0f0 50%, #e6e6e6 51%);
	border-right: 1px solid rgba(9, 9, 9, 0.125);
	box-shadow: 1px -1px 0 rgba(255, 255, 255, 0.6) inset;
	-moz-box-shadow: 1px -1px 0 rgba(255, 255, 255, 0.6) inset;
	-webkit-box-shadow: 1px -1px 0 rgba(255, 255, 255, 0.6) inset;
	position:relative;
	float: left;
	list-style: none;
}

.menu li:after{
	content:'.';
	text-indent:-9999px;
	overflow:hidden;
	position:absolute;
	width:100%;
	height:100%;
	top:0;
	left:0;
	z-index:1;
	opacity:0;
	background-image:-webkit-gradient(linear, left top, right top, from(rgba(168,168,168,0.5)),color-stop(0.5,rgba(168,168,168,0)), to(rgba(168,168,168,0.5)));
	background-image:-moz-linear-gradient(left, rgba(168,168,168,0.5), rgba(168,168,168,0) 50%, rgba(168,168,168,0.5));
	background-image:-o-linear-gradient(left, rgba(168,168,168,0.5), rgba(168,168,168,0) 50%, rgba(168,168,168,0.5));
	background-image:-ms-linear-gradient(left, rgba(168,168,168,0.5), rgba(168,168,168,0) 50%, rgba(168,168,168,0.5));
	background-image:linear-gradient(left, rgba(168,168,168,0.5), rgba(168,168,168,0) 50%, rgba(168,168,168,0.5));
	box-shadow:-1px 0 0 #a3a3a3,-2px 0 0 #fff,1px 0 0 #a3a3a3,2px 0 0 #fff;
	-moz-box-shadow:-1px 0 0 #a3a3a3,-2px 0 0 #fff,1px 0 0 #a3a3a3,2px 0 0 #fff;
	-webkit-box-shadow:-1px 0 0 #a3a3a3,-2px 0 0 #fff,1px 0 0 #a3a3a3,2px 0 0 #fff;
	-moz-transition:0.25s all;
	-webkit-transition:0.25s all;
	-o-transition:0.25s all;
	transition:0.25s all;
}

.menu li:first-child{
	border-radius: 4px 0 0 4px;
}

.menu li:first-child:after,
.menu li.selected:first-child:after{
	box-shadow:1px 0 0 #a3a3a3,2px 0 0 #fff;
	-moz-box-shadow:1px 0 0 #a3a3a3,2px 0 0 #fff;
	-webkit-box-shadow:1px 0 0 #a3a3a3,2px 0 0 #fff;
	border-radius:4px 0 0 4px;
}

.menu li:last-child{
	border-radius: 0 4px 4px 0;
}

.menu li:last-child:after,
.menu li.selected:last-child:after{
	box-shadow:-1px 0 0 #a3a3a3,-2px 0 0 #fff;
	-moz-box-shadow:-1px 0 0 #a3a3a3,-2px 0 0 #fff;
	-webkit-box-shadow:-1px 0 0 #a3a3a3,-2px 0 0 #fff;
	
	border-radius:0 4px 4px 0;
}

.menu li:hover:after,
.menu li.selected:after,
.menu li:target:after{
	opacity:1;
}

.menu:hover li.selected:after,
.menu:hover li:target:after{
	opacity:0;
}

.menu li.selected:hover:after,
.menu li:target:hover:after{
	opacity:1 !important;
}

.menu li a{
	color: #5d5d5d;
	display: inline-block;
	font: 19px/1 Lobster,Arial,sans-serif;
	padding: 5px 15px 7px;
	position: relative;
	text-shadow: 1px 1px 0 rgba(255, 255, 255, 0.6);
	z-index:2;
	text-decoration:none !important;
	white-space:nowrap;
	height: 17px;
}

.menu a.homeIcon{
	display: block;
	overflow: hidden;
	padding-left: 12px;
	padding-right: 12px;
	text-indent: -9999px;
	width: 16px;
	background-image: url(../imagens/home.png);
	background-repeat: no-repeat;
	background-position: center center;
}

#tabela {
	background-image:-webkit-gradient(linear, left top, right top, from(rgba(0,0,0,0.5)),color-stop(0.1,rgba(0,0,0,0.5)), to(rgba(0,0,0,0.6)));s
	background-image:-moz-linear-gradient(left, rgba(0,0,0,0.5));
	background-image:-o-linear-gradient(left, rgba(0,0,0,0.5));
	background-image:-ms-linear-gradient(left, rgba(0,0,0,0.5));
	background-image:linear-gradient(left, rgba(0,0,0,0.5));
	box-shadow:-1px 0 0 #a3a3a3,-2px 0 0 #fff,1px 0 0 #a3a3a3,2px 0 0 #fff;
	-moz-box-shadow:-1px 0 0 #a3a3a3,-2px 0 0 #fff,1px 0 0 #a3a3a3,2px 0 0 #fff;
	-webkit-box-shadow:-1px 0 0 #a3a3a3,-2px 0 0 #fff,1px 0 0 #a3a3a3,2px 0 0 #fff;
	-moz-transition:0.25s all;
	-webkit-transition:0.25s all;
	-o-transition:0.25s all;
	transition:0.25s all;
}
#logo {
	background-image:url(../imagens/logo.png);
	background-repeat:no-repeat;
	background-position:center;
}

#header {
	background-image:url(../imagens/header_douro.jpeg);
	background-position:center;
	background-repeat:no-repeat;
}


.footermenu{
	overflow: hidden;
	display: inline-block;
}

.footermenu li{
	background-color: #f0f0f0;
	background-image: -webkit-gradient(linear,left top, left bottom,from(#fefefe), color-stop(0.5,#f0f0f0), color-stop(0.51, #e6e6e6));
	background-image: -moz-linear-gradient(#fefefe 0%, #f0f0f0 50%, #e6e6e6 51%);
	background-image: -o-linear-gradient(#fefefe 0%, #f0f0f0 50%, #e6e6e6 51%);
	background-image: -ms-linear-gradient(#fefefe 0%, #f0f0f0 50%, #e6e6e6 51%);
	background-image: linear-gradient(#fefefe 0%, #f0f0f0 50%, #e6e6e6 51%);
	border-right: 1px solid rgba(9, 9, 9, 0.125);
	box-shadow: 1px -1px 0 rgba(255, 255, 255, 0.6) inset;
	-moz-box-shadow: 1px -1px 0 rgba(255, 255, 255, 0.6) inset;
	-webkit-box-shadow: 1px -1px 0 rgba(255, 255, 255, 0.6) inset;
	position:relative;
	float: left;
	list-style: none;
}

.footermenu li:after{
	content:'.';
	text-indent:-9999px;
	overflow:hidden;
	position:absolute;
	width:100%;
	height:100%;
	top:0;
	left:0;
	z-index:1;
	opacity:0;
	background-image:-webkit-gradient(linear, left top, right top, from(rgba(168,168,168,0.5)),color-stop(0.5,rgba(168,168,168,0)), to(rgba(168,168,168,0.5)));
	background-image:-moz-linear-gradient(left, rgba(168,168,168,0.5), rgba(168,168,168,0) 50%, rgba(168,168,168,0.5));
	background-image:-o-linear-gradient(left, rgba(168,168,168,0.5), rgba(168,168,168,0) 50%, rgba(168,168,168,0.5));
	background-image:-ms-linear-gradient(left, rgba(168,168,168,0.5), rgba(168,168,168,0) 50%, rgba(168,168,168,0.5));
	background-image:linear-gradient(left, rgba(168,168,168,0.5), rgba(168,168,168,0) 50%, rgba(168,168,168,0.5));
	box-shadow:-1px 0 0 #a3a3a3,-2px 0 0 #fff,1px 0 0 #a3a3a3,2px 0 0 #fff;
	-moz-box-shadow:-1px 0 0 #a3a3a3,-2px 0 0 #fff,1px 0 0 #a3a3a3,2px 0 0 #fff;
	-webkit-box-shadow:-1px 0 0 #a3a3a3,-2px 0 0 #fff,1px 0 0 #a3a3a3,2px 0 0 #fff;
	-moz-transition:0.25s all;
	-webkit-transition:0.25s all;
	-o-transition:0.25s all;
	transition:0.25s all;
}

.footermenu li:first-child{
	border-radius: 4px 0 0 4px;
}

.footermenu li:first-child:after,
.footermenu li.selected:first-child:after{
	box-shadow:1px 0 0 #a3a3a3,2px 0 0 #fff;
	-moz-box-shadow:1px 0 0 #a3a3a3,2px 0 0 #fff;
	-webkit-box-shadow:1px 0 0 #a3a3a3,2px 0 0 #fff;
	border-radius:4px 0 0 4px;
}

.footermenu li:last-child{
	border-radius: 0 4px 4px 0;
}

.footermenu li:last-child:after,
.footermenu li.selected:last-child:after{
	box-shadow:-1px 0 0 #a3a3a3,-2px 0 0 #fff;
	-moz-box-shadow:-1px 0 0 #a3a3a3,-2px 0 0 #fff;
	-webkit-box-shadow:-1px 0 0 #a3a3a3,-2px 0 0 #fff;
	
	border-radius:0 4px 4px 0;
}

.footermenu li:hover:after,
.footermenu li.selected:after,
.footermenu li:target:after{
	opacity:1;
}

.footermenu:hover li.selected:after,
.footermenu:hover li:target:after{
	opacity:0;
}

.footermenu li.selected:hover:after,
.footermenu li:target:hover:after{
	opacity:1 !important;
}

.footermenu li a{
	color: #5d5d5d;
	display: inline-block;
	font: 12px/1 Lobster,Arial,sans-serif;
	padding: 5px 15px 4px;
	position: relative;
	text-shadow: 1px 1px 0 rgba(255, 255, 255, 0.6);
	z-index:2;
	text-decoration:none !important;
	white-space:nowrap;
	height: 17px;
}
#painel {
	width:667px;
	height:450px;
	background-color:#FFFFFF;
}

#slideShowContainer{
	width:540px;
	height:390px;
	position:relative;
	margin:120px auto 50px;
}
#slideShow{
	position:absolute;
	height:370px;
	width:520px;
	background-color:#fff;
	margin:10px 0 0 10px;
	z-index:100;
	
	-moz-box-shadow:0 0 10px #111;
	-webkit-box-shadow:0 0 10px #111;
	box-shadow:0 0 10px #111;
}

#slideShow ul{
	position:absolute;
	top:15px;
	right:15px;
	bottom:15px;
	left:15px;
	list-style:none;
	overflow:hidden;
}

#slideShow li{
	position:absolute;
	top:0;
	left:0;
	height:370px;
	width:520px;
}

#slideShowContainer > a{
	border:none;
	text-decoration:none;
	text-indent:-99999px;
	overflow:hidden;
	width:36px;
	height:37px;
	background:url('../img/arrows.png') no-repeat;
	position:absolute;
	top:50%;
	margin-top:-21px;
}

Principais scripts desenvolvidas

Incluimos uma galeria de imagens numa das páginas. Thumbnails das imagens são apresentadas à esquerda. Estes thumbnails são clicáveis e, quando o utlizador o faz, mostram a imagem em tamanho original à direita. Os nomes das imagens estão guardados num array que depois é concatenado num código HTML que permite a exibição da página. Este código é depois inserido numa div com recurso ao atributo "innerHTML".

<script type="text/javascript">
var imagesList = new Array;
imagesList[0] = ["01.jpg"];
imagesList[1] = ["02.jpg"];
imagesList[2] = ["03.jpg"];
imagesList[3] = ["04.jpg"];
imagesList[4] = ["05.jpg"];
imagesList[5] = ["06.jpg"];

function showImgPic(num){
	imgPic = "<img src='imagens/galeria/"+imagesList[num]+"' width='650px' height='430px'/>";
	document.getElementById("painel").innerHTML = imgPic;
}
</script>


O script de validação do formulário de contacto foi baseado num script encontrado online que foi modificado por nós, de forma a que ajustasse melhor aos nossos propósitos. Cada campo é validado separadamente e apenas permite a validação do formulário se todos os campos preenchidos estiverem correctos (nome composta apenas por letras, idade composta apenas por números, e-mail válido e mensagem dentro do limite máximo de caracteres). Cada campo é validado por uma função que é chamada na função principal. Quando o utilizador se foca num campo, uma dica ao preenchimento é apresentada do lado direito. Os caracteres restantes também são contados, onde possível.

<script type="text/javascript">
function formValidator(){
	var nome = document.getElementById('nome');
	var idade = document.getElementById('idade');
	var email = document.getElementById('email');
	var mensagem = document.getElementById('mensagem');
	
	// Check each input in the order that it appears in the form!
	if(isAlphabet(nome, "Campo incorrecto. Só são aceites letras.")){
		if(isNumeric(idade, "Campo incorrecto. Só são aceites números.")){
			if(emailValidator(email, "Campo incorrecto. Coloque um e-mail válido.")){
				if(lengthRestriction(mensagem, 1, 50)){
						return true;
				}
			}
		}
	}
	return false;
}

function isAlphabet(elem, helperMsg){
	var alphaExp = /^[a-zA-Z]+$/;
	if(elem.value.match(alphaExp)){
		return true;
	}else{
		document.getElementById('info1').innerHTML = helperMsg;
		elem.focus();
		return false;
	}
}

function isNumeric(elem, helperMsg){
	var numericExpression = /^[0-9]+$/;
	if(elem.value.match(numericExpression)){
		return true;
	}else{
		document.getElementById('info2').innerHTML = helperMsg;
		elem.focus();
		return false;
	}
}
function lengthRestriction(elem, minimo, maximo){
	var uInput = elem.value;
	if(uInput.length >= minimo && uInput.length <= maximo){
		return true;
	}else{
		document.getElementById('info4').innerHTML = "A sua mensagem deve ter entre " +minimo+ " e " +maximo+ " caracteres.";
		elem.focus();
		return false;
	}
}

function emailValidator(elem, helperMsg){
	var emailExp = /^[\w\-\.\+]+\@[a-zA-Z0-9\.\-]+\.[a-zA-z0-9]{2,4}$/;
	if(elem.value.match(emailExp)){
		return true;
	}else{
		document.getElementById('info3').innerHTML = helperMsg;
		elem.focus();
		return false;
	}
}

function ajuda(campo) {
	switch (campo) {
		case 1:
			document.getElementById("info1").innerHTML = "coloque aqui o seu primeiro nome";
			break;
		case 2:
			document.getElementById("info2").innerHTML = "coloque aqui a sua idade";
			break;
		case 3:
			document.getElementById("info3").innerHTML = "coloque aqui o seu e-mail";
			break;
		case 4:
			document.getElementById("info4").innerHTML = "coloque aqui a sua mensagem";
			break;
			default:
	}
}

function limpaajuda() {
	for (i=1;i<7;i++) document.getElementById("info"+i).innerHTML = "";
}

function contarCarac(numcaract){
	switch(numcaract){
		case 50:
			var y=document.form1.morada.value;
			document.getElementById("info4").innerHTML = "restam-lhe " + (numcaract-y.length) + " caracteres";
			break;
	};
};
</script>

Integração com outras tecnologias

Em algumas das páginas foram incluídos mapas do GoogleMaps. Utilizamos as ferramentas disponibilizadas pela Google para os incluir, sendo que apenas foi necessário colocar o código pré-feito na página escolhida.

Melhoramentos futuros

Era pretendido que o banner do website fosse capaz de se movimentar dentro da sua "div" de forma a que fosse possível visualizar uma imagem panorâmica no seu interior. Devido a problemas encontrados com o script, não nos foi possível concluir essa funcionalidade, sendo portanto essa uma funcionalidade que gostariamos de incluir em versões futuras.

Outra modificação a incluir em versões futuras é a criação de páginas individuais para cada monumento e estabelecimento específicos, integrando em cada um deles mapas interactivos.

Conclusões

Chegado ao fim do nosso trabalho, pensamos que ainda há muito trabalho a ser feito caso fossemos divulgar o website no nosso público-alvo. A incorporação de php e bases de dados seria uma boa forma de dinamizar o website.

Notamos que o browser que mais problemas de compatibilidade com o CSS3 foi o IE, mesmo na sua versão 9, onde claramente os efeitos de hover sobre os botões de menu não são conseguidos sem recurso a javascript, tendo sido necessário modificar alguns aspectos visuais para não comprometer em demasia o aspecto visual.

Referências bibliográficas

Validação de formulários - http://www.tizag.com/javascriptT/javascriptform.php

Criação de menus com CSS3 - http://tutorialzine.com/

Personal tools
Namespaces
Variants
Actions
Navigation
Toolbox