伸缩菜单的制作——水平方向

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>伸缩菜单的制作——水平方向</title>
<style type="text/css">
*{
padding: 0;
margin: 0;
}
ul{
margin: 100px auto;
width: 1000px;
border-bottom: 6px solid #FB4E09;
padding: 0 40px;
}
  li{
  display: inline-block;
  width: 100px;
  text-align: center;
  background-color: #FB4E09;
  padding:15px 0;
  }
</style>
</head>
<body>
<ul id="banner">
<li style="width: 100px">首页</li>
<li style="width: 100px">新闻资讯</li>
<li style="width: 100px">产品展示</li>
<li style="width: 100px">售货服务</li>
<li style="width: 100px">联系我们</li>
</ul>
<script type="text/javascript">
window.οnlοad=function(){
var banner=document.getElementById("banner").getElementsByTagName("li");
// alert(banner.length);
for (var i = 0; i < banner.length; i++) {
banner[i].οnmοuseοver=function(){
var This=this;
clearInterval(This.interavl);
This.interavl=setInterval(function(){
                This.style.width=This.offsetWidth+10+"px";
if(This.offsetWidth>150){
clearInterval(This.interavl);
}
},30);


}
banner[i].οnmοuseοut=function(){
var This=this;
clearInterval(This.interavl);
This.interavl=setInterval(function(){
                This.style.width=This.offsetWidth-8+"px";
if(This.offsetWidth<=100){
clearInterval(This.interavl);
}
},30);


}
}

}
</script>
</body>

</html>


1、this.style.width获取不到值得原因

(1)元素未设置宽度值。

(2)元素设置了宽度值,但是设置在内联或外联样式表中,而非内嵌式的。只有内嵌式的设置宽度才能被获取到。

(3)可以用style.width来设置元素的宽度并且表现出来。

(4)它与this.offsetWidth不同之处

this.style.width返回的是内容区域的宽度,即你单纯设置的宽度,不加padding和border。而且返回的值是带单位的PX。

this.offsetWidth返回的是内容区域+padding+border。返回的值不带单位。


一般想要通过  style.属性   获取的属性值的,都需要使用 内嵌式的设置才能获得,offset属性   则可以获取任意地方定义的属性值
可以利用  style.属性   来设置属性的值并使其表现出来
2、关于var This=this的使用
每个函数在定义被ECMAScript解析器解析时,都会创建两个特殊的变量:this和arguments,换句话说,每个函数都有属于自己的this对象,这个this对象是在运行时基于函数的执行环境绑定的,即在全局对象中,this指向的是window对象;在自定义函数中,this对象指向的是调用这个函数的对象,
也就是说,this指向的是调用执行环境的那个对象。 如果是在函数嵌套环境中,this指代的是调用外部函数或者内部函数的执行环境的对象;
(注意:可以通过使用call()或者apply()改变函数执行环境的情况下,this就会指向其他对象。)



在这个例子里面this指代的是触发onmouseover的对象,

this是Javascript语言的一个关键字它代表函数运行时,自动生成的一个内部对象,只能在函数内部使用。

 //通常用法:将上下文this缓存到一个变量中
 //以便在本函数作用域内包含另一个函数作用域的情况下可以继续使用此上下文对象this
 //如果省略var This=this; 这行,那么在嵌套函数作用域内就无法访问到本函数作用域的成员了。         

this对象在程序中随时会改变,而var This=this之后,This没改变之前仍然是指向当时的this,这样就不会出现找不到原来的对象。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
UGUI的可伸缩折叠菜单可以通过使用Unity的布局组件和动态生成UI元素来实现。以下是一些示例代码: 1. 创建一个空白的GameObject命名为"Menu",并添加一个VerticalLayoutGroup组件。这将用于自动布置菜单项。 2. 创建一个MenuItem脚本,并将其附加到Menu GameObject上。这个脚本将负责动态生成菜单项并处理点击事件。 ```csharp using UnityEngine; using UnityEngine.UI; public class MenuItem : MonoBehaviour { public string title; public GameObject content; public bool isExpanded = false; public Image arrowIcon; private Button button; void Start() { button = GetComponent<Button>(); button.onClick.AddListener(ToggleMenu); } void ToggleMenu() { isExpanded = !isExpanded; if (isExpanded) { content.SetActive(true); arrowIcon.transform.localRotation = Quaternion.Euler(0, 0, 90); } else { content.SetActive(false); arrowIcon.transform.localRotation = Quaternion.Euler(0, 0, 0); } } } ``` 3. 创建一个MenuItem模板预制件,包含一个Button和一个Arrow图标。在这个模板中,将Arrow图标作为Button的子对象,并将Arrow图标的RectTransform设置为适当的大小和位置。 4. 在Menu脚本中添加以下代码,用于动态生成菜单项。 ```csharp using UnityEngine; using UnityEngine.UI; public class Menu : MonoBehaviour { public GameObject menuItemPrefab; public Transform contentContainer; public string[] menuTitles; void Start() { foreach (string title in menuTitles) { GameObject menuItem = Instantiate(menuItemPrefab, contentContainer); MenuItem item = menuItem.GetComponent<MenuItem>(); item.title = title; item.content = new GameObject(title); item.arrowIcon = menuItem.transform.Find("Arrow").GetComponent<Image>(); item.content.transform.SetParent(contentContainer); item.content.SetActive(false); } } } ``` 在这个代码中,我们使用menuItemPrefab来实例化新的菜单项。然后,我们将MenuItem组件中的属性设置为正确的值,并创建一个新的GameObject作为菜单项的内容。最后,我们将菜单项的Arrow图标和内容添加到菜单项中。 这些示例代码可以帮助你开始制作自己的可伸缩折叠菜单。你需要根据自己的需求进行修改和调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值