Interfaccia utente multipiattaforma e mobile · Nuova risorsa

sistema di design Vant.

Un flusso mobile di selezione dell’indirizzo realizzato con Vant 4: variabili CSS reali, identità dell’indirizzo controllata, convalida dei campi, cambio di tema e salvataggio esplicitamente limitato al dispositivo.

Guida OpenDesign9 capitoli34 voci di riferimentoGuida applicativa originale
01

Anteprima dell’interfaccia del sistema di design Vant

Seleziona un destinatario, modifica un indirizzo, convalida una nuova voce e cambia il tema del componente nativo.

Indirizzo di consegna del kit campioneApri l’esempio completo
Vant nativo 4.10.2 con Vue 3. La grafica della carta e il layout circostante sono originali. · Riferimento per l’implementazione
02

Riferimento al sistema di design Vant

Variabili CSS 4.10.2 di Vant, lette dal foglio di stile base installato. L’anteprima applica una variante primaria originale color verde petrolio tramite ConfigProvider; i ruoli predefiniti qui sotto sono identificati esplicitamente.

Ruoli cromatici predefiniti

Fonte
Nome / regolaValore / configurazioneUtilizzo
--van-primary-colorvar(--van-blue)Alias di azione predefinito; il blu è #1989fa.
--van-success-colorvar(--van-green)Alias di esito positivo; il verde è #07c160.
--van-danger-colorvar(--van-red)Alias di pericolo; il rosso è #ee0a24.
--van-warning-colorvar(--van-orange)Alias di avviso; l’arancione è #ff976a.
--van-text-colorvar(--van-gray-8)Alias del testo principale; gray-8 è #323233.
--van-text-color-2var(--van-gray-6)Alias del testo secondario; gray-6 è #969799.
--van-border-colorvar(--van-gray-3)Alias del divisore; gray-3 è #ebedf0.
--van-backgroundvar(--van-gray-1)Superficie della pagina; gray-1 è #f7f8fa.
--van-background-2var(--van-white)Superficie del componente; white è #fff.

Scala di spaziatura

Fonte
Nome / regolaValore / configurazioneUtilizzo
--van-padding-base4pxScostamento interno minimo.
--van-padding-xs8pxPiccolo spazio interno.
--van-padding-sm12pxSpaziatura interna dell’elemento indirizzo.
--van-padding-md16pxMargine interno standard della pagina.
--van-padding-lg24pxMargine interno della sezione.
--van-padding-xl32pxMargine interno ampio della pagina.

Tipografia e forma

Fonte
Nome / regolaValore / configurazioneUtilizzo
--van-font-size-xs10pxDimensione predefinita del testo dell’interfaccia.
--van-font-size-sm12pxDimensione predefinita del testo dell’interfaccia.
--van-font-size-md14pxDimensione predefinita del testo dell’interfaccia.
--van-font-size-lg16pxDimensione predefinita del testo dell’interfaccia.
--van-line-height-xs14pxToken di interlinea corrispondente.
--van-line-height-sm18pxToken di interlinea corrispondente.
--van-line-height-md20pxToken di interlinea corrispondente.
--van-line-height-lg22pxToken di interlinea corrispondente.
--van-radius-sm2pxRaggio dell’angolo denominato.
--van-radius-md4pxRaggio dell’angolo denominato.
--van-radius-lg8pxRaggio dell’angolo denominato.
--van-radius-max999pxRaggio dell’angolo denominato.
--van-disabled-opacity.5Opacità predefinita per gli elementi disabilitati.
--van-duration-base.3sDurata della transizione standard.

Adattamenti dell’elenco indirizzi e dell’anteprima

Fonte
Nome / regolaValore / configurazioneUtilizzo
--van-address-list-padding12px 12px 80pxL’impostazione predefinita ufficiale riserva spazio per il pulsante di aggiunta in basso.
themeVars.addressListPadding12pxAdattamento originale perché questa anteprima nasconde il pulsante di aggiunta fisso.
themeVars.primaryColor#176b77 Variante primaria originale associata a --van-primary-color.
--van-address-list-item-font-size13pxDimensione ufficiale del testo dell’indirizzo.
--van-address-list-edit-icon-size20pxDimensione ufficiale dell’icona di modifica; non corrisponde all’intera area interattiva.
03

Guida completa al sistema di design Vant

Una guida pratica per scegliere, applicare e valutare questo sistema in un’interfaccia reale.

DESIGN-vant.md

Indicazioni complete, un punto di partenza per l’implementazione e link alle fonti.

Scarica la guida

Componenti per dispositivi mobili del sistema di design Vant con ruoli CSS espliciti

Componenti per dispositivi mobili con ruoli CSS espliciti

Vant è destinato alle interfacce web mobili Vue. AddressList, Field e CellGroup offrono righe compatte per gli indirizzi di consegna e celle per i moduli, invece di una tabella amministrativa desktop. Il flusso del kit campione usa questi componenti nativi e mostra la destinazione selezionata in un riepilogo separato.

Da questa guida su OpenDesign

Il ruolo primario è impostato per impostazione predefinita sul blu tramite --van-primary-color. I ruoli di esito positivo, pericolo e avviso fanno ciascuno riferimento a variabili cromatiche distinte. L’esempio cambia deliberatamente il colore primario in #176b77 tramite ConfigProvider; non definisce questo verde petrolio come colore ufficiale del brand Vant. La grafica originale della carta è decorativa e non rappresenta lo stato di alcun controllo.

Leggi la specifica di supporto

sistema di design Vant: la scala di spaziatura a incrementi di quattro pixel e la tipografia compatta

La scala di spaziatura a incrementi di quattro pixel e la tipografia compatta

Vant espone valori di spaziatura di 4, 8, 12, 16, 24 e 32 pixel. Si tratta di variabili di base effettive, non dedotte da uno screenshot. Gli elementi dell’elenco indirizzi usano il token di spaziatura ridotta, mentre l’anteprima circostante aggiunge spazi più ampi tra le sezioni per distinguere il modulo dal riepilogo dell’ordine.

Le dimensioni del testo denominate vanno da 10 a 16 pixel, con interlinee abbinate da 14 a 22 pixel. Il testo degli indirizzi ha una propria variabile del componente da 13px. Un prodotto per dispositivi mobili potrebbe aver bisogno di testo editoriale più grande rispetto a questi valori predefiniti dei controlli: il titolo di esempio usa una dimensione originale di 32px, ridotta a 27px in corrispondenza del breakpoint della pagina.

Leggi la specifica di supporto

sistema di design Vant: la selezione radio è determinata dall’ID dell’indirizzo

La selezione radio è determinata dall’ID dell’indirizzo

AddressList riceve record dell’elenco con id, name, tel, address e isDefault facoltativo. Il valore di v-model identifica il record selezionato. Il riepilogo viene calcolato cercando quell’ID nell’elenco corrente, così modificare il destinatario aggiorna immediatamente la destinazione visualizzata senza introdurre un secondo stato riepilogativo indipendente.

Il magazzino non disponibile viene passato tramite disabled-list e accompagnato da una spiegazione chiara del testo disabilitato. Rimane visibile per fornire contesto, ma non può diventare la destinazione selezionata. L’etichetta Default indica che il record è quello predefinito; è distinta dalla selezione corrente e non cambia quando si sceglie un’altra opzione radio.

Leggi la specifica di supporto

sistema di design Vant: tieni separata la bozza dal record salvato

Tieni separata la bozza dal record salvato

L’evento edit fornisce il record dell’indirizzo. L’editor copia solo i campi modificabili in una bozza reattiva e memorizza separatamente il suo ID stabile. Annulla nasconde la bozza senza modificare l’indirizzo salvato. Salva sostituisce il record corrispondente o ne aggiunge uno nuovo in locale, poi seleziona quell’ID.

L’esempio mostra l’editor in linea sotto l’elenco, invece di aprire un popup inferiore. Così l’intero esempio rimane utilizzabile in un documento incorporato. Vant offre anche AddressEdit per l’inserimento standardizzato degli indirizzi; questo esempio usa Form e Field perché gli indirizzi campione evitano deliberatamente di presupporre i dati amministrativi di un singolo Paese.

  1. Seleziona uno studio e controlla il riepilogo prima di aprire Modifica.
  2. Cambia il destinatario, poi annulla per verificare che la riga salvata non sia cambiata.
  3. Riapri l’editor, salva i campi validi e controlla il riepilogo selezionato.

Leggi la specifica di supporto

sistema di design Vant: le regole di Field regolano l’evento submit

Le regole di Field regolano l’evento submit

Il Form usa validate-trigger="onSubmit". Il validatore del destinatario rimuove gli spazi iniziali e finali e richiede almeno due caratteri. Il validatore del telefono accetta un intervallo ragionevole di cifre, spazi, parentesi e trattini, con un segno più iniziale facoltativo. Il validatore dell’indirizzo richiede dieci caratteri non composti da spazi. Questi controlli illustrano il funzionamento, ma non costituiscono una verifica postale né una convalida telefonica universale.

Un Button primario con native-type="submit" invia il modulo nativo. Vant emette submit solo se le regole sono rispettate. Gli errori compaiono accanto al Field pertinente e scroll-to-error porta in vista il campo non valido. L’anteprima sposta inoltre il focus sul primo input del destinatario quando inizia la modifica. La bozza viene mantenuta in caso di errori di convalida.

Leggi la specifica di supporto

sistema di design Vant: ConfigProvider associa i valori camelCase alle variabili CSS

ConfigProvider associa i valori camelCase alle variabili CSS

L’oggetto theme-vars include primaryColor, buttonPrimaryBackground, buttonPrimaryBorderColor e addressListPadding. ConfigProvider associa questi nomi alle corrispondenti variabili --van-*. In questo documento isolato, il provider usa theme-vars-scope="global", così gli alias dichiarati nella radice vengono risolti in base al ruolo primario modificato. La ridefinizione del ruolo e di entrambi i valori del pulsante primario mantiene coordinati l’azione nativa e la selezione radio.

Passare la prop theme da light a dark aggiorna il tema dei componenti di Vant. La pagina deve comunque definire sfondo e testo usando le variabili del tema: impostare solo il provider non applica i colori a ogni elemento dell'applicazione. I campioni decorativi di carta mantengono intenzionalmente i propri colori in entrambi i temi.

Leggi la specifica di supporto

sistema di design Vant: un'azione mobile fissa richiede una decisione sull'incorporamento

Un'azione mobile fissa richiede una decisione sull'incorporamento

AddressList riserva normalmente ottanta pixel di padding inferiore per il pulsante fisso di aggiunta. L'anteprima imposta show-add-button su false e fornisce un normale Button nel flusso. Modifica anche addressListPadding impostandolo a dodici pixel, evitando sia un'azione fissa scollegata dal contenuto sia un'area vuota ingiustificata in fondo all'esempio incorporato.

Sugli schermi ampi, l'elenco e il riepilogo dei materiali formano due colonne. Sotto il breakpoint originale di 680px, vengono impilati. L'altezza nativa di AddressList, height:100%, viene reimpostata esplicitamente su height:auto, così il pannello si adatta al contenuto invece di sovrapporsi alla riga successiva della griglia. Non viene usata un'altezza minima globale del viewport, quindi la pagina contenitore può dimensionare il documento incorporato in base al contenuto. Sugli schermi stretti, i nomi degli indirizzi vanno a capo invece di allargare la pagina.

Leggi la specifica di supporto

sistema di design Vant: focus visibile e risultati locali espliciti

Focus visibile e risultati locali espliciti

Il reset di base di Vant rimuove i contorni di focus predefiniti. Il foglio di stile della pagina ripristina un anello di focus-visible di tre pixel su pulsanti, campi di input, aree di testo e controlli con tabindex. Si tratta di un'aggiunta a livello di applicazione, non dell'affermazione che l'import di una libreria, da solo, completi il lavoro sull'accessibilità. L'interruttore del tema ha un nome accessibile e un'etichetta visibile.

Una notifica di stato registra un salvataggio locale o la selezione di una destinazione. Specifica chiaramente che non è stata prenotata alcuna consegna. L'esempio non include un endpoint di checkout, archiviazione o effetti collaterali esterni. Un checkout reale richiederebbe la convalida dell'indirizzo lato server, la verifica della disponibilità della consegna e una revisione finale prima dell'acquisto.

  • Spiega chiaramente perché gli indirizzi non disponibili non sono selezionabili, anziché eliminarli senza avviso.
  • Mantieni la bozza dopo un invio non valido, così l'utente può correggere un campo.
  • Descrivi se un'azione modifica una selezione locale o prenota effettivamente una consegna.

Leggi la specifica di supporto

sistema di design Vant: importa la lingua e gli stili dei componenti

Importa la lingua e gli stili dei componenti

L'SFC completo importa i componenti localmente. Il file di ingresso installa la lingua inglese tramite Locale.use e importa vant/lib/index.css prima del foglio di stile originale del layout. Il pacchetto verificato è Vant 4.10.2 con Vue 3; il suffisso .mjs nell'import della lingua inglese corrisponde al file ESM installato.

L'anteprima autonoma incorpora nel documento JavaScript, CSS e il font delle icone. Rimuove il fallback WOFF remoto inutilizzato dopo aver mantenuto il font WOFF2 incorporato, così l'esempio non dipende da una richiesta di font a terze parti. Le applicazioni di produzione dovrebbero usare il proprio bundler e le proprie regole per gli asset, invece di copiare l'URL di una demo ospitata.

Leggi la specifica di supporto

Esempi di componenti del sistema di design Vant

Selezione dell'indirizzo e modifica con convalida

SFC Vue completo con AddressList, Form, Field, ConfigProvider e una bozza controllata.

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>

Riferimento del codice

  • Il valore selezionato è un ID dell'indirizzo, non la posizione nell'array.
  • Il pulsante fisso per aggiungere indirizzi di AddressList è nascosto; un Button nel flusso apre l'editor.
  • L'invio di Form avviene solo dopo il superamento delle convalide di Field.

Pagina reattiva e focus visibile

Il layout diviso originale per desktop si trasforma in un flusso di consegna per dispositivi mobili.

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}

Riferimento del codice

  • La geometria dei componenti proviene da Vant; il breakpoint della pagina a 680px è una scelta applicativa.
  • L'anteprima ripristina un anello di focus visibile perché il reset di base rimuove i contorni predefiniti.
04

Configurazione dell'agente per il sistema di design Vant

Punto di partenza per l’implementazione

Verificato con Vue 3 e Vant 4.10.2. L'esempio non conserva indirizzi al di fuori dello stato in 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

Un prompt per il tuo progetto

Prompt per l’agente
Parti dal selettore di indirizzi sample-kit di Vant 4.10.2. Mantieni AddressList nativo e il flusso di modifica con Form/Field per aggiungere o modificare un indirizzo locale, inclusi la convalida dei campi e lo stato dell'indirizzo selezionato. Mantieni la configurazione di Locale, il modulo en-US, l'ambito del tema di ConfigProvider e l'adattamento di AddressList all'altezza del contenuto. L'annullamento non deve sostituire un indirizzo esistente; una convalida riuscita aggiorna solo la raccolta locale degli indirizzi. Non aggiungere affermazioni di successo relative a pagamenti o fasce orarie di consegna a questo esempio, dedicato ai soli indirizzi.
05

Fonti e ambito del sistema di design Vant

Vant 4.10.2. I token predefiniti sono distinti dalle scelte originali della pagina. Gli indirizzi di esempio sono fittizi; selezione e modifica avvengono localmente.