Javascript 根据背景更改导航字体颜色

Javascript 根据背景更改导航字体颜色,javascript,php,jquery,html,css,Javascript,Php,Jquery,Html,Css,我的问题是这个。我有一个固定的左侧导航栏,我必须根据它下面部分的背景更改列表字体颜色。代码是这样的。因此,如果该部分为黑色且位于链接下方,则不会看到文本。我必须根据列表下某个部分的背景更改每个列表,以便其可读 html 难道你不能给固定div一个中性颜色,让它环绕其内容,而不必求助于客户端脚本来动态更改颜色吗?我对固定元素进行了一些消毒,使其看起来更吸引人……填充、边距等 #left_side { position:fixed; left: 20px; top:10px;

我的问题是这个。我有一个固定的左侧导航栏,我必须根据它下面部分的背景更改列表字体颜色。代码是这样的。因此,如果该部分为黑色且位于链接下方,则不会看到文本。我必须根据列表下某个部分的背景更改每个列表,以便其可读

html


难道你不能给固定div一个中性颜色,让它环绕其内容,而不必求助于客户端脚本来动态更改颜色吗?我对固定元素进行了一些消毒,使其看起来更吸引人……填充、边距等

#left_side
{
    position:fixed;
    left: 20px;
    top:10px;
    z-index:999;
    background-color:#eee;
    padding:10px;
}

已更新。。看到这把小提琴了吗

$(文档)。滚动(函数(){
var top=$(document).scrollTop()-322;
console.log(顶部)

如果(top0&&top322&&top644&&top966&&top要执行您要求的操作,可以使用jquery执行此操作:

var\u li,\u段;
$(函数(){
_li=$(“#我的菜单”)。查找(“li”);
_sections=$(“#包装器”)。查找(“.section”);
$(窗口).on('scroll',liBgs);
});
函数liBgs(){
对于(变量i=0;i<\u li.length;i++){
var _litop=_li.eq(i).offset().top;
对于(var j=0;j<_sections.length;j++){
var$s=_部分等式(j),
_sectop=$s.offset().top,
_secbottom=$s.offset().top+$s.height()-20;
如果(\u litop>\u sectop&&u litop>\u secbottom){
var_color=rgb2hex($s.css('background-color'));
_li.eq(i).find('a').css('color'),(_color==“#ffffff”)?“#000000”:“#ffffff”);
}             
}
}
}
函数rgb2hex(rgb){
rgb=rgb.match(/^rgb\(\d+)\s*(\d+)\s*(\d+)$/);
函数十六进制(x){
返回(“0”+parseInt(x).toString(16)).slice(-2);
}
返回“#”+hex(rgb[1])+hex(rgb[2])+hex(rgb[3]);
}
注意:rgb2hex()函数取自此问题: 此代码的作用是: 我基本上是比较菜单的位置,李的部分,检查下什么
每次滚动时,每个li都会结束。我不确定这是否非常有效,但对于小规模的产品来说,这是可以的。如果有人知道如何提高效率,我很乐意学习。

使用jquery来完成此操作。找到了一个参考

HTML:

添加了一个额外的颜色属性

<div class="section" id="section1" data-color="#333">section1</div>
第1节
JS:

$(窗口).on('scroll',function(){
var scrollTop=$(this.scrollTop();
$('.section')。每个(函数(){
var topDistance=$(this).offset().top;
如果((顶部距离)<滚动顶部){
$('#mymenu a').css('color',$(this.attr('data-color'));
}
});
}))


类似的方法可以:

$(window).scroll(function() {

    /* get current scroll-position within window */
    var scroll = $(window).scrollTop();

    $('.mainLeft li').each(function() {

        /* get position of navigation-element (distance from top minus half of it's height, so that it changes color while it's half over black and half over white background) */
        var elementPositionTop = parseFloat($(this).offset().top) + (parseFloat($(this).height() / 2));

        /* change color for each background-change */
        if (elementPositionTop >= 320 && elementPositionTop <= 640 || elementPositionTop >= 960 && elementPositionTop <= 1280) {
            $(this).addClass('whiteText');
        } else {
            $(this).removeClass('whiteText');
        }
    });
});
我给
.section
div一个固定的高度,因为我使用的JS使用固定的像素值,并且如果没有定义元素,并非所有浏览器对元素高度的解释都是相同的


这里有一个提琴:

提琴链接不起作用!嗨,先生,它现在已经起作用了。为什么不这样做呢?谢谢你的回答,先生!我可以这样做,但这在设计方面并不好。我必须遵循设计中的内容:(我的意思是在PSD中,我应该遵循。是的,但是当用户滚动锚点时,锚点会根据背景一个接一个地改变。因此,如果导航列表5的颜色为白色,背景为黑色,则其余的链接为黑色。如果黑色背景达到第四个列表(从上方开始),导航列表5和4的字体颜色为白色,1,2和3仍然为黑色您想使用滚动事件吗?是的,先生,我已经这样做了。除了知道每个锚是否在新div下面的正确代码
$(document).scroll(function(){
var top=$(document).scrollTop()-322;
console.log(top)
if(top<0)
{
$('.mainLeft li a').css('color','black')
    $('#li1 a').css('color',$('#section1').css('color'))
    //$('#li1 a').css('color',"red")
}
if(top>0 && top<322)
{
    $('.mainLeft li a').css('color','black')
    $('#li2 a').css('color',$('#section2').css('color'))
    //$('#li1 a').css('color',"red")
}
    if(top>322 && top<644)
{
    $('.mainLeft li a').css('color','black')
    $('#li3 a').css('color',$('#section3').css('color'))
    //$('#li1 a').css('color',"red")
}
if(top>644 && top<966)
{
    $('.mainLeft li a').css('color','black')
    $('#li4 a').css('color',$('#section4').css('color'))
    //$('#li1 a').css('color',"red")
}
    if(top>966 && top<1288)
{
    $('.mainLeft li a').css('color','black')
    $('#li5 a').css('color',$('#section5').css('color'))
    //$('#li1 a').css('color',"red")
}

});
var _li, _sections;

$(function() {
   _li = $("#mymenu").find("li"); 
    _sections =  $("#wrapper").find(".section");   
    $(window).on('scroll', liBgs);
});


function liBgs() {
    for (var i = 0; i < _li.length ; i++) {
        var _litop = _li.eq(i).offset().top; 
        for (var j = 0; j < _sections.length; j++) {
            var $s = _sections.eq(j),
            _sectop = $s.offset().top,
            _secbottom = $s.offset().top+$s.height()-20;
            if (_litop > _sectop && _litop > _secbottom) {
                var _color = rgb2hex($s.css('background-color'));
                _li.eq(i).find('a').css('color',  (_color=="#ffffff") ? "#000000" : "#ffffff");
            }             
        }
    }
}

function rgb2hex(rgb) {
    rgb = rgb.match(/^rgb\((\d+),\s*(\d+),\s*(\d+)\)$/);
    function hex(x) {
        return ("0" + parseInt(x).toString(16)).slice(-2);
    }
    return "#" + hex(rgb[1]) + hex(rgb[2]) + hex(rgb[3]);
}
<div class="section" id="section1" data-color="#333">section1</div>
$(window).on('scroll', function() {
var scrollTop = $(this).scrollTop();
$('.section').each(function() {
    var topDistance = $(this).offset().top;
    if ( (topDistance) < scrollTop ) {
        $('#mymenu a').css('color',$(this).attr('data-color'));
    }
});
$(window).scroll(function() {

    /* get current scroll-position within window */
    var scroll = $(window).scrollTop();

    $('.mainLeft li').each(function() {

        /* get position of navigation-element (distance from top minus half of it's height, so that it changes color while it's half over black and half over white background) */
        var elementPositionTop = parseFloat($(this).offset().top) + (parseFloat($(this).height() / 2));

        /* change color for each background-change */
        if (elementPositionTop >= 320 && elementPositionTop <= 640 || elementPositionTop >= 960 && elementPositionTop <= 1280) {
            $(this).addClass('whiteText');
        } else {
            $(this).removeClass('whiteText');
        }
    });
});
.mainLeft li.whiteText a {
    color: #fff;
}
.section {
    height: 18px;
    overflow: hidden;
}