自己用JavaScript写出吉他和弦图生成器

前言:因为自己有个设计衣服的想法,但网络搜到的和弦图都太模糊,也对市场上的和弦图生成器不太清楚,于是,用自己所学,使用JavaScript写出和弦图

和弦图画起来也是比较简单的,分析一下,就是横竖线,加点位。

步骤:

1、容器

首先创建和弦容器,使用absolute定位;定义好它的宽高。

        let container = document.createElement("div");
        container.id = `poi-${Object.keys(this.gittarPoi[index])}`;
        gittar.appendChild(container);
        container.style.position = "absolute";
        container.style.width = "50px";
        container.style.height = "46px";
        container.style.top = 0;
        container.style.left = `${index * 56}px`;
        // 和弦格子
        container.style.top = 0;

2、接着就可以画格子了

          
          // 竖线
          let v_ul = document.createElement("ul");
          container.appendChild(v_ul);
          for (let i = 0; i < 6; i++) {
            let v_li = document.createElement("li");
            v_li.id = `v-${index}-${i}`;
            v_ul.appendChild(v_li);
            v_li.style["list-style-type"] = "none";
            v_li.style.position = "absolute";
            v_li.style["border-left"] = "1px solid #000";
            v_li.style.height = "46px";
            v_li.style.left = `${i * 10}px`;
            v_li.style.top = 0;
          }
          // 横线
          let h_ul = document.createElement("ul");
          container.appendChild(h_ul);
          for (let j = 0; j <= 3; j++) {
            let h_li = document.createElement("li");
            h_li.id = `h-${index}-${j}`;
            h_ul.appendChild(h_li);
            h_li.style["list-style-type"] = "none";
            h_li.style.position = "absolute";
            h_li.style["border-top"] = "1px solid #000";
            h_li.style.width = "50px";
            h_li.style.top = `${j * 15}px`;
            h_li.style.left = 0;
          }

3、点位

initPoi() {
      this.gittarPoi.forEach((element) => {
        const container = document.getElementById(
          `poi-${Object.keys(element)}`
        );
          Object.keys(element).forEach((item) => {
            element[item].forEach((vh, index1) => {
              // 和弦点位坐标
              let poi = document.createElement("div");
              poi.id = `${Object.keys(element) + index1}`;
              container.appendChild(poi);
              poi.style.position = "absolute";
              poi.style["border-radius"] = "50%";
              poi.style.width = "8px";
              poi.style.background = "#000";
              poi.style.height = "8px";
              //偏移量与坐标、单位宽度、半径
              poi.style.right = `${(vh[0] - 1) * 10 - 4 - 0.25}px`;
              poi.style.top = `${(vh[1] - 1) * 15 + 4 + 0.25}px`;
            });
          });
      });
    },

例子:

自己在vue里面写了一个小demo

<template>
  <div class="gittar" id="gittar"></div>
</template>

<script>
export default {
  data() {
    return {
      gittarPoi: [
        {
          f: [
            [6, 1],
            [5, 3],
            [4, 3],
            [3, 2],
            [2, 1],
            [1, 1],
          ],
        },
        {
          u: "U",
        },
        {
          c: [
            [5, 3],
            [4, 2],
            [2, 1],
          ],
        },
        {
          k: "K",
        },
      ],
    };
  },
  mounted() {
    this.drawGrid();
    this.initPoi();
  },
  methods: {
    drawGrid() {
      let gittar = document.getElementById("gittar");
      // 根据gittarPoi创建元素
      for (let index = 0; index < this.gittarPoi.length; index++) {
        let container = document.createElement("div");
        container.id = `poi-${Object.keys(this.gittarPoi[index])}`;
        gittar.appendChild(container);
        container.style.position = "absolute";
        container.style.width = "50px";
        container.style.height = "46px";
        container.style.top = 0;
        container.style.left = `${index * 56}px`;
        // 判断是否为和弦图
        if (Array.isArray(Object.values(this.gittarPoi[index])[0])) {
          // 和弦格子
          container.style.top = 0;
          // 竖线
          let v_ul = document.createElement("ul");
          container.appendChild(v_ul);
          for (let i = 0; i < 6; i++) {
            let v_li = document.createElement("li");
            v_li.id = `v-${index}-${i}`;
            v_ul.appendChild(v_li);
            v_li.style["list-style-type"] = "none";
            v_li.style.position = "absolute";
            v_li.style["border-left"] = "1px solid #000";
            v_li.style.height = "46px";
            v_li.style.left = `${i * 10}px`;
            v_li.style.top = 0;
          }
          // 横线
          let h_ul = document.createElement("ul");
          container.appendChild(h_ul);
          for (let j = 0; j <= 3; j++) {
            let h_li = document.createElement("li");
            h_li.id = `h-${index}-${j}`;
            h_ul.appendChild(h_li);
            h_li.style["list-style-type"] = "none";
            h_li.style.position = "absolute";
            h_li.style["border-top"] = "1px solid #000";
            h_li.style.width = "50px";
            h_li.style.top = `${j * 15}px`;
            h_li.style.left = 0;
          }
        } else {
          container.style.top = "-10px";
        }
      }
    },
    initPoi() {
      this.gittarPoi.forEach((element) => {
        const container = document.getElementById(
          `poi-${Object.keys(element)}`
        );
        // 判断是否为和弦图
        if (Array.isArray(Object.values(element)[0])) {
          Object.keys(element).forEach((item) => {
            element[item].forEach((vh, index1) => {
              // 和弦点位坐标
              let poi = document.createElement("div");
              poi.id = `${Object.keys(element) + index1}`;
              container.appendChild(poi);
              poi.style.position = "absolute";
              poi.style["border-radius"] = "50%";
              poi.style.width = "8px";
              poi.style.background = "#000";
              poi.style.height = "8px";
              //偏移量与坐标、单位宽度、半径
              poi.style.right = `${(vh[0] - 1) * 10 - 4 - 0.25}px`;
              poi.style.top = `${(vh[1] - 1) * 15 + 4 + 0.25}px`;
            });
          });
        } else {
          // 文字样式
          let text = document.createElement("div");
          container.appendChild(text);
          let newText = document.createTextNode(`${Object.values(element)[0]}`);
          text.appendChild(newText);
          text.style.fontSize = "50px";
          text.style.marginLeft = "8px";
        }
      });
    },
  },
};
</script>

<style lang='scss' scoped>
.gittar {
  position: absolute;
}
</style>
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 我可以为您提供一些参考,实现JavaScript轮播的基本步骤有:1)获取所有片的引用;2)设置计数变量并初始化;3)编写函数以更改片;4)使用setInterval()函数来周期性地更改片;5)添加按钮以控制轮播。 ### 回答2: 轮播是一个常见的网页元素,可以展示多张片或内容,实现片自动切换或手动切换的效果。使用JavaScript可以很方便地实现一个简单的轮播。 首先,在HTML中准备一个包含片的容器,并给每张片添加一个唯一的id值。然后,在CSS中设置容器和片的样式,例如设置容器的宽度和高度,以及片的显示方式。 接下来,在JavaScript中使用定时器来实现片的自动切换。通过查询当前显示的片的id值,然后根据判断逻辑确定下一张要显示的片的id值,并通过修改片的display属性来实现切换效果。同时,还可以设置一个计时器,定时调用这个切换函数。 如果要实现手动切换,可以在HTML中添加前进和后退按钮,并通过JavaScript来监听按钮的点击事件。当点击前进按钮时,切换到下一张片;当点击后退按钮时,切换到上一张片。 此外,还可以添加其他的功能,例如鼠标悬停时停止轮播、鼠标滑过时显示片描述等。 总结起来,通过组合使用HTML、CSS和JavaScript,可以轻松地实现一个基本的轮播。当然,如果需要更多的功能和效果,可以进一步完善和优化代码。 ### 回答3: 轮播是网页设计中常用的元素之一,可以通过JavaScript来实现。下面我会用300字中文来解释如何用JavaScript写一个简单的轮播。 1. 首先,在HTML中创建一个包含轮播的元素,如一个div容器,给它设置一个固定的宽度和高度,并设置overflow属性以便显示轮播内容。 2. 在JavaScript中,使用document.querySelector()方法选中该元素,创建一个变量来保存它的引用。 3. 创建一个数组,存储轮播片链接。可以根据需要添加或删除片。 4. 创建一个变量来保存当前显示片的索引,在初始状态下,将其设为0。 5. 使用JavaScript的setInterval()函数,定时更改轮播的显示片。可以根据需要设置定时器的时间间隔。 6. 在定时函数中,首先根据索引从数组中获取当前应该显示的片链接。 7. 在选中的元素中,设置背景片为当前片链接。 8. 将索引加1,以便下一次显示下一张片。如果索引超过数组的最大值,则将其重置为0,使轮播循环播放。 9. 在页面加载完成后,调用定时函数以便开始轮播的播放。 通过以上步骤,你可以用JavaScript编写一个简单的轮播。当然,这只是一个基本的实现方法,可以根据具体需求进行更复杂的设计和功能改进。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值