草庐IT

有意思的水平横向溢出滚动

ChokCoco 2023-03-28 原文

最近接到一个很有意思的需求,能否做到当内容横向溢出时,依然能够使用鼠标滚轮对内容进行滚动的方法

什么意思呢?来看看这么一种情况:

我们有一个垂直方向溢出滚动的容器,以及一个水平方向溢出滚动的容器:

如果使用的是非触控板(大部分用户没有触控板),而是使用鼠标来进行操作,会发现,这两个容器中,只有垂直方向溢出滚动的容器,是可以响应鼠标滚轮的:

  1. 垂直方向溢出滚动的容器,正常响应鼠标滚轮,可滚动内容
  2. 水平方向溢出滚动的容器,不会响应鼠标滚轮,不可滚动内容

那么,这里可能就是一个用户痛点。

如果在一些特定场景下,确实有横向滚动的内容,譬如横向的图片内容展示等。又想使用鼠标滚轮对内容进行滚动,能否做到呢?

那是必须的,本文就将介绍一种可能可行的技巧,在特定场景下在水平方向溢出滚动的容器,依然可以用鼠标滚轮进行滚动。

旋转大法

是的,既然只有垂直方向的溢出,才能响应滚轮操作。那我们不妨从这个角度入手。

首先实现一个垂直方向的溢出:

<div class="g-scroll">
    <div class="g-pesudo"></div>
</div>
.g-scroll {
    width: 200px;
    height: 200px;
    border: 1px solid #f00;
}
.g-pesudo {
    width: 200px;
    height: 400px;
    background: linear-gradient(rgba(122, 122, 50, .3), rgba(20, 200, 150, .3))
}

大概是这样:

好,加上 overflow: hidden,就会变成这样:

.g-scroll {
    overflow: scroll;
}

既然只有垂直方向的溢出,才能响应滚轮操作。要想变成水平方向的,我们只需要给容器旋转 90° 不就行了吗?

好像有点道理,我们来尝试下:

.g-scroll {
    width: 200px;
    height: 200px;
    box-sizing: border-box;
    transform: rotate(-90deg);
    overflow: scroll;
}

看看效果:

这样,原本竖直的容器,就变成了水平的容器,图中鼠标没有在滚动条上容器的运动就是通过滚轮实现的。

当然,这样还有个非常严重的问题,如果容器内存在内容,那么就变成了这样:

Oh,由于容器整体旋转了 90°,里面的内容当然也一起发生了旋转。我们需要解决这个问题。

内容反向旋转 90°,修复视角

这个也好解决,我们只需要重新构造下 DOM,将原本的内容再反向旋转 90° 一次。

当然,需要同时处理好旋转中心。

整个结构变成了这样:

<div class="g-scroll">
    <div class="g-pesudo"></div>
    <div class="g-content">
        Lorem ipsum dolor sit amet, consectetur adipisicing elit. Dolorum quis ipsum officiis placeat ipsa sit ad incidunt similique, consequuntur earum architecto recusandae veritatis et illo, illum quae nulla minus rerum?
    </div>
</div>

我们将实际装有了文字内容的 DOM 提取出来成一个单独的 DOM,与 g-pesudo 同级。

我们实际触发滚动操作的实际是 g-pesudo 的变化,我们只需要将内容通过再一次旋转,完美叠加在原本的容器之上即可:

.g-scroll {
    position: relative;
    width: 200px;
    height: 200px;
    transform-origin: 100% 0;
    transform: rotate(-90deg);
    overflow: scroll;
}
.g-pesudo {
    width: 200px;
    height: 400px;
    background: linear-gradient(rgba(122, 122, 50, .3), rgba(20, 200, 150, .3));
}
.g-content {
    position: absolute;
    top: 0;
    left: 200px;
    width: 400px;
    height: 200px;
    transform-origin: 0 0;
    border: 1px solid #000;
    transform: rotate(90deg);
}

什么意思呢。通过定位,我们将 g-content 高宽设置为容器旋转后,滚动内容的 DOM 实际表现为的高宽。

并且,通过设定以左下角为旋转中心 transform-origin: 0 0,再经过一次旋转,将滚动容器,和内容叠加在一起:

好,经过这一系列较为复杂的操作,我们就实现了内容适配旋转,给容器加上 overflow: scroll,一切表现正常,我们实现了横向滚动溢出,鼠标滚轮依旧生效!

完整的代码,你可以戳:CodePen Demo -- CSS-Only Horizontal Parallax Gallery

隐藏滚动条

当然,有个问题,这样滚动条就穿帮了。

这里,在现代浏览器,我们可以通过 ::-webkit-scrollbar 相关 CSS 隐藏掉整个滚动条:

/* hide scrollbar */
::-webkit-scrollbar {
  width: 1px;
  height: 1px;
}
::-webkit-scrollbar-button {
  width: 1px;
  height: 1px;
}

这样,整个效果,就感受不到滚动条的存在,可以直接使用滚轮进行控制:

上述操作都在鼠标滚轮下完成。

其他用途场景

这个技巧,只有特定的一些场景才适用。

如果内部的 DOM 复杂一点,整体改造的成本就非常高了,不太适合。

这里再给另外一个用这个技巧实现的 DEMO,一个横向 3D 纯 CSS 的视差效果,使用鼠标滚轮控制页面横向滚动:

感兴趣可以自行研究下源码,整体的技巧与上述阐述的类似,容器一次旋转,内容二次反向旋转即可。

CodePen Demo -- CSS-Only Horizontal Parallax Gallery By Paulina Hetman

最后

好了,本文到此结束,希望对你有帮助 ?

更多精彩 CSS 效果可以关注我的 CSS 灵感

更多精彩 CSS 技术文章汇总在我的 Github -- iCSS ,持续更新,欢迎点个 star 订阅收藏。

如果还有什么疑问或者建议,可以多多交流,原创文章,文笔有限,才疏学浅,文中若有不正之处,万望告知。

有关有意思的水平横向溢出滚动的更多相关文章

  1. ruby -::在 Ruby 语法中是什么意思? - 2

    这个问题在这里已经有了答案:WhatisRuby'sdouble-colon`::`?(12个答案)关闭8年前。什么是::?@song||=::TwelveDaysSong.new

  2. ruby - __FILE__ == $PROGRAM_NAME 在 ruby​​ 中是什么意思? - 2

    这个问题在这里已经有了答案:Whatdoes`if__FILE__==$0`meaninRuby(6个答案)关闭6年前。我在审查Ruby代码时偶然发现了这个语法。代码是:if__FILE__==$PROGRAM_NAME#somecode...end我想__FILE__是一个变量,可以让我获取我所在文件的名称?但是$PROGRAM_NAME简化了什么?另外,为什么这个if语句是必需的,因为程序可以使用或不使用它?

  3. ruby-on-rails - 没有参数的 `<<`(小于两倍)是什么意思? - 2

    我在一个我想在formtasticGem中覆盖的方法中找到了这个。该方法如下所示:defto_htmlinput_wrappingdohidden_field_html是什么意思?在第三行做什么?我知道它对数组有什么作用,但在这里我不知道。 最佳答案 你可以这样读:hidden_field_htmllabel_with_nested_checkbox是连接到hidden_​​field_html末尾的参数-为了“清晰”,他们将其分成两行 关于ruby-on-rails-没有参数的`

  4. ruby - Ruby 的 AST 中的 'send' 关键字是什么意思? - 2

    我正在尝试学习Ruby词法分析器和解析器(whitequarkparser)以了解更多有关从Ruby脚本进一步生成机器代码的过程。在解析以下Ruby代码字符串时。defadd(a,b)returna+bendputsadd1,2它导致以下S表达式符号。s(:begin,s(:def,:add,s(:args,s(:arg,:a),s(:arg,:b)),s(:return,s(:send,s(:lvar,:a),:+,s(:lvar,:b)))),s(:send,nil,:puts,s(:send,nil,:add,s(:int,1),s(:int,3))))任何人都可以向我解释生成的

  5. ruby - Ruby 的 printf 参数是什么意思? - 2

    谁能帮我理解下面的表达方式?printf("%3d-%s\n",counter,name)该行打印类似这样的内容6-安装Adob​​e软件我查阅了资料并阅读了引用资料,但找不到简单的答案,我有点困惑。如果你能给我一个好的引用,请这样做。%3d好的,根据我的理解,%3d是字符数或空格数。请指出解释它的引用资料。%s\n我不知道这是做什么的。我猜\n是一个换行符或类似的东西,但通过查看输出,它似乎并不像那样工作。为什么counter和name变量用逗号分隔?通过查看输出,似乎%3d被替换为counter而%s\n被替换为名称。我不确定它是如何工作的,但我想了解它。

  6. ruby - ruby 中 * 和 flatten 的意思是什么 - 2

    我是ruby​​语言的新手,所以当我尝试按值对哈希进行排序时我用这个方法排序:movie_popularity.sort_by{|m,p|p}.reverse但是sort方法返回一个数组,而我需要返回一个散列,所以我使用了这个命令:movie_popularity=Hash[*movie_popularity.sort_by{|m,p|p}.reverse.flatten]我的问题是上面一行中的*和flatten是什么意思?谢谢=) 最佳答案 *被称为“splat运算符”;我不确定我能否给你技术上的定义(虽然我相信你会在谷歌的帮助下

  7. ruby - Ruby 中的单竖线和等号线是什么意思? - 2

    这个问题在这里已经有了答案:Ruby|=assignmentoperator(4个答案)关闭9年前。在ruby​​中,|=操作符是做什么的?示例:a=23a|=3333#=>3351

  8. ruby - "string literal in condition"是什么意思? - 2

    每当我尝试运行该程序时,都会弹出一条错误消息“条件字符串文字(第10行)”。我做错了什么?puts"Welcometothebestcalculatorthereis.Wouldyouliketo(a)calculatetheareaofageometricshapeor(b)calculatetheequationofaparabola?Pleaseenteran'a'ora'b'togetstarted."response=gets.chompifresponse=="a"or"A"puts"ok."elsifresponse=="b"or"B"puts"awesome."else

  9. ruby - 这在 Ruby 语言中是什么意思? - 2

    运行下面的代码,a=[1,2,3,4,5]head,*tail=apheadptail你会得到结果1[2,3,4,5]谁能帮我解释一下语句head,*tail=a,谢谢! 最佳答案 head,*tail=a表示将数组a的第一个元素赋值给head,其余元素赋值到尾部。*,有时称为“splat运算符”,可以对数组执行多种操作。当它位于赋值运算符(=)的左侧时,如您的示例所示,它仅表示“保留所有剩余内容”。如果您在该代码中省略了splat,它将改为执行以下操作:head,tail=[1,2,3,4,5]phead#=>1ptail#=>2

  10. ruby - Ruby 常量是什么意思? - 2

    Ruby常量的真正含义是什么?以下代码不显示任何“常量”属性。警告在那里,但我仍然要更改A所指的内容。A=1putsA#=>1A=2#warning:alreadyinitializedconstantAputsA#=>2或者说Ruby常量只是一种指示,没有任何强制措施? 最佳答案 没错,constants就像ruby​​中的variables,但如果您更改它们,您会收到警告。此外,与纯变量有一个区别:您可以访问常量,即使它们是在另一个类或模块中定义的,例如给定以下代码段:moduleConstantsPI=3,1415other=

随机推荐