O valor da propriedade da borda tracejada nativa não oferece controle sobre os traços propriamente ditos ... portanto, traga a border-image
propriedade!
Faça sua própria fronteira com border-image
Compatibilidade : Oferece excelente suporte ao navegador (IE 11 e todos os navegadores modernos). Uma borda normal pode ser definida como um substituto para navegadores mais antigos.
Vamos criar estes
Essas bordas exibirão exatamente o mesmo navegador cruzado!
Etapa 1 - Crie uma imagem adequada
Este exemplo tem 15 pixels de largura por 15 pixels de altura e as lacunas atualmente têm 5 px de largura. É um .png com transparência.
Isto é o que parece no photoshop quando ampliado:
É assim que parece escalar:
Controle de folga e comprimento do curso
Para criar intervalos ou traços mais largos / curtos, amplie / reduza os intervalos ou traços na imagem.
Aqui está uma imagem com intervalos maiores de 10 px:
corretamente dimensionado =
Etapa 2 - Crie o CSS - este exemplo requer 4 etapas básicas
Defina a origem da imagem da borda :
border-image-source:url("http://i.stack.imgur.com/wLdVc.png");
Opcional - Defina a largura da imagem da borda :
border-image-width: 1;
O valor padrão é 1. Ele também pode ser definido com um valor de pixel, valor percentual ou como outro múltiplo (1x, 2x, 3x etc). Isso substitui qualquer border-width
conjunto.
Defina a fatia da imagem da borda :
Neste exemplo, a espessura das bordas superior, direita, inferior e esquerda das imagens é de 2px e não há espaço fora delas, portanto, o valor da fatia é 2:
border-image-slice: 2;
As fatias ficam assim, a 2 pixels da parte superior, direita, inferior e esquerda:
Defina a repetição da imagem da borda :
Neste exemplo, queremos que o padrão se repita uniformemente em torno de nossa div. Então escolhemos:
border-image-repeat: round;
Escrevendo taquigrafia
As propriedades acima podem ser definidas individualmente ou em forma abreviada usando border-image :
border-image: url("http://i.stack.imgur.com/wLdVc.png") 2 round;
Exemplo completo
Observe o border: dashed 4px #000
fallback. Navegadores não compatíveis receberão essa borda.
.bordered {
display: inline-block;
padding: 20px;
/* Fallback dashed border
- the 4px width here is overwritten with the border-image-width (if set)
- the border-image-width can be omitted below if it is the same as the 4px here
*/
border: dashed 4px #000;
/* Individual border image properties */
border-image-source: url("http://i.stack.imgur.com/wLdVc.png");
border-image-slice: 2;
border-image-repeat: round;
/* or use the shorthand border-image */
border-image: url("http://i.stack.imgur.com/wLdVc.png") 2 round;
}
/*The border image of this one creates wider gaps*/
.largeGaps {
border-image-source: url("http://i.stack.imgur.com/LKclP.png");
margin: 0 20px;
}
<div class="bordered">This is bordered!</div>
<div class="bordered largeGaps">This is bordered and has larger gaps!</div>
border-style: solid
(ou algo semelhante) se você omitir o fallback.Em adição ao
border-image
propriedade, existem algumas outras maneiras de criar uma borda tracejada com controle sobre o comprimento do traçado e a distância entre eles. Eles são descritos abaixo:Método 1: usando SVG
Podemos criar a borda tracejada usando um
path
ou umpolygon
elemento e definindo astroke-dasharray
propriedade A propriedade usa dois parâmetros em que um define o tamanho do traço e o outro determina o espaço entre eles.Prós:
border-radius
envolvido. Teríamos apenas substituído opath
com umcircle
igual nesta resposta (ou) convertido opath
em um círculo.Contras:
vector-effect='non-scaling-stroke'
(como na segunda caixa), mas o suporte ao navegador para essa propriedade é nulo no IE.Mostrar snippet de código
Método 2: usando gradientes
Podemos usar várias
linear-gradient
imagens de fundo e posicioná-las adequadamente para criar um efeito de borda tracejada. Isso também pode ser feito com a,repeating-linear-gradient
mas não há muita melhoria devido ao uso de um gradiente de repetição, pois precisamos que cada gradiente seja repetido em apenas uma direção.Mostrar snippet de código
Prós:
Contras:
border-radius
está envolvido porque os fundos não se curvam com baseborder-radius
. Eles são cortados em seu lugar.Método 3: sombras da caixa
Podemos criar uma pequena barra (na forma do traço) usando pseudo-elementos e depois criar vários
box-shadow
versões para criar uma borda, como no trecho abaixo.Se o traço tiver uma forma quadrada, um único pseudoelemento seria suficiente, mas se for um retângulo, precisaríamos de um pseudoelemento para as bordas superior + inferior e outro para as bordas esquerda + direita. Isso ocorre porque a altura e a largura do traço na borda superior serão diferentes das da esquerda.
Prós:
Contras:
border-radius
mas posicioná-los seria muito complicado por ter que encontrar pontos em um círculo (e possivelmente atétransform
).Mostrar snippet de código
fonte
pointer-events:none
ao svg inorder para poder interagir com o conteúdo.Curto: Não, não é. Você terá que trabalhar com imagens.
fonte
Existe uma ferramenta interessante feita por @kovart chamada gerador de borda tracejada .
Ele usa um svg como imagem de fundo para permitir a configuração do traço do traço desejado, e é bastante conveniente.
Você poderia simplesmente usá-lo como a propriedade background em seu elemento no lugar da borda:
fonte
O comprimento do curso depende da largura do curso. Você pode aumentar o comprimento aumentando a largura e ocultando parte da borda pelo elemento interno.
https://jsfiddle.net/ok6srt2z/
fonte
pointer-events: none
para evitar o problema de sobreposição.Recentemente, tive o mesmo problema.
Consegui resolvê-lo com duas divs absolutamente posicionadas carregando a borda (uma para horizontal e outra para vertical) e depois transformá-las. A caixa externa só precisa ser relativamente posicionada.
Nota: usei taquiões neste exemplo, mas acho que as classes são autoexplicativas.
fonte
Isso criará uma borda laranja e cinza usando a classe = "minhaclasse" na div.
fonte