Un carrusel sencillo. Cómo crear un carrusel usando sólo HTML y CSS. Bloque dinámico “Opiniones de clientes”

Hay dos verdades elementales de las que parte la cuestión actual. Lo primero que debes hacer es decirte a ti mismo “¡vamos!” y elaborar un plan de negocio.
Lo cual determinaría la dirección del desarrollo, los costos y ganancias esperados, tomaría en cuenta los riesgos y los ingresos adicionales. Pero si con el primero es más fácil, cogimos el sable de nuestro abuelo de la pared y salimos por el jardín a picar coles. Con el segundo, todo es muy complicado: a veces el swing es por un rublo, pero el efecto es por un centavo.

Al final resulta que no hay ningún plan y ni siquiera hay idea de qué hacer ahora y mañana. Vale la pena tener en cuenta que existen dos tipos de planes de negocios: uno simple, que se elabora más para usted, y uno complejo para inversiones y préstamos bancarios. Pero al compilar cualquiera de ellos, surge una comprensión de lo que mi ser querido necesita, de lo que puedo hacer frente y de dónde tendré que buscar ayuda o incluso abandonar alguna parte de la dirección de mi actividad. No molestaré a nadie con planes de negocios complejos todavía; afortunadamente, existen recursos avanzados para esto en gestión corporativa, y allí se puede obtener información más completa, aunque a veces por una miseria.

Pero nosotros en Internet, negocio desde casa y qué tiempo dedicarle, qué esfuerzo y con qué seriedad tomarlo. Puede ayudar a desarrollar gastos de venta simples, tal vez incluso pronosticar ganancias y pérdidas.

– En base a esto, es fácil planificar cómo administrar sus recursos y cómo utilizar los fondos operativos.

Por definir, se trata de un plan de desarrollo elemental en el que sólo hay algunos elementos de una startup: objetivos, formas de alcanzarlos, análisis ambiental y análisis de equilibrio. Esto le da, aunque sea brevemente, una comprensión de su propio negocio.
Y, sin embargo, no todas las startups son tan sencillas como nos gustaría.

Algunos de ellos requieren inversión, un pensamiento más detallado y una planificación correspondiente, lo que no se puede hacer sin un trabajo analítico suficiente. Me ofrecieron de alguna manera rehacer un antiguo proyecto de inversión que ya estaba en funcionamiento en uno nuevo, pero de la manera habitual: reescribir y corregir ligeramente los números en el estudio de viabilidad (estudio de viabilidad) para obtener un préstamo para promoción. Pero aunque en los bancos hay empleados, a veces también tienen cerebro: podrían darse cuenta fácilmente de que esto es medio falso sin investigar el proyecto de inversión en cuestión. Las cuestiones que se nos plantean son de cierta complejidad y requieren un enfoque algo detallado.
En cualquier caso, incluso un simple plan de inicio debe contener información suficiente para atraer socios y patrocinadores, descifrando el enfoque del recurso de Internet.
Puede ganar dinero en línea utilizando un recurso de varias maneras y no debe mezclarlas, porque una dirección interferirá con la otra: un equipo de plomeros difícilmente podrá combinar el trabajo en un supermercado.
Aquí hay una plantilla aproximada en la que podría consistir un plan de negocios de inicio:
Planificar el cronograma de esencia del tema
1 Resumen Lo más importante
1.1 Metas
1.2 Formas de lograrlo
2 Lanzamiento del resumen de recursos
3 Descripción de la actividad
4.1 Segmentación del mercado
4.2 Estrategia del segmento de mercado objetivo
4.3 Detalles del segmento
5 Implementación y resumen de la estrategia
5.1 Ventajas competitivas
5.2 Estrategia competitiva de previsión de ventas
6 Gestión de currículum
7 plan financiero

7.1 Determinación del punto de equilibrio

  • Algunas cosas de un simple plan de negocios pueden pasar por alto al propietario, pero cada empresa tiene un plan. Cualquiera puede beneficiarse de la creación de documentos siempre que las ideas estén escritas porque el proceso de preparación de un esquema es gratificante y valioso.
  • Una vez que otra persona está interesada en los parámetros necesarios de un plan ya elaborado, es fundamental transmitirle una comprensión de los objetivos, la estrategia y la implementación detallada.
  • Tan pronto como alguien del entorno externo esté interesado en las características de la startup, aunque esto no estaba previsto al principio, entonces debes proporcionar información adicional. Cuando el plan es sólo para uso interno, no se puede describir el historial de inicio, las características del recurso, por ejemplo. Cíñete a temas que creen valor agregado; esto, en última instancia, te ayudará a lograr tu objetivo. Cuando atrae personas, socios, patrocinadores, debe proporcionar información más detallada. información de fondo como parte de este plan.
  • A los efectos de discutir las perspectivas, basta con obtener plan inicial. Intente describir sus objetivos, formas de lograrlos, mercado objetivo, ventajas competitivas y estrategias básicas. ¿Qué tan bien se superpone con la idea de negocio?
  • Incluso si eres capaz de hacer mentalmente análisis financieros relacionados con las actividades de tu startup, es mucho más fácil si utilizas algunas herramientas que pueden darte una secuencia clara de acciones y sumarlas y restarlas automáticamente.
  • Aquí es donde ayuda un plan. ¿Conoces realmente el mercado en el que has elegido un nicho? Buen análisis

El mercado puede ayudarle a ver oportunidades que tal vez no sean obvias. Comprenda por qué las personas recurren a otros y visitan sus recursos.

¿Cuáles son las necesidades de los visitantes? ¿Cuántos de ellos hay como clientes potenciales? De esta manera podrás decidir si tu plan de negocio es muy importante, incluso en la fase inicial de la puesta en marcha, e incluso si puedes tenerlo en mente. para negocios, sueña con convertirla en un “unicornio” que cambiará el mundo. Pero según las estadísticas, sólo 1 de cada 10 proyectos sale adelante, el resto fracasa. ¿Por qué sucede esto y qué se puede hacer al inicio del proyecto para minimizar el riesgo de fracaso? - dijo Vladimir Lysikov, analista de inversiones de Capital Times.

— En la práctica de la banca de inversión, tenemos que lidiar con ideas y proyectos generados por emprendedores. A menudo piensan que podrían llegar a tecnología única o solución. Y cuanto más cultivan su invento, más se enamoran de él y, a veces, pierden el sentido de la realidad en el que esta solución debería funcionar y generar ganancias.

Vladímir Lisikov
Analista de inversiones en Capital Times

A menudo, estas ideas ya han invertido una enorme cantidad de dinero, tiempo y energía en desarrollar y promover su solución en un mercado que es esencialmente inexistente. Esto sucede cuando un emprendedor guarda celosamente su territorio, evitando la hipótesis de que va por el camino equivocado.

Hace apenas 30 años, el ciclo de desarrollo de una nueva solución duraba entre 5, 10 y 15 años, e incluso en caso de un error de diseño, los usuarios no tenían más remedio que utilizar el producto propuesto.

Ahora el ciclo de desarrollo y lanzamiento se ha reducido a varios meses.

Déjame darte un ejemplo. Versión software 1.0 se considera etapa clave desarrollo. Como regla general, es desde el momento en que se lanza la primera versión que el producto se considera listo y puede venderse. a un amplio círculo usuarios. Wargaming presentó la versión de World of tanks 1.0 recién el 20 de marzo de 2018, aunque el lanzamiento online tuvo lugar en 2011. Desde entonces, el desarrollador ha lanzado 45 actualizaciones de clientes, configuración completa, adiciones, mejoras. Al mismo tiempo, la monetización del proyecto comenzó en la versión beta del producto.

Si Wargaming hubiera pasado más de 7 años desarrollando el producto internamente, sin recibir comentarios de los usuarios que participan en las batallas todos los días, el mercado habría recibido un producto que no cumplió con las expectativas de los jugadores y difícilmente habría podido llegar a su audiencia. .

Por qué fracasan las startups

En mi opinión, hay tres razones principales para el fracaso de una startup:

1. El amor ciego de los fundadores por su proyecto.

2. Incapacidad para concentrarse en el problema que se supone que debe resolver el proyecto.

3. Falta de voluntad para considerar cuidadosamente la viabilidad de las ideas.

Y si prácticamente no se puede hacer nada con respecto al amor del empresario por su creación, entonces las otras razones (concentración en el problema y un estudio exhaustivo de la viabilidad de la idea) no son tan difíciles de descubrir.

Tradicionalmente, las empresas utilizan herramientas como la modelización económica y el desarrollo de una hoja de ruta detallada en forma de plan de negocios para evaluar la viabilidad. Pero para las empresas emergentes, esta forma de valoración no se justifica ni desde la perspectiva del costo ni del valor. Y el plan de negocios en sí no es tanto un reflejo de la realidad como un reflejo de las "fantasías y expectativas" del autor. Por esta razón, incluso un plan de negocios perfectamente equilibrado sobre el papel y con excelentes indicadores puede no ser implementado.

Gran plaza en lugar de un plan de negocios.

Una alternativa al plan de negocios tradicional en este caso puede ser la elaboración de una especie de "captura de pantalla" de los conceptos principales del negocio futuro en forma de un concepto desarrollado utilizando la tecnología Business Model Canvas o Lean Canvas.


Ilustración del libro Business Model Generation de Alexander Osterwalder, Yves Pigneur

Tecnología de modelado de negocios Business Model Canvas (autores: Alexander Osterwalder, Yves Pigneur) es una plantilla para una estructura estable de cualquier negocio, que consta de 9 elementos principales.

1. Consumidores.

En este bloque, debe determinar qué grupos de personas y organizaciones espera atraer y servir. Para satisfacer mejor las necesidades de los clientes, es recomendable dividirlos en grupos según sus necesidades, características de comportamiento u otras características.

2. Productos (propuesta de valor).

Aquí debe describir por qué los clientes deberían elegir su producto en lugar del producto de sus competidores.

3. Relaciones con los clientes. En este bloque deberás definir claramente qué tipo de relación quieres establecer con los consumidores. Estos pueden variar desde personales hasta automatizados.

4. Canales de venta. Se trata de un sistema de interacción entre la empresa y el consumidor, el punto de contacto entre el vendedor y el cliente. 5. Ingresos.

7. Socios clave.

Red de proveedores y socios y tipos de relaciones con ellos, como cooperación estratégica o co-competencia. 8. Recursos clave. Los recursos clave pueden ser materiales, financieros, intelectuales o humanos (personal). La empresa puede ser propietaria de estos recursos, alquilarlos o recibirlos de socios clave. Diferentes tipos

Los modelos de negocio requieren diferentes recursos. Un fabricante de chips necesita una capacidad de producción intensiva en capital, pero el diseñador de esos chips necesita recursos humanos.

9. Costos.

En este bloque es necesario describir los costos más significativos del proyecto y sus tipologías. La tecnología descrita le permite combinar y ver relaciones internas y cadenas semánticas en el proceso de generación de ganancias. Por ejemplo, qué herramientas (recursos) se deben utilizar para llevar a cabo actividades para producir un producto, cuánto cuestan estos recursos y cómo se pueden abaratar. Esto requiere estudiar las fortalezas y debilidades Según los bloques clave del modelo, evaluar y adaptar la solución a los consumidores y la influencia de los cambios.

ambiente externo

y, lo más importante, garantizar que todos los bloques del modelo sean coherentes entre sí.

Como resultado, obtenemos una idea de negocio claramente estructurada en una sola página. Sin embargo, el Business Model Canvas puede ser difícil de usar para las startups, ya que algunas células no tienen nada en qué encajar (el proyecto puede no tener socios o los canales de ventas futuros no están del todo claros).


El empresario Ash Morya replanteó la tecnología Business Model Canvas y propuso su propia tecnología: Lean Canvas.

Haga clic en la imagen para ampliarla

Ilustración de leanstack.com

Los bloques deben completarse en la secuencia indicada en el diagrama.

1. Determine el público objetivo: quién es el cliente.

4. Descripción de la solución. Se debe hacer énfasis en capacidades clave

su solución, pero teniendo en cuenta la descripción del mecanismo para resolver estos problemas. 5. Oferta única. En este bloque es importante formular en

forma corta

, máximo 140 caracteres, la singularidad de nuestro producto, la diferencia entre el producto y las soluciones competitivas.

6. Canales de venta. Aquí es necesario determinar las formas en que el cliente conocerá el producto.

7. Métricas clave del proyecto. En este bloque conviene anotar los criterios con los que vas a seguir el proyecto: cómo será el producto en un horizonte de 3 años, qué resultado financiero generará el producto, tasas de crecimiento. 8. Estructura de costos.

Los costos deben dividirse en dos categorías: costos iniciales del producto y costos recurrentes de desarrollo. 9. Ventaja oculta. En este bloque, es necesario prever inmediatamente medidas de protección del producto, por ejemplo, una enorme.

base de clientes

, patentes, licencias, marca, alto costo de entrada.

La mayoría de los emprendedores emergentes, cuando intentan por primera vez trazar un esquema de su futuro negocio en cualquier forma, ni siquiera pueden completar aproximadamente todos los bloques. Así, en nuestra práctica, los errores más frecuentes y críticos ocurren en el análisis.

público objetivo

Déjame darte un ejemplo. Un grupo de empresarios de Uzbekistán desarrolló un portal de Internet que recopila información actualizada sobre la disponibilidad y el costo de los medicamentos en las farmacias. El proyecto se lanzó, pero contrariamente a las expectativas de los fundadores, no pudo generar ganancias solo porque las farmacias mismas fueron identificadas como el público objetivo, y no los usuarios del sitio, la gente común y corriente.

Como resumen

En cualquier caso, dibujar un lienzo ayuda al fundador a determinar el objetivo, las perspectivas del negocio, sus riesgos y los principales parámetros financieros de desarrollo. Por supuesto, elaborar un modelo de negocio para una startup utilizando las tecnologías descritas no es una panacea ni una garantía de éxito, pero los fundadores e inversores, al observar los bloques completados, comprenden instantáneamente tanto las perspectivas del proyecto como el grado de elaboración del mismo. la idea de negocio. A veces tengo que resolver problemas relacionados con el frontend, a pesar de que no me gusta :) fue que el resultado debería ser un script JS, que, a través de servicio de terceros Me conectaría al sitio. En consecuencia, los carruseles ya preparados en JavaScript ya no eran necesarios, porque Para integrarlos, era necesario agregar una conexión de biblioteca al código HTML del sitio a través de una etiqueta de script y copiar los archivos al servidor o extraerlos a través de cdn, pero esto nuevamente requeriría editar el código del recurso.

Cómo hacer un control deslizante de JavaScript: el comienzo

Hoy creo que todos los que se encontraron en una situación similar comenzaron buscando desarrollos existentes, porque... Cuando la tarea de hacer un carrusel JS está dentro del alcance del trabajo, siempre debe realizarse lo más rápido posible. Y en tales condiciones, nadie le permitirá sentarse e inventar sus propias bicicletas.

A los clientes siempre no les importa cómo está escrito el código, cuál es su arquitectura, ¡lo principal es ver el resultado!

Como resultado, como comprenderá, antes de escribir un control deslizante en JavaScript sin jQuery, decidí buscar uno ya hecho y modificarlo para adaptarlo a mis necesidades. ¿Por qué no jQuery? Sí, porque en el recurso de destino donde planeé conectar mi control deslizante a través del servicio, la llamada jQuery en el código se ubicó más tarde que el script conectado por el servicio. Por lo tanto, las construcciones jQuery en mi código simplemente no se percibieron.

Como base, tomé este control deslizante de imágenes de JavaScript: https://codepen.io/gabrieleromanato/pen/pIfoD.

Decidí parar ahí, porque... su código JS fue escrito utilizando principios de programación orientada a objetos y sus clases se basan en prototipos, no en funciones banales.

Para ser honesto, no entiendo ni reconozco profundamente la exageración actual en torno a JavaScript usando programación orientada a objetos, marcos y otras cosas arquitectónicas en un lenguaje que originalmente estaba destinado a ser un lenguaje de secuencias de comandos dinámico simple. Al igual que el propio JS, francamente no me gusta con su vinagreta sintáctica, que permite escribir las mismas construcciones de varias maneras.

Pero, lamentablemente, en mundo moderno Pocas personas comparten mis posiciones, porque... este lenguaje se está desarrollando a un ritmo vertiginoso e incluso intenta conquistar las mentes de los desarrolladores backend que utilizan Node.js como alternativa a Java, PHP, C#, Ruby y otros monstruos.

Como resultado, para no quedarse sin trabajo, es necesario descubrir JavaScript en silencio. Y en la implementación del control deslizante elegí, JavaScript puro Conocí algo que, como comprenderás, desprecio en idioma dado. Por eso lo elegí, para que hubiera al menos alguna razón para trabajar y comprender la programación orientada a objetos de JavaScript y las clases prototipo; de lo contrario, nunca los habría tocado voluntariamente en mi vida :)

Según el código que encontré, necesitaba desarrollar un control deslizante en JS puro en una ventana emergente (esto también se llama ventana emergente, ventana emergente, etc.), que tendría botones para cambiar de diapositiva e indicadores en los que se puede hacer clic del actual. deslizar. También fue necesario hacer un botón para cerrar esta ventana.

Esto es con lo que terminé.

Hacer una biblioteca JS deslizante

Primero, decidí implementar todo sabiamente y crear un control deslizante de JavaScript para el sitio en forma de biblioteca, conectado al sitio mediante un único script, en el que se llamarán los componentes del control deslizante, divididos en subdirectorios. Decidí llamarlo popupSlider.js en honor a su propósito original.

Su código se puede encontrar en GitHub en esta dirección: https://github.com/Pashaster12/popupSlider.js

La estructura de la biblioteca es la siguiente:

La carpeta de diapositivas es para imágenes de diapositivas. Controles contiene imágenes de controles de carrusel JS (botones para cerrar el control deslizante y cambiar de diapositiva). Y en los activos hay elementos estáticos del control deslizante JS: marcado HTML y un archivo con estilos CSS.

Bueno, el archivo popupSlider.js es el corazón de la biblioteca en sí, en el que se escriben las acciones JavaScript del carrusel y se establece una conexión con otros archivos. Es éste el que conectaremos en el sitio y llamará a los demás.

Decidí comenzar con el marcado HTML de nuestro carrusel de imágenes JS, que en mi caso se ve así:

Texto 1 Texto 2 Texto 3

Para diseñar el control deslizante en JavaScript como una ventana emergente, utilicé los siguientes estilos:

#slider (margen: automático; ancho: 600px! Importante; desbordamiento: oculto;) #slider-wrapper (ancho: 9999px; alto: 343px; posición: relativa; transición: izquierda 400ms lineal;) .slide (float: izquierda; ancho : 600px; posición: desbordamiento relativo: oculto; .caption (ancho: 600px; alto: 110px; alto de línea: 1,5; tamaño de fuente: 15px; peso de fuente: 300; alineación de texto: centro; color: # 000; display:table; ) .caption-container ( display: table-cell; vertical-align: middle; padding: 0 20px; ) #slider-nav ( posición: absoluta; abajo: -36px; text-align: center; izquierda: 50%; transformar: traducirX(-50%); ) #slider-nav a (ancho: 8px; alto: 8px; decoración de texto: ninguno; color: #000; pantalla: bloque en línea; radio de borde: 50% ; margen: 0 5px; color de fondo: #fafafa; ) #slider-nav a.current (color de fondo: #337ab7; ) .controles horizontales (posición: absoluta; visualización: bloque en línea; ancho: 12px; alto : 20px; superior: 50%; margen superior: -10px;

izquierda: -40px; ) #prev:desplazar el cursor (fondo: url(../controls/arrow_left_active.png); ) #siguiente (fondo: url(../controls/arrow_right_inactive.png); derecha: -40px; ) #siguiente:desplazar el cursor (fondo : url(../controls/arrow_right_active.png); #cq-popup (ancho: 600px; índice z: 23; izquierda: calc(50%); arriba: calc(50%); posición: fija! Importante; repetición de fondo: no repetición; color de fondo: #fff; familia de fuentes: "Roboto", "Segoe UI", "Helvetica", "Georgia", "Calibri", "Verdana"; %, -50%) escala(1); #cq-popup .header ( pantalla: bloque en línea; tamaño de fuente: 17px; peso de fuente: 500; ) #cq-popup > div ( ancho: 500px; fuente- tamaño: 22px; altura de línea: 36px; ) #cq-popup-btclose (decoración de texto: ninguna; posición: absoluta; derecha: -40px; arriba: 0; fondo: url(. ./controls/btn_delete_inactive.png) ; alto: 16px; ancho: 16px; ) #cq-popup-btclose:hover (fondo: url(../controls/btn_delete_active.png); ) #cq-popup-bg (posición: fija; ancho: 100%;

altura: 100%; fondo: rgba(51,51,51,0.8); Moví popupSlider.html y popupSlider.css a archivos separados, que se encuentran en el directorio de activos de la biblioteca deslizante de JavaScript. Hice esto a propósito para que al usar este código, los usuarios pudieran ajustar fácilmente el marcado y el diseño sin perder el tiempo en el código JS, donde lo que tendría que escribirse tendría que escribirse directamente.

Además, a muchas personas todavía les gusta minimizar JS para acelerar la carga del sitio. Así que personaliza esta decisión En estas condiciones sería muy difícil.

Al final, decidí simplemente conectarme. archivos listos en el archivo de la biblioteca principal popupSlider.js, que para mi tarea tomó la siguiente forma:

Función Slider(elemento) ( this.loadStatic(); this.el = document.querySelector(elemento); this.init(); ) Slider.prototype = ( init: function () ( this.links = this.el.querySelectorAll ("#slider-nav a"); this.wrapper = this.el.querySelector("#slider-wrapper"); el.querySelector("#prev"); navegar: función ( ) ( var self = esto; para (var i = 0; i< this.links.length; ++i) { var link = this.links[i]; link.addEventListener("click", function (e) { self.slide(this); }); } self.prevBtn.style.display = "none"; self.nextBtn.addEventListener("click", function (e) { var currentSlideNumber = document.querySelector("#slider-nav a.current").getAttribute("data-slide"); var nextSlide = document.querySelector(""); nextSlide.click(); }, false); self.prevBtn.addEventListener("click", function (e) { var currentSlideNumber = document.querySelector("#slider-nav a.current").getAttribute("data-slide"); var prevSlide = document.querySelector(""); prevSlide.click(); }, false); self.close(); }, slide: function (element) { this.setCurrentLink(element); var index = parseInt(element.getAttribute("data-slide"), 10) + 1; var currentSlide = this.el.querySelector(".slide:nth-child(" + index + ")"); this.wrapper.style.left = "-" + currentSlide.offsetLeft + "px"; if (index < this.links.length) this.nextBtn.style.display = "block"; else if (index == this.links.length) this.nextBtn.style.display = "none"; if (index >1) this.prevBtn.style.display = "bloquear";< a.length; ++j) { var cur = a[j]; if (cur !== link) { cur.className = ""; } } }, loadStatic: function () { var self = this; var link = document.createElement("link"); link.rel = "stylesheet"; link.href = "assets/popupSlider.css"; document.head.appendChild(link); var sliderHTML = ""; var xhr = new XMLHttpRequest(); xhr.open("GET", "assets/popupSlider.html", false); xhr.send(); if (xhr.status != 200) { alert("Can not load the popupSlider.html. Got the error " + xhr.status + ": " + xhr.statusText); } else { sliderHTML = xhr.responseText; } var div = document.createElement("div"); div.innerHTML = sliderHTML; document.body.appendChild(div); }, close: function () { document.getElementById("cq-popup-btclose").onclick = function () { document.getElementById("cq-popup-bg").remove(); document.getElementById("cq-popup").remove(); } } };

de lo contrario si (índice == 1) this.prevBtn.style.display = "none";

), setCurrentLink: función (enlace) ( var parent = link.parentNode; var a = parent.querySelectorAll("a"); link.className = "current"; this.currentElement = link; for (var j = 0; j

Algunos comentarios sobre el código anterior. El contenido del archivo popupSlider.js es una única clase JavaScript Slider que, como en PHP, contiene un constructor y métodos de clase. Sólo en JS, la definición de un constructor, a diferencia de PHP, es obligatoria.

El constructor se define utilizando la siguiente construcción:

Control deslizante de función (elemento) (//código constructor)

Dentro del constructor se deben especificar las acciones que se realizarán al crear un objeto de clase.

Los métodos de clase se ubicarán dentro del prototipo y estarán disponibles para todas las instancias de esta clase de JavaScript. El prototipo JS en mi caso se describe mediante el siguiente diseño:

Slider.prototype = (//métodos)

Serán convocados fuera del cuerpo de la clase de la siguiente manera:

Control deslizante var = nuevo control deslizante(); control deslizante.class_method();

Y dentro del código de la clase, está disponible el siguiente método: This.class_method(); Lo principal es no olvidar que en

Var self = esto; self.class_method(); //para acceder a un método ubicado un nivel superior al código del método descrito

Parece que hablé de todos los matices de escribir código. Ahora unas palabras sobre los métodos de nuestra clase JavaScript, que contienen descripciones de las acciones JS del carrusel de imágenes.

cargarEstático()

El primer método llamado al crear una instancia de una clase en el constructor. Responsable de agregar etiquetas deslizantes y un archivo con estilos al código HTML de la página del sitio web.

Primero, se crea una nueva etiqueta de enlace en la memoria usando la función JavaScript document.createElement() y se le asignan los valores de todos los atributos necesarios, incluida la ruta al archivo CSS con los estilos del control deslizante JS. Y finalmente se añade a páginas HTML estamos usando método javascript appendChild() hasta el final secciones de cabeza, donde deberían estar los estilos.

A continuación hacemos lo mismo para el archivo con marcado HTML nuestro control deslizante en JavaScript puro. Aquí solo hay un pequeño matiz: no puedes simplemente incluir un archivo HTML dentro del mismo, como hicimos con un archivo CSS. Hay bibliotecas especiales para esto, por ejemplo, para incluir HTML en HTML, la biblioteca de w3.org es excelente: https://www.w3schools.com/howto/howto_html_include.asp

Pero entonces tendría que incluirse en la biblioteca del control deslizante o pedir a los usuarios que lo instalen ellos mismos. Pero todo esto no es óptimo, porque... Requiere muchos movimientos corporales y ralentiza la velocidad de carga del sitio debido a scripts adicionales.

Como resultado, decidí recibir el contenido. archivo html adentro código javascript y cargarlo en uno nuevo elemento div, creado en la memoria, como hice antes para incluir un archivo CSS en JavaScript. El elemento generado se incluye al final de la sección del cuerpo del código HTML de la página del sitio.

Si desea insertar un div con marcado deslizante no solo al final del cuerpo, sino en un contenedor específico, puede hacerlo con el siguiente código:

Var div = document.createElement("div"); div.innerHTML = control deslizanteHTML; documento.body.appendChild(div);

Ingrese lo siguiente, especificando el identificador deseado del contenedor de destino (en mi caso, el control deslizante HTML JS se ubicará en el elemento con id popupSlider):

Var objetivo = document.querySelector("#popupSlider"); target.innerHTML = sliderHTML;

El método, que se llama en el constructor después de loadStatic(), es necesario para inicializar las propiedades de clase correspondientes a las principales. elementos HTML, al que accederemos en el siguiente código.

Al final, se llama al método navegar().

navegar por()
En este método, las acciones que ocurren al hacer clic en los botones del interruptor deslizante y los elementos de navegación ubicados debajo del control deslizante se indican en forma de círculos.

Para mayor comodidad, moví el código JavaScript para cambiar diapositivas a un método slide() separado, pero en este simplemente lo adjunto al evento de clic para cada botón redondo en el bucle.

Cuando haces clic en los botones “diapositiva anterior” / “siguiente diapositiva”, como puedes ver, decidí simplemente emular un clic en el círculo correspondiente, determinando el deseado en relación con el actual, que tiene clase CSS actual.

diapositiva (elemento)

El método “responsable de la magia” del propio carrusel de JavaScript, que contiene el código que cambia las posiciones de las diapositivas. Al principio, se llama al método setCurrentLink(), del que hablaremos un poco más adelante.

El objeto del botón de navegación del control deslizante JS en forma de círculo se le pasa como parámetro de entrada.

El interruptor deslizante en sí funciona así:

  • Todos nuestros toboganes están diseñados en forma de bloques del mismo tamaño, uno tras otro. La ventana deslizante es solo parte visible elemento que contiene todas las diapositivas.
  • Determinamos el desplazamiento del borde izquierdo de la diapositiva actual desde el borde izquierdo elemento padre usando la propiedad offsetLeft.
  • Y cambiamos el elemento principal en este valor para que el elemento requerido se muestre en la ventana deslizante.
  • Al final del método, se describe el comportamiento de los botones “diapositiva anterior”/”siguiente diapositiva”, diseñados como flechas izquierda/derecha, respectivamente. Si la diapositiva actual es la primera de toda la lista, entonces el botón para ir a la diapositiva anterior está oculto. Si es lo último, elimine el botón para pasar a la siguiente diapositiva.

    establecerEnlaceActual(enlace)

    Este método de nuestra clase de control deslizante de JavaScript es responsable de resaltar el botón redondo de navegación correspondiente al elemento actual. Aquellos. si tenemos seleccionada la segunda diapositiva, se resaltará el segundo botón.

    El objeto del botón que debe seleccionarse como actual se pasa como parámetro de entrada a la función.

    La lógica para resaltar el elemento actual es simple:

  • Obtenemos el objeto del elemento padre, que en nuestro caso es el contenedor con el identificador slider-nav .
  • Obtenemos todos los elementos de navegación como una serie de enlaces.
  • Seleccionamos el elemento recibido como entrada agregándolo a la clase actual.
  • En el bucle, revisamos todos los elementos de navegación y borramos el valor de clase para todos excepto el actual. Esto es necesario para deseleccionar el elemento que era el actual antes. esta llamada funciones.
  • El último método de la clase, que define la acción al hacer clic en el botón de cierre del control deslizante en forma de cruz. Aquí, de hecho, el código es el más comprensible de todos los contenidos en la clase deslizante JS.

    Al hacer clic en el botón de cerrar, al que se accede mediante su identificador, se eliminan de la página el elemento deslizante y el elemento que lo define. fondo translúcido. A su vez, también se obtienen mediante identificadores únicos.

    El método en sí se llama dentro de la navegación() descrita anteriormente, que contiene todos los escenarios de acciones que tienen lugar en nuestro control deslizante de JavaScript.

    Por cierto, si desea cerrar el control deslizante cuando hace clic fuera de él, simplemente agregue el siguiente código a este método:

    Document.getElementById("cq-popup-bg").onclick = función () ( document.getElementById("cq-popup-bg").remove(); document.getElementById("cq-popup").remove() ;

    Presentación de diapositivas de JavaScript basada en la biblioteca desarrollada

    A veces, en la práctica, es posible que necesites crear un carrusel de desplazamiento JS, que a menudo se denomina presentación de diapositivas. En mi caso, esto no era necesario, pero aun así decidí crear uno basado en el código final de la biblioteca para un caso en el que pudiera ser útil.

    De hecho, la implementación de JavaScript de una presentación de diapositivas difiere ligeramente de un control deslizante normal. La única diferencia es que en una presentación de diapositivas, las diapositivas cambian automáticamente en un intervalo de tiempo determinado, mientras que en el caso de un carrusel JS normal cambian manualmente mediante elementos de navegación.

    Presentación de diapositivas: función (tiempo de espera) ( var sliderCount = this.links.length; var self = this; this.slideCycle = setInterval(function () ( var currentSlideNumber = document.querySelector("#slider-nav a.current").getAttribute ("diapositiva de datos"); var slideId = parseInt(currentSlideNumber, 10) + 1; self.slide(document.querySelector(""));

    Creo que está claro lo que está pasando aquí. para crear este método Copié el código del evento de clic en los botones del interruptor deslizante manual y lo coloqué dentro llamada de javascript función setInterval(), que hace acción especificada después de un período de tiempo determinado.

    El script de acción se pasa como primer argumento como una función anónima, y ​​el intervalo de tiempo se pasa como segundo, lo que decidí hacer como una variable cuyo valor se pasa cuando se llama a slideShow().

    La única modificación que se requirió en el código dentro de setInterval() fue determinar el número de diapositivas y comparar el índice de la diapositiva actual con él para realizar un bucle del cambio automático.

    Bueno, para que este código funcione, se debe llamar al método en sí. Decidí hacer todo esto en el mismo navegador(), que es precisamente una colección de todo tipo de scripts. Hice la llamada al final, pasando como argumento el valor del intervalo de tiempo para cambio automático diapositivas en nuestra presentación de diapositivas JS (elegí 2000 milisegundos o 2 segundos, puedes cambiar este número según sea necesario):

    Self.diapositivas(2000);

    Después de ese cheque trabajo de javascript control deslizante, sin olvidar limpiar su navegador.

    En teoría, todo debería funcionar. Si no, estudia los errores en la consola del navegador y compártelos en los comentarios.

    Como resultado, obtuvimos una presentación de diapositivas JS en la que las diapositivas cambian automáticamente y en círculo, es decir. cuando se llega a la última diapositiva, el espectáculo entra en un nuevo bucle y comienza de nuevo desde el primer elemento.

    Al trabajar con varias bibliotecas En los carruseles de imágenes y reseñas de JS, noté que los desarrolladores utilizan activamente esta práctica, pero con algunas adiciones. En todas las soluciones que he visto, la presentación de diapositivas automática se interrumpe si el usuario realiza un cambio manual. Entonces decidí hacer lo mismo en mi biblioteca.

    Para interrumpir la visualización automática diapositivas de javascript carrusel, decidí usar la función JS estándar clearInterval(), a la que le paso como argumento el identificador del intervalo de tiempo devuelto por la función setInterval() cuando está configurada.

    Como resultado, obtuve el siguiente código, que decidí no escribir como un método separado:

    ClearInterval(self.slideCycle);

    Y lo colocó en los lugares donde se describen las acciones al hacer clic en varios elementos navegación, es decir en lo siguiente:

    Link.addEventListener("clic", función (e) (...)); self.prevBtn.addEventListener("clic", función (e) (...)); self.nextBtn.addEventListener("clic", función (e) (...));

    Es mejor llamar a clearInterval() más cerca del evento de clic en sí, lo principal es antes y no después.

    Integración del control deslizante JavaScript en el sitio web.

    Entonces, nuestro control deslizante en JS puro está listo. Ahora solo queda conectarlo al sitio.

    Para hacer esto, debe seguir los siguientes pasos secuencialmente, que son acciones estándar al integrar cualquier tercero Bibliotecas de JavaScript en absoluto.

    Paso 1. Copiamos los archivos de la biblioteca a nuestro sitio web en un directorio separado.
    Paso 2. Agregue el siguiente código al HTML de las páginas donde deberá mostrarse el control deslizante, colocándolo antes de la etiqueta del cuerpo de cierre:

    Paso 3. Colocamos el siguiente código para llamar al carrusel JS en cualquier archivo JavaScript existente, que se incluye en la página después de conectar el control deslizante:

    Var aControl deslizante = nuevo control deslizante("#control deslizante");

    Como puede ver, este código esencialmente crea un objeto de la clase Slider, que está contenido en popupSlider.js. Es por eso que se debe llamar solo después de conectar el archivo de clase a la página.

    Agregar nuevas diapositivas a un carrusel de JavaScript

    Aquí todo es muy sencillo. Dado que nuestras diapositivas se toman de un directorio separado de la biblioteca de diapositivas, al agregar nuevas imágenes solo tendrá que colocarlas en él. archivos necesarios, habiéndoles dado previamente el mismo tamaño que los demás.

    Y luego en el código del archivo activos/popupSlider.html agregue nuevo bloque en el contenedor con id slider-wrapper:

    Texto

    En principio, puede simplemente copiar uno similar existente y cambiar la ruta al archivo de imagen y el texto de la firma (si es necesario).

    También necesitarás agregar nuevo elemento navegación en forma de círculo, porque en en este momento su adición automática aún no se ha implementado. Para hacer esto, deberá agregar el siguiente código al contenedor con el ID de navegación deslizante, escribiéndolo al final:

    El valor del atributo data-slide debe ser mayor que el valor más grande de los demás elementos. Basta con aumentar la corriente máxima en uno.

    Empaquetar el carrusel JS en un solo script

    Eso es todo, control deslizante activado Listo para JavaScript y conectado. Yo personalmente recomiendo usar esta opción en la práctica, si es que lo necesitas :)

    Para acelerar su funcionamiento, por cierto, puede comprimir aún más componentes estáticos: archivos CSS, HTML y JavaScript. No hice esto y les ofrecí código minimizado, porque ahora hay muchos sistemas de compilación frontend: Gulp, Grunt, Webpack y otros. Y cada uno de ellos tiene sus propios algoritmos para comprimir y conectar archivos.

    Además, los resultados minimizados pueden funcionar de manera diferente en diferentes sistemas operativos. En general, hay muchas razones.

    Y creo que los códigos fuente en sí no son tan pesados ​​como para necesitar este procedimiento. Pero si los necesita, configure la minificación usted mismo, teniendo en cuenta su sistema operativo y su recopilador.

    Como escribí al principio, para resolver la tarea inicialmente asignada, necesitaba obtener un único archivo JS para el uso correcto de mi control deslizante a través de un servicio de terceros en el sitio. Por esta razón, estrictamente hablando, no utilicé bibliotecas de terceros ya preparadas.

    Entonces la opción de un único script de carrusel JavaScript te resultará útil, porque... todo el contenido estará contenido directamente en él, incluido el código HTML/CSS, que en el caso de una biblioteca se almacena en archivos separados.

    El guión en mi caso consta de dos partes. La primera parte contenía el contenido del archivo popupSlider.js, que no presentaré por segunda vez. Insértelo usted mismo, eliminando la descripción del método loadStatic() y su llamada del código de la clase, porque no los necesitaremos.

    La segunda parte de un único script de control deslizante JavaScript para el sitio es un controlador para el evento DOMContentLoaded, que ocurre cuando se carga el contenido de la página.

    Allí agregaremos el código JS del carrusel a la página HTML/CSS y crearemos un objeto de la clase Slider, lo que equivale a activar el propio slider.

    Esquemáticamente el código se ve así:

    /* contenido de popupSlider.js sin describir el método loadStatic() y su llamada */ document.addEventListener("DOMContentLoaded", function())( var str = "\ \ /* codigo css*/ \ /* código html*/ "; var div = document.createElement("div"); div.innerHTML = str; document.body.appendChild(div); var aSlider = new Slider("#slider");

    Como en mi caso la opción de subir archivos al servidor estaba completamente cerrada, tuve que subir los archivos de imagen de los controles del carrusel JavaScript a la nube y en lugar de las rutas a ellos en el código HTML y CSS, escribir los enlaces generados cuando ahorro.

    Si no tiene tales dificultades, entonces no tiene que cambiar nada, pero no olvide copiar los directorios de la biblioteca de controles y diapositivas al servidor y especificar las formas correctas a ellos.

    Control deslizante JS personalizado: perspectivas de desarrollo

    Para ser honesto, no planeo dedicarme al soporte específico y al desarrollo de la solución que creé :) Por el momento, hay un montón de controles deslizantes similares y un carrito pequeño que, a diferencia del mío, tienen su propia historia, son Probados minuciosamente y cuentan con el respaldo de una gran comunidad de usuarios y desarrolladores.

    De alguna manera no es interesante para mí comenzar todo este viaje desde cero solo y crear otra bicicleta, y realmente no tengo tiempo para ello. Pero este control deslizante de JavaScript es una excelente oportunidad para practicar el desarrollo refactorizando su código e implementando nuevas funciones interesantes que quizás aún no existan.

    Entonces, si usted, como yo, necesita una base de código para experimentos y tiene al menos algo adicional tiempo libre- copie el código del control deslizante de JavaScript que describí o únase a los colaboradores en GitHub. El repositorio está abierto y le proporcioné un enlace al principio del artículo.

    Si quieres mejorar tus habilidades de front-end en mi creación, incluso puedo darte una pequeña lista de ediciones y mejoras que el código necesita y que pueden ser de tu interés en términos de su implementación:

  • realice una configuración externa para que pueda configurar cómodamente el control deslizante;
  • permitir incrustar un control deslizante dentro de la página (actualmente está diseñado solo como una ventana emergente);
  • asincrónico cargando HTML código (ahora sincrónico, que muchos navegadores marcan como obsoleto);
  • empaquetar la biblioteca como un paquete, NPM, Bower u otro paquete para que pueda instalarse y administrarse las dependencias mediante administradores de paquetes;
  • hacer que el diseño sea adaptable para usar el carrusel JS en varios dispositivos;
  • Realice cambios de diapositivas según el evento Swipe para usuarios de dispositivos móviles.
  • La lista de ediciones que he proporcionado, por supuesto, no es definitiva y puede complementarse. Escriba sus sugerencias, pensamientos y deseos en los comentarios debajo del artículo y compártalos con sus amigos a través de redes sociales involucrarlos también en el desarrollo.

    Les pido que no juzguen mi código de manera estricta, porque, como ya dije, no me considero un especialista en Frontend y no lo soy. También estoy abierto a todos sus comentarios sobre el estilo de codificación y espero poder aprender algo de usted y usted de mí, es decir. Cumplir con el objetivo principal de desarrollar y soportar productos OpenSource.

    Únase a las comunidades del proyecto, suscríbase a las actualizaciones e incluso puede ayudarme financieramente usando el formulario que se encuentra debajo del artículo, si pude ayudarlo con algo o simplemente le gusta lo que hago :)

    ¡Tengo todo! ¡Mis mejores deseos! 🙂

    PD : si necesita un sitio web o necesita realizar cambios en uno existente, pero no hay tiempo ni ganas para ello, puedo ofrecer mis servicios.

    Más de 5 años de experiencia desarrollo profesional sitios. Trabajando con PHP, OpenCart, WordPress, Laravel, Yii, MySQL, PostgreSQL, JavaScript, React, Angular y otras tecnologías de desarrollo web.

    Experiencia en desarrollo de proyectos. varios niveles: landing pages, webs corporativas, tiendas online, CRM, portales. Incluyendo soporte y desarrollo de proyectos HighLoad. Envía tus solicitudes por correo electrónico [correo electrónico protegido].

    /* Aquí es donde comienza nuestro carrusel. Block.carousel-wrapper está posicionado relativamente, wrapper.carousel-item está posicionado absolutamente. . */ .carousel-wrapper( position:relative; /* Los cuadros con posición absoluta obtienen su alto y ancho de su padre. Los hicimos transparentes de forma predeterminada y luego aparecerán sin problemas al hacer clic en links.arrow-prev y.arrow- siguiente. * / .carousel-item( posición:absoluta; arriba:0; abajo:0; izquierda:0; derecha:0; relleno:25px50px; opacidad:0; transición:all0.5sease-in-out; /* Notado el relleno a la izquierda y a la derecha 50px? De esta manera podemos posicionar nuestros enlaces. ¡Cada uno tendrá 50px de ancho! imagen de fondo para que los enlaces parezcan flechas. Comprueba si has cambiado URL de enlace con la URL original para que sus enlaces no sean solo rectángulos transparentes. */ .arrow( posición:absoluta; arriba:0; pantalla:bloque; ancho:50px; altura:100%; -webkit-tap-highlight-color:rgba(0,0,0,0); fondo:url( "/carousel-arrow-dark.png")50%50%/20pxno-repeat; /* Volvamos nuestra flecha a la izquierda */ &.arrow-prev( left:0; ) /* Y la segunda es la derecha. La misma imagen para la flecha, la giro 180 grados */ &.arrow-next( right:0; -webkit-transform:rotate(180deg); transform:rotate(180deg); ) ) /* Me gusta mucho Me encanta cómo se ven las diapositivas del carrusel. fondo oscuro, y si block.carousel-item tiene una clase "clara", cambiaremos su texto a blanco y usaremos flechas blancas en lugar de grises. Vuelva a verificar que la ruta a la imagen de la flecha sea correcta */ &.light( color:white; .arrow( background:url("/carousel-arrow-light.png")50%50%/20pxno-repeat; ) ) /* Escribamos una consulta de medios para cambiar el tamaño de las flechas en dispositivos con tamaño más pequeño screen.*/ @media(max-width:480px)( .arrow,&.light.arrow( background-size:10px; background-position:10px50%; ) ) ) /* Establecer objetivos para enlaces valor de visualización: ninguno; De esta manera, nos deshacemos de que el navegador salte constantemente a la parte superior del carrusel cada vez que hacemos clic en las flechas. Esta propiedad es efectiva para cualquier elemento cuyo ID comience con "elemento de destino". */ ( display:none; ) /* Arriba, hemos hecho que todas las diapositivas de nuestro carrusel sean transparentes, lo que significa que cuando el carrusel se cargue, obtendremos un cuadro grande y vacío. Cambiemos el valor de transparencia de la primera diapositiva a 1 para su visualización. También configuramos el índice z en 2, colocándolo más alto que las otras diapositivas. */ .item-1( z-index:2; opacity:1; ) /* Pero no queremos que la primera diapositiva siempre tenga un valor de opacidad de opacity: 1; de lo contrario, tendremos que avanzar a través de esta diapositiva mientras rotamos las demás. */ *:target~.item-1( opacity:0; ) /* ..pero si #target-item-1 está enfocado y queremos mostrar la primera diapositiva, selecciónela usando el ícono ~ y configure el transparencia nuevamente a 1:-) */ #target-item-1:target~.item-1( opacity:1; ) /* Si otros target-item-# están enfocados, selecciónelos usando el selector ~, muestre suavemente ellos y colóquelos encima usando el índice z: 3. Aquí puede agregar intervalos adicionales con el identificador del elemento de destino si tiene más de tres. Puede agregar 10 piezas a la vez. */ #target-item-2:target~.item-2,#target-item-3:target~.item-3( z-index:3; opacity:1; ) )



    
    Arriba