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.