Изменение позиции в JavaScript с условной ошибкой CSS - PullRequest
0 голосов
/ 14 октября 2011

ОК, у меня есть сайт, который я разрабатываю для клиента. Этот веб-сайт довольно прост, но клиент определил одну вещь: когда пользователь прокручивает страницу вниз, он хочет, чтобы меню прокручивалось вниз вместе с ним. Я думал, что было бы хорошо просто использовать .menu { position: fixed;}, но это не удалось, потому что меню должно быть длиннее, чем размер экрана компьютеров пользователя.

Итак, я сейчас использую код JavaScript, который позволяет элементу div оставаться как position:absolute, но когда верхняя часть элемента div достигает верхней части страницы во время прокрутки, он меняет его на position:fixed. ОК, это здорово.

Но этот сценарий, похоже, работает в Internet Explorer 6, 7, (9 не уверен), но не в Internet Explorer 8. Все браузеры WebKit работают. Почему?

Script (scrolling)
    function reposition(){
        var el = document.getElementById('menu');

        var ScrollTop = document.body.scrollTop;
        if (ScrollTop == 0)
        {
            if (window.pageYOffset)
                ScrollTop = window.pageYOffset;
            else
                ScrollTop = (document.body.parentElement) ? document.body.parentElement.scrollTop : 0;
        }
        if(ScrollTop < 200)
            el.style.top = 200 - ScrollTop + "px";
        else
            el.style.top = "0px";
    }

Пример страницы:

<body onscroll="reposition()">
    <script type="text/javascript">
        disableSelection(document.body)
    </script>
    <div id="header-cont" class="border-radius-bottom">
        <div id="header">
            <div id="logo"><div id="Page-Title">
                <h1 style="font-size:30px;">Bowlplex YBC</h1></div></div>
        </div>
    </div>

    <div id="container">
        <div id="wrapper">
            <div id="menu">
                <ul id="nav">
                    <li><a href="/" title="Home">Home</a></li><br />
                    <li><a href="/" title="Constitution">Constitution</a></li>
                    <li><a href="/" title="Rules">Rules</a>
                        <ul>
                            <li><a href="/" title="BTBA">BTBA Rules</a></li>
                            <li><a href="/" title="Club">Club Rules</a></li>
                            <li><a href="/" title="Basics">Basic Bowling Rules</a></li>
                        </ul>
                    </li>
                    <li><a href="/" title="Tournaments">Tournaments</a>
                        <ul>
                            <li><a href="/" title="List">List</a></li>
                            <li><a href="/" title="Reports">Reports</a></li>
                        </ul>
                    </li>
                    <li><a href="/Calendar" title="Calendar">Our Calendar</a>
                        <ul>
                            <li><a href="/Calendar/?option=YBC" title="YBC">YBC Calendar</a></li>
                            <li><a href="/Calendar/?option=Tourament" title="Tournament">Tournament Calendar</a></li>
                        </ul>
                    </li>
                    <li><a href="/" title="Achievements">Achievements</a></li>
                    <li><a href="/" title="Newsletters">Newsletters</a></li>
                    <li><a href="/" title="Sponsorship">Sponsorship</a></li>
                    <li><a href="/" title="Contacts">Contacts</a></li>
                    <br />
                    <li><a href="/" title="Policies">Policies</a>
                        <ul>
                            <li><a href="/" title="YBC">YBC Policies</a></li>
                            <li><a href="/" title="Website">Website Policies</a></li>
                        </ul>
                    </li>
                    <li><a href="/Forum" title="Forum">Forum</a></li>
                    <br>
                    <li><a href="/admin/" title="Admin">Admin Login</a></li></ul>
                </div>
                <p>&nbsp;</p>
            </div>
        </div>
    </div>
</body>

Пример CSS

@charset "utf-8";
/* CSS Document */
body{
    margin: auto;
    font-family: Verdana, Geneva, sans-serif;
    font-style: normal;
    font-weight: 400;
    font-size:12px;
    background: #dddddd;
}

a img {
    border:none;
    color:inherit;
    text-decoration:none;
}

#container{
    width: 900px;
    margin: auto;
    margin-top: 5px;
    margin-bottom:20px;
}

#header-cont {
    width:auto;
    margin:auto;
    height:115px;
    padding-top:30px;
    padding-bottom:10px;
    background:url(../images/header_bg.png) repeat-x top left;
    z-index:-1;
    border-bottom: 2px solid #ddd;
    box-shadow: 0 0 6px #000;
    -moz-box-shadow: 0 0 6px #000;
    -webkit-box-shadow: 0 0 6px #000;
}

#header{
    margin:auto;
    width:900px;
    height: 90px;
    z-index:8;
}

#menu {
    position:absolute;
    margin-left:-253px;
    margin-top:5px;
}

div > div#menu { position: fixed; }

#logo{
    float:left;
    width:200px;
    height:90px;
    background:url(../images/bowlplex_logo.png) no-repeat left top;
    position:absolute;
}

#Page-Title{
    padding-left:10px;
    width:690px;
    margin-left:210px;
    position:relative;
}

#wrapper{
    margin-top:40px;
    padding:8px 26px 16px 26px;
    -webkit-border-radius:5px;
    -moz-border-radius:5px;
    -khtml-border-radius:5px;
    border-radius:5px;
    -webkit-box-shadow:#333 0px 0px 15px;
    -moz-box-shadow:#333 0px 0px 15px;
    text-align: left;
    color: #555;
    background-color:#FFFFFF;
}

.content{
    -webkit-border-radius:3px;
    -moz-border-radius:3px;
    border-radius:3px;
    background-color:#FFFFFF;
    margin:5px;
    padding:10px;
    float:left;
    height:200px;
    width:500px;
}

.border-radius{
    -webkit-border-radius:3px;
    -moz-border-radius:3px;
    border-radius:3px;
}

Мой второй вопрос применим, если нет способа решить первый. Чтобы обойти это, я использовал условный CSS для применения определенных настроек к определенным браузерам:

Например:

In Internet Explorer 8

div > div#menu{ position:absolute; }

div > div.smOW { position: absolute; }

Которая блокирует скрипт и сохраняет его абсолютным.

Проблема в том, что это работает для Internet Explorer 7 и ниже и WebKit:

Если я применяю настройку в CSS, которая позволяет браузерам WebKit работать, Internet Explorer 7 не работает, и наоборот. Раздражает я знаю.

Я могу применить условный CSS к Internet Explorer 7, но я не могу использовать WebKit, потому что мне нужны оба, чтобы он работал.

Это условные выражения, которые я пытаюсь использовать:

This one is for Internet Explorer 7
<!--[if gte IE 5.5]><![if lt IE 7]>
<link rel="stylesheet" href="../styles/ie.css" type="text/css" />
<![endif]><![endif]-->

In order for the scrolling sub menus to work it needs this:

div > div.smOW { position: absolute !important; }

This one is for Internet Explorer 8
<!--[if IE 8]>
<link rel="stylesheet" href="../styles/ie8.css" type="text/css" />
<![endif]-->

This one disable the scrolling effect (at the moment)

div > div#menu{
    position:absolute;
}

div > div.smOW { position: absolute; }

And finally this one is the one I use for WebKit browsers **Which doesn't work**
<!--[if !IE]>
<link rel="stylesheet" href="../styles/MenuMatic-not-ie.css" type="text/css" />
<![endif]-->

div > div.smOW { position: fixed; }

Если я добавлю последний бит кода CSS в основной файл, условные настройки CSS в Internet Explorer 7 будут переопределены, и он не будет работать.

Я пытался использовать browscap в зависимости от браузера, но это тоже не сработало.

1 Ответ

0 голосов
/ 14 октября 2011

Я только что попробовал ваш код, и он работает только с этими настройками:

#menu{position:fixed; right:0; top:100px; border:1px solid black}
ul#nav li {list-style-type:none; display:block;}

Пытался разобраться с этим, он не идеален, но проверьте его здесь .

В любом случае, если вы используете JavaScript-фреймворк, такой как jQuery или MooTools , эти вещи действительно станут проще ... Например, отметьте Создание плавающегоМеню HTML с использованием jQuery и CSS , я использовал его один раз и довольно просто и кросс-браузерно;адаптироваться к нему не составит труда.

...