Como remover apenas o sublinhado de um: antes?


95

Eu tenho um conjunto de links estilizados usando o :beforepara aplicar uma seta.

Parece bom em todos os navegadores, mas quando aplico o sublinhado ao link, não quero o sublinhado na :beforeparte (a seta).

Veja jsfiddle por exemplo: http://jsfiddle.net/r42e5/1/

É possível remover isso? O estilo de teste com o qual me sentei #test p a:hover:beforeé aplicado (de acordo com o Firebug), mas o sublinhado ainda está lá.

Alguma maneira de evitar isso?

#test {
  color: #B2B2B2;
}

#test p a {
  color: #B2B2B2;
  text-decoration: none;
}

#test p a:hover {
  text-decoration: underline;
}

#test p a:before {
  color: #B2B2B2;
  content: "► ";
  text-decoration: none;
}

#test p a:hover:before {
  text-decoration: none;
}
<div id="test">
  <p><a href="#">A link</a></p>
  <p><a href="#">Another link</a></p>
</div>


Bem, você obviamente quer uma lista ... Use um elemento UL em vez da combinação DIV / P. Com as listas você obtém os marcadores (ou discos, ...) gratuitamente ...
— Šime Vidas

Por que não usar lista com marcadores personalizados em vez de parágrafos no seu caso? Caso contrário, aplique before-content ao pai p, não para vincular a si mesmo.
— YuS de

Respostas:


171

É possível remover isso?

Sim, se você alterar o estilo de exibição do elemento embutido de display:inline(o padrão) para display:inline-block:

#test p a:before {
    color: #B2B2B2;
    content: "► ";
    display:inline-block;
}

Isso ocorre porque as especificações CSS dizem :

Quando especificado ou propagado para um elemento embutido, ele afeta todas as caixas geradas por aquele elemento e é propagado posteriormente para qualquer caixa de nível de bloco de fluxo que divide o embutido (consulte a seção 9.2.1.1). [...] Para todos os outros elementos, ele é propagado para qualquer filho de fluxo. Observe que as decorações de texto não são propagadas para descendentes flutuantes e absolutamente posicionados, nem para o conteúdo de descendentes atômicos de nível embutido, como blocos embutidos e tabelas embutidas .

(Ênfase minha.)

Demo: http://jsfiddle.net/r42e5/10/

Obrigado a @Oriol por fornecer a solução alternativa que me levou a verificar as especificações e ver se a solução alternativa é legal.


2
Você pode substituir um text-decoration:underlineaplicado a um elemento pai com display:inline-block. Veja um exemplo: jsfiddle.net/aZdhN/1 . Então, o problema do solicitante pode ser resolvido assim: stackoverflow.com/a/17347068/1529630
— Oriol

3
Pelo que posso ver, isso não funciona no Internet Explorer (teste 8-10). Alguma ideia de como lidar com o IE?
— Linus Caldwell

Eu encontrei uma solução que está funcionando no IE8-11 também: stackoverflow.com/a/21902566/1607968
— LeJared

53

Há um bug no IE8-11 , então usar display:inline-block;sozinho não funcionará lá.

Eu encontrei uma solução para esse bug, definindo explicitamente text-decoration:underline;para: before-content e, em seguida, sobrescrever essa regra novamente comtext-decoration:none;

a {text-decoration:none;}
a:hover {text-decoration:underline;}
a:before {content:'>\a0'; text-decoration:underline; display:inline-block;}
a:before,
a:hover:before {text-decoration:none;}

Exemplo de trabalho aqui: http://jsfiddle.net/95C2M/

Atualização: Como o jsfiddle não funciona mais com o IE8, basta colar este código de demonstração simples em um arquivo html local e abri-lo no IE8:

<!DOCTYPE html>
<html>
<head>
    <title>demo</title>
    <style type="text/css">
        a {text-decoration:none;}
        a:hover {text-decoration:underline;}
        a:before {content:'>\a0'; text-decoration:underline; display:inline-block;}
        a:before,
        a:hover:before {text-decoration:none;}
    </style>
</head>
<body>
    <a href="#">Testlink</a> With no Underline on hover under before-content
</body>
</html>

Se o IE8 tivesse um caso, o sublinhado de uma imagem com hiperlink só poderia ser desativado por <img style="text-decoration:underline">dentro (e aqui estava a chave)<a style="padding:0; border:none;">
— Bob Stein

Infelizmente, esse jsfiddle não pode ser verificado no IE8 porque jsfiddle não funciona no IE8.
— user2867288 de

Infelizmente não consegui encontrar nenhuma ferramenta de compartilhamento de código online que ainda funcione com o IE8. Eu adicionei um código cortado à resposta acima, que você pode simplesmente colar em um arquivo html e abri-lo localmente no IE8.
— LeJared

Testado e aprovado no IE9, evento sem dois estados diferentes.
— saeraphin

Tinha um link com um ícone em: antes disso, era para NÃO ser sublinhado no estado de repouso, depois ser sublinhado ao passar o mouse, mas não o ícone. Aqui está o que eu tive que fazer para convencer o IE a acertar: a {text-decoration: none} a: before {text-decoration: underline} a: before {text-decoration: none} (sim, sério, primeiro sublinhado, em seguida, substitua por nenhum) a: hover {text-decration: underline} a: hover: before {text-decoration: none}
— Fake Haak

7

Você pode fazer isso adicionando o seguinte ao :beforeelemento:

display: inline-block;
white-space: pre-wrap;

Com display: inline-blocko sublinhado desaparece. Mas então o problema é que o espaço após o triângulo entra em colapso e não é mostrado. Para consertar, você pode usar white-space: pre-wrapou white-space: pre.

Demo : http://jsfiddle.net/r42e5/9/


1
1 para a pre-wrapdica. Eu estava usando content:'►\a0'(\ a0 = & nbsp;)
— Hashbrown

1

Envolva seus links em intervalos e adicione a decoração de texto ao intervalo no a: hover assim,

a:hover span {
   text-decoration:underline;
}

Eu atualizei seu violino para o que acho que você está tentando fazer. http://jsfiddle.net/r42e5/4/


Boa ideia. Foi assim que eu fiz antes. O problema é que esse link é produzido em um sistema cms e nossos clientes estão preenchendo-o como rich text.
— OptimusCrime

que idioma é o CMS? Conseguiria fazer com que ele soltasse o link e depois o envolvesse antes de enviá-lo ao navegador?
— Tetas de

A empresa está usando modx. Acho que poderia fazer isso como uma última saída, mas eu realmente queria anular isso. Acho que não é possível. Obrigado de qualquer forma.
— OptimusCrime

-1

tente usar em seu lugar:

#test p:before {
    color: #B2B2B2;
    content: "► ";
    text-decoration: none;
}

isso vai servir?


Eu tenho muitos parágrafos no meu div, então isso não funcionará. Boa ideia tho.
— OptimusCrime

interessante quem colocou -1 se a resposta aceita sugere o mesmo, mas de forma diferente ...
— Elen

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.