div自适应宽度的问题,求高手帮忙!

qq_17228139 2014-07-24 10:28:17

在左侧做了一个可以自动伸缩的菜单栏,想让菜单栏展开时,完全展开右面带地图的div,而不是被左面的菜单遮住一部分,该怎么解决?

这是菜单展开的图:搜索

这是菜单隐藏的图:

这是body:
<div>
<div id="mapDiv" class ="mydiv"></div>
<div id="common_box">
<div id="cli_on"></div>
</div>
</div>
这是样式表:

#common_box{
width:280px;
height :100%;
position:fixed;
left:0;
top:40px;
border:1px solid #789;
background:#fff;
z-index:99
}
#cli_on{
width:10px;
height:100%;
float:right;
cursor:pointer;
background:#ccc;
text-align:center;
line-height:180px;
font-size:24px;
color:#f00;
}
.mydiv
{
position:fixed;
top:40px;
left:0px;
width: 100%;
height:650px;
}

这是伸缩菜单的js:
<script type ="text/javascript" >
//左侧弹出菜单
window.onload = function () {
var common_box = document.getElementById("common_box");
var cli_on = document.getElementById("cli_on");
var flag = true, r_len = 0, timer = null;
cli_on.onclick = function () {
if (flag) {
r_len = 0;
timer = setInterval(slideright, 10);

} else {
r_len = -270;
timer = setInterval(slideleft, 10);
}
}
function slideright() {
if (r_len <= -270) {
flag = !flag;
cli_on.innerHTML = "";
clearInterval(timer);
return false;

} else {
r_len -= 5;
common_box.style.left = r_len + "px";
}
}
function slideleft() {

if (r_len >= 0) {
clearInterval(timer);
flag = !flag;
cli_on.innerHTML = "";
return false;
} else {
r_len += 5;
common_box.style.left = r_len + "px";
}
}

}
</script>
就是想改成像这个网站论坛首页左面菜单栏的那种感觉。
...全文
172 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_17228139 2014-07-25
  • 打赏
  • 举报
回复
引用 5 楼 dalianzsl 的回复:
[quote=引用 4 楼 qq_17228139 的回复:] [quote=引用 3 楼 dalianzsl 的回复:] 感觉应该需要改变div的宽度。用left什么的左右移动菜单和地图,由于之前它们已经绘制完毕了,左右移动时,不是遮盖了自身的一部分(这个效果应该只是左侧菜单需要的),就是由于初始时加载的画面太小已经固定,不能动态适应宽度变化(当你向左侧移动地图时,右侧新增的部分应该不会被自动填充)。 因此,我建议应该在timer的事件中改变两侧div的宽度,同时重新填充div中的内容,使其适应宽度的变化。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<style>
#common_box{
     width:15%;
     height :100%;
     position:fixed;
     left:0;
     top:40px;
     border:1px solid #789;
     background:#fff;
     z-index:99;
	 float:left;
	 padding:0;
    }
    #cli_on{
     width:10px;
     height:100%;
     float:right;
     cursor:pointer;
     background:#ccc;
     text-align:center;
     line-height:180px;
     font-size:24px;
     color:#f00;
    }
    .mydiv
    {
        position:fixed;
        top:40px;
        right:0px;
        width: 85%;
        height:650px;
		float: right;
		padding:0;
        }
</style>
<script type="text/javascript">
	//左侧弹出菜单
        window.onload = function () {
            var common_box = document.getElementById("common_box");
            var cli_on = document.getElementById("cli_on");
			var mapDiv = document.getElementById("mapDiv");
            var flag = true, r_len = 0, timer = null;
			
			var mapDiv_width = mapDiv.clientWidth;
			var common_box_width = common_box.clientWidth;
			var body_client_width = mapDiv.clientWidth + common_box.clientWidth;
			
            cli_on.onclick = function () {
                if (flag) {
                    r_len = common_box_width;
                    timer = setInterval(slideright, 10);

                } else {
                    r_len = 0;
                    timer = setInterval(slideleft, 10);
                }
            }
            function slideright() {
                if (r_len <= 10) {
                    flag = !flag;
					common_box.style.width = 10 + "px";
					mapDiv.style.width = body_client_width - common_box.clientWidth + "px";
					cli_on.innerHTML = "菜单栏";
					mapDiv.innerHTML = "地图";
                    clearInterval(timer);
                    return false;

                } else {
                    r_len -= 5;
                    common_box.style.width = r_len + "px";
					mapDiv.style.width = body_client_width - common_box.clientWidth + "px";
					mapDiv.innerHTML = "地图";
                }
            }
            function slideleft() {

                if (r_len >= common_box_width) {
                    clearInterval(timer);
                    flag = !flag;
					common_box.style.width = common_box.clientWidth + "px";
					mapDiv.style.width = mapDiv_width + "px";
                    cli_on.innerHTML = "菜单栏";
					mapDiv.innerHTML = "地图";
                    return false;
                } else {
                    r_len += 5;
                    common_box.style.width = r_len + "px";
					mapDiv.style.width = body_client_width - common_box.clientWidth + "px";
					mapDiv.innerHTML = "地图";
                }
            }

        }
</script>
<body>
	<div>
		<div id="common_box" style="background-color:yellow; overflow: hidden;">
             <div id="cli_on">菜单栏</div>
        </div>    
		<div id="mapDiv" class ="mydiv" style="background-color:green;">地图</div> 
    </div>
</body>
</html>
嗯,按照你的帮助修改运行了一下代码,果真左面的菜单栏不会覆盖右面的地图了,但在菜单栏隐藏时,右面的地图会在右面留出15%的空白,没法被自动填充[/quote] 我写的效果就是需要手动重绘地图的,你需要将 mapDiv.innerHTML = "地图"; 这些地方替换成地图的加载代码,这样地图才能自动适应画面变化。[/quote] 地图这个只在mapDiv里加载,想要完全加载只能靠改变div的宽度来实现了
qq_17228139 2014-07-25
  • 打赏
  • 举报
回复
引用 2 楼 zyl_lyr1019 的回复:
mydiv{
	margin-top:40px;
	background-color:#eee;
	height:650px;
	margin-left:280px;
}
window.onload = function () {
	var common_box = document.getElementById("common_box");
	var cli_on = document.getElementById("cli_on");
	var mapDiv = document.getElementById("mapDiv");
	//zheli
	var flag = true, r_len = 0, timer = null;
	cli_on.onclick = function () {
		if (flag) {
			r_len = 0;
			timer = setInterval(slideright, 10);

		} else {
			r_len = -270;
			timer = setInterval(slideleft, 10);
		}
	}
	function slideright() {
		if (r_len <= -270) {
			flag = !flag;
			cli_on.innerHTML = "";
			clearInterval(timer);
			return false;

		} else {
			r_len -= 5;
			common_box.style.left = r_len + "px";
			mapDiv.style.marginLeft = 270 + r_len + "px";
			//zheli
		}
	}
	function slideleft() {

		if (r_len >= 0) {
			clearInterval(timer);
			flag = !flag;
			cli_on.innerHTML = "";
			return false;
		} else {
			r_len += 5;
			common_box.style.left = r_len + "px";
			mapDiv.style.marginLeft = 270 + r_len + "px";
			//zheli
		}
	}
}
在你的基础上,稍微改了一点。试试是你要的效果吗?没有测兼容性。 不过,一些效果的话,html部分的布局也是很重要的,先想好布局,之后的js和css写起来,才会更简单的。
试了一下,效果实现了!是不是用position:fixed;直接固定位置挺不好的?
dalianzsl 2014-07-25
  • 打赏
  • 举报
回复
引用 4 楼 qq_17228139 的回复:
[quote=引用 3 楼 dalianzsl 的回复:] 感觉应该需要改变div的宽度。用left什么的左右移动菜单和地图,由于之前它们已经绘制完毕了,左右移动时,不是遮盖了自身的一部分(这个效果应该只是左侧菜单需要的),就是由于初始时加载的画面太小已经固定,不能动态适应宽度变化(当你向左侧移动地图时,右侧新增的部分应该不会被自动填充)。 因此,我建议应该在timer的事件中改变两侧div的宽度,同时重新填充div中的内容,使其适应宽度的变化。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<style>
#common_box{
     width:15%;
     height :100%;
     position:fixed;
     left:0;
     top:40px;
     border:1px solid #789;
     background:#fff;
     z-index:99;
	 float:left;
	 padding:0;
    }
    #cli_on{
     width:10px;
     height:100%;
     float:right;
     cursor:pointer;
     background:#ccc;
     text-align:center;
     line-height:180px;
     font-size:24px;
     color:#f00;
    }
    .mydiv
    {
        position:fixed;
        top:40px;
        right:0px;
        width: 85%;
        height:650px;
		float: right;
		padding:0;
        }
</style>
<script type="text/javascript">
	//左侧弹出菜单
        window.onload = function () {
            var common_box = document.getElementById("common_box");
            var cli_on = document.getElementById("cli_on");
			var mapDiv = document.getElementById("mapDiv");
            var flag = true, r_len = 0, timer = null;
			
			var mapDiv_width = mapDiv.clientWidth;
			var common_box_width = common_box.clientWidth;
			var body_client_width = mapDiv.clientWidth + common_box.clientWidth;
			
            cli_on.onclick = function () {
                if (flag) {
                    r_len = common_box_width;
                    timer = setInterval(slideright, 10);

                } else {
                    r_len = 0;
                    timer = setInterval(slideleft, 10);
                }
            }
            function slideright() {
                if (r_len <= 10) {
                    flag = !flag;
					common_box.style.width = 10 + "px";
					mapDiv.style.width = body_client_width - common_box.clientWidth + "px";
					cli_on.innerHTML = "菜单栏";
					mapDiv.innerHTML = "地图";
                    clearInterval(timer);
                    return false;

                } else {
                    r_len -= 5;
                    common_box.style.width = r_len + "px";
					mapDiv.style.width = body_client_width - common_box.clientWidth + "px";
					mapDiv.innerHTML = "地图";
                }
            }
            function slideleft() {

                if (r_len >= common_box_width) {
                    clearInterval(timer);
                    flag = !flag;
					common_box.style.width = common_box.clientWidth + "px";
					mapDiv.style.width = mapDiv_width + "px";
                    cli_on.innerHTML = "菜单栏";
					mapDiv.innerHTML = "地图";
                    return false;
                } else {
                    r_len += 5;
                    common_box.style.width = r_len + "px";
					mapDiv.style.width = body_client_width - common_box.clientWidth + "px";
					mapDiv.innerHTML = "地图";
                }
            }

        }
</script>
<body>
	<div>
		<div id="common_box" style="background-color:yellow; overflow: hidden;">
             <div id="cli_on">菜单栏</div>
        </div>    
		<div id="mapDiv" class ="mydiv" style="background-color:green;">地图</div> 
    </div>
</body>
</html>
嗯,按照你的帮助修改运行了一下代码,果真左面的菜单栏不会覆盖右面的地图了,但在菜单栏隐藏时,右面的地图会在右面留出15%的空白,没法被自动填充[/quote] 我写的效果就是需要手动重绘地图的,你需要将 mapDiv.innerHTML = "地图"; 这些地方替换成地图的加载代码,这样地图才能自动适应画面变化。
qq_17228139 2014-07-25
  • 打赏
  • 举报
回复
引用 3 楼 dalianzsl 的回复:
感觉应该需要改变div的宽度。用left什么的左右移动菜单和地图,由于之前它们已经绘制完毕了,左右移动时,不是遮盖了自身的一部分(这个效果应该只是左侧菜单需要的),就是由于初始时加载的画面太小已经固定,不能动态适应宽度变化(当你向左侧移动地图时,右侧新增的部分应该不会被自动填充)。 因此,我建议应该在timer的事件中改变两侧div的宽度,同时重新填充div中的内容,使其适应宽度的变化。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<style>
#common_box{
     width:15%;
     height :100%;
     position:fixed;
     left:0;
     top:40px;
     border:1px solid #789;
     background:#fff;
     z-index:99;
	 float:left;
	 padding:0;
    }
    #cli_on{
     width:10px;
     height:100%;
     float:right;
     cursor:pointer;
     background:#ccc;
     text-align:center;
     line-height:180px;
     font-size:24px;
     color:#f00;
    }
    .mydiv
    {
        position:fixed;
        top:40px;
        right:0px;
        width: 85%;
        height:650px;
		float: right;
		padding:0;
        }
</style>
<script type="text/javascript">
	//左侧弹出菜单
        window.onload = function () {
            var common_box = document.getElementById("common_box");
            var cli_on = document.getElementById("cli_on");
			var mapDiv = document.getElementById("mapDiv");
            var flag = true, r_len = 0, timer = null;
			
			var mapDiv_width = mapDiv.clientWidth;
			var common_box_width = common_box.clientWidth;
			var body_client_width = mapDiv.clientWidth + common_box.clientWidth;
			
            cli_on.onclick = function () {
                if (flag) {
                    r_len = common_box_width;
                    timer = setInterval(slideright, 10);

                } else {
                    r_len = 0;
                    timer = setInterval(slideleft, 10);
                }
            }
            function slideright() {
                if (r_len <= 10) {
                    flag = !flag;
					common_box.style.width = 10 + "px";
					mapDiv.style.width = body_client_width - common_box.clientWidth + "px";
					cli_on.innerHTML = "菜单栏";
					mapDiv.innerHTML = "地图";
                    clearInterval(timer);
                    return false;

                } else {
                    r_len -= 5;
                    common_box.style.width = r_len + "px";
					mapDiv.style.width = body_client_width - common_box.clientWidth + "px";
					mapDiv.innerHTML = "地图";
                }
            }
            function slideleft() {

                if (r_len >= common_box_width) {
                    clearInterval(timer);
                    flag = !flag;
					common_box.style.width = common_box.clientWidth + "px";
					mapDiv.style.width = mapDiv_width + "px";
                    cli_on.innerHTML = "菜单栏";
					mapDiv.innerHTML = "地图";
                    return false;
                } else {
                    r_len += 5;
                    common_box.style.width = r_len + "px";
					mapDiv.style.width = body_client_width - common_box.clientWidth + "px";
					mapDiv.innerHTML = "地图";
                }
            }

        }
</script>
<body>
	<div>
		<div id="common_box" style="background-color:yellow; overflow: hidden;">
             <div id="cli_on">菜单栏</div>
        </div>    
		<div id="mapDiv" class ="mydiv" style="background-color:green;">地图</div> 
    </div>
</body>
</html>
嗯,按照你的帮助修改运行了一下代码,果真左面的菜单栏不会覆盖右面的地图了,但在菜单栏隐藏时,右面的地图会在右面留出15%的空白,没法被自动填充
张运领 2014-07-25
  • 打赏
  • 举报
回复
定位浮动什么的,我会觉得,能少用,就尽量少用,如果用的太多,以后添加功能,更改样式时,都会变得更难。 当然,有时候也不得不用,只要不是把所有的布局,都用float,position这样就好了。 也算是个人习惯。
dalianzsl 2014-07-24
  • 打赏
  • 举报
回复
感觉应该需要改变div的宽度。用left什么的左右移动菜单和地图,由于之前它们已经绘制完毕了,左右移动时,不是遮盖了自身的一部分(这个效果应该只是左侧菜单需要的),就是由于初始时加载的画面太小已经固定,不能动态适应宽度变化(当你向左侧移动地图时,右侧新增的部分应该不会被自动填充)。 因此,我建议应该在timer的事件中改变两侧div的宽度,同时重新填充div中的内容,使其适应宽度的变化。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<style>
#common_box{
     width:15%;
     height :100%;
     position:fixed;
     left:0;
     top:40px;
     border:1px solid #789;
     background:#fff;
     z-index:99;
	 float:left;
	 padding:0;
    }
    #cli_on{
     width:10px;
     height:100%;
     float:right;
     cursor:pointer;
     background:#ccc;
     text-align:center;
     line-height:180px;
     font-size:24px;
     color:#f00;
    }
    .mydiv
    {
        position:fixed;
        top:40px;
        right:0px;
        width: 85%;
        height:650px;
		float: right;
		padding:0;
        }
</style>
<script type="text/javascript">
	//左侧弹出菜单
        window.onload = function () {
            var common_box = document.getElementById("common_box");
            var cli_on = document.getElementById("cli_on");
			var mapDiv = document.getElementById("mapDiv");
            var flag = true, r_len = 0, timer = null;
			
			var mapDiv_width = mapDiv.clientWidth;
			var common_box_width = common_box.clientWidth;
			var body_client_width = mapDiv.clientWidth + common_box.clientWidth;
			
            cli_on.onclick = function () {
                if (flag) {
                    r_len = common_box_width;
                    timer = setInterval(slideright, 10);

                } else {
                    r_len = 0;
                    timer = setInterval(slideleft, 10);
                }
            }
            function slideright() {
                if (r_len <= 10) {
                    flag = !flag;
					common_box.style.width = 10 + "px";
					mapDiv.style.width = body_client_width - common_box.clientWidth + "px";
					cli_on.innerHTML = "菜单栏";
					mapDiv.innerHTML = "地图";
                    clearInterval(timer);
                    return false;

                } else {
                    r_len -= 5;
                    common_box.style.width = r_len + "px";
					mapDiv.style.width = body_client_width - common_box.clientWidth + "px";
					mapDiv.innerHTML = "地图";
                }
            }
            function slideleft() {

                if (r_len >= common_box_width) {
                    clearInterval(timer);
                    flag = !flag;
					common_box.style.width = common_box.clientWidth + "px";
					mapDiv.style.width = mapDiv_width + "px";
                    cli_on.innerHTML = "菜单栏";
					mapDiv.innerHTML = "地图";
                    return false;
                } else {
                    r_len += 5;
                    common_box.style.width = r_len + "px";
					mapDiv.style.width = body_client_width - common_box.clientWidth + "px";
					mapDiv.innerHTML = "地图";
                }
            }

        }
</script>
<body>
	<div>
		<div id="common_box" style="background-color:yellow; overflow: hidden;">
             <div id="cli_on">菜单栏</div>
        </div>    
		<div id="mapDiv" class ="mydiv" style="background-color:green;">地图</div> 
    </div>
</body>
</html>
张运领 2014-07-24
  • 打赏
  • 举报
回复
mydiv{
	margin-top:40px;
	background-color:#eee;
	height:650px;
	margin-left:280px;
}
window.onload = function () {
	var common_box = document.getElementById("common_box");
	var cli_on = document.getElementById("cli_on");
	var mapDiv = document.getElementById("mapDiv");
	//zheli
	var flag = true, r_len = 0, timer = null;
	cli_on.onclick = function () {
		if (flag) {
			r_len = 0;
			timer = setInterval(slideright, 10);

		} else {
			r_len = -270;
			timer = setInterval(slideleft, 10);
		}
	}
	function slideright() {
		if (r_len <= -270) {
			flag = !flag;
			cli_on.innerHTML = "";
			clearInterval(timer);
			return false;

		} else {
			r_len -= 5;
			common_box.style.left = r_len + "px";
			mapDiv.style.marginLeft = 270 + r_len + "px";
			//zheli
		}
	}
	function slideleft() {

		if (r_len >= 0) {
			clearInterval(timer);
			flag = !flag;
			cli_on.innerHTML = "";
			return false;
		} else {
			r_len += 5;
			common_box.style.left = r_len + "px";
			mapDiv.style.marginLeft = 270 + r_len + "px";
			//zheli
		}
	}
}
在你的基础上,稍微改了一点。试试是你要的效果吗?没有测兼容性。 不过,一些效果的话,html部分的布局也是很重要的,先想好布局,之后的js和css写起来,才会更简单的。
张运领 2014-07-24
  • 打赏
  • 举报
回复
你这个页面的布局不对啊,你看你使用的是position:fixed。在控制显示位置的,这个很明显的,就会出现覆盖这个问题了。 这个你可以这么处理: 左侧的那块,使用定位处理,而右侧的那块,不使用定位,但是使用一个margin-left来控制左侧空出来的距离 当你左侧的更改时,同时改变右侧的那个margin-left的值就行了。 我这么说,能想明白吗?

61,112

社区成员

发帖
与我相关
我的任务
社区描述
层叠样式表(英文全称:Cascading Style Sheets)是一种用来表现HTML(标准通用标记语言的一个应用)或XML(标准通用标记语言的一个子集)等文件样式的计算机语言。
社区管理员
  • HTML(CSS)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧