Is there a way to adjust the scrollLeft of a div according to the clientX position during a

I am attempting to create a scrollable div that scrolls when the mouse is dragged inside of it.

For a basic implementation, check out this code pen.

I am struggling with understanding how to work with scrollLeft and clientX. I believe I need to adjust the scrollLeft position to be

clientX + the initial scrollBar position when the drag begins
. However, they seem to be in different relative positions?

This leads to a slightly "jumpy" feeling when starting to drag.

function mouseMove(event) {
  if (!dragging) return;
  
  const {scrollLeft} = initScroll;
  
  // Even if I click exactly where the bar starts the positions are way off ...
  div.scrollLeft = event.clientX + scrollLeft;
}

In this screenshot, I clicked at the beginning of the bar but the scrollLeft value is 548 while clientX is 282?

How can I improve the smoothness of this interaction?

https://i.sstatic.net/m2jnp.png

Answer №1

It is recommended to constantly reset the initPosition value whenever the mouse is in motion and being dragged. Rather than reassigning the scrollLeft, it can be more effective to subtract the difference between the current clientX and the initial initPosition:

var dragging = false;
var startX = 0;
var elem = document.querySelector('.draggable');
document.addEventListener('mousedown', (e) => (dragging = true,startX = e.clientX))
document.addEventListener('mouseup', () => (dragging = false))
document.addEventListener('mousemove', function(e) {
  if (!dragging) return;
  elem.scrollLeft -= e.clientX - startX;
  startX = e.clientX;
})
.draggable {
  overflow-y: auto;
}

.draggable .content {
  width: 200%;
  background-color: red;
  height: 100px;
}
<div class="draggable">
  <div class="content"></div>
</div>

Similar questions

If you have not found the answer to your question or you are interested in this topic, then look at other similar questions below or use the search

What is the process for loading an image from the FileSystem using expo?

Can someone help with loading an image from FileSystem in expo? The fileUri is as follows: file:///Users/username/Library/Developer/CoreSimulator/Devices/B9799180-7428-41D8-A4BC-C3A34BF93043/data/Containers/Data/Application/3D502086-E077-42D5-9B56-A1DB788 ...

Examining AngularJS ng-click arguments once all Angular content has been loaded

In my website, I have a simple jade markup as follows: .well(ng-repeat="note in notes") .row h3.pull-left {{note.title}} p.pull-right ( {{note.subject}}, {{note.college}} ) .row.margin-bottom-10(sty ...

The error remains a mystery to the console - could it be possibly linked to the onclick() method?

Despite checking thoroughly, the console remains empty. I came across this code in a video tutorial where it worked perfectly. Below is the simple code that I am currently using: function addItem() { inames = [] iqtyp = [] iprice = [] inames.pu ...

Obtain individual information from XML

After fetching data from the server using ajax, I am looking to retrieve only a specific part of the data which is the name. How can I modify my code to achieve this? const url = 'https://jsonplaceholder.typicode.com/users' const xhr = new XMLH ...

Retrieving information upon page loading and setting it as select options within a Vue JS environment

Currently, I am working on a straightforward form that includes a select type form. This specific form is initially created without any options as I intend to dynamically populate them from the backend later. Below is the code snippet for reference: < ...

Guide on accessing the fastify application instance within an imported module

Currently, I am working on developing a rest API using Fastify and I am in the process of organizing my code into separate files for better structure. One issue I am facing is how to access the Fastify instance within a file that I import. The following s ...

When do Angular.js memory leaks become a cause for concern?

My application is quite large, built on angular with nested states, directives, and data tables. We recently decided to switch to a full single-page setup, which raised some performance concerns. While Chrome seems unaffected visually, Firefox appears to s ...

Task that merges multiple JSON files into one using Gulp

Within my directory, I have a collection of JSON files that contain arrays of objects. Folder A file1.json file2.json file3.json All the files in this folder have the same structure (a single array containing multiple objects). My goal is to execu ...

Content changing programmatically does not reset the scrollHeight

As I embark on the journey to expand my coding skills, I have decided to challenge myself by tackling some tasks without relying on jQuery. One particular challenge that I am currently facing involves a fixed contenteditable div. The goal is to adjust the ...

What is the best way to retrieve chosen values from a Bootstrap multiple selectpicker?

Below is an example of a select element with the multiple attribute: <select id="dd-personnels" onchange="personnelChange()" asp-items="Model.Personnels" multiple data-max-options="1" class="form-control form ...

An issue in ASP.net user control not triggering a specific javascript function

I am currently working on an asp.net web application where I have implemented a repeater that calls a registered user control. Within this user control, there is a button that is supposed to trigger a Javascript function to make an Ajax call for server-sid ...

The PHP shopping cart file is returning an undefined JSON response

Currently, I am developing a shopping cart system using a combination of PHP and JavaScript with an xmlhttprequest call to handle the AJAX functionality. The issue I am facing is that whenever the user clicks on the 'add to cart' button, the prod ...

Is it appropriate to use a component inside an entry component?

I'm currently working on a component that triggers a function to open a window: @Component({ selector: 'app-deposits', templateUrl: './deposits.component.html', styleUrls: ['./deposits.component.scss&apo ...

When a specific item is selected from a drop-down menu, text boxes and drop-downs will dynamically appear and change

In the current version of my code, there is a single drop-down menu with three options for the user to select from. If "Complete" is chosen, a text box should appear. If "Abandon" or "Transfer" is selected, a separate drop-down menu needs to be displayed. ...

Secondary Electron window not properly receiving IPC messages

While developing my TypeScript code that is linked to the HTML being executed by my application, I encountered an issue with creating a new window for my settings. It seems that the preloaded script is loaded onto the new window upon opening, but the windo ...

Modify session variable upon link click

Here is an extension of the question posed on Stack Overflow regarding creating a new page for different PHP ORDER BY statements: Create a new page for different php ORDER BY statement? The task at hand requires changing a session variable and refreshing ...

Retrieve the accurate file name and line number from the stack: Error object in a JavaScript React Typescript application

My React application with TypeScript is currently running on localhost. I have implemented a try...catch block in my code to handle errors thrown by child components. I am trying to display the source of the error (such as file name, method, line number, ...

If you scroll quickly, watch out for the flickering of the fadeIn and fadeOut

I have a script that fades in an element once the user scrolls more than 145px from the top of the page. $(window).scroll(function(){ if ($(this).scrollTop() > 145) { $('#fademenu').fadeIn(); } else { $('#fademenu').fadeOut(); } } ...

Modify the content of a separate division by selecting a different item in a list with the help of Vue.js and TypeScript

I am still learning Vue and may not have all the answers. Currently, I am working on a feature that changes the text of another div based on the item I select from a list. You can find the code sandbox link below along with my current implementation. Code ...

I aim to utilize lodash filter to swap out any null values with zero

let x = [{'abc': 1, 'qwe':2},{'abc': 2, 'qwe':2},{'abc': 5, 'qwe':null}, {'abc': 4, 'qwe':null}], let result = _.chain(x) _.groupBy(qwe) _.map ...