Herramientas de usuario

Herramientas del sitio


clase:daw:diw:2eval:tema07

Diferencias

Muestra las diferencias entre dos versiones de la página.

Enlace a la vista de comparación

Ambos lados, revisión anterior Revisión previa
Próxima revisión
Revisión previa
clase:daw:diw:2eval:tema07 [2020/12/03 12:53]
admin
clase:daw:diw:2eval:tema07 [2021/01/06 12:48] (actual)
admin [Ejercicios]
Línea 1: Línea 1:
-====== 7. Contenido interactivo ======+====== 7. Drag & Drop ====== 
 +El drag & drop es una forma de simplificar los interfaces de usuario.
  
  
-  * [[https://css-tricks.com/ground-rules-for-web-animations/|Ground Rules for Web Animations]]: Reglas para cuando usar animaciones+En el drag & drop siempre hay 2 elementos HTML que son: 
 +  * El elemento que se arrastra 
 +  * El elemento donde se suelta 
  
-  * Drag Drop +Respecto a los eventos , hay 3 eventos en un drag drop: 
-  * Transformaciones +  * ''ondragstart'': Cuando se empieza a arrastrar 
-  * Transiciones +  * ''ondragover'': Cuando se está sobre el elemento donde se quiere soltar (pero sin soltarlo) 
-  * Animaciones+  * ''ondrop'': Cuando se suelta.
  
 +Por último está:
 +  * La propiedad ''draggable'' que indica si un elemento se puede arrastrar
 +  * El objeto de JavaScript ''dataTransfer'' que es donde se almacena lo que que se está arrastrando.
  
-===== Material =====+Mas información: 
 +    * [[http://www.w3schools.com/html/html5_draganddrop.asp|HTML Drag and Drop API]] 
 +    * [[https://bevacqua.github.io/dragula/|Dragula: Librería de Drag & Drop de Alto Nivel]] 
 +    * [[http://interactjs.io/|interact.js: Librería de Drag & Drop de Bajo Nivel]]
  
-==== Drag and drop ====+===== API ===== 
 +Para explicar como funciona drag & drop, vamos a usar el siguiente ejemplo
  
-    * [[http://www.w3schools.com/html/html5_draganddrop.asp|API de HTML 5]]+<sxh html> 
 +<!DOCTYPE HTML> 
 +<html> 
 +  <head> 
 +    <style> 
 +      .destino { 
 +        width350px; 
 +        height: 70px; 
 +        border: 1px solid #aaaaaa; 
 +      } 
 +    </style> 
 +    <script>
  
-   * [[https://www.youtube.com/watch?v=sX5hzEMMQAI|Animaciones y transiciones CSS]]: Vídeo de Youtube +      function onDragStart(ev) { 
-==== Transformaciones ====+        var element=ev.target; 
 +        var data=element.innerText;
  
 +        ev.dataTransfer.setData("text/plain", data);
 +      }
  
  
-    * [[http://www.w3schools.com/css/css3_2dtransforms.asp|Transformaciones 2D]] +      function onDrop(ev{ 
-      * matrix(n,n,n,n,n,n+        ev.preventDefault();
-      * translate(x,y) +
-      * translateX(n) +
-      * translateY(n) +
-      * scale(x,y) +
-      * scaleX(n) +
-      * scaleY(n) +
-      * rotate(angle) +
-      * skew(x-angle,y-angle) +
-      * skewX(angle) +
-      * skewY(angle) +
-    * [[http://www.w3schools.com/css/css3_3dtransforms.asp|Transformaciones 3D]] +
-      * matrix3d(n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n) +
-      * translate3d(x,y,z) +
-      * translateX(x) +
-      * translateY(y) +
-      * translateZ(z) +
-      * scale3d(x,y,z) +
-      * scaleX(x) +
-      * scaleY(y) +
-      * scaleZ(z) +
-      * rotate3d(x,y,z,angle) +
-      * rotateX(angle) +
-      * rotateY(angle) +
-      * rotateZ(angle) +
-      * perspective(n) +
-==== Transiciones ====+
  
-    * [[http://www.w3schools.com/css/css3_transitions.asp|CSS3 Transitions]] +        var element=ev.target; 
-    * [[https://www.kirupa.com/html5/css3_animations_vs_transitions.htm|CSS3: Animations vs. Transitions]] +        var data = ev.dataTransfer.getData("text/plain");
-    * [[https://cssanimation.rocks/es/transition-vs-animation/|Transiciones vs. Animaciones]]+
  
-==== Animaciones ==== 
  
-    * [[http://www.w3schools.com/css/css3_animations.asp|CSS3 Animations]] +        element.innerText=data; 
-      * @keyframes +      } 
-      * animation-name: Nombre  +       
-      * animation-duration: Duración en segundos. +      function onDragOver(ev) 
-      * animation-delay: Retraso en empezar +        ev.preventDefault()
-      * animation-iteration-count: Nª de repeticiones +            
-      * animation-direction: Si va desde el principio al final o al revés, etc. {normal,reverse,alternate,alternate-reverse} +    </script> 
-      * animation-timing-function: El progreso{ease,linear,ease-in,ease-out,ease-in-out,cubic-bezier(n,n,n,n)} +  </head> 
-        * [[https://cubic-bezier.com/|cubic-bezier]]: Genera tu propia función +  <body>
-      * animation-fill-mode: Que CSS se aplica cuando acaba. {none,forwards,backwards,both}   +
-      * animation: La unión de todas las de antes+
  
-    * [[https://www.w3schools.com/jsref/met_win_settimeout.asp|Timeout]]+    <p>Arrastra aquí la pieza a reparar:</p> 
 +    <p class="destino" ondrop="onDrop(event)" ondragover="onDragOver(event)"></p>
  
-    * Ejemplos: +    <ul> 
-      * {{animacionescss.zip|Ejemplo de animación de alas de mariposa}} +      <li draggable="true" ondragstart="onDragStart(event)">Disco duro</li> 
-      * [[https://codepen.io/YusukeNakaya/full/YLPVER|404]] +      <li draggable="true" ondragstart="onDragStart(event)">Procesador</li>   
-      * [[https://codepen.io/Wujek_Greg/pen/KRXYpg|Reloj]] +      <li draggable="true" ondragstart="onDragStart(event)">Memoria RAM</li> 
-      * [[https://codepen.io/YusukeNakaya/pen/rJxevm|Escaleras]] +      <li draggable="true" ondragstart="onDragStart(event)">Placa base</li> 
-      * [[https://codepen.io/miocene/pen/WJRXVg|Cuadros animados]]+    </ul>
  
 +  </body>
 +</html>
 +</sxh>
  
-===== Material complementario ===== +  * Atributo ''draggable="true"'' : Permite que ese elemento sea //arrastable// 
-  * Drag & Drop +  * Evento ''ondragstart'': Función que se ejecuta al empezar a arrastrar el elemento. 
-    * [[https://bevacqua.github.io/dragula/|Dragula: Alto nivel]] +    * ''ev.target''Obtenemos el elemento que se está arrastrando
-    * [[http://interactjs.io/|interact.jsBajo nivel]] +    * ''ev.dataTransfer.setData("text", data);''Guardamos la información de lo que se está arrastrando. 
-  * Animaciones +  * Evento ''ondragover'': Se ejecuta cuando hay algo arrastrándose sobre él , pero aun no se ha soltado. Se usa para indicar si se puede soltar sobre él. En caso de que si se pueda, habrá que llamar a la función ''ev.preventDefault();'' 
-    [[https://www.sitepoint.com/top-9-animation-libraries-use-2016/|Top 9 Animation Libraries to Use in 2016]] +  Evento ''ondrop''Se ejecuta cuando se ha soltado el elemento sobre él
-    * [[https://daneden.github.io/animate.css/|Animate.css]] +    * ''ev.target''Elemento donde se ha soltado 
-    * [[https://minimamente.com/example/magic_animations/|Magic Animations]]+    * ''ev.dataTransfer.getData("text")''Obtenemos la información de lo que se estaba arrastrando.
  
-===== Ejercicios =====+===== dataTransfer ===== 
 +El objeto ''dataTransfer'' es donde se almacena lo que que se está arrastrando.
  
  
-==== Ejercicio 1 ==== +Para guardar el dato, se usa: 
-Crea un programa en JavaScript+HTML+CSS que un rectángulo rojo vaya modificando el ancho desde lo 100px los 600px que tarde 4 segundos+  ev.dataTransfer.setData("text/plain", data); 
 +Para obtener el dato, se usa:  
 +  var data ev.dataTransfer.getData("text/plain"); 
 +   
 +   
 +Sin embargo , podemos pensar que no es muy útil ya que se podría usar directamente una variable de JavaScript. En ese caso vamos usar una variable global llamada ''data'' el código quedaría así:
  
 +<sxh javascript>
 +  var dragData="";
  
-==== Ejercicio 2 ==== +  function onDragOver(ev) { 
-Crea un programa en JavaScript+HTML+CSS que el tamaño de un texto pase de los 12px iniciales a los 30px finales y que tarde 3 segundos.+ ev.preventDefault(); 
 +  }
  
-==== Ejercicio 3 ==== +  function onDragStart(ev) { 
-Modifica el anterior ejercicio para que la animación solo se haga al pulsar un botón+ var element=ev.target; 
 + dragData=element.innerText; 
 +  }
  
-==== Ejercicio 4 ==== +  function onDrop(ev) { 
-Modifica el anterior ejercicio para que se haga grande al pulsar el botón pero si lo vuelves a pulsar que se haga otra vez pequeño+ ev.preventDefault();
  
 + var element=ev.target;
  
-==== Ejercicio 5 ==== + element.innerText=dragData; 
-Crea un programa en JavaScript+HTML+CSS de un puzzle. +  } 
-En la parte superior estarán las 4 imágenes del puzzle sin colocar. +</sxh>
-En la parte imferior, habrá un cuadro con los 4 huecos a colocar.+
  
-Separa todo lo que puedas la parte visual de la lógica del puzzle 
  
-Para ello crea una clase Puzzle que no contenga nada de parte visual.+¿cual es la diferencia entre usar ''dataTransfer''una variable de JavaScript ''dragData''?. Pues que usando ''dataTransfer'' podemos hacer el Drag & Drop entre aplicaciones y con la variable no podemos hacer eso.
  
-==== Ejercicio 6 ====+Sin embargo la ventaja de usar la variable es que podemos almacenar mas cosas que un simple texto.
  
-{{ :clase:modulos:daw:dif:vuelos.png?600 |}} 
  
  
 +===== Ejercicios =====
 +
 +==== Ejercicio 1 ====
 +En base al ejemplo del tema, prueba a arrastrar el texto a otra aplicación como el Bloc de Notas de Windows. ¿Ha funcionado?
 +
 +Ahora modifica el ejemplo y en vez de usar ''dataTransfer'' usa una variable de JavaScript y  vuelve a arrastrar el texto a otra aplicación como el Bloc de Notas de Windows. ¿Ha funcionado?. Explica que ha ocurrido
 +
 +
 +==== Ejercicio 2 ====
 +En base al ejemplo del tema, modifica que en vez de guardarse el texto del elemento, se guarde un JSON similar al siguiente:
 +<sxh json>
 +{
 +  color: "#FF0000",
 +  texto: "Disco duro"
 +}
 +</sxh>
 +
 +Y al soltar que en el elemento ''<p>'', se muestre la propiedad ''texto'' del JSON y que sea del colo de la propiedad ''color'' del JSON.
 +
 +
 +==== Ejercicio 3 ====
 +Haz un programa similar al siguiente:
 +
 +{{:clase:daw:diw:2eval:vuelos.png|}}
 +
 +De forma que:
   * Al arrastrar el icono de "Avión despegando" sobre el texto de "Nº de Vuelos Despegados" se incrementará en 1 el valor   * Al arrastrar el icono de "Avión despegando" sobre el texto de "Nº de Vuelos Despegados" se incrementará en 1 el valor
   * Al arrastrar el icono de "Avión aterrizando" sobre el texto de "Nº de Vuelos Aterrizados" se incrementará en 1 el valor   * Al arrastrar el icono de "Avión aterrizando" sobre el texto de "Nº de Vuelos Aterrizados" se incrementará en 1 el valor
Línea 123: Línea 156:
   * Al arrastrar el icono de "Nº de Vuelos Aterrizados" sobre el icono de "La papelera" se decrementará en 1 el valor   * Al arrastrar el icono de "Nº de Vuelos Aterrizados" sobre el icono de "La papelera" se decrementará en 1 el valor
  
-{{:clase:modulos:daw:dif:drag_drop_vuelos.html.zip|Solución}} +Ademas, cambiar todo el aspecto visual para que "quede bonito"Vamos a suponer que la página se usa en la torre de control de una aeropuerto como Castellón y se usa para ir controlando cuantos aviones van despegando y aterrizando.
- +
  
  
  
clase/daw/diw/2eval/tema07.1606996432.txt.gz · Última modificación: 2020/12/03 12:53 por admin