3

私のウェブページで、カスタムスクロールバーを取得しようとしています。正常に動作しています。

これで、ユーザーが黒のテーマまたは白のテーマのいずれかを選択できるテーマボタンができました。このために、2つのcssファイルを作成しました。1つはcarbon.css、もう1つはquartz.cssです。

ユーザーがテーマの1つをクリックすると、以下の関数でcssファイルが更新されます。

スクロールバーを除くすべての変更を正しく表示できます。マウスをスクロールバーに合わせるまで、そのcssの変更は発生しません。

より明確にするために、私が黒のテーマにいると仮定します。黒いスクロールバーが表示されています。白のテーマをクリックすると、背景がすべて表示され、テキストが白のテーマに適切に変更されます。ただし、スクロールバーはまだ黒のテーマのままです。マウスをスクロールバーに移動すると、スクロールバーが白いテーマに更新されます。

どうすればこの問題を解決できますか?

ありがとう!

ちょっとAnubav:これがあなたの変更を含めた後に私が働いているコードです:

trail.html

  <html>
  <head>
  <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
  <script   type="text/javascript" src="./jquery-1.7.1.min.js"></script>
  <link href="./carbon.css" rel="stylesheet" type="text/css" id="extCSSFile"/>
  <script type="text/javascript">
  $(document).ready(function() {
  function changeAndPaint(that){

        var filename = $(that).attr('data-href');

    $('#extCSSFile').attr('href',filename);
        var newfile = $('#extCSSFile');

        $('#extCSSFile').remove();
        $(that).css('display','none').height(); //<--this is the trick to repaint
        $(that).css('display','inherit');       


        var elem = $('<link href="" rel="stylesheet" type="text/css" id="extCSSFile"/>');
        $(elem).attr('href',filename);  
        $('head').append(elem);

    }

        $('#carbonTheme,#quartzTheme').on('click', function(){
                changeAndPaint($(this));
            }); 
            });
            </script>
   </head>
  <body>
 <ul id="nav">
    <li id="carbonTheme" data-href="./carbon.css">carbon Theme </li>
    <li id="quartzTheme" data-href="./quartz.css">Quartz Theme </li>
 </ul>      
  <div> 
           <p>There are no results</p>
            <p>There are no results</p>
            <p>There are no results</p>
            <p>There are no results</p><p>There are no results</p>
            <p>There are no results</p>
            <p>There are no results</p>
            <p>There are no results</p><p>There are no results</p>
            <p>There are no results</p>

            <p>There are no results</p>
            <p>There are no results</p>
            <p>There are no results</p>
           <p></p>
           <p></p><p></p><p></p><p></p><p></p>
           <p></p><p></p><p></p><p></p><p></p>
           <p></p><p></p><p></p><p></p><p></p>
           <p></p><p></p><p></p><p></p><p></p>
           <p></p>


            </div>
            </body>
            </html>

carbon.css

body {
    font-family: Arial, Helvetica, sans-serif;      
    font-size:8.5pt;  
    width:inherit;
    min-width:100px;
    max-width:250px;
    margin:10px;
    background-color:#191919;
    color:white;    
}

 ul{height:1000px;}

 #carbonTheme, #quartzTheme{ 
 text-decoration:underline;
 color:blue;
  }
  ::-webkit-scrollbar {
    width: 12px;
 }

::-webkit-scrollbar-track {
 background-color:#aaa;
}

::-webkit-scrollbar-thumb {

  background-color:black;
}

quartz.css

body {
    font-family: Arial, Helvetica, sans-serif;      
    font-size:8.5pt;  
    width:inherit;
    min-width:100px;
    max-width:250px;
    margin:10px;

 }
  ul{height:1000px;}

  #carbonTheme, #quartzTheme{ 
  text-decoration:underline;
  color:blue;
 }
 ::-webkit-scrollbar {
 width: 12px;
 }

 ::-webkit-scrollbar-track {
  background-color:#333;
 }

  ::-webkit-scrollbar-thumb {

   background-color:white;
 }
4

6 に答える 6

3

ブラウザに完全なDOMを再描画させるには、次のようにします$("#body").offset().Top;(bodyは、セレクターを高速化するためにbodyタグに指定されたIDです)。

タスクへの簡単なアプローチはdisabled="disabled"、リンク要素に属性を追加することです。

HEADセクションにLINKを次のように含めます。

<link href="./carbon.css" rel="stylesheet" type="text/css" id="carbonCSS" />
<link href="./quartz.css" rel="stylesheet" type="text/css" id="quartzCSS" disabled="disabled" />

リンクの下に次のようにスクリプトを含めます。

 <script   type="text/javascript" src="./jquery-1.7.1.min.js"></script>
<script type="text/javascript">
      $(document).ready(function() {
            $('#nav li').on('click', function(){
                    objLink = document.getElementById($(this).attr("data-href"))
                    $("#carbonCSS , #quartzCSS").attr("disabled","disabled");
                    $("#body").offset().Top;  // Force Repaint
                    objLink.removeAttribute("disabled");
                }); 
        });
 </script> 

完全なhtmlページは次のようになります。

<!DOCTYPE html>
<html>
  <head>
  <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">

  <link href="./carbon.css" rel="stylesheet" type="text/css" id="carbonCSS" />
  <link href="./quartz.css" rel="stylesheet" type="text/css" id="quartzCSS" disabled="disabled" />

   <script   type="text/javascript" src="./jquery-1.7.1.min.js"></script>
    <script type="text/javascript">
      $(document).ready(function() {
            $('#nav li').on('click', function(){
                    objLink = document.getElementById($(this).attr("data-href"))
                    $("#carbonCSS , #quartzCSS").attr("disabled","disabled");
                    $("#body").offset().Top;
                    objLink.removeAttribute("disabled");
                }); 
        });
    </script>
   </head>
<body id="body">
 <ul id="nav">
    <li id="carbonTheme" data-href="carbonCSS">carbon Theme </li>
    <li id="quartzTheme" data-href="quartzCSS">Quartz Theme </li>
 </ul>      
  <div> 
           <p>There are no results</p>
            <p>There are no results</p>
            <p>There are no results</p>
            <p>There are no results</p><p>There are no results</p>
            <p>There are no results</p>
            <p>There are no results</p>
            <p>There are no results</p><p>There are no results</p>
            <p>There are no results</p>

            <p>There are no results</p>
            <p>There are no results</p>
            <p>There are no results</p>
           <p></p>
           <p></p><p></p><p></p><p></p><p></p>
           <p></p><p></p><p></p><p></p><p></p>
           <p></p><p></p><p></p><p></p><p></p>
           <p></p><p></p><p></p><p></p><p></p>
           <p></p>


            </div>
</body>
</html>
于 2012-09-17T11:06:51.633 に答える
2

このソリューションにはいくつか奇妙なことがあります。@Quentinが指摘したように、このrel属性を単に可変ストレージ領域に使用するべきではありません。属性でcssパスを使用するかhref(とにかくfalseを返すため)、リンクごとに「黒」または「白」にclassまたはを設定することをお勧めします。id

その上、あなたが言うとき、$('link')あなたは自動的にページhrefの最初のlink要素のを変更しているだけです。私はidあなたのテーマ要素にattrを使用するlinkので、あなたはそれを変更していることを常に知っています(その前に他のリンクを追加するかどうかにかかわらず)。

テーマを変更するためにクリックするたびに、メソッドはhttpリクエストも追加します。

これが最善の解決策だと思います。すべてのスタイルを同じcssシートに配置し、classテーマ固有のスタイルごとにプレフィックスを付けてから、要素にtoggleClass()(jQuery)を/から付けます。これにより、多くの問題が単純化され、スクロールバーの色の問題が自動的に解消される可能性があります。htmlblackThemewhiteTheme

うまくいけばアイデアを説明するためのフィドルがあります。(わかりやすくするために、この作業は2方向のトグルでのみ行いました。)

于 2012-09-10T14:34:45.377 に答える
2

link要素を削除して追加する必要があります。

HTMLファイル

<html>
<head>
<title></title>
<link href="css.css" rel="stylesheet" type="text/css" id="extCSSFile"/>
<script src="jq.js" type="text/javascript"></script>
<script type="text/javascript">
$(function(){
    $('#bt,#wt').on('click', function(){

        $('#extCSSFile').attr('href',$(this).attr('data-href'));
        var newfile = file = $('#extCSSFile');
        $('#extCSSFile').remove();

        $('head').append($(newfile));
    });
    });
</script>
</head>
<body>
<ul id="nav">
<li id="bt" data-href="css.css">blackTheme</li>
<li id="wt" data-href="css2.css">whiteTheme</li>
</ul>
</body>
</html>

css.cssファイル

ul{height:1000px;}

#bt, #wt{ 
    text-decoration:underline;
    color:blue;
}

::-webkit-scrollbar {
    width: 12px;
}

::-webkit-scrollbar-track {
  background-color:#aaa;
}

::-webkit-scrollbar-thumb {

    background-color:black;
}

css2.css

body{
    background-color:black;
    color:white;
}

ul{height:1000px;}

#bt, #wt{ 
    text-decoration:underline;
    color:blue;
}

::-webkit-scrollbar {
    width: 12px;
}

::-webkit-scrollbar-track {
  background-color:#333;
}

::-webkit-scrollbar-thumb {

    background-color:white;
}
于 2012-09-10T20:52:09.917 に答える
2

ここに勝者がいると思います。

これはHTMLファイルコードのみです。cssファイルはあなたが望むものにすることができます。

CSSのみのメソッドがあればいいのにと思います。また、この目的のための意図的な再描画コマンドも見つかりませんでした。私が見つけたものは、奇妙なことに、クロム拡張機能を利用していました。しかし、とにかく、塗り直しは簡単でした。あなたがしなければならないのは、ペイントされたDOMを少し振るだけで、準備は完了です。

ああ、私は最新のカナリアビルドとjQueryを使用しています。したがって、コードでそれらを除外します。何かおかしいことがあれば教えてください。

<link href="" rel="stylesheet" type="text/css" id="extCSSFile"/>

<script src="jquery.js" type="text/javascript"></script>

<script type="text/javascript">
$(function(){

function changeAndPaint(that){

    var filename = $(that).attr('data-href');

$('#extCSSFile').attr('href',filename);
    var newfile = $('#extCSSFile');

    $('#extCSSFile').remove();

    $(that).css('display','none').height(); //<--this is the trick to repaint
    $(that).css('display','inherit');       

    var elem = $('<link href="" rel="stylesheet" type="text/css" id="extCSSFile"/>');
    $(elem).attr('href',filename);  
    $('head').append(e);
}

    $('#bt,#wt').on('click', function(){
            changeAndPaint($(this));
        }); 
    });
于 2012-09-11T17:09:16.630 に答える
2

他の解決策はどれも私にはうまくいきませんでした。私はついにbodyこれを使って再描画するためにwebkitのスクロールバーを手に入れました:

$('body').hide();
$('body').get(0).offsetHeight;
$('body').show();

...ここで提案されているように:http ://www.eccesignum.org/blog/solving-display-refreshredrawrepaint-issues-in-webkit-browsers

編集:上記のJavaScriptは、スクロール位置をページの上部にリセットします。

同じスクロール位置にとどまるには:

var scrollX = window.pageXOffset;
var scrollY = window.pageYOffset;
$('body').hide();
$('body').get(0).offsetHeight;
$('body').show();
window.scrollTo(scrollX, scrollY);
于 2014-10-02T19:44:23.007 に答える
1

私はScrimothyの解決策について少し詳しく説明しました(そして実際に彼を読む前に私の答えを書きました、おっと)、そして私はそれがかなり滑らかで効率的だと思います。彼の優れた例がうまくいかなかった理由はわかりませんが、おそらくここに含まれているWebkitスクロールバーのスタイルを使用すると、ギャップを埋めることができます。

再描画や複数のcssファイルに依存するのではなく、jQueryを使用してbodyタグのテーマ固有のクラスを切り替え、とに固有のセレクターを使用してすべてのcssを1つのファイルにまとめbody.quartz ...ますbody.carbon...

このフィドルでそれをチェックしてください:http://jsfiddle.net/crowjonah/Ajkjy/

スクリプトはこれに蒸留されます:

$('body').addClass('carbon'); // apply the default theme
$('#carbonTheme').on('click', function(){
    $('body').removeClass('quartz');
    $('body').addClass('carbon');
});
$('#quartzTheme').on('click', function(){
    $('body').removeClass('carbon');
    $('body').addClass('quartz');
});

CSSは次のようになります。

body.carbon {
    font-family:Arial,Helvetica,sans-serif;
    font-size:8.5pt;
    width:inherit;
    min-width:100px;
    max-width:250px;
    margin:10px;
    background-color:#191919;
    color:#fff;
}

body.carbon #carbonTheme,body.carbon #quartzTheme {
    text-decoration:underline;
    color:blue;
    cursor:pointer;
}

::-webkit-scrollbar {
    width:12px;
}

body.carbon .constraint::-webkit-scrollbar-track {
    background-color:#aaa;
}

body.carbon .constraint::-webkit-scrollbar-thumb {
    background-color:#000;
}

body.quartz {
    font-family:Arial,Helvetica,sans-serif;
    font-size:8.5pt;
    width:inherit;
    min-width:100px;
    max-width:250px;
    margin:10px;
}

body.quartz #carbonTheme,body.quartz #quartzTheme {
    text-decoration:underline;
    color:blue;
    cursor:pointer;
}

body.quartz .constraint::-webkit-scrollbar-track {
    background-color:#333;
}

body.quartz .constraint::-webkit-scrollbar-thumb {
    background-color:#fff;
}

.constraint {
    height:100px;
    overflow-y:scroll;
}​

今、私はこれがあなたの目的に合わないかもしれない潜在的に正当な理由がたくさんあることを認めます(特にあなたがたくさんのテーマを持っていて、それぞれがかなりの量のユニークなスタイリングを持っている場合)、しかしあなたが注意してそしてできるなら私は思うテーマに関係なく幅やマージンなどの一貫したレイアウトを定義します。これにより、HTTPリクエストが節約され(Scrimothyが言ったように)、読み込み時間が短縮され、relの問題に巻き込まれたり、リンクタグを削除および追加したりするのを防ぐことができます。 。

于 2012-09-13T21:11:18.880 に答える