js笔记(2)实现自滚动选项卡效果

js笔记(2)实现自滚动选项卡效果

1.实例

如下图bilibili官网的效果

在这里插入图片描述

2.简单的原理实现,不带图片
#1css部分代码

xxk.css

@charset="utf-8";

#div1{
	float: left;
}

#div1 div{
	width: 100px;height: 100px;
	background: #bdbdbd;
	border: 1px solid black;
	display: none;
}

#div1 .change{
	background-color: yellow;
}
#2html标签代码
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<link rel="stylesheet" type="text/css" href="xxk.css">
	</head>
	<body>
		<div id = 'div1'>
			<div style="display: block;">1</div>
			<div>2</div>
			<div>3</div>
			<input type="button" name="" value="1" class="change">
			<input type="button" name="" value="2">
			<input type="button" name="" value="3">
			<a href="#"></a>
			<a href="#"></a>
		</div>
	</body>
</html>
#3显示效果

在这里插入图片描述

#4js代码的分步实现

@1:定义变量

var all_input = document.getElementsByTagName('input');
var all_div = div1.getElementsByTagName('div');
var all_a = document.getElementsByTagName('a');
var in_dex = 0;
var timer = null;

all_input; all_div; all_a 是选取所有的这些标签。

in_dex是作为索引值而存在,便于实现“左”“右”按钮

timer用来实现定时器setInterval效果

@2:点击button实现样式切换

for(var i = 0; i < all_input.length; i++){
	all_input[i].setAttribute('suoyin',i);
	all_input[i].onclick = function (){
		for (var i = 0;i<all_input.length;i++){
			all_input[i].className='';
			all_div[i].style.display = 'none';
		}
		//console.log(i);
		all_div[this.getAttribute('suoyin')].style.display = 'block';
		this.className = 'change';
		in_dex = this.getAttribute('suoyin');
	}
}

使用attribute设置索引值便于设置style

@3:实现向右按钮

function roll(){
	in_dex++;
	if(in_dex == all_input.length) in_dex=0;
	for (var i = 0;i<all_input.length;i++){
		all_input[i].className='';
		all_div[i].style.display = 'none';
	}
	all_div[in_dex].style.display = 'block';
	all_input[in_dex].className = 'change';
}
all_a[1].onclick = roll;

这里用函数进行封装,便于设置定时器

@4:实现向左按钮

all_a[0].onclick = function(){
	in_dex--;
	if(in_dex == -1) in_dex=all_input.length-1;
	for (var i = 0;i<all_input.length;i++){
		all_input[i].className='';
		all_div[i].style.display = 'none';
	}
	all_div[in_dex].style.display = 'block';
	all_input[in_dex].className = 'change';
}

根据向右的函数进行简单修改即可

@5:设置定时器,并确定鼠标事件

clearInterval(timer);
timer = setInterval(roll,500);

div1.onmouseover = function(){
	clearInterval(timer);
}
div1.onmouseout = function(){
	clearInterval(timer);
	timer = setInterval(roll,500);
}

鼠标移上去时,暂停滚动,移出继续滚动

在前面的笔记中,我们已经实现选项卡的基本功能,可以切换不同的选项卡内容。但是,为了让选项卡更加美观和实用,我们需要进一步完善选项卡的功能。 ## 1. 添加图标 我们可以为每个选项卡添加一个图标,这样可以更加直观地表示每个选项卡的功能。实现方法如下: 首先,我们需要准备好图标。这里我们以三个选项卡为例,分别对应“文件”,“编辑”和“视图”功能。我们可以在 Unity 的 Assets 窗口中创建一个文件夹,然后将三个图标拖拽到该文件夹中。 接下来,在 OnGUI() 函数中,为每个选项卡添加一个图标。具体实现代码如下: ```csharp // 定义三个纹理变量 private Texture2D fileTexture; private Texture2D editTexture; private Texture2D viewTexture; // 在 Start() 函数中加载纹理 void Start() { fileTexture = Resources.Load<Texture2D>("fileIcon"); editTexture = Resources.Load<Texture2D>("editIcon"); viewTexture = Resources.Load<Texture2D>("viewIcon"); } // 在 OnGUI() 函数中为每个选项卡添加图标 void OnGUI() { GUI.skin = skin; // 绘制选项卡标签栏 GUILayout.BeginHorizontal(); if (GUILayout.Toggle(selectedTab == 0, new GUIContent(fileTexture, "文件"), "tabLeft")) selectedTab = 0; if (GUILayout.Toggle(selectedTab == 1, new GUIContent(editTexture, "编辑"), "tabMid")) selectedTab = 1; if (GUILayout.Toggle(selectedTab == 2, new GUIContent(viewTexture, "视图"), "tabRight")) selectedTab = 2; GUILayout.EndHorizontal(); // 绘制选项卡内容 switch (selectedTab) { case 0: DrawFileTab(); break; case 1: DrawEditTab(); break; case 2: DrawViewTab(); break; } } ``` 在上面的代码中,我们首先定义了三个纹理变量,然后在 Start() 函数中加载了这三个纹理。在 OnGUI() 函数中,我们为每个选项卡添加了一个图标,并使用 GUIContent 类型的参数来设置图标和鼠标悬停时显示的文本。 运行程序,我们可以看到每个选项卡都有了自己的图标。 ## 2. 设置选项卡大小 默认情况下,选项卡的大小是根据标签文本的长度来自动调整的。但是,有时候我们希望选项卡的大小是固定的,这样可以使选项卡更加美观。实现方法如下: 首先,我们需要定义一个变量来保存选项卡的宽度。例如,我们希望每个选项卡的宽度都是 100 像素,那么可以定义一个变量如下: ```csharp private int tabWidth = 100; ``` 然后,在 OnGUI() 函数中为每个选项卡设置宽度。具体实现代码如下: ```csharp // 在 OnGUI() 函数中为每个选项卡设置宽度 void OnGUI() { GUI.skin = skin; // 计算选项卡的总宽度 int totalWidth = tabWidth * 3 + 6; // 绘制选项卡标签栏 GUILayout.BeginHorizontal(GUILayout.Width(totalWidth)); if (GUILayout.Toggle(selectedTab == 0, new GUIContent(fileTexture, "文件"), "tabLeft", GUILayout.Width(tabWidth))) selectedTab = 0; if (GUILayout.Toggle(selectedTab == 1, new GUIContent(editTexture, "编辑"), "tabMid", GUILayout.Width(tabWidth))) selectedTab = 1; if (GUILayout.Toggle(selectedTab == 2, new GUIContent(viewTexture, "视图"), "tabRight", GUILayout.Width(tabWidth))) selectedTab = 2; GUILayout.EndHorizontal(); // 绘制选项卡内容 switch (selectedTab) { case 0: DrawFileTab(); break; case 1: DrawEditTab(); break; case 2: DrawViewTab(); break; } } ``` 在上面的代码中,我们首先计算了选项卡标签栏的总宽度,然后使用 GUILayout.BeginHorizontal() 函数设置了标签栏的宽度。接下来,我们使用 GUILayout.Width() 函数为每个选项卡设置宽度。 运行程序,我们可以看到每个选项卡的宽度都是固定的。 ## 3. 支持拖拽 有时候,我们希望能够通过拖拽的方式来切换选项卡,这样可以使用户体验更加流畅。实现方法如下: 首先,我们需要定义一个变量来保存当前鼠标是否按下。例如,我们可以定义一个布尔型变量如下: ```csharp private bool isMouseDown; ``` 然后,在 OnGUI() 函数中检测鼠标是否按下,并根据鼠标位置计算选项卡索引。具体实现代码如下: ```csharp // 在 OnGUI() 函数中检测鼠标是否按下,并根据鼠标位置计算选项卡索引 void OnGUI() { GUI.skin = skin; // 计算选项卡的总宽度 int totalWidth = tabWidth * 3 + 6; // 绘制选项卡标签栏 GUILayout.BeginHorizontal(GUILayout.Width(totalWidth)); if (Event.current.type == EventType.MouseDown && Event.current.button == 0) { isMouseDown = true; } if (Event.current.type == EventType.MouseUp && Event.current.button == 0) { isMouseDown = false; int index = (int)(Event.current.mousePosition.x / tabWidth); if (index != selectedTab) { selectedTab = index; } } if (GUILayout.Toggle(selectedTab == 0, new GUIContent(fileTexture, "文件"), "tabLeft", GUILayout.Width(tabWidth))) selectedTab = 0; if (GUILayout.Toggle(selectedTab == 1, new GUIContent(editTexture, "编辑"), "tabMid", GUILayout.Width(tabWidth))) selectedTab = 1; if (GUILayout.Toggle(selectedTab == 2, new GUIContent(viewTexture, "视图"), "tabRight", GUILayout.Width(tabWidth))) selectedTab = 2; GUILayout.EndHorizontal(); // 绘制选项卡内容 switch (selectedTab) { case 0: DrawFileTab(); break; case 1: DrawEditTab(); break; case 2: DrawViewTab(); break; } } ``` 在上面的代码中,我们首先检测鼠标是否按下。如果鼠标左键按下,我们将 isMouseDown 变量设置为 true。接下来,我们检测鼠标左键是否释放。如果是,我们将 isMouseDown 变量设置为 false,并根据鼠标位置计算选项卡索引。如果选项卡索引不等于当前选项卡索引,则切换选项卡。 运行程序,我们可以使用鼠标拖拽的方式切换选项卡
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值