js逐步教你实现原生古诗匹配系统(html逻辑 css逻辑 js逻辑)

简介: js逐步教你实现原生古诗匹配系统(html逻辑 css逻辑 js逻辑)

第一步html:

<form action="
    " class="search-form">
        <input type="text" class="search"  placeholder="诗人名字,关键字">
        <ul  class="suggestions">
            <li>这里面是匹配到的古诗</li>
        </ul>
    </form>

图片:
在这里插入图片描述

html逻辑:
写一个html表单,表单text表达的是匹配的是什么?
ul里面是匹配成功出来的诗.

css部分:

*{padding: 0px;margin: 0px;}
        body
        {
            display: flex;
            justify-content: center;
            background-color: rgb(145,182,195);
        }
        .search-form {
          display: flex;
          flex-direction: column;
          justify-content: center;
          align-items: center;
        }
        input.search {
          padding: 20px;
          font-size: 40px;
          text-align: center;
          width: 120%;
          outline: 0;
          border-radius: 5px;
          position: relative;
          top: 10px;
          left: 10px;
        }
        .suggestions {
          position: relative;
          top: 7px;
          width: 100%;
        }

        .suggestions li {
          background: white;
          list-style: none;
          padding: 20px;
          display: flex;
          flex-direction: column;
        }
        span.title {
          margin-right: 20px;
          text-align: right;
          color: yellow;
          margin-top: 5px;
        }

        span.hl {
          color: green;
        }



        /*偶数匹配*/
        .suggestions li:nth-child(even) {
          transform: perspective(100px) rotateX(3deg) translateY(2px) scale(1.001);
          background: linear-gradient(to bottom, #ffffff 0%, #efefef 100%);
        }

        /*奇数匹配*/
        .suggestions li:nth-child(odd) {
          transform: perspective(100px) rotateX(-3deg) translateY(3px);
          background: linear-gradient(to top, #ffffff 0%, #efefef 100%);
        }

css逻辑:
第一:先取消掉所有的系统默认的样式.
第二:是先让body里面的表单弹性布局( display: flex;),并让主轴(justify-content)x水平居中.(简单的说就是让表单水平居中.).
第三:是让表单里面的元素flex布局,并让主轴改为y排列模式flex-direction: column;,y居中justify-content: center;,x居中 align-items: center;.
第四:是让input:text自身扩大20px,文字40px,text里面的文字水平居中,点击的边框默认行为变没( outline: 0;),top:10是让离上面10px,,left:10离左边10px
注意一下;相对定位是相对于本身的啊。
第五;是ul相对于本身top: 7px;
第六:是让里面的li里面的文字垂直排列.( flex-direction:是默认的方式是水平.)
第七:是

span.title {
          margin-right: 20px;
          text-align: right;
          color: yellow;
          margin-top: 5px;
        }

        span.hl {
          color: green;
        }

js使用的.
第八:是
在这里插入图片描述这里的目的是;让它更立体感一点,
偶数的情况下;距离目标100px,x轴旋转3deg,往y也就是往厚度移动2px,一倍大0.001.
奇数的情况下;渐变是开始的时候是#ffffff 0%,到达top的时候是#efefef 100%,也就是说从下往上把.
第九;偶数even代表0248,奇数代表13579

效果图片:
在这里插入图片描述

js代码(逻辑在下面):

const endpoint =
      'https://gist.githubusercontent.com/liyuechun/f00bb31fb8f46ee0a283a4d182f691b4/raw/3ea4b427917048cdc596b38b67b5ed664605b76d/TangPoetry.json';


    const poetrys = [];
    fetch(endpoint)
      .then(responseData => {
        console.log(responseData);
        return responseData.json();
      })
      .then(data => {
        console.log(data);
        poetrys.push(...data);
        console.log(poetrys);
      });



    function findMatches(wordToMatch, poetrys) {
      return poetrys.filter(poet => {
        // 正则找出匹配的诗句
        const regex = new RegExp(wordToMatch, 'gi');
        const author = poet.detail_author.join('');
        //            console.log(author);
        return poet.detail_text.match(regex) || poet.title.match(regex) || author.match(regex);
      });
    }

    function displayMatches() {
      const matches = findMatches(this.value, poetrys);
      const regex = new RegExp(this.value, 'gi');
      const html = matches.map(poet => {
        // 替换高亮的标签
        const text = poet.detail_text.replace(regex, `<span class="hl">${ this.value }</span>`);
        const title = poet.title.replace(regex, `<span class="hl">${ this.value }</span>`);
        const detail_author = poet.detail_author[0].replace(regex, `<span class="hl">${ this.value }</span>`);
        // 构造 HTML 值
        return `
      <li>
        <span class="poet">${ text }</span>
        <span class="title">${ title } - ${ detail_author }</span>
      </li>
    `;
      }).join();
      //        console.log(html);
      suggestions.innerHTML = html;
    }

    const search = document.querySelector('.search');
    const suggestions = document.querySelector('.suggestions');

    search.addEventListener('change', displayMatches);
    search.addEventListener('keyup', displayMatches);

    //    console.log(poetrys);

js逻辑:
第一步:得到json数据

const endpoint =
      'https://gist.githubusercontent.com/liyuechun/f00bb31fb8f46ee0a283a4d182f691b4/raw/3ea4b427917048cdc596b38b67b5ed664605b76d/TangPoetry.json';

第二:创建一个空数组用来装数据的.
第三;先下载fetch(endpoint),下载完毕后,再让里面的一个一个的字符串转换成对象.

then(responseData => {
        return responseData.json();

,完毕后,然后再让一个一对象装进一个一下标里面(装进数组里面).

.then(data => {
        console.log(data);
        poetrys.push(...data);

...是扩展运算符,是。。。代表获取所有的.

第四:获取到要用到的表单与ul。
第五:是当input改变的时候,把

 const matches = findMatches(this.value, poetrys);

把输入的值与poetrys进行匹配去进行:
第六:

在这里插入图片描述

这个函数的
第一步是:用正则(输入的作为匹配的条件(也就是说必须包括它.))。
第二步:是要转换成字符串才能匹配,为什么,因为对象不能匹配(js规定).
第三步·:是要让诗句 或者诗名 或者作者名必须有一个里面包括的值是输入的匹配成功就行了.

在这里插入图片描述

功能是;把输入的换成高高亮亮的颜色.在innerHTML到网页上.
注意一下:要正则的话必须先转换成字符串啊.join();

注意一下;text诗句,title是诗名。author是作者名.

最下面是整个项目的代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style type="text/css">
        *{padding: 0px;margin: 0px;}
        body
        {
            display: flex;
            justify-content: center;
            background-color: rgb(145,182,195);
        }
        .search-form {
          display: flex;
          flex-direction: column;
          justify-content: center;
          align-items: center;
        }
        input.search {
          padding: 20px;
          font-size: 40px;
          text-align: center;
          width: 120%;
          outline: 0;
          border-radius: 5px;
          position: relative;
          top: 10px;
          left: 10px;
        }
        .suggestions {
          position: relative;
          top: 7px;
          width: 100%;
        }

        .suggestions li {
          background: white;
          list-style: none;
          padding: 20px;
          display: flex;
          flex-direction: column;
        }
        span.title {
          margin-right: 20px;
          text-align: right;
          color: yellow;
          margin-top: 5px;
        }

        span.hl {
          color: green;
        }



        /*偶数匹配*/
        .suggestions li:nth-child(even) {
          transform: perspective(100px) rotateX(3deg) translateY(2px) scale(1.001);
          background: linear-gradient(to bottom, #ffffff 0%, #efefef 100%);
        }

        /*奇数匹配*/
        .suggestions li:nth-child(odd) {
          transform: perspective(100px) rotateX(-3deg) translateY(3px);
          background: linear-gradient(to top, #ffffff 0%, #efefef 100%);
        }

    </style>
</head>
<body>
    <form class="search-form">
        <input type="text" class="search"  placeholder="诗人名字,关键字">
        <ul  class="suggestions">
            <li>输入词句,找一首诗</li>
            <li></li>
        </ul>
    </form>
    <script>
    
    const endpoint =
      'https://gist.githubusercontent.com/liyuechun/f00bb31fb8f46ee0a283a4d182f691b4/raw/3ea4b427917048cdc596b38b67b5ed664605b76d/TangPoetry.json';


    const poetrys = [];
    fetch(endpoint)
      .then(responseData => {
        console.log(responseData);
        return responseData.json();
        
      })
      .then(data => {
        console.log(data);
        poetrys.push(...data);
        console.log(poetrys);
      });



    function findMatches(wordToMatch, poetrys) {
      return poetrys.filter(poet => {
        // 正则找出匹配的诗句
        const regex = new RegExp(wordToMatch, 'gi');
        const author = poet.detail_author.join('');
        //            console.log(author);
        return poet.detail_text.match(regex) || poet.title.match(regex) || author.match(regex);
      });
    }

    function displayMatches() {
      const matches = findMatches(this.value, poetrys);
      const regex = new RegExp(this.value, 'gi');
      const html = matches.map(poet => {
        // 替换高亮的标签
        const text = poet.detail_text.replace(regex, `<span class="hl">${ this.value }</span>`);
        const title = poet.title.replace(regex, `<span class="hl">${ this.value }</span>`);
        const detail_author = poet.detail_author[0].replace(regex, `<span class="hl">${ this.value }</span>`);
        // 构造 HTML 值
        return `
      <li>
        <span class="poet">${ text }</span>
        <span class="title">${ title } - ${ detail_author }</span>
      </li>
    `;
      }).join();
      //        console.log(html);
      suggestions.innerHTML = html;
    }

    const search = document.querySelector('.search');
    const suggestions = document.querySelector('.suggestions');

    search.addEventListener('change', displayMatches);
    search.addEventListener('keyup', displayMatches);

    //    console.log(poetrys);
  </script>

</body>
</html>
相关文章
|
18天前
纸屑飘落生日蛋糕场景js+css3动画特效
纸屑飘落生日蛋糕CSS3动画特效是一款js+css3制作的全屏纸屑飘落,生日蛋糕点亮庆祝动画特效。
35 3
|
1月前
|
缓存 前端开发 JavaScript
优化CSS和JavaScript加载
优化CSS和JavaScript加载
|
1月前
|
缓存 前端开发 JavaScript
优化CSS和JavaScript加载
Next.js和Nuxt.js在优化CSS和JavaScript加载方面提供了多种策略和工具。Next.js通过代码拆分、图片优化和特定的CSS/JavaScript优化措施提升性能;Nuxt.js则通过代码分割、懒加载、预渲染静态页面、Webpack配置和服务端缓存来实现优化。两者均能有效提高应用性能。
|
1月前
JS+CSS3文章内容背景黑白切换源码
JS+CSS3文章内容背景黑白切换源码是一款基于JS+CSS3制作的简单网页文章文字内容背景颜色黑白切换效果。
20 0
|
JavaScript 前端开发
12道 javaScript 经典逻辑题,是否承载着你的回忆
12道 javaScript 经典逻辑题,是否承载着你的回忆
|
1月前
|
JavaScript 前端开发
JavaScript中的原型 保姆级文章一文搞懂
本文详细解析了JavaScript中的原型概念,从构造函数、原型对象、`__proto__`属性、`constructor`属性到原型链,层层递进地解释了JavaScript如何通过原型实现继承机制。适合初学者深入理解JS面向对象编程的核心原理。
27 1
JavaScript中的原型 保姆级文章一文搞懂
|
5月前
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp的客户关系管理系统附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp的客户关系管理系统附带文章源码部署视频讲解等
107 2
|
5月前
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp的小区物流配送系统附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp的小区物流配送系统附带文章源码部署视频讲解等
155 4
|
5月前
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp的宠物援助平台附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp的宠物援助平台附带文章源码部署视频讲解等
90 4
|
5月前
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp的宠物交易平台附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp的宠物交易平台附带文章源码部署视频讲解等
82 4