2012-05-02 15 views
12

擬似要素::outsideを使用したいと思っていますが、主要なブラウザのどれもそれをサポートしていないようです(今日のテストに基づいています)。CSS3 :: outside擬似要素のサポートを有効にする

このセレクタを有効にするJSポリフィルがありますか?または、これをシミュレートするための良いテクニックがありますか?

+0

を '破壊の問題を回避する李、内部のAPを追加... Marcinsソリューションの最適化です::外側?私はこのセレクタについて聞いたことがありません。それを説明する何らかのドキュメントへのリンクがありますか? – animuson

+1

@animuson http://www.w3.org/TR/css3-content/#wrapping – Marcin

+1

@animuson:CSS3の新しい擬似要素はそれぞれのモジュールに移動されているので、 ':: outside'は* never *セレクタに登場しました。 – BoltClock

答えて

18

あなたは正しいです:存在するブラウザには古代のCSS3 Generated and Replaced Content moduleの新機能が実装されていないため、提案された擬似要素を試すことはできません。実際、彼らはモジュール自体を書き直すつもりであるので、現行の作業草案は放棄されるべきだと思うべきです。残念ながら、これらの提案された機能の運命は分かりません。

とにかく、これらの擬似要素に使用可能なJSポリフィルも認識していないので、あなたのCSSに::outsideを使用してセレクタを書くのは大変です。

最も近いのは、コンテナでスタイルを設定する要素の周りに実際の要素をラップすることです。これは、たとえばjQueryの.wrap()または.wrapAll()などで安価に実現できます。

ので、代わりにこれを行う:

p::outside { 
    display: block; 
    border: 3px solid #00f; 
} 

あなたはこれを行うだろう:

$('p').wrap('<div class="outside-p" />'); 
/* 
* Notice that you can't select only .outside-p that contains p:only-child, 
* so you'll have to come up with esoteric class names. 
*/ 
.outside-p { 
    border: 3px solid #00f; 
} 

jsFiddle preview

これにはいくつかの注意点があり、しかし:

  • これは主にDOMに依存します。状況によっては、他の要素の周りに特定の要素をラップすることはできません。可能であれば、それらのラッパー要素は実際の親要素の振る舞いやスタイリングを妨害することになります。

    例えば、それはこのような場合には、子セレクタを使用してからあなたを防ぐ:

    あなたにそれらのラッパー要素がarticle間の親子関係を壊すだろう、jQuery.wrap()にそれらのp要素を意図し
    article > p 
    

    およびp

  • スペックは::before::afterなどの::outside擬似要素は、それらを生成元素からスタイルを継承することになっていると述べています。 JavaScript/jQueryを使用してラッパーを追加すると、それらのラッパーはラッパーではなく親エレメントからスタイルを継承します。これは、継承規則に通常従って、子要素として挿入されることを意図しているので、::before::afterをポリ充てんするときに問題になることはありません。

+0

私の答えを見てください。私はラッピングに関するいくつかの問題を修正していると思います':: outside'のターゲットのまわりで。 – Marcin

+3

どのように優先順位は低くなりますか?本当にきれいなHTMLを簡単に書くことはできないでしょうか?あなたが望むスタイリング効果を達成するためにdivで要素を折り返さなければならないことが時々あるのは嫌です。 –

+0

@Cameron Martin:アニメーション、フレックスボックス、そしてそのすべてのジャズを気にする人はいますか? – BoltClock

2

私はようやく私のページに、このスニペットを追加しました:

$('ol > li').each(function(){ 
     var $this = $(this); 
     var $content = $($this.contents()); 
     $content.wrapAll('<p class="liwrap"/>'); 
    }); 

これがありますので、子セレクタを破壊し、(クラスに対して難解な名前を必要とする問題を回避li、内部pを追加親セレクターなし)。 ::outside::beforeに置き換えることができるため、スタイルを継承しないという問題も回避します。

しかし、適切な視覚効果を実現するには、内側を生成されたコンテンツのレベルに上げるには負のマージンが必要です。

2

あなたはjQueryのを使用しているように見えます、そして、私はあなたのコードに小さな変更を示唆している

$('ol > li').wrapInner("<p class='liwrap' />"); 

その場合には、それは非常に多くの変数や関数呼び出しなしで、従うことを少しクリーンで簡単です。

編集: 畏敬の念が正しく指摘するように、これは

は、子セレクタ

+1

明確にする:これは、[Marcins answer](http://stackoverflow.com/a/10429936/109392)のソリューションの改善です。これが元の問題をどのように解決するかについては、彼の答えを参照してください。 – awe