使用 jQuery scollLeft() 方法默认向右滚动,我的代码有什么问题?

using jQuery scollLeft() method to scroll to the right by default, what is wrong with my code?

这是我的代码:

<head>
    <title>Labs</title>
      <meta charset="utf-8">
      <meta name="viewport" content="width=device-width, initial-scale=1">
      <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
      <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script>
var left = $('.entry-content').width();
$('.entry-content').scrollLeft(left);
</script>
</head>
<body>
    <div class="container"> 
        <div class="entry-content"><img src="map.png"></div>
    </div>
</body>

我希望当用户访问页面时滚动条自动显示到最右边。目前它默认向左滚动。请告诉我我的代码有什么问题。

通常在这种情况下你会说 var left = $('.entry-content').width() * -1;,这在这种情况下行不通吗?

您应该在页面加载完成后执行您的代码(因此图像宽度已知),为此您需要将代码插入 window.load 事件的处理程序中,如下所示:

<head>
    <title>Labs</title>
      <meta charset="utf-8">
      <meta name="viewport" content="width=device-width, initial-scale=1">
      <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
      <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
</head>
<script>
$(window).on('load', function() {
    var left = $('.entry-content').width();
    $('.entry-content').scrollLeft(left);
});
</script>
<body>
    <div class="container"> 
        <div class="entry-content"><img src="map.png"></div>
    </div>
</body>

确保在 DOM 元素之后包含该脚本,或者将其包装在 DOMContentLoaded handler 中。例如:

<script>
    document.addEventListener('DOMContentLoaded', function() {
        var left = $('.entry-content').width();
        $('.entry-content').scrollLeft(left);
    });
</script>

在您的示例中,select 或 $('.entry-content') 到 select 实际元素是不可能的,因为在 javascript 代码运行时它还不存在。 DOM 从上到下进行解析,沿途找到的任何脚本都会立即执行。


正如 Nelson 在他的回答中也指出的那样,记住图像可能需要一段时间才能加载也是一个好主意。只有在加载后,图像才会开始占用实际需要的 space。因此,如果您在加载图像之前测量 .entry-content 的尺寸,如果图像需要的水平 space 多于包含元素自然占据的水平,您将得到一个不准确的数字。

要解决此问题,您可以改为在 window 上监听 "load" event,它将始终在 DOMContentLoaded 之后触发,而不是在加载所有资源(其中包括您的图像)之前:

<script>
    window.addEventListener('load', function() {
        var left = $('.entry-content').width();
        $('.entry-content').scrollLeft(left);
    });
</script>

这个例子等同于.

尝试以下脚本:

<script>
$(document).ready(function(){
    var left = document.querySelector('div.entry-content').getBoundingClientRect().left;
    window.scrollBy(left,0);
});
</script>

我使用 getBoundingClientRect() 获取具有 .entry-content class 属性的 div 元素的位置。左侧 属性 从浏览器左侧 window 给出 x-offset 值。现在,我使用该值使用 window.scrollBy(x,y) 方法滚动 window。

为了使您的代码段正常工作,您需要对 html 进行一些更改:

 <script>
    $(document).ready(function(){
      var left = $('.entry-content').width();
      $('.entry-content').scrollLeft(left);
    });
 </script>

   <div class="container"> 
        <div class="entry-content" style="width:30%;overflow:auto"><img src="map.png"></div>
    </div>

请注意,我已 将 div 的大小限制为 30%,并将溢出设置为 true 将导致 div 在图像宽度为超过 div 的宽度。现在 left 将包含应用了 .entry-content class 的 div 元素的宽度,并且由于 div 的内容现在可以使用可用的滚动条滚动,您可以调用 scrollLeft( div 上的 value) 方法将此 div 的内容滚动到左侧。 如果你想滚动到图像的最右边,你应该将 amountToScroll = widthOfImage-widthOfDivContaing 图像传递给 scrollLeft(amountToScroll) 即

<script>
    $(document).ready(function(){
     var amountToScroll = $('img').width() - $('.entry-content').width()
    $('.entry-content').scrollLeft(amountToScroll);
    });
 </script>

希望对您有所帮助。