You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. A aut qui labore rerum placeat similique hic consequatur tempore doloribus aliquid alias, nobis voluptates. Perferendis, voluptate placeat esse soluta deleniti id!</p>
p {
width:200px;
height:200px;
resize: horizontal;
overflow: scroll;
}
本文将介绍一个非常有意思的功能,使用纯 CSS 利用 resize 实现强大的图片切换预览功能。类似于这样:
思路
首先,要实现这样一个效果如果不要求可以拖拽,其实有非常多的办法。
两种方式都简单示意一下。
假设我们的结构如下,分别使用
background
展示两张图片:方法一,改变上层图片的宽度的方式:
效果如下:
当然,使用
mask
遮罩的方式也非常轻松的可以实现类似的效果:也可以得到同样的效果:
上述 DEMO 的完整代码:CodePen Demo -- Switch Picture
使用 resize 实现拖拽功能
下一步则是最核心,最关键的一步,巧妙的使用 CSS
resize
属性,实现拖拽控制元素的宽度。什么是
resize
?resize
:该属性允许你控制一个元素的大小语法如下:
看一个最简单的 DEMO:
这里,我们设置了一个长宽为
200px
的<p>
为横向可拖拽改变宽度。效果如下:简单总结一些小技巧:
resize
的生效,需要配合overflow: scroll
,当然,准确的说法是,overflow
不是visible
,或者可以直接作用于替换元素譬如图像、<video>
及<iframe>
、<textarea>
等resize
的horizontal
、vertical
、both
来设置横向拖动、纵向拖动、横向纵向皆可拖动。max-width
、min-width
、max-height
、min-height
限制可拖拽改变的一个范围将 resize 运用于图片拖拽切换
OK,接下来,我们将 resize 运用于图片拖拽切换。
首先,还是上述的代码,我们将 resize 作用于子元素试试:
可以看到,
g-inner
设置了resize: horizontal
,将允许被横向拖动,实际的效果如下:嗯,非常接近了,因为需要配合
overflow: scroll
,所以出现了恼人的滚动条,非常的不美观,我们得想办法干掉滚动条。借助多一层嵌套及绝对定位实现隐藏滚动条
隐藏滚动条的方式有很多,这里我们介绍其中一种巧妙的方式,我们对我们的结构进行一下改造,再叠加多一层 div:
我们将控制拖拽这个功能交给
g-resize
,它负责改变元素的宽度,而g-inner
改为绝对定位,当g-resize
的宽度增大时,其父元素g-inner
也会随之增大,最后设置g-resize
的opacity
为 0 即可隐藏滚动条。核心代码如下:
这里,为了方便示意,我将
opacity
设置了一个渐隐渐现的动画效果,方便示意:借助伪元素,显示拖拽条
最后一步,由于完全隐藏了滚动条,用户也就不知道可以拖拽了,所以我们还需要绘制一个更为好看的拖拽条,这里延续上述的布局,给
.g-inner
再添加一个伪元素,绝对定位在元素最后即可:最终完美达成效果:
完整详细的代码,你可以在我的 CSS 灵感上看到:
CSS 灵感 -- 利用 resize 实现图片切换预览功能
总结一下
通过本文,你可以学会:
最后
好了,本文到此结束,希望对你有帮助 :)
想 Get 到最有意思的 CSS 资讯,千万不要错过我的公众号 -- iCSS前端趣闻 😄
更多精彩 CSS 效果可以关注我的 CSS 灵感
更多精彩 CSS 技术文章汇总在我的 Github -- iCSS ,持续更新,欢迎点个 star 订阅收藏。
如果还有什么疑问或者建议,可以多多交流,原创文章,文笔有限,才疏学浅,文中若有不正之处,万望告知。
The text was updated successfully, but these errors were encountered: