1. Web Design
  2. UX/UI
  3. Material Design

Cómo personalizar Contact Form 7 para WordPress: etiquetas flotantes

Scroll to top

Spanish (Español) translation by Ana Paulina Figueroa (you can also view the original English article)

Es posible que hayas visto formularios en los que el texto marcador de posición es animado cuando comienzas a escribir en ese campo de entrada. Este patrón no es nuevo, pero sigue siendo una tendencia popular en el diseño de formularios enfocado a la experiencia de usuario.

Hoy aprenderemos los pasos necesarios para añadir este comportamiento en un formulario creado con Contact Form 7 (CF7), uno de los complementos más populares para formularios de contacto de WordPress disponible.

Lo que vamos a construir

Aquí puedes ver una demostración rápida en video del formulario de WordPress en acción:

Nota: este tutorial asume que estás en cierto modo familiarizado con WordPress y Contact Form 7.

Complementos para Contact Form 7 en CodeCanyon

¿Estás interesado en extender tu Contact Form 7 de forma rápida y sencilla? CodeCanyon alberga una gran cantidad de scripts y complementos para llevar tus formularios CF7 al siguiente nivel. Por ejemplo, Multi Step for Contact Form 7 Pro (Múltiples pasos para Contact Form 7 Pro) es una excelente forma de mejorar la experiencia de usuario de tus formularios largos:

Multi step contact form 7Multi step contact form 7Multi step contact form 7

Dicho eso, suponiendo que ya has instalado Contact Form 7 en un proyecto de WordPress, regresemos al tutorial y discutamos los pasos necesarios para animar las etiquetas de nuestro formulario CF7.

1. Elimina las etiquetas innecesarias

El primer paso es eliminar las etiquetas adicionales que Contact Form 7 agrega al formulario.

The extra tags that Contact Form 7 throws in the formThe extra tags that Contact Form 7 throws in the formThe extra tags that Contact Form 7 throws in the form

Para hacer esto, vamos a establecer el valor de la constante WPCF7_AUTOP en false en el archivo wp-config.php, de esta forma:

Change the value of the WPCF7_AUTOP to falseChange the value of the WPCF7_AUTOP to falseChange the value of the WPCF7_AUTOP to false

2. Crea el formulario de contacto

El segundo paso es crear el formulario desde el panel de control de WordPress.

Contact Form 7 ShortcodeContact Form 7 ShortcodeContact Form 7 Shortcode

Usaremos una combinación de códigos cortos de Contact Form 7 junto con un poco de HTML personalizado.

El formulario estará compuesto por dos elementos input, un elemento textarea y un botón de envío. Además, asociaremos cada uno de los elementos input y textarea con un elemento label. Cada elemento label se comportará como un marcador de posición.

Este es el código que tenemos que agregar al editor de Contact Form 7:

1
<h1>Contact Us</h1>
2
<ul>
3
  <li class="form-wrapper">
4
    [text* your-fullname id:your-fullname]
5
    <label for="your-fullname">Full Name</label>
6
  </li>
7
  <li class="form-wrapper">
8
    [email* your-email id:your-email]
9
    <label for="your-email">Email</label>
10
  </li>
11
  <li class="form-wrapper form-textarea-wrapper">
12
    [textarea* your-message id:your-message]
13
    <label for="your-message">Message</label>
14
  </li>
15
  <li class="form-wrapper form-submit-wrapper">
16
    [submit "Submit"]
17
    <svg width="24" height="24" viewBox="0 0 24 24">
18
      <path d="M24 21h-24v-18h24v18zm-23-16.477v15.477h22v-15.477l-10.999 10-11.001-10zm21.089-.523h-20.176l10.088 9.171 10.088-9.171z"/>
19
    </svg>
20
  </li>
21
</ul>

3. Agrega los estilos de formulario CSS

Para continuar, pondremos en cola un nuevo archivo CSS en el archivo functions.php de nuestro proyecto, de esta forma (aunque tu carpeta destino puede diferir):

1
wp_enqueue_style( 'custom', get_template_directory_uri() . '/assets/css/custom.css' );

En su interior, colocaremos un grupo de estilos:

  • Comenzaremos con algunos de restablecimiento (genéricos). Solo para hacer que el formulario se vea un poco más atractivo, usaremos una fuente de Google personalizada. Asegúrate de poner esta fuente en cola si quieres usarla en tu proyecto.
  • A continuación, definiremos los estilos principales para nuestro formulario. Como veremos más adelante, el formulario recibirá la clase form-with-animated-labels. Esto nos ayudará a aislarla y evitar conflictos con otros estilos.
  • Finalmente, personalizaremos un poco la apariencia de algunos de los mensajes de respuesta de CF7.

Lo más importante es que eches un vistazo a la manera en la que estilizamos las etiquetas. Estos son elementos con una posición absoluta y centrados verticalmente en el interior de su padre .form-wrapper. Como veremos en un momento, cuando su elemento relacionado del formulario recibe el foco, estos se moverán encima de él a través de la clase focused.

Aquí están todos los estilos requeridos:

1
/* RESET RULES & INITIAL SET UP

2
–––––––––––––––––––––––––––––––––––––––––––––––––– */
3
:root {
4
    --white: #fff;
5
    --black: #222;
6
    --brown: #9f4631;
7
    --gray: #9a9a9a;
8
    --lightgray: #f2f3f5;
9
}
10
11
* {
12
    padding: 0;
13
    margin: 0;
14
    box-sizing: border-box;
15
    border: none;
16
    outline: none;
17
}
18
19
input,
20
textarea {
21
    font-family: inherit;
22
    font-size: 100%;    
23
}
24
25
[type="submit"] {
26
    cursor: pointer;
27
}
28
29
textarea {
30
    resize: none;
31
}
32
33
ul {
34
    list-style: none;
35
}
36
37
body {
38
    font: 20px/24px "IBM Plex Sans", sans-serif;
39
}
40
41
form {
42
    max-width: 600px;
43
    padding: 0 15px;
44
    margin: 100px auto;
45
}
46
47
h1 {
48
    font-size: 60px;
49
    line-height: 78px;
50
    margin-bottom: 50px;
51
}
52
53
54
/* FORM ELEMENTS

55
–––––––––––––––––––––––––––––––––––––––––––––––––– */
56
.form-with-animated-labels .form-wrapper {
57
    position: relative;
58
}
59
60
.form-with-animated-labels .form-wrapper + .form-wrapper {
61
    margin-top: 40px;
62
}
63
64
.form-with-animated-labels [type="text"],
65
.form-with-animated-labels [type="email"],
66
.form-with-animated-labels textarea {
67
    width: 100%;
68
    padding: 15px 10px;
69
    border: 1px solid transparent;
70
    border-radius: 5px;
71
    color: var(--black);
72
    background: var(--lightgray);
73
    font-size: 18px;
74
}
75
76
.form-with-animated-labels textarea {
77
    height: 150px;
78
}
79
80
.form-with-animated-labels [type="text"]:focus,
81
.form-with-animated-labels [type="email"]:focus,
82
.form-with-animated-labels textarea:focus {
83
    border-color: var(--brown);
84
}
85
86
.form-with-animated-labels label {
87
    position: absolute;
88
    top: 50%;
89
    left: 10px;
90
    font-size: 18px;
91
    transform: translateY(-50%);
92
    color: var(--gray);
93
    transition: all 0.25s ease-in-out;
94
}
95
96
.form-with-animated-labels .form-textarea-wrapper label {
97
    top: 10px;
98
    transform: none;
99
}
100
101
.form-with-animated-labels label.focused {
102
    top: -22px;
103
    transform: none;
104
    font-size: 13px;
105
    font-weight: bold;
106
    color: var(--black);
107
}
108
109
.form-with-animated-labels [type="submit"] {
110
    min-width: 160px;
111
    padding: 20px 4px;
112
    border-radius: 10px;
113
    width: 100%;
114
    font-size: 22px;
115
    font-weight: bold;
116
    text-transform: uppercase;
117
    box-shadow: 0 5px 15px rgba(0, 0, 0, 0.08);
118
    color: var(--white);
119
    background: var(--brown);
120
}
121
122
.form-with-animated-labels .form-submit-wrapper svg {
123
    position: absolute;
124
    top: 0;
125
    left: 0;
126
    transform: rotate(40deg);
127
    opacity: 0.75;
128
    fill: var(--white);
129
    width: 60px;
130
    height: 60px;
131
}
132
133
.form-with-animated-labels .wpcf7-form-control-wrap {
134
    position: static;
135
}
136
137
.form-with-animated-labels .wpcf7-not-valid-tip {
138
    position: absolute;
139
    bottom: 100%;
140
    right: 10px;
141
    font-size: 12px;
142
}
143
144
145
/* OUTPUT MESSAGES CF7

146
–––––––––––––––––––––––––––––––––––––––––––––––––– */
147
.wpcf7 form .wpcf7-response-output {
148
    font-size: 18px;
149
    padding: 10px;
150
    margin: 0;
151
}
152
153
.wpcf7 form.invalid .wpcf7-response-output,
154
.wpcf7 form.unaccepted .wpcf7-response-output,
155
.wpcf7 form.sent .wpcf7-response-output {
156
    border-color: var(--brown);
157
}

Nota: para este ejemplo estoy usando un tema básico. Sin embargo, dependiendo de tu tema algunos de estos estilos podrían ser anulados. Teniendo en cuenta ese hecho, si el formulario no se ve como era de esperarse en tu proyecto, asegúrate de revisar los estilos de tu tema y hacer los cambios necesarios.

Consejo: puedes usar etiquetas condicionales para cargar este archivo CSS solamente en las páginas que incluyan al formulario.

Por qué un enfoque que usa CSS solamente no funcionará

Antes de continuar, permíteme aclarar una cosa.

Probablemente has visto muchas implementaciones que usan solamente CSS para crear etiquetas flotantes en la web. Estos aprovechan principalmente la "técnica del truco con el checkbox en CSS". Ciertamente es una técnica muy útil que hemos discutido muchas veces en el pasado.

Desafortunadamente, en este caso no podemos usarla. Si inspeccionas el marcado generado por los códigos cortos de Contact Form 7, notarás que todos los controles del formulario están envueltos por un elemento span.

Wrapper around a form control in Contact Form 7Wrapper around a form control in Contact Form 7Wrapper around a form control in Contact Form 7

Como resultado, los controles y sus etiquetas asociadas no son hermanos, y un estilo como este no tendrá ningún efecto:

1
.form-with-animated-labels [type="text"]:focus + label {
2
  // styles for the animation here
3
}

4. Agrega el código JavaScript

Como siguiente paso, pondremos en cola un nuevo archivo JavaScript en el archivo functions.php de nuestro proyecto, de esta forma (aunque tu carpeta destino puede diferir):

1
wp_enqueue_script( 'custom', get_template_directory_uri() . '/assets/js/custom.js', array(), '', true );

En su interior, llevaremos a cabo las siguientes acciones:

  1. Vamos a recorrer con un bucle todos los formularios .form-with-animated-labels.
  2. Para cada formulario, tomaremos sus controles destino (inputs, textarea). En tu caso, estos podrían ser diferentes.
  3. Después, para cada control, escucharemos los eventos focus y blur. Estos eventos serán los responsables de animar las etiquetas cambiando la clase focused que definimos anteriormente.
  4. Por último, usaremos uno de los eventos AJAX de CF7 para colocar de nuevo las etiquetas en sus posiciones iniciales. Siéntete libre de usar cualquier de esos eventos según tus necesidades.

Aquí puedes ver el código JavaScript correspondiente:

1
const formsWithAnimatedLabels = document.querySelectorAll(
2
    ".form-with-animated-labels"
3
);
4
const focusedClass = "focused";
5
6
for (const form of formsWithAnimatedLabels) {
7
    const formControls = form.querySelectorAll(
8
        '[type="text"], [type="email"], textarea'
9
    );
10
    for (const formControl of formControls) {
11
        formControl.addEventListener("focus", function () {
12
            this.parentElement.nextElementSibling.classList.add(focusedClass);
13
        });
14
15
        formControl.addEventListener("blur", function () {
16
            if (!this.value) {
17
                this.parentElement.nextElementSibling.classList.remove(
18
                    focusedClass
19
                );
20
            }
21
        });
22
    }
23
24
25
    form.parentElement.addEventListener("wpcf7mailsent", function () {
26
        const labels = document.querySelectorAll(".focused");
27
        for (const label of labels) {
28
            label.classList.remove(focusedClass);
29
        }
30
    });
31
}

Consejo: puedes usar etiquetas condicionales para cargar este archivo de JavaScript solamente en las páginas que incluyan al formulario.

5. Llama al formulario de contacto

Por último, pero no por eso menos importante, vamos a incluir el código corto generado por Contact Form 7 en la parte que deseemos en nuestro proyecto:

1
[contact-form-7 id="5" title="Contact Form With Animated Labels" html_class="form-with-animated-labels"]

Observa la clase añadida a través del atributo html_class. Esta es nuestra conocida clase form-with-animated-labels.

Conclusión

¡Y hemos terminado, amigos! En este breve tutorial, discutimos un método sencillo para personalizar la apariencia de un formulario de Contact Form 7 agregando etiquetas flotantes. Estoy seguro de que también habrán otras soluciones eficaces, ¡pero esta parece hacer su trabajo! Con suerte la probarás en alguno de tus próximos proyectos de WordPress.

¿Alguna vez has creado un efecto así con Contact Form 7? ¿Has logrado encontrar una solución basada solamente en CSS? Comparte tus pensamientos en los comentarios a continuación.

Como siempre, ¡muchas gracias por leer!

Más personalización para Contact Form 7 y etiquetas flotantes

Si sientes la curiosidad de aprender cómo crear un formulario SVG responsivo hecho a mano con Contact Form 7, o si te gustaría profundizar en el tema de las etiquetas flotantes, echa un vistazo a estos tutoriales: