// 
//     Licensed to the Apache Software Foundation (ASF) under one
//     or more contributor license agreements.  See the NOTICE file
//     distributed with this work for additional information
//     regarding copyright ownership.  The ASF licenses this file
//     to you under the Apache License, Version 2.0 (the
//     "License"); you may not use this file except in compliance
//     with the License.  You may obtain a copy of the License at
// 
//       http://www.apache.org/licenses/LICENSE-2.0
// 
//     Unless required by applicable law or agreed to in writing,
//     software distributed under the License is distributed on an
//     "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
//     KIND, either express or implied.  See the License for the
//     specific language governing permissions and limitations
//     under the License.
//

= HTML5 - Conceitos Básicos sobre o Desenvolvimento de Cordova
:jbake-type: tutorial
:jbake-tags: tutorials 
:jbake-status: published
:icons: font
:syntax: true
:source-highlighter: pygments
:toc: left
:toc-title:
:description: HTML5 - Conceitos Básicos sobre o Desenvolvimento de Cordova - Apache NetBeans
:keywords: Apache NetBeans, Tutorials, HTML5 - Conceitos Básicos sobre o Desenvolvimento de Cordova

|===
|Este screencast apresenta o suporte no NetBeans IDE para desenvolver aplicações com HTML, Java Script e CSS para dispositivos móveis por meio de Cordova.

link:http://bits.netbeans.org/media/html5-gettingstarted-cordova-final-screencast.mp4[+Download / Veja em tamanho completo+] (36 MB)

 

|Para obter mais informações sobre como trabalhar com aplicações HTML5 no NetBeans IDE, assista aos screencasts a seguir.

* link:html5-gettingstarted-screencast.html[+ HTML5 - Parte 1: Conceitos Básicos sobre Aplicações HTML5+]
* link:html5-css-screencast.html[+ HTML5 - Parte 2: Trabalhando com as Folhas de Estilo CSS nas Aplicações HTML5+]
* link:html5-javascript-screencast.html[+ HTML5 - Parte 3: Testando e Depurando JavaScript nas Aplicações HTML5+]

link:/about/contact_form.html?to=3&subject=Feedback:%20Video%20of%20Getting%20Started%20with%20Cordova%20Applications[+Enviar Feedback neste Tutorial+]
 
|===


== Links relacionados

* link:../webclient/cordova-gettingstarted.html[+Conceitos Básicos sobre Criação de uma Aplicação Cordova+]
* link:../webclient/html5-gettingstarted.html[+Conceitos Básicos sobre Aplicações em HTML5 +]
* link:../webclient/html5-editing-css.html[+Trabalhando com Folhas de Estilo de CSS em Aplicações em HTML5+]
* link:../webclient/html5-js-support.html[+Depurando e Testando JavaScript em Aplicações em HTML5+]
* link:http://wiki.netbeans.org/HTML5[+Suporte a HTML5 na página Wiki do NetBeans IDE+]
* link:../../trails/php.html[+Trilha de Aprendizado de PHP e HTML5+]
