Come rimuovere lo stato attivo attorno ai pulsanti al clic


226

I miei pulsanti hanno tutti un punto culminante intorno a loro dopo aver fatto clic su di essi. Questo è in Chrome.

Non selezionato Selezionato

<button class="btn btn-primary btn-block">
    <span class="icon-plus"></span> Add Page
</button>

Sto usando Bootstrap con un tema, ma sono abbastanza sicuro che non lo sia: lo stavo già notando su un altro progetto.

Va via se uso un <a>tag anziché <button>. Perché? Se volessi usare <button>come lo farei andare via?


12
contorno: 0; potrebbe interessarti
Wiggler Jtag,

Qualche classe viene aggiunta dopo il clic?
Kuzgun,

1
schema: 0 non sembra aiutare, né aspetto webkit
Sean Clark Hess,

7
28 risposte a tutti suggerendo che metodi diversi per aggirare questo problema sono la prova del triste stato di sviluppo del front-end di oggi.
deltanine,

3
Le persone che considerano questa funzionalità di accessibilità un problema sono la testimonianza del triste stato di sviluppo del front-end di oggi.
Quentin,

Risposte:


293

Ho trovato queste domande e risposte in un'altra pagina e l'override dello stile di attivazione dei pulsanti ha funzionato per me. Questo problema può essere specifico per MacOS con Chrome.

.btn:focus {
  outline: none;
  box-shadow: none;
}

Si noti tuttavia che ciò ha implicazioni per l'accessibilità e non è consigliato fino a quando non si dispone di un buono stato di messa a fuoco coerente per i pulsanti e gli input. Secondo i commenti qui sotto, ci sono utenti là fuori che non possono usare i topi.


33
Ho pensato anche a questo, ma la rimozione del contorno non ha problemi di accessibilità?
Silvenon,

10
Immagino che non abbiamo altra scelta. Puoi anche aggiungere il .btn:active:focusselettore per rimuoverlo anche dallo stato attivo.
Silvenon,

45
La rimozione del contorno da un pulsante è decisamente dannosa per l'accessibilità. Ci sono utenti che non possono controllare un mouse e devono essere in grado di scorrere una pagina con la tastiera. La rimozione del contorno lo rende molto difficile. Probabilmente è meglio evitare che il pulsante riceva lo stato attivo sul clic.
Murphy Randle,

Per i viaggiatori futuri, questo codice sostituisce completamente tutti gli stili in tutti gli stati dei pulsanti per il pulsante predefinito (non tutti i pulsanti):.btn-default, .btn-default:hover, .btn-default:active, .btn-default:active:focus, .btn-default:visited, .btn-default:focus { color: #dcdcdc; background-color: #232323; outline: none; }
Geordie

1
se si utilizzano variabili bootstrap integrate, è possibile ottenere ciò impostando questi due parametri su: $ btn-focus-width: 0; $ btn-focus-box-shadow: none;
bullettrain

109

Vuoi qualcosa come:

<button class="btn btn-primary btn-block" onclick="this.blur();">...

Il metodo .blur () rimuove correttamente l'evidenziazione del focus e non confonde gli stili di Bootstraps.


9
Questo mostra lo schema per un breve momento, che lo rovina ancora: /
silvenon

2
Non vedo sfarfallio se innesco l'evento focus invece dell'evento click.
Charles,

2
Questo ha funzionato alla grande! Ci sarebbero potenziali problemi se provassi ad associare un diverso gestore di eventi click () (cioè il codice che viene eseguito quando si fa clic su detto pulsante) allo stesso pulsante?
Nils_e,

4
Se qualcuno si sta chiedendo se questo funziona in bootstrap v4, lo fa. Risposta ancora valida nel 2018, evviva!
giunse

4
È l'accessibilità-OK, rispetto alla domanda più votata?
CharlesM,

47

la mia comprensione è che l'attenzione viene prima applicata dopo l' onMouseDownevento, in modo da chiamare e.preventDefault()inonMouseDown può essere una soluzione pulita a seconda delle esigenze. Questa è certamente una soluzione di accessibilità, ma ovviamente regola il comportamento dei clic del mouse che potrebbe non essere compatibile con il tuo progetto web.

Attualmente sto usando questa soluzione (all'interno di un react-bootstrapprogetto) e non ricevo uno sfarfallio della messa a fuoco o lo stato attivo dei pulsanti dopo un clic, ma sono ancora in grado di impostare la mia messa a fuoco e visualizzare visivamente lo stato attivo degli stessi pulsanti.


2
Sì. la tua soluzione funziona. Grazie per il consiglio. Ecco il violino per la soluzione. Ma richiede un gestore javascript da allegare a ogni pulsante. Sarebbe bello se riuscissimo a raggiungere questo obiettivo solo attraverso la soluzione CSS.
Galeel Bhasha,

1
Penso che le persone si aspettino che l'attenzione si concentri su un elemento quando si fa clic su di esso e questa soluzione lo impedisce. Faccio spesso clic su un elemento e poi mi allontano prima di rilasciare il mouse per focalizzarlo in modo da poterlo selezionare da lì in poi.
Michael Tontchev,

7
Per chiunque cerchi uno snippet, questo dovrebbe funzionare e preservare su Click:onMouseDown={e => e.preventDefault()}
Adam K Dean

1
Ciò impedisce alla barra spaziatrice e al tasto Invio di "fare clic" sul pulsante. Forse una soluzione più completa è quella di aggiungere questo nuovo con: onKeyUp={(e) => {if (e.keyCode === 13 || e.keyCode === 32) handleClick()}.
jfbloom22,

Non è necessario chiamare e.preventDefault () all'interno onKeyUpdell'evento. Si scopre se lo si fa, quindi il pulsante rimane attivo dopo aver premuto il tasto spazio o il tasto Invio e facendo clic o facendo clic in un punto qualsiasi.
jfbloom22,

30

Non riesco a credere che nessuno l'abbia ancora pubblicato.

Usa un'etichetta invece di un pulsante.

<label type="button" class="btn btn-primary btn-block">
<span class="icon-plus"></span> Add Page
</label>

Violino


11
Questo funziona bene per la maggior parte degli utenti, ma questo metodo non è amichevole per gli screen reader o per le tastiere e lascerà gli utenti non vedenti e gli utenti con abilità motorie compromesse, incapaci di interagire con il pulsante.
Murphy Randle,

8
1. Sostituire l'etichetta con il tag <a>. in modo che sia accessibile tramite tastiera. 2. aggiungere aria-role = "button" per migliorare l'accessibilità per l'utente dello screen reader. Fiddle
Galeel Bhasha

bella soluzione, mi ha aiutato, ma in qualche modo non funziona per direttiva angolare, anche con un involucro, ad esempio<a class="btn"><my-directive/></a>
ya_dimon

2
Le etichette vengono totalmente ignorate per gli utenti non mouse durante la tabulazione, male per l'accessibilità
Felipe,

1
In Bootstrap 4 sembra alterare l'aspetto del pulsante.
Jason Kim,

30

Anche se è facile rimuovere il contorno per tutti i pulsanti focalizzati (come nella risposta dell'utente 1933897 ), ma quella soluzione è pessima dal punto di vista dell'accessibilità (ad esempio, vedi Interrompi messaggistica con la struttura Focus predefinita del browser )

D'altra parte, è probabilmente impossibile convincere il tuo browser a smettere di definire come focalizzato il tuo pulsante cliccato se pensa che sia focalizzato dopo averlo cliccato (ti sto guardando, Chrome su OS X).

Quindi cosa possiamo fare? Mi vengono in mente un paio di opzioni.

1) Javascript (jQuery): $('.btn').mouseup(function() { this.blur() })

Stai chiedendo al tuo browser di rimuovere lo stato attivo attorno a qualsiasi pulsante immediatamente dopo aver fatto clic sul pulsante. Usando mouseupinvece di clickmantenere il comportamento predefinito per le interazioni basate sulla tastiera ( mouseupnon viene attivato dalla tastiera).

2) CSS: .btn:hover { outline: 0 !important }

Qui si disattiva la struttura solo per i pulsanti al passaggio del mouse . Ovviamente non è l'ideale, ma potrebbe essere sufficiente in alcune situazioni.


4
Il numero 1 è un suggerimento utile. Disabiliterà la messa a fuoco quando il pulsante non viene premuto, tuttavia lo lascerà visualizzato mentre è premuto. Ho disabilitato il focus sull'elemento attivo cliccato con :active:focus {outline:none;}.
sicuramente il

Le funzioni abbreviate che legano i listener di eventi sono deprecate in jQuery, quindi è meglio se lo usi .on('mouseup', function() { ... })invece di.mouseup()
Crazy Redd

16

Questo ha funzionato per me. Ho creato una classe personalizzata che sostituisce il CSS necessario.

.custom-button:focus {
    outline: none !important;
    border: none !important;
    -webkit-box-shadow: none !important;
    box-shadow: none !important;
}

inserisci qui la descrizione dell'immagine

-Webkit-box-shadow funzionerà con i browser Chrome e Safari.


funziona per me, ma ho dovuto rimuovere il border: none !important;pulsante per mantenere le stesse dimensioni
Emeka Mbah

1
Stavo cercando di rimuovere il focus onClick sopra le risposte non ha funzionato ma "box-shadow: none! Important;" il suo lavoro per me grazie @Menaka
Zaif Warm il

11

Questo funziona per me, un'altra soluzione non menzionata. Basta lanciarlo nell'evento click ...

$(this).trigger("blur");

O chiamalo da un altro evento / metodo ...

$(".btn_name").trigger("blur");

Il problema è che quando un utente della tastiera "fa clic" sul pulsante (focalizzandolo e premendo spazio) perde la messa a fuoco. Devi quindi tornare indietro fino a dove eri. 😡
Tamlyn,

8

Se si utilizza la regola :focus { outline: none; }per rimuovere i contorni, il collegamento o il controllo saranno attivabili ma senza indicazione di attivazione per gli utenti della tastiera. Metodi per rimuoverlo tale con JS comeonfocus="blur()" sono anche peggio e comporteranno l'impossibilità per gli utenti della tastiera di interagire con il controllo.

Gli hack che puoi usare, che sono in qualche modo OK , includono l'aggiunta di :focus { outline: none; }regole quando gli utenti interagiscono con il mouse e li rimuovono se viene rilevata un'interazione da tastiera. Lindsay Evans ha fatto una lib per questo: https://github.com/lindsayevans/outline.js

Preferirei impostare una classe sul tag html o body. E avere il controllo nel file CSS di quando utilizzare questo.

Ad esempio (i gestori di eventi inline sono solo a scopo dimostrativo):

<html>
<head>
<style>
  a:focus, button:focus {
    outline: 3px solid #000;
  }
  .no-focus a, .no-focus button {
    outline: none;
  } 
</style>
</head>
<body id="thebody" 
onmousedown="document.getElementById('thebody').classList.add('no-focus');"
onkeydown="document.getElementById('thebody').classList.remove('no-focus');">
    <p>This her is <a href="#">a link</a></p>   
    <button>Click me</button>
</body>
</html>

Ho messo insieme una penna: http://codepen.io/snobojohan/pen/RWXXmp

Ma attenzione, ci sono problemi di prestazioni. Questo costringe a ridipingere ogni volta che l'utente passa tra mouse e tastiera. Maggiori informazioni su Come evitare vernici non necessarie http://www.html5rocks.com/en/tutorials/speed/unnecessary-paints/


6

Ho notato lo stesso e anche se mi dà davvero fastidio, credo che non ci sia un modo corretto di gestirlo.

Vorrei raccomandare contro tutte le altre soluzioni fornite perché eliminano completamente l'accessibilità del pulsante, quindi ora, quando si fa clic sul pulsante, non si ottiene lo stato attivo previsto.

Questo dovrebbe essere evitato!

.btn:focus {
  outline: none;
}

Non penso che sia sbagliato, perché hai ancora un fulmine leggermente diverso sul pulsante quando messo a fuoco, quindi anche gli utenti di tastiera possono ancora riconoscerlo. Ma questo non è abbastanza, perché otterrai ancora la cornice del bordo quando premi e tieni premuto il pulsante sinistro del mouse
apocalypz,

6

Trovo una soluzione quando ci concentriamo, bootstrap usa box-shadow, quindi lo disabilitiamo (non abbastanza reputazione, impossibile caricare l'immagine :().

aggiungo

.btn:focus{
    box-shadow:none !important;
}

Funziona.


6

OPZIONE 1: utilizzare la :focus-visiblepseudo-classe

La :focus-visiblepseudo-classe può essere utilizzata per eliminare i contorni sgradevoli e gli anelli di messa a fuoco sui pulsanti e sui vari elementi per gli utenti che NON navigano tramite tastiera (ovvero, tramite tocco o clic del mouse).

/** 
 * The default focus style is likely provided by Bootstrap or the browser
 * but here we override everything else with a visually appealing cross-
 * browser solution that works well on all focusable page elements
 * including buttons, links, inputs, textareas, and selects.
 */
*:focus { 
  outline: 0 !important;
  box-shadow:
    0 0 0 .2rem #fff, /* use site bg color to create whitespace for faux focus ring */
    0 0 0 .35rem #069 !important; /* faux focus ring color */
}

/**
 * Undo the above focused button styles when the element received focus
 * via mouse click or touch, but not keyboard navigation.
 */
*:focus:not(:focus-visible) {
  outline: 0 !important;
  box-shadow: none !important;
}

Avvertenza: a partire dal 2020, la :focus-visiblepseudo-classe non è ampiamente supportata da tutti i browser . Tuttavia il polyfill è molto facile da usare; vedere le istruzioni di seguito.


OPZIONE 2: utilizzare il .focus-visiblepolyfill

Questa soluzione utilizza una normale classe CSS anziché la pseudo-classe sopra menzionata e ha un ampio supporto del browser perché è un polifill ufficiale basato su Javascript .

Passaggio 1: aggiungi le dipendenze Javascript alla tua pagina HTML

Nota: il polyfill con focus visibile richiede un polyfill aggiuntivo per diversi browser meno recenti che non supportano classList :

<!-- place this code just before the closing </html> tag -->
<script src="https://cdn.polyfill.io/v2/polyfill.js?features=Element.prototype.classList"></script>
<script src="https://unpkg.com/focus-visible"></script>

Passaggio 2: aggiungi il seguente CSS al tuo foglio di stile

La seguente è una versione modificata della soluzione CSS documentata in modo più approfondito sopra.

/**
 * Custom cross-browser styles for keyboard :focus overrides defaults.
 */
*:focus { 
  outline: 0 !important;
  box-shadow:
    0 0 0 .2rem #fff,
    0 0 0 .35rem #069 !important;
}

/**
 * Remove focus styles for non-keyboard :focus.
 */
*:focus:not(.focus-visible) {
  outline: 0 !important;
  box-shadow: none !important;
}

Passaggio 3 (facoltativo): utilizzare la classe 'focus-visible' ove necessario

Se hai elementi in cui vuoi effettivamente mostrare l'anello di messa a fuoco quando qualcuno fa clic o usa il tocco, aggiungi semplicemente la focus-visibleclasse all'elemento DOM.

<!-- This example uses Bootstrap classes to theme a button to appear like
     a regular link, and then add a focus ring when the link is clicked --->
<button type="button" class="btn btn-text focus-visible">
  Clicking me shows a focus box
</button>

Risorsa:

demo:


Ma se anche Chrome non lo supporta ancora, probabilmente non è la soluzione migliore (per ora)
Elijah Mock

Cosa suggerisci invece?
JamesWilson,

Nascondi lo schema come dicono le altre risposte fino a quando questa soluzione non sarà più standardizzata
Elijah Mock

Dalla mia lettura delle cose, se l'accessibilità è una preoccupazione, nascondere il contorno carta bianca <whatever>:focus { outline: none }è un'idea peggiore di questa soluzione. In realtà ci sono persone nella comunità dell'accessibilità che preferiscono che NON rimuoviate MAI la struttura e invece faccia in modo che tutto abbia uno: stile di messa a fuoco (contorno o box-shadow), e non vogliono supportarlo: focus-visibile finché i browser non implementano un modo per consentire gli utenti specificano una preferenza dell'utente sul fatto che tutti gli elementi debbano essere attivabili o meno. Mi piace pensare: focus-visible è un mezzo felice tra preoccupazioni progettuali e a11y.
JamesWilson

5

Se quanto sopra non funziona per te, prova questo:

.btn: focus {outline: none; box-shadow: none; border: 2px solid transparent;}

Come sottolineato dall'utente1933897, questo potrebbe essere specifico per MacOS con Chrome.


Tuttavia, ciò è valido quando si utilizza bootstrap 4.0- in Windows
3gwebtrain il

5

In ritardo, ma chi lo sa può aiutare qualcuno. Il CSS sarebbe simile a:

.rhighlight{
   outline: none !important;
   box-shadow:none
}

L'HTML sarebbe simile a:

<button type="button" class="btn btn-primary rHighlight">Text</button> 

In questo modo puoi mantenere btn e i suoi comportamenti associati.


1
element:focus { box-shadow: none; }rimosso il contorno / ombra blu.
user435421

3

L'ho menzionato in un commento sopra, ma vale la pena elencarlo come una risposta separata per chiarezza. Fintanto che non hai bisogno di concentrarti sul pulsante, puoi utilizzare l'evento focus per rimuoverlo prima che possa applicare qualsiasi effetto CSS:

$('buttonSelector').focus(function(event) {
    event.target.blur();
});

Questo evita lo sfarfallio che può essere visto quando si utilizza l'evento click. Ciò limita l'interfaccia e non sarà possibile eseguire la tabulazione sul pulsante, ma non è un problema in tutte le applicazioni.


Questo ha fatto la metà del trucco per me. Sto usando React e React-Bootstrap. Dopo il clic, il pulsante è stato evidenziato con un bagliore attorno a questo. Aggiunta di e.target.blur (); rimuove il bagliore, ma il pulsante rimane di un colore diverso.
pixelwiz,

3

Stile

.not-focusable:focus {
    outline: none;
    box-shadow: none;
}

utilizzando

<button class="btn btn-primary not-focusable">My Button</button>

In che modo questa soluzione è diversa dalle altre risposte?
aprile

2
C'è solo una piccola differenza: puoi rimuovere lo stato attivo per gli elementi di cui hai bisogno specificando la classe "non focalizzabile" senza ignorare il comportamento di tutti i pulsanti, i collegamenti ecc.
Bogdan Kanteruk

3

Prova questa soluzione per rimuovere il bordo attorno al pulsante. Aggiungi questo codice in CSS.

Provare

button:focus{
outline:0px;
}

Se non funziona, utilizzare di seguito.

button:focus{
 outline:none !important;
 }

Il secondo funziona anche con il pulsante React Material UI
Geek Guy,

3

Per le persone che desiderano un modo css puro per farlo:

:focus:not(:focus-visible) { outline: none }

Questo potrebbe funzionare anche per il collegamento e così via, e bonus, mantiene l'accessibilità della tastiera. Infine, viene ignorato dai browser che non supportano: focus-visible


4
Funzionerà solo su Chrome con funzioni sperimentali abilitate, come da developer.mozilla.org/en-US/docs/Web/CSS/:focus-visible
Justin Kahn

focus-visibleora ha un polyfill ufficiale. La mia risposta stackoverflow.com/a/60219624/413538 su questa domanda approfondisce come dare un senso a tutto ciò.
JamesWilson,

2

Abbiamo riscontrato un problema simile e abbiamo notato che Bootstrap 3 non presenta il problema nelle schede (in Chrome). Sembra che stiano usando lo stile di contorno che consente al browser di decidere cosa fare meglio e Chrome sembra fare quello che vuoi: mostra il contorno quando focalizzato a meno che non abbia appena fatto clic sull'elemento.

Il supporto per outline-styleè difficile da definire poiché il browser decide cosa significhi. Meglio controllare alcuni browser e avere una regola di fallback.


2

Un'altra possibile soluzione è quella di aggiungere una classe utilizzando un listener Javascript quando l'utente fa clic sul pulsante e quindi rimuovere quella classe in primo piano con un altro listener. Ciò mantiene l'accessibilità (tabulazione visibile) impedendo al contempo il comportamento bizzarro di Chrome di considerare un pulsante focalizzato quando si fa clic.

JS:

$('button').click(function(){
    $(this).addClass('clicked');
});
$('button').focus(function(){
    $(this).removeClass('clicked');
});

CSS:

button:focus {
    outline: 1px dotted #000;
}
button.clicked {
    outline: none;
}

Esempio completo qui: https://jsfiddle.net/4bbb37fh/


Usa mouseDown invece di fare clic. Al clic, il contorno appare mentre il mouse viene premuto (senza rilasciarlo) iniziale.
Vincent Hoch-Drei,


2
.btn:focus:active {
  outline: none;
}

questo rimuove il contorno al clic, ma mantiene lo stato attivo durante la tabulazione (per a11y)


Questo rimuove solo il contorno del mouse verso il basso. Dopo il passaggio del mouse, viene visualizzato il contorno.
Fonte

2

Funziona meglio

.btn-primary.focus, .btn-primary:focus {
-webkit-box-shadow: none!important;
box-shadow: none!important;
}

1
  .btn:focus,.btn:active, a{
        outline: none !important;
        box-shadow: none;
     }

questo schema: nessuno funzionerà sia per il pulsante che per un tag


Come risponde alla domanda? Si prega di aggiungere alcune spiegazioni.
André Kool,

1

Aggiungi questo nei CSS:

*, ::after, ::before {
    box-sizing: border-box;
    outline: none !important;
    border: none !important;
    -webkit-box-shadow: none !important;
    box-shadow: none !important;
}

1

Ho trovato una soluzione semplicemente aggiungere sotto la riga nel tuo codice CSS.

button:focus { outline: none }

0

Ho avuto questo stesso problema su MacOS e Chrome mentre utilizzavo un pulsante per attivare un evento di "transizione". Se qualcuno che sta leggendo questo sta già utilizzando un listener di eventi, puoi risolverlo chiamando le .blur()tue azioni.

Esempio:

 nextQuestionButtonEl.click(function(){
    if (isQuestionAnswered()) {
        currentQuestion++;
        changeQuestion();
    } else {
        toggleNotification("invalidForm");
    }
    this.blur();
});

Tuttavia, se non stai già utilizzando un listener di eventi, aggiungerne uno solo per risolvere questo problema potrebbe aggiungere un sovraccarico non necessario e una soluzione di stile come le risposte precedenti fornisce è migliore.


0

Puoi impostare tabIndex="-1". Il browser salterà questo pulsante quando TAB attraverso i controlli attivabili.

Altre "correzioni" suggerite qui, rimuovono solo il contorno del focus, ma lasciano ancora i pulsanti tababili. Tuttavia, dal punto di vista dell'usabilità, hai già rimosso il bagliore, quindi l'utente non saprà in alcun modo quale sia il pulsante attualmente focalizzato.

D'altra parte, rendere il pulsante non tabulare ha implicazioni sull'accessibilità.

Lo sto usando per rimuovere il contorno del focus dal pulsante X in bootstrap modal, che ha il pulsante "Chiudi" duplicato in basso in ogni modo, quindi la mia soluzione non ha alcun impatto sull'accessibilità.


0

Se stai usando un browser webkit (e potenzialmente un browser compatibile con il prefisso del fornitore webkit), quel contorno appartiene alla -webkit-focus-ringpseudoclasse del pulsante . Basta impostare outlinesu none:

*:-webkit-focus-ring {
  outline: none;
}

Chrome è un tale browser webkit e questo effetto si verifica anche su Linux (non solo una cosa macOS, anche se alcuni stili di Chrome sono solo macOS)


0

Stavo <a>riscontrando lo stesso problema usando la funzione di pulsante e ho scoperto che mancava una soluzione alternativa aggiungendo attr type="button", almeno per me si comporta normalmente.

<a type="button" class="btn btn-primary">Release Me!</a>


L' typeattributo non dovrebbe avere alcun effetto su questo, ed buttonè un valore non valido per questo. L'attributo accetta un tipo MIME e indica al client quale tipo di dati dovrebbe aspettarsi di ottenere se segue il collegamento (ad es <a type="application/pdf" ...>.
Quentin

@Quentin Grazie. Sì, ne sono consapevole. Ho iniziato con, role="button"ma non ha funzionato (dopo aver usato un <button>invece di <a>). La mia implementazione ha richiesto specificamente <a>e non <button>. Quindi, dopo aver armeggiato molto, ho scoperto questa soluzione alternativa (molto probabilmente un bug BS)!
spcsLrg

0

direttamente nel tag html (in uno scenario in cui potresti voler lasciare il tema bootstrap in posizione altrove nel tuo design) ..

esempi da provare ..

<button style="border: transparent;">
<button style="border: 1px solid black;">

..ect ,. a seconda dell'effetto desiderato.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.