电影应用开发:从代码细节到用户体验优化

在前端开发的世界里,学习一个实际的项目是提升技能的有效途径。今天我们就来深入剖析一个电影应用的开发,重点讲解其中的关键知识点,帮助大家更好地理解项目背后的编程思想和用户体验优化策略。

学习地点:50projects50days.com/projects/mo...

我还剩一点 css 样式没有完成,大家可以根据我给的网址去查看源码来帮助实现。

良好的编程风格和用户体验的细节考量

在开发过程中,遵循良好的编程风格是至关重要的。像字节、腾讯、拼多多等大厂都有自己的代码风格手册,这些手册规范了代码的书写方式,让代码更具可读性和可维护性。统一的代码风格可以让团队成员之间的协作更加顺畅,也方便后续的代码审查和修改。

表单阻止默认提交的原因及实现

为何要阻止默认提交

在 HTML 早期,表单收集用户的数据后,默认会由后端处理。当用户提交表单时,页面会重新刷新,这会给用户带来不好的体验,页面会出现短暂的"白屏"现象。而随着 JavaScript 的发展,我们可以使用 fetch 方法进行 HTTP 请求来提交数据,这样就没有必要刷新页面了。通过阻止表单的默认提交行为,我们可以优化用户体验,让页面交互更加流畅。

实现方式

script.js 文件中,我们可以看到以下代码:

javascript 复制代码
oForm.addEventListener('submit', function(event) {
  console.log(event, '////');
  event.preventDefault();
  const search = oInput.value.trim();
  if (search) {
    getMovies(search)
  }
})

这里通过 addEventListener 为表单的 submit 事件添加了一个监听器。当用户提交表单时,会触发这个监听器。在监听器内部,使用 event.preventDefault() 方法阻止了表单的默认提交行为。然后获取用户输入的搜索关键词,调用 getMovies 函数进行电影搜索。

如果不阻止表单的默认提交行为,就算不写 action 地址,它也会自动跳转页面,在原来地址上加一个?,换页面可以看到下面的输出也刷新。

HTML5 特性提升用户体验

placeholder 属性

placeholder 是 HTML5 的新特性,它可以在输入框中显示提示信息,告诉用户应该输入什么内容。在 index.html 文件中,我们可以看到以下代码:

html 复制代码
<input 
  type="text" 
  id="search" 
  class="search" 
  placeholder="Search"
  required
>

这里的 placeholder="Search" 会在输入框中显示"Search"字样,当用户开始输入时,提示信息会自动消失。这个特性可以把用户当成小白,为他们提供明确的操作指引,减少用户犯错的可能性。

语义化标签

HTML5 引入了许多语义化标签,如 headermain 等。这些标签可以让代码的结构更加清晰,也有利于搜索引擎优化(SEO)。在 index.html 文件中,我们使用了 header 标签来包裹搜索表单,使用 main 标签来显示电影列表:

html 复制代码
<header>
  <form action="" id="form">
    <input 
      type="text" 
      id="search" 
      class="search" 
      placeholder="Search"
      required
    >
  </form>
</header>
<main id="main"></main>

这样的结构让代码更易于理解和维护。

required 关键字

required 关键字可以将表单字段设置为必填项。在上面的输入框代码中,required 属性确保用户必须输入内容才能提交表单,从而减少了一些用户犯错的情况。

当然我们在写js 代码时也为该输入添加了.trim()(去除首尾空格)方法,以防用户不小心输入空格回车搜索。

函数模块化的重要性

函数模块化是一种重要的编程思想,它强调将代码封装成独立的函数,实现代码的复用和模块化。在 script.js 文件中,我们将获取电影数据和显示电影列表的功能分别封装成了 getMoviesshowMovies 函数:

javascript 复制代码
// 获取电影 
const getMovies = (keyword) => {
  let reqUrl = '';
  if (keyword) {
    reqUrl = SEARCH_API + keyword;
  } else {
    reqUrl = API_URL;
  }
  fetch(reqUrl)
  .then(res => res.json())
  .then(data => {
    showMovies(data.results);
  })
}

// movie list render
const showMovies = (movies) => {
  main.innerHTML = '';
  main.innerHTML = movies.map(movie => {
    const { title, poster_path, vote_average, overview } = movie;
    return`
    <div class="movie">
      <img src="${IMG_PATH + poster_path}" alt="${title}">
      <div class="movie-info">
        <h3>${title}</h3>
        <span>${vote_average}</span>
      </div>
      <div class="overview">
        <h3>Overview</h3>
        ${overview}
      </div>
    </div>  
  `}).join("")
}

这样的封装让代码更加清晰,每个函数只负责一个特定的功能,方便代码的维护和扩展。如果后续需要修改获取电影数据的逻辑,只需要修改 getMovies 函数即可,不会影响到其他部分的代码。

项目亮点解析

这个电影搜索项目还有几个值得学习的亮点:

  1. 响应式设计:通过CSS的flex布局和合理的单位使用,确保应用在不同设备上都能良好显示。
  2. 视觉效果:电影卡片设计了悬停显示详情的交互效果,增强了用户体验:

flex布局可以看看这篇:Flex 弹性布局完全指南

css 复制代码
.movie:hover .overview{
    transform: translateY(0);
}

hover:悬浮事件,鼠标到哪,哪个电影简介悬停展示,而不是堆在下面显得冗长杂乱:

  1. ES6特性应用:大量使用现代JavaScript特性如模板字符串、箭头函数、解构赋值等,使代码更简洁:
javascript 复制代码
const { title, poster_path, vote_average, overview } = movie;
  1. 性能优化 :将script标签放在body底部,避免阻塞页面渲染,尽快看到页面才是重中之重。

JSONView 插件的作用

JSONView 是一款浏览器插件,它可以让我们更好地查看 API 接口返回的 JSON 数据。在开发过程中,我们经常需要调试 API 请求,查看返回的数据结构。JSONView 可以将 JSON 数据以更直观的方式展示出来,方便我们进行调试和分析。

安装JSONView 之前的数据展示(其实点左上角的美观输出也可以):

安装 JSONView 之后:

通过对这个电影应用的学习,我们不仅掌握了前端开发的一些基本技能,还了解了如何从用户体验的角度出发,优化代码和设计页面。希望这些知识能对大家的学习和工作有所帮助。

整体代码50projects50days.com/projects/mo... jym 点开检查网页源代码就行。

相关推荐
袁煦丞1 分钟前
低成本私有云存储方案Nas-Cab:cpolar实验室第508次成功挑战
前端·程序员·远程工作
小公主2 分钟前
「前端必备」Flex 布局全解析:从入门到深度计算,搞懂弹性盒子!
前端·css
江城开朗的豌豆19 分钟前
前端性能救星!用 requestAnimationFrame 丝滑渲染海量数据
前端·javascript·面试
江城开朗的豌豆19 分钟前
src和href:这对'双胞胎'属性,你用对了吗?
前端·javascript·面试
江城开朗的豌豆26 分钟前
forEach遇上await:你的异步代码真的在按顺序执行吗?
前端·javascript·面试
万少34 分钟前
HarmonyOS Next 弹窗系列教程(3)
前端·harmonyos·客户端
七灵微2 小时前
【后端】单点登录
服务器·前端
持久的棒棒君6 小时前
npm安装electron下载太慢,导致报错
前端·electron·npm
crary,记忆8 小时前
Angular微前端架构:Module Federation + ngx-build-plus (Webpack)
前端·webpack·angular·angular.js
漂流瓶jz8 小时前
让数据"流动"起来!Node.js实现流式渲染/流式传输与背后的HTTP原理
前端·javascript·node.js