Interfaz de usuario multiplataforma y móvil · Nuevo recurso

Sistema de diseño Vant.

Un flujo móvil de selección de dirección creado con Vant 4: variables reales de CSS, identidad de dirección controlada, validación de campos, cambio de tema y guardado explícitamente local.

Guía de OpenDesign9 capítulos34 entradas de referenciaGuía de aplicación original
01

Vista previa de la interfaz del sistema de diseño Vant

Selecciona un destinatario, edita una dirección, valida una nueva entrada y cambia el tema del componente nativo.

Dirección de entrega del kit de muestraAbrir ejemplo completo
Vant nativo 4.10.2 con Vue 3. La ilustración del papel y la composición que la rodea son originales. · Referencia de implementación
02

Referencia de diseño del sistema de diseño Vant

Variables CSS de Vant 4.10.2, consultadas en la hoja de estilos base instalada. La vista previa aplica un color primario verde azulado original mediante ConfigProvider; los roles predeterminados que aparecen a continuación siguen identificados explícitamente.

Roles de color predeterminados

Fuente
Nombre / ReglaValor / ConfiguraciónUso
--van-primary-colorvar(--van-blue)Alias de acción predeterminado; el azul es #1989fa.
--van-success-colorvar(--van-green)Alias de éxito; el verde es #07c160.
--van-danger-colorvar(--van-red)Alias de peligro; el rojo es #ee0a24.
--van-warning-colorvar(--van-orange)Alias de advertencia; el naranja es #ff976a.
--van-text-colorvar(--van-gray-8)Alias de texto principal; gray-8 es #323233.
--van-text-color-2var(--van-gray-6)Alias de texto secundario; gray-6 es #969799.
--van-border-colorvar(--van-gray-3)Alias de divisor; gray-3 es #ebedf0.
--van-backgroundvar(--van-gray-1)Superficie de página; gray-1 es #f7f8fa.
--van-background-2var(--van-white)Superficie de componente; blanco es #fff.

Escala de espaciado interno

Fuente
Nombre / ReglaValor / ConfiguraciónUso
--van-padding-base4pxPequeño desplazamiento interno.
--van-padding-xs8pxSeparación interna pequeña.
--van-padding-sm12pxEspaciado interno del elemento de dirección.
--van-padding-md16pxMargen interior normal de página.
--van-padding-lg24pxMargen interior de sección.
--van-padding-xl32pxMargen interior amplio de página.

Tipografía y forma

Fuente
Nombre / ReglaValor / ConfiguraciónUso
--van-font-size-xs10pxTamaño de texto predeterminado de la interfaz.
--van-font-size-sm12pxTamaño de texto predeterminado de la interfaz.
--van-font-size-md14pxTamaño de texto predeterminado de la interfaz.
--van-font-size-lg16pxTamaño de texto predeterminado de la interfaz.
--van-line-height-xs14pxToken de altura de línea correspondiente.
--van-line-height-sm18pxToken de altura de línea correspondiente.
--van-line-height-md20pxToken de altura de línea correspondiente.
--van-line-height-lg22pxToken de altura de línea correspondiente.
--van-radius-sm2pxRadio de esquina definido.
--van-radius-md4pxRadio de esquina definido.
--van-radius-lg8pxRadio de esquina definido.
--van-radius-max999pxRadio de esquina definido.
--van-disabled-opacity.5Opacidad predeterminada de estado deshabilitado.
--van-duration-base.3sDuración de transición estándar.

Ajustes de la lista de direcciones y la vista previa

Fuente
Nombre / ReglaValor / ConfiguraciónUso
--van-address-list-padding12px 12px 80pxEl valor predeterminado oficial reserva espacio para el botón de añadir situado abajo.
themeVars.addressListPadding12pxAjuste original porque esta vista previa oculta el botón fijo para añadir.
themeVars.primaryColor#176b77 Modificación original del color principal asignada a --van-primary-color.
--van-address-list-item-font-size13pxTamaño oficial del texto de dirección.
--van-address-list-edit-icon-size20pxTamaño oficial del icono de edición; no corresponde a toda el área táctil.
03

Guía completa del sistema de diseño Vant

Una guía práctica para elegir, aplicar y revisar este sistema en una interfaz real.

DESIGN-vant.md

Orientación completa, un punto de partida para la implementación y enlaces al código fuente.

Descargar la guía

Componentes móviles del sistema de diseño Vant con roles CSS explícitos

Componentes móviles con roles CSS explícitos

Vant está dirigido a interfaces web móviles con Vue. Sus componentes AddressList, Field y CellGroup ofrecen filas compactas de direcciones de entrega y celdas de formulario, en lugar de una tabla de administración de escritorio. El flujo del kit de muestra usa esos componentes nativos y muestra el destino seleccionado en un resumen independiente.

De esta guía de OpenDesign

De forma predeterminada, el rol principal es azul mediante --van-primary-color. El éxito, el peligro y la advertencia hacen referencia a variables de color independientes. La muestra cambia deliberadamente el color principal a #176b77 mediante ConfigProvider; no presenta ese verde azulado como un color oficial de marca de Vant. La ilustración original del papel es decorativa y no representa el estado de ningún control.

Consulta la especificación complementaria

Sistema de diseño Vant: escala de espaciado interno de cuatro píxeles y tipografía compacta

Escala de espaciado interno de cuatro píxeles y tipografía compacta

Vant ofrece valores de espaciado interno de 4, 8, 12, 16, 24 y 32 píxeles. Son variables base reales, no valores inferidos de una captura de pantalla. Los elementos de la lista de direcciones usan el token de espaciado pequeño, mientras que la vista previa añade espacios más amplios entre secciones para diferenciar el formulario del resumen del pedido.

Los tamaños de texto definidos van de 10 a 16 píxeles, con alturas de línea correspondientes de 14 a 22 píxeles. El texto de dirección tiene su propia variable de componente de 13px. Un producto móvil puede necesitar texto editorial más grande que esos valores predeterminados de los controles: el encabezado de la muestra tiene un tamaño original de 32px, que se reduce a 27px en el punto de interrupción de la página.

Consulta la especificación complementaria

Sistema de diseño Vant: un ID de dirección controla la selección de radio

Un ID de dirección controla la selección de radio

AddressList recibe registros de lista con id, name, tel, address y el campo opcional isDefault. El valor de v-model identifica el registro seleccionado. El resumen se calcula buscando ese ID en la lista actual, de modo que editar un destinatario actualiza de inmediato el destino mostrado, sin necesidad de mantener un segundo estado de resumen independiente.

El almacén no disponible se pasa mediante disabled-list y se le añade una explicación clara en disabled-text. Permanece visible como contexto, pero no puede convertirse en el destino seleccionado. La insignia «Predeterminada» identifica el estado predeterminado del registro; es independiente de la selección actual y no cambia simplemente porque se elija otra opción de radio.

Consulta la especificación complementaria

Sistema de diseño Vant: mantén el borrador separado del registro guardado

Mantén el borrador separado del registro guardado

El evento de edición proporciona el registro de dirección. El editor copia solo sus campos editables en un borrador reactivo y guarda por separado su ID estable. Al cancelar, oculta este borrador sin modificar la dirección guardada. Al guardar, reemplaza el registro correspondiente o añade uno nuevo local y, después, selecciona ese ID.

El ejemplo muestra el editor en línea, debajo de la lista, en lugar de abrir una ventana emergente inferior. Así, el ejemplo completo se puede usar en un documento incrustado. Vant también ofrece AddressEdit para introducir direcciones de forma estandarizada; este ejemplo usa Form y Field porque sus direcciones de muestra evitan deliberadamente presuponer los datos administrativos de un país concreto.

  1. Selecciona un estudio y comprueba el resumen antes de abrir Editar.
  2. Cambia el destinatario y luego cancela para confirmar que la fila guardada no haya cambiado.
  3. Vuelve a abrir el editor, guarda campos válidos y comprueba el resumen seleccionado.

Consulta la especificación complementaria

Sistema de diseño Vant: las reglas de los campos controlan el evento de envío

Las reglas de los campos controlan el evento de envío

Form usa validate-trigger="onSubmit". El validador del destinatario elimina los espacios en blanco sobrantes y exige al menos dos caracteres. El validador del teléfono acepta un rango moderado de dígitos, espacios, paréntesis y guiones, con un signo más inicial opcional. El validador de la dirección exige diez caracteres que no sean espacios en blanco. Estas comprobaciones ilustran el funcionamiento; no verifican direcciones postales ni validan teléfonos de forma universal.

Un Button principal con native-type="submit" envía el formulario nativo. Vant emite submit solo si se superan las reglas. Los errores aparecen junto al Field correspondiente y scroll-to-error desplaza el campo no válido hasta dejarlo visible. La vista previa también enfoca la primera entrada del destinatario al iniciar la edición. El borrador se conserva si la validación falla.

Consulta la especificación complementaria

Sistema de diseño Vant: ConfigProvider asigna valores camelCase a variables de CSS

ConfigProvider asigna valores CamelCase a variables CSS

El objeto theme-vars incluye primaryColor, buttonPrimaryBackground, buttonPrimaryBorderColor y addressListPadding. ConfigProvider asigna esos nombres a las variables --van-* correspondientes. En este documento aislado, el proveedor usa theme-vars-scope="global" para que los alias declarados en la raíz se resuelvan según el rol principal modificado. Sobrescribir el rol y ambos valores del botón principal mantiene coordinados la acción nativa y el estado de selección de radio.

Al cambiar la propiedad theme entre light y dark, se actualiza el tema de los componentes de Vant. La página aún necesita sus propias declaraciones de fondo y texto mediante las variables del tema; configurar el proveedor por sí solo no aplica estilos a todos los elementos de la aplicación. Las muestras decorativas de papel mantienen intencionadamente sus colores de material en ambos temas.

Consulta la especificación complementaria

Sistema de diseño Vant: una acción fija para móviles requiere decidir cómo incrustarla

Una acción fija para móviles requiere decidir cómo incrustarla

AddressList normalmente reserva ochenta píxeles de relleno inferior para su botón fijo de adición. La vista previa establece show-add-button en false y proporciona un Button normal en el flujo del contenido. También cambia addressListPadding a doce píxeles para evitar tanto una acción fija separada como un espacio vacío e inexplicable al pie del ejemplo incrustado.

En una pantalla ancha, la lista y el resumen de materiales se muestran en dos columnas. Por debajo del punto de quiebre original de 680px, se apilan. La altura nativa height:100% de AddressList se restablece explícitamente a height:auto para que el panel se ajuste a su contenido en lugar de superponerse a la siguiente fila de la cuadrícula. No se establece una altura mínima global de la ventana gráfica, de modo que la página principal pueda dimensionar el documento incrustado según su contenido. Los nombres de las direcciones se ajustan en pantallas estrechas en vez de ensanchar la página a la fuerza.

Consulta la especificación complementaria

Sistema de diseño Vant: foco visible y resultados locales explícitos

Foco visible y resultados locales explícitos

El restablecimiento base de Vant elimina los contornos de foco predeterminados. La hoja de estilos de la página que lo acompaña vuelve a añadir un anillo de foco visible de tres píxeles a botones, campos de entrada, áreas de texto y controles con tab-index. Es una mejora a nivel de aplicación; no se afirma que importar una biblioteca por sí solo complete el trabajo de accesibilidad. El selector de tema tiene un nombre accesible y una etiqueta visible.

Un aviso de estado registra un guardado local o la selección de un destino. Indica explícitamente que no se ha reservado ninguna entrega. El ejemplo no tiene ningún punto de acceso de pago, almacenamiento ni efecto externo. Un proceso de pago real requeriría validar la dirección en el servidor, comprobar la elegibilidad para la entrega y realizar una revisión final antes de la compra.

  • Explica de forma visible por qué las direcciones no están disponibles, en lugar de eliminarlas sin indicarlo.
  • Conserva el borrador tras un envío no válido para que el usuario pueda corregir un campo.
  • Indica si una acción cambia la selección local o si realmente reserva una entrega.

Consulta la especificación complementaria

Sistema de diseño Vant: importa la configuración regional y los estilos de los componentes

Importa la configuración regional y los estilos de los componentes

El SFC completo importa sus componentes localmente. El archivo de entrada instala la configuración regional en inglés mediante Locale.use e importa vant/lib/index.css antes de la hoja de estilos del diseño original. El paquete verificado es Vant 4.10.2 con Vue 3; el sufijo .mjs de la importación de la configuración regional en inglés coincide con el archivo ESM instalado.

La vista previa independiente incluye en el documento su JavaScript, CSS y la fuente de iconos. Elimina la alternativa WOFF remota que no se usa después de conservar la fuente WOFF2 incluida, de modo que el ejemplo no dependa de una solicitud a una fuente de terceros. Las aplicaciones de producción deben usar su propio empaquetador y sus propias políticas de recursos, en lugar de copiar una URL de demostración alojada.

Consulta la especificación complementaria

Vant Ejemplos de componentes del sistema de diseño

Selección de dirección y edición validada

SFC completo de Vue que usa AddressList, Form, Field, ConfigProvider y un borrador controlado.

vue
<script setup>
import {ref,reactive,computed,nextTick} from 'vue';
import {ConfigProvider,AddressList,Button,Form,Field,CellGroup,Tag,Switch,NoticeBar} from 'vant';
const list=ref([{id:'studio',name:'Alex Morgan',tel:'+44 20 7946 0101',address:'Studio 4, 18 Paper Street, London',isDefault:true},{id:'workshop',name:'Jules Chen',tel:'+44 20 7946 0122',address:'Workshop B, 52 Clay Road, London'}]);
const disabledList=[{id:'archive',name:'Sam Rivera',tel:'+44 20 7946 0133',address:'Old warehouse, 8 Mill Lane, London'}];
const chosen=ref('studio'),editing=ref(false),editingId=ref(null),notice=ref(''),dark=ref(false),formRef=ref();
const draft=reactive({name:'',tel:'',address:''});
const selected=computed(()=>list.value.find(x=>x.id===chosen.value));
const themeVars={primaryColor:'#176b77',addressListPadding:'12px',buttonPrimaryBackground:'#176b77',buttonPrimaryBorderColor:'#176b77'};
async function edit(item){editingId.value=item?.id||null;Object.assign(draft,item?{name:item.name,tel:item.tel,address:item.address}:{name:'',tel:'',address:''});editing.value=true;notice.value='';await nextTick();formRef.value?.resetValidation();document.querySelector('[name="recipient"]')?.focus();}
function save(){const value={id:editingId.value||`local-${Date.now()}`,name:draft.name.trim(),tel:draft.tel.trim(),address:draft.address.trim()};if(editingId.value)list.value=list.value.map(x=>x.id===editingId.value?{...x,...value}:x);else list.value.push(value);chosen.value=value.id;editing.value=false;notice.value='Address saved in this local preview.';}
function confirm(){notice.value=`Selected ${selected.value.name} at ${selected.value.address}. No delivery was booked.`;}
const nonempty=v=>v.trim().length>=2;
const phone=v=>/^\+?[\d ()-]{7,22}$/.test(v.trim());
</script>
<template><ConfigProvider theme-vars-scope="global" :theme="dark?'dark':'light'" :theme-vars="themeVars"><main class="delivery" :class="{dark}"><header><div><p class="eyebrow">VANT · MOBILE COMMERCE</p><h1>A destination for your sample kit.</h1><p class="intro">Choose a studio, update a recipient or add a local address.</p></div><label class="mode"><span>Dark</span><Switch v-model="dark" size="22px" aria-label="Dark theme" /></label></header><div class="columns"><section class="address-panel" aria-label="Delivery addresses"><div class="section-heading"><h2>Delivery address</h2><Tag plain type="primary">{{list.length}} available</Tag></div><AddressList v-model="chosen" :list="list" :disabled-list="disabledList" disabled-text="Outside the sample delivery area" default-tag-text="Default" :show-add-button="false" @edit="edit" @select="notice=''" /><div class="actions"><Button plain block type="primary" @click="edit()">Add a local address</Button></div></section><aside><section class="kit"><div class="paper-samples" aria-hidden="true"><i></i><i></i><i></i></div><p class="eyebrow">MATERIAL LIBRARY</p><h2>Paper & pigment kit</h2><p>Six paper stocks. Three print finishes. One place to compare them.</p><dl><div><dt>Recipient</dt><dd>{{selected?.name}}</dd></div><div><dt>Destination</dt><dd>{{selected?.address}}</dd></div></dl><Button block type="primary" @click="confirm">Use this address</Button><p class="local-note">Selection only. Nothing is purchased or shipped.</p></section></aside></div><section v-if="editing" class="editor"><h2>{{editingId?'Edit recipient':'Add an address'}}</h2><Form ref="formRef" validate-trigger="onSubmit" label-align="top" scroll-to-error @submit="save"><CellGroup inset><Field v-model="draft.name" name="recipient" label="Recipient" placeholder="Full name" :rules="[{validator:nonempty,message:'Enter at least two characters.'}]" /><Field v-model="draft.tel" name="telephone" type="tel" label="Telephone" placeholder="+44 20 7946 0100" :rules="[{validator:phone,message:'Use 7–22 characters: digits, spaces, +, brackets or hyphens.'}]" /><Field v-model="draft.address" name="address" type="textarea" rows="2" autosize label="Address" placeholder="Building, street and city" :rules="[{validator:v=>v.trim().length>=10,message:'Enter a complete address of at least ten characters.'}]" /></CellGroup><div class="form-actions"><Button type="primary" native-type="submit">Save locally</Button><Button native-type="button" @click="editing=false">Cancel</Button></div></Form></section><NoticeBar v-if="notice" wrapable :scrollable="false" color="var(--van-primary-color)" background="var(--van-background-2)" class="result" role="status">{{notice}}</NoticeBar></main></ConfigProvider></template>

Referencia de código

  • El valor seleccionado es un ID de dirección, no una posición en la matriz.
  • Se oculta el botón fijo para añadir de AddressList; un Button integrado en el flujo abre el editor.
  • El envío de Form solo se ejecuta después de que los validadores de Field den su aprobación.

Diseño adaptable y foco visible

La disposición original de escritorio en dos columnas se adapta a un flujo de entrega para móviles.

css
*{box-sizing:border-box}body{margin:0;background:#f7f8fa;color:#323233}.delivery{padding:32px;max-width:1080px;margin:auto;background:var(--van-background);color:var(--van-text-color)}.delivery.dark{background:var(--van-background);color:var(--van-text-color)}header{display:flex;align-items:flex-start;justify-content:space-between;gap:24px;margin-bottom:32px}.eyebrow{font-size:11px;font-weight:600;letter-spacing:.12em;color:var(--van-text-color-2)}h1{font-size:32px;line-height:1.2;margin:12px 0;max-width:550px}h2{font-size:18px;line-height:24px;margin:0 0 12px}.intro{font-size:15px;line-height:24px;color:var(--van-text-color-2)}.mode{display:flex;gap:8px;align-items:center;font-size:12px}.columns{display:grid;grid-template-columns:1.25fr 1fr;gap:24px}.section-heading{display:flex;justify-content:space-between;align-items:center;padding:0 12px}.section-heading h2{margin:0}.actions{padding:0 12px}.kit{background:var(--van-background-2);padding:24px;border-radius:8px}.kit p{line-height:1.6}.paper-samples{height:130px;position:relative;display:flex;align-items:center;justify-content:center;margin-bottom:24px;background:#e9edef;border-radius:4px;overflow:hidden}.paper-samples i{height:90px;width:90px;background:#d6b59b;box-shadow:0 4px 8px #0001;transform:rotate(-12deg);margin-right:-25px}.paper-samples i:nth-child(2){background:#efdfbe;transform:rotate(2deg)}.paper-samples i:nth-child(3){background:#94adb1;transform:rotate(16deg)}dl{font-size:14px;line-height:20px;margin:24px 0}dl div{display:grid;grid-template-columns:90px 1fr;margin:12px 0;gap:12px}dt{color:var(--van-text-color-2)}dd{margin:0}.local-note{font-size:12px;color:var(--van-text-color-2);margin-bottom:0}.editor{max-width:640px;margin-top:32px}.editor h2{margin-left:16px}.form-actions{display:flex;gap:12px;margin:16px}.result{margin-top:24px;border-radius:8px}button:focus-visible,input:focus-visible,textarea:focus-visible,[tabindex]:focus-visible{outline:3px solid #176b77!important;outline-offset:3px}@media(max-width:680px){.delivery{padding:24px 12px}.columns{grid-template-columns:1fr}header{gap:8px;margin-bottom:24px}h1{font-size:27px}.mode{padding-top:4px}.kit{padding:20px}.paper-samples{height:110px}.van-address-item__name{white-space:normal}}

.delivery .van-address-list{height:auto}

Referencia de código

  • La geometría de los componentes procede de Vant; el punto de ruptura de página de 680px es una decisión de la aplicación.
  • La vista previa restaura un indicador de foco visible porque el restablecimiento base elimina los contornos predeterminados.
04

Configuración del agente del sistema de diseño Vant

Punto de partida para la implementación

Verificado con Vue 3 y Vant 4.10.2. El ejemplo no guarda direcciones fuera de su estado en memoria.

javascript
// Create the project first:
// npm create vite@latest vant-specimen -- --template vue
// cd vant-specimen && npm install
// In a Vite Vue 3 project:
// npm install [email protected]
// Save the complete SFC as App.vue and the supplied layout as style.css.
import {createApp} from 'vue';
import {Locale} from 'vant';
import enUS from 'vant/es/locale/lang/en-US.mjs';
import 'vant/lib/index.css';
import './style.css';
import App from './App.vue';
Locale.use('en-US',enUS);
createApp(App).mount('#app');
// index.html must contain <div id="app"></div>.
// Keep the template index.html and replace its entry with the code above.
// npm run dev

Una instrucción para tu proyecto

Instrucción para el agente
Parte del selector de direcciones del kit de ejemplo de Vant 4.10.2. Conserva AddressList nativo y el flujo de edición Form/Field para añadir o modificar una dirección local, incluida la validación de campos y el estado de la dirección seleccionada. Mantén la configuración de Locale, el módulo en-US, el ámbito del tema de ConfigProvider y la adaptación de AddressList a la altura del contenido. La cancelación no debe sustituir una dirección existente; la validación correcta solo actualiza la colección local de direcciones. No añadas afirmaciones de éxito sobre pagos o franjas de entrega a este ejemplo, que solo abarca direcciones.
05

Fuentes y alcance del sistema de diseño Vant

Vant 4.10.2. Se distinguen los tokens predeterminados de las decisiones originales de la página. Las direcciones de ejemplo son ficticias; la selección y la edición se mantienen en el ámbito local.