js基于div丝滑实现贝塞尔曲线

yizhihongxing

下面就是详细讲解“js基于div丝滑实现贝塞尔曲线”的完整攻略。

1. 什么是贝塞尔曲线?

贝塞尔曲线是一种使用平滑曲线连接任意多个点的数学函数,并且通过更改这些点的锚点信息来改变曲线的特性。在前端网站开发中,贝塞尔曲线经常被用来创建各种交互效果,如动画、滑动、转场等。

2. 为什么要基于div实现贝塞尔曲线?

虽然在SVG和canvas中也可以实现贝塞尔曲线,但是使用DIV实现贝塞尔曲线具有以下优势:

  1. 灵活性:DIV可以随时更改其大小、位置、旋转等,并且可以嵌套在其他元素中。

  2. 易于实现:撰写DIV元素的CSS代码比SVG和canvas简单得多,因此比较容易掌握。

  3. 性能:DIV和CSS比使用SVG和canvas更加轻量,因此有更高的性能。

3. 实现过程

下面将逐步说明如何基于DIV实现贝塞尔曲线。您将用到的工具和技术是HTML、CSS和JavaScript。

第一步:在HTML中添加DIV元素

首先,您需要在HTML中添加一个DIV元素,它将代表曲线的起点和终点。在此示例中,我们将使用一个带有唯一ID的DIV元素来表示曲线:

<div id="curve"></div>

第二步:为DIV元素设置样式

接下来,您需要在CSS中设置DIV元素的样式,以便它不仅看起来像曲线,而且可以在其他元素中嵌套:

#curve {
  position: absolute;
  width: 300px;
  height: 3px;
  background: black;
  transform-origin: left center;
  transform: rotate(45deg);
}

在此示例中,曲线DIV元素的样式包括位置、大小、背景颜色和旋转属性。

第三步:使用JavaScript实现贝塞尔曲线

在JavaScript中,使用贝塞尔公式计算曲线上的点,在这里您需要使用贝塞尔曲线的三个锚点:起点、终点和中间控制点。

const curve = document.querySelector('#curve');
const points = [
  [0, 0],
  [150, 150],
  [300, 0],
];
for (let i = 0; i <= 1; i += 0.01) {
  const [x1, y1] = lerp(points[0], points[1], i);
  const [x2, y2] = lerp(points[1], points[2], i);
  const [x, y] = lerp([x1, y1], [x2, y2], i);
  curve.style.left = `${x}px`;
  curve.style.top = `${y}px`;
}
function lerp([x1, y1], [x2, y2], ratio) {
  return [x1 + (x2 - x1) * ratio, y1 + (y2 - y1) * ratio];
}

在此示例中,lerp(线性插值)函数用于计算曲线上的点,该点在三个锚点之间。在第三步中,我们使用回调函数遍历点的范围,然后按比例计算每个中间点。

第四步:用CSS动画过渡曲线

最后,您可以使用CSS transition动画样式来过渡曲线。通过更改CSS属性,可以创建启动和停止CSS动画的JavaScript函数。

#curve {
  transition: transform 1s ease;
}

在JavaScript中,setParameter()函数用于设置曲线动画参数。 startAnimation()和stopAnimation()函数用于开始和停止CSS动画:

function setParameter(curve, scale, rotate) {
  curve.style.transform = `scale(${scale}) rotate(${rotate}deg)`;
}
function startAnimation(curve) {
  curve.classList.add('animate');
}
function stopAnimation(curve) {
  curve.classList.remove('animate');
}

在示例站点中,我们使用两条贝塞尔曲线实现了原始页面和目标页面之间的过渡效果。他们的代码类似于:

.animate {
  animation: curveMove 1s ease-in forwards;
}
@keyframes curveMove {
  0% {
    transform: scale(0) rotate(45deg);
  }
  100% {
    transform: scale(1) rotate(0deg);
  }
}

在JavaScript中,我们使用mousedown和mouseup事件处理程序在点击时启动和停止CSS动画。

document.addEventListener('mousedown', () => startAnimation(curve));
document.addEventListener('mouseup', () => stopAnimation(curve));

现在,在您的HTML页面上点击曲线DIV元素,您将看到一种平滑的动画效果,类似于弹簧般的运动。

示例1:在响应式设计中使用曲线

在这个示例中,我们使用基本的曲线和CSS过渡动画添加了一个响应式设计功能。页面布局包含一个文本框区域和一个曲线DIV元素。在响应的变化中,曲线DIV元素会自适应网格并显示反应式设计布局。

代码:

<div class="container">
  <div class="form">
    <h1>Login Form</h1>
    <div class="input-group">
      <input type="text" placeholder="Username">
    </div>
    <div class="input-group">
      <input type="password" placeholder="Password">
    </div>
    <div class="input-group">
      <button type="submit">
        Login
      </button>
    </div>
  </div>
  <div class="curve" id="curve"></div>
</div>
.container {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
  align-items: center;
  justify-content: center;
}
.form {
  text-align: center;
}
.input-group {
  margin-bottom: 15px;
}
input[type='text'],
input[type='password'],
button[type='submit'] {
  width: 100%;
  padding: 10px;
  border: none;
  border-bottom: 1px solid #ccc;
  margin-bottom: 10px;
}
button[type='submit'] {
  background-color: black;
  color: white;
  padding: 15px;
  border: none;
  cursor: pointer;
  font-size: 16px;
  font-weight: bold;
  transition: background-color 0.3s ease;
}
.curve {
  position: relative;
  height: 3px;
  background-color: black;
  transform: rotate(45deg);
  transform-origin: left center;
  transition: transform 0.3s ease;
  margin-right: -20px;
}
const curve = document.querySelector('#curve');
document.addEventListener('mousedown', () => {
  curve.classList.add('animate');
});
document.addEventListener('mouseup', () => {
  curve.classList.remove('animate');
});

示例2:在滑块中使用曲线

在此示例中,我们使用createElement()和append()方法创建滑块控件,该控件使用贝塞尔曲线作为跟踪条。用户可以通过拖动滑块旁边的曲线来更改滑块的值。

代码:

<div id="slider" class="slider">
    <div class="track">
        <div class="thumb"></div>
        <div class="curve">
            <div id="curve"></div>
        </div>
    </div>
</div>
.slider {
  display: flex;
  justify-content: center;
  align-items: center;
  height: 100%;
  width: 100%;
}
.track {
  overflow: hidden;
  height: 10px;
  border-radius: 5px;
  position: relative;
}
.thumb {
  position: absolute;
  width: 24px;
  height: 24px;
  top: -7px;
  background: white;
  border-radius: 50%;
  box-shadow: 0 5px 8px rgba(0, 0, 0, 0.1), inset 0 -0.25em rgba(255, 255, 255, 0.5),
    inset 0.25em 0.25em rgba(0, 0, 0, 0.15), inset -0.5em 0.5em rgba(255, 255, 255, 0.3),
    inset 0 -0.25em rgba(0, 0, 0, 0.4);
  z-index: 1;
  left: -10px;
  cursor: pointer;
}
.curve {
  position: absolute;
  top: -2.5px;
  left: 0;
  width: 100%;
  height: 8px;
  overflow: hidden;
}
#curve {
  position: absolute;
  width: 300px;
  height: 3px;
  background: black;
  transform-origin: left center;
  transform: rotate(45deg);
  cursor: pointer;
}
const curve = document.querySelector('#curve');
const thumb = document.querySelector('.thumb');

document.addEventListener('mousedown', () => {
  curve.classList.add('animate');
});

document.addEventListener('mouseup', () => {
  curve.classList.remove('animate');
});

const slider = document.querySelector('#slider');
slider.addEventListener('mouseenter', () => {
  curve.style.transition = 'none';
  thumb.style.transition = 'none';
});

slider.addEventListener('mouseleave', () => {
  curve.style.transition = 'transform 1s ease';
  thumb.style.transition = 'transform 0.2s ease';
});

curve.addEventListener('mousemove', (e) => {
  const width = curve.clientWidth;
  const { left } = curve.getBoundingClientRect();
  const position = (e.clientX - left) / width;
  position = Math.max(0, Math.min(1, position));
  thumb.style.transform = `translateX(${position * 100 - 50}%))`;
});

总结

通过上述步骤,我们可以基于DIV元素和CSS样式创建平滑的贝塞尔曲线,使用JavaScript动态生成曲线上的点,使用CSS动画过渡曲线,通过在HTML页面上嵌入曲线DIV元素,可以轻松地将曲线添加到任何交互设计中,并且可以在移动设备上运行良好。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:js基于div丝滑实现贝塞尔曲线 - Python技术站

(0)
上一篇 2023年5月28日
下一篇 2023年5月28日

相关文章

  • Vue中使用Printjs插件实现打印功能

    下面是Vue中使用Printjs插件实现打印功能的完整攻略: 一、安装Printjs插件 在使用Printjs插件前,需要先进行安装。打开终端,进入你的Vue项目根目录,并输入以下命令: npm install print-js –save 该命令会自动将Printjs插件安装到你的项目中。 二、使用Printjs插件实现打印功能 在需要打印的组件中引入P…

    Vue 2023年5月29日
    00
  • Vue3关于响应式数据类型详解(ref、reactive、toRef、及toRefs)

    Vue 3是Vue.js框架的最新版本,Vue 3对Vue.js响应式系统进行了重构,引入了一些新特性。在Vue 3中,我们可以使用以下概念来定义响应式数据类型:ref、reactive、toRef、toRefs。 ref ref是Vue 3中的一个响应式数据类型,它可以将一个基本类型的值(如字符串、数字、布尔值)封装成一个响应式对象,从而使这个基本类型的值…

    Vue 2023年5月28日
    00
  • vue实现打卡功能

    下面是vue实现打卡功能的完整攻略。 1. 确定需求和功能点 在开始实现打卡功能之前,我们需要先明确需求和功能点。一般来说,一个打卡功能至少包含以下几个方面: 打卡地点的定位和显示 打卡时间的记录和展示 打卡成功/失败的反馈提示 打卡数据的保存和更新 根据实际业务需求,我们可以在此基础之上进行扩展和优化。 2. 实现地理位置定位 首先,我们需要实现打卡地点的…

    Vue 2023年5月27日
    00
  • vue2.0 + element UI 中 el-table 数据导出Excel的方法

    当使用 Vue2.0 + Element UI 开发项目时,我们有时需要将 el-table 的数据导出为 Excel 文件,以方便用户进行数据的离线查看和分析。下面是在 Vue2.0 + Element UI 中实现 el-table 数据导出 Excel 的具体步骤: 步骤一:引入文件 首先,需要引入以下文件: <script src="…

    Vue 2023年5月29日
    00
  • Vue3 中的 readonly 特性及函数使用详解

    Vue3 中的 readonly 特性及函数使用详解 在 Vue3 中,readonly 是一个非常有用的特性,它可以将一个对象或数组变成只读的,防止被修改,以保证应用程序的稳定性。 什么是 readonly 特性? readonly 特性可以在定义一个对象或数组时,将其设置为只读状态,使其不被修改。使用 readonly 的优势在于避免了应用程序中的错误或…

    Vue 2023年5月28日
    00
  • element中el-autocomplete的常见用法示例

    当使用 Vue.js 和 Element UI 搭建网站时,使用 el-autocomplete 组件可以实现一个自动完成的输入框。以下是 el-autocomplete 的常见用法示例: 基本用法 使用 v-model 在父组件中绑定输入框的值,使用 fetchSuggestions 方法获取自动完成的选项列表: <template> <…

    Vue 2023年5月28日
    00
  • 详细聊聊Vue中的options选项

    接下来我将详细聊聊Vue中的options选项。 什么是Vue中的options选项 在Vue中,每个组件都可以定义一些可选的选项。这些选项可以用来配置组件的行为和功能。Vue的选项可以分为两类:数据选项和组件选项。 数据选项:Vue组件中的数据选项是一个JavaScript对象,用于传递数据到组件模板中。数据选项包括data、props、computed、…

    Vue 2023年5月28日
    00
  • vue实现商城上货组件简易版

    下面我将为你详细讲解“Vue实现商城上货组件简易版”的完整攻略,包含以下几个步骤: 一、设计组件结构 在Vue中设计组件有以下几个要点: 1. 组件的数据 组件必须拥有数据,这些数据可以通过props传递来自父组件的数据,也可以通过data()方法定义组件自身的数据。 2. 组件的模板 Vue使用HTML模板作为组件的呈现形式。 3. 组件的方法 Vue组件…

    Vue 2023年5月28日
    00
合作推广
合作推广
分享本页
返回顶部