HTML手搓轮播图+解决轮播图无法播放问题

1.HTML手搓轮播图

虽然现在前端框架很多,很多情况不需要自己手搓组件,但是为了解决初学者的学习问题,这里我还是给大家分享下吧。

首先是html代码

<div class="center-pic">
				<div id="lunboimg">
					<a href="#">
						<img src="img/0.jpg" class="carousel-image" />
					</a>
					<div id="selector">
						<span class="selector-span"></span>
						<span class="selector-span"></span>
						<span class="selector-span"></span>
						<span class="selector-span"></span>
						<span class="selector-span"></span>
					</div>
				</div>
			</div>

然后是css代码

#lunboimg {
				width: 200px;
				height: 200px;
				position: absolute;
				display: flex;
			}
			.carousel-image {
				width: 800px;
				height: 310px;
				object-fit: cover;
			}
			#selector{
				position: absolute;
				bottom:-100px;
				right:-580px;
				display: flex;
				justify-content: space-between;
				z-index: 100;
			}
			#selector span {
				display: inline-block;
				width: 10px;
				height: 10px;
				background-color: gray;
				margin: 0 5px;
				cursor: pointer;
			}

最重要的js代码

let img = document.querySelector('#lunboimg .carousel-image');
let spans = document.querySelectorAll('#selector .selector-span');
let index = 0;
let timer;

function show() {
    img.src = `img/${index}.jpg`;
    spans.forEach(span => span.style.backgroundColor = 'gray');
    spans[index].style.backgroundColor = 'red';
}

function autoPlay() {
    timer = setInterval(function() {
        index = (index + 1) % spans.length;
        show();
    }, 1000);
}
autoPlay();

function ctrlPlay() {
    spans.forEach((span, i) => {
        span.onclick = function() {
            index = i;
            show();
        };
    });
}
ctrlPlay();

function eventList() {
    spans.forEach((span, i) => {
        span.addEventListener('mouseenter', function() {
            clearInterval(timer);
            index = i;
            show();
        }, false);

        span.addEventListener('mouseleave', function() {
            autoPlay();
        }, false);
    });
}
eventList();

这里要注意刚开始的img和span的命名,最好在html里相应部分加上class,避免和页面其他的img和span搞混,这里的js功能包括自动轮播和鼠标控制播放。

2.解决轮播图无法播放问题

第二个部分是我写代码时遇到的,不一定和大家的一样,但是大家可以参考下,我觉得很容易出错。这里的前端代码都是正确的,我去打印了下前端span.length的值,发现是0。

所以很有可能是页面没加载出来就执行了js代码,导致没获取到正确的span.length

于是我又回头看了代码,发现我引用的<script>在head标签里,也就是body的上方,答案呼之欲出,我把<script>放在body的最后,使得浏览器先解析html再执行js逻辑,发现完美的解决了问题~

(关灯睡觉ZZZ)

<think>嗯,用户询问写编译器常见问题解决方法。这是个专业性很强的问题,需要结合编译原理知识和实际开发经验来回答。用户可能正在学习编译原理或尝试自己实现编译器,遇到了具体困难。从ta提问方式看,应该是初学者或中级学习者,需要既包含理论解释又包含实践指导的答案。根据系统要求,所有数学公式都需要用$...$格式。在回答中会涉及正则表达式、文法推导等需要数学表示的内容,需要特别注意格式规范。例如正则表达式$\d+$和文法规则$S\rightarrowaSb$都需要正确标注。准备从词法分析、语法分析、语义处理、代码生成和优化五个主要阶段组织问题分类。每个问题都会给出具体错误示例和解决方案:词法分析部分重点讲解正则表达式冲突(如优先级问题)和未识别符号的处理。比如用$|$操作符时要注意顺序,示例中$\text{int}|\text{integer}$会导致后者无法匹配的问题很典型。语法分析阶段主要解决二义性和冲突处理。LL(1)文法中FIRST集计算$FIRST(A)=\{a\inT\midA\Rightarrow^*a\alpha\}$和LR分析表冲突都需要数学表示。会强调测试用例的重要性,建议用户像示例那样构造$1+2*3$和$1*2+3$等关键用例。语义分析环节类型系统是重点,要说明如何实现类型推导和检查。比如隐式转换规则$int\rightarrowfloat$的实现策略,以及符号表作用域管理的$O(n)$复杂度优化。代码生成部分会讨论平台相关的寄存器分配问题,引入图着色算法$O(n^2)$的复杂度说明。优化阶段则强调DAG和常量传播$c=2*3\rightarrowc=6$的具体实现技巧。最后补充开发建议时,会引用用户提供的参考材料[^2]中关于错误定位的技巧,结合示例说明如何根据^~~标记快速定位错误源。测试驱动开发部分则呼应参考材料[^3]提到的性能优化思路。相关问题设计会覆盖理论(文法证明)、实践(工具链)和进阶(JIT优化)三个维度,帮助用户系统掌握。特别注意所有独立公式如$S\Rightarrow^*\epsilon$都必须用$$...$$格式并单独成段。需要确保所有技术细节准确:比如提到LL(1)分析器时明确其不能处理左递归,解决方案$A\rightarrowA\alpha\mid\beta$应改写为$A\rightarrow\betaA'$等专业内容必须验证无误。</think>以下梳理写编译器各阶段的常见问题解决方案,结合编译原理与实践经验整理: ### 一、词法分析阶段 1. **问题:正则表达式冲突** - 现象:`int` 被误识别为标识符(如定义顺序:`identifier=[a-z]+` 在 `int` 之前) - **解决方案**: 调整规则优先级,关键字优先于标识符: ```lex "int" { return TOKEN_INT; } // 关键字在前 [a-z]+ { return TOKEN_ID; } // 标识符在后 ``` 2. **问题:未识别特殊符号** - 现象:`@` 等符号未定义,导致扫描中断 - **解决方案**: 添加默认规则并报错: ```lex . { printf("非法字符: %c", yytext[0]); } ``` --- ### 二、语法分析阶段 3. **问题:二义性文法** - 经典案例:`if x if y then z else w` 的 `else` 归属歧义 - **解决方案**: 使用明确分层文法(如规定 `else` 匹配最近 `if`): $$ \begin{align*} stmt \rightarrow & \text{ matched\_stmt } \\ & | \text{ open\_stmt } \\ matched\_stmt \rightarrow & \text{ if expr then matched\_stmt else matched\_stmt } \\ open\_stmt \rightarrow & \text{ if expr then stmt } \\ & | \text{ if expr then matched\_stmt else open\_stmt } \end{align*} $$ 4. **问题:LR(1) 状态冲突** - 现象:移进-归约冲突(如 `1+2*3` 中 `*` 的优先级处理) - **解决方案**: - 显式定义优先级:`%left '+'`, `%left '*'` - 或重构文法: $$expr \rightarrow expr + term \mid term$$ $$term \rightarrow term * factor \mid factor$$ --- ### 三、语义分析阶段 5. **问题:类型系统不一致** - 案例:`float x = 10 + 3.5;` 中整数与浮点数运算 - **解决方案**: - 实现隐式类型转换规则: $$int \rightarrow float \rightarrow double$$ - 或强制显式转换:`(float)10 + 3.5` 6. **问题:作用域嵌套错误** - 现象:内层变量覆盖外层同名变量时访问错误 - **解决方案**: 用**符号表栈**管理作用域: ```c void enter_scope() { symtab = new_scope(symtab); } // 入栈新作用域 void exit_scope() { symtab = symtab->parent; } // 出栈 ``` --- ### 四、代码生成与优化 7. **问题:寄存器分配冲突** - 现象:多变量竞争有限寄存器(如 x86 仅有 16 个通用寄存器) - **解决方案**: - **图着色算法**:将变量视为节点,冲突边连接,着色数=寄存器数 - 溢出策略:将溢出变量存储到内存 8. **问题:冗余指令生成** - 案例:`a = b * 0` 未优化为 `a = 0` - **解决方案**: 实现窥孔优化规则: ```text MUL reg, 0 → MOV reg, 0 ADD reg, 0 → NOP ``` --- ### 五、开发实践建议 1. **测试驱动**: - 为每个语法单元编写测试用例(如解析 `1+2*3` 需输出 AST:`+(1, *(2,3))`) 2. **工具链整合**: - 使用 Flex/Bison 加速词法/语法分析开发,避免重复造轮子[^2] 3. **可视化调试**: - 输出 AST 的 Graphviz DOT 格式,直观检查结构正确性 ```dot // AST 示例 digraph { node [shape=box]; expr -> "+"; "+" -> "1"; "+" -> "*"; "*" -> "2"; "*" -> "3"; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值