2017-10-23 9 views
0

SVGアイコンに使用される擬似要素::beforeでアンカーを作成しました。 ::beforeの場合、position: relativeの場合、上/左を使用する場合は負の値、下/右を使用する場合は正の値のいずれかに配置すると、text-overflow: ellipsis機能が中断されます。例えば擬似要素が配置されているとテキストオーバーフローが発生する

a { 
 
    display: block; 
 
    border: 1px solid blue; 
 
    text-overflow: ellipsis; 
 
    white-space: nowrap; 
 
    overflow: hidden; 
 
    width: 200px; 
 
} 
 

 
a::before { 
 
    content: ''; 
 
    display: inline-block; 
 
    width: 20px; 
 
    height: 20px; 
 
    border: 1px solid red; 
 
    position: relative; 
 
} 
 

 
a.test2::before, a.test3::before { 
 
    left: -1px; 
 
} 
 

 
a.test3::before { 
 
    position: absolute; 
 
}
<a class="test1">some very long text which overflows</a> 
 
<a class="test2">some very long text which overflows</a> 
 
<a class="test3">some very long text which overflows</a>

、テキストが(少なくともクロム61、MacOSの中に)これらの例の各々において省略記号が、第1破断をオーバーフローさせ得るべきです。

macのFirefox 56はではないと思われます。にこの問題があります。

position: absoluteなどを使用すると、問題が解決しますが、の理由がわかりません。これが発生します。

enter image description here

答えて

-1

Pseudo-elementsずっと定期的な要素を、staticのデフォルトpositionを持っています。任意の形式のオフセット(例:left)を静的に配置すると効果はありません。 ただし、の場合は、これら3つの疑似要素にpositionrelativeを明示的に適用しています。相対的に配置された要素は「文書の通常の流れにとどまる」と、親のオフセットに相対的である。それらのオフセット計算は、親オフセットを考慮しての後にを適用します。

批判的に<body>デフォルト8pxmarginを持っています。このマージンを明示的に変更しない限り、relativeの位置を持つ直接の子要素のデフォルトはleftで、8pxになります。したがって、最初の要素は8pxでオフセットされ、2番目の要素は7px8pxから手動で指定されたleft: 1pxを引いたもの)だけオフセットされます。

あなたはabsoluteの位置を適用すると、この位置は「最も近い位置付け祖先(staticではありませんつまり、最も近い祖先)に相対的である。配置祖先が存在しない場合は、初期の容器が使用されています"あなたの場合、それは<body>です。

絶対配置は、パレンタルパディングを無視します。そここれはhereをなぜ起こるかに多大な答えだが、要するに、position: absoluteが入っている箱親のパディングボックスではなく、コンテンツボックスになります。従って、第3の擬似要素は、0pxの(理論的)デフォルト値leftを有する。の場合、これはではありません。デフォルトではが適用されます。 leftは、影響を受けるには手動で指定する必要があります。left: -1pxを手動で指定すると、オフセットが適用され、1pxのオフセットが左に<body>となります。

これは説明するのに役立ちますなぜこれが起こっている! :)

+0

テキストオーバーフローの計算に関連する説明は表示されません。実際の問題は 'body> a 'よりはるかに深いことになります。これは、' body'のマージン/パディングに関係なく再現できるので、含まれる要素は無関係です。私は個人的には既にポジショニングの仕組みを理解していますが、テキスト*が明らかにオーバーフローしているにもかかわらず、テキストオーバーフローがもはや適用されない理由については言及していません。 – helion3

+0

ボックスは、 'position:absolute'のために考慮される親のオフセットであるため、左に配置されます。より深いレベルで階層的な問題がある場合は、親要素に 'position'を指定していないか、' padding'または 'margin'を追加しているためです。あふれていないテキストは、占有スペースと切り詰めようとしている要素のオフセットの両方のクォークであるようです。疑似要素から 'position:absolute'を削除するか、コンテナに' position:relative'を追加して解決してください。 –

+0

私は自分の投稿ではっきりしていないかもしれませんが、私はポジショニングについて質問していません、ポジショニングの仕組みを完全に理解しています。私が持っている唯一の質問に答えると、あなたはそれが "変わったようです"と言っている、それは役に立たない。 – helion3