CSS 使用 resize 实现图片拖拽切换预览功能(强大功能)


Posted in HTML / CSS onAugust 23, 2021

本文将介绍一个非常有意思的功能,使用纯 CSS 利用 resize 实现强大的图片切换预览功能。类似于这样:

CSS  使用 resize 实现图片拖拽切换预览功能(强大功能)

思路

首先,要实现这样一个效果如果不要求可以拖拽,其实有非常多的办法。

  • 将两张图片叠加在一起
  • 改变上层图片的宽度,或者使用 mask, 改变 mask 的透明度区间变化

两种方式都简单示意一下。

假设我们的结构如下,分别使用 background 展示两张图片:

<div class="g-outer">
    <div class="g-inner"></div>
</div>

方法一,改变上层图片的宽度的方式:

.g-outer {
    width: 650px;
    height: 340px;
    background-image: url(image1.png);
    overflow: hidden;
}
.g-inner {
    height: 340px;
    background: url(image2.png);
    animation: widthchange 3s infinite alternate linear;
}
@keyframes widthchange {
    0% {
        width: 650px;
    }
    100% {
        width: 0px;
    }
}

效果如下:

CSS  使用 resize 实现图片拖拽切换预览功能(强大功能)

当然,使用 mask 遮罩的方式也非常轻松的可以实现类似的效果:

.g-outer {
    background-image: url(https://images.cnblogs.com/cnblogs_com/coco1s/881614/o_21081614180122.png);
}
.g-inner {
    background: url(https://images.cnblogs.com/cnblogs_com/coco1s/881614/o_21081614175811.png);
    mask: linear-gradient(90deg, #fff 0%, #fff 50%, transparent 50%, transparent 100%);
    mask-size: 200% 100%;
    animation: maskChange 2s infinite alternate linear;
}
@keyframes maskChange {
    0% {
        mask-position: -100% 0;
    }
    100% {
        mask-position: 0 0;
    }
}

也可以得到同样的效果:

CSS  使用 resize 实现图片拖拽切换预览功能(强大功能)

上述 DEMO 的完整代码:CodePen Demo -- Switch Picture

对强大的 mask 属性还不是太了解的,可以猛戳:奇妙的 CSS MASK

使用 resize 实现拖拽功能

下一步则是最核心,最关键的一步,巧妙的使用 CSS resize 属性,实现拖拽控制元素的宽度。

什么是 resize

resize:该属性允许你控制一个元素的大小

语法如下:

{
/* Keyword values */
  resize: none;
  resize: both;
  resize: horizontal;
  resize: vertical;
  resize: block;
  resize: inline;
}

看一个最简单的 DEMO:

<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;
}

这里,我们设置了一个长宽为 200px<p> 为横向可拖拽改变宽度。效果如下:

CSS  使用 resize 实现图片拖拽切换预览功能(强大功能)

简单总结一些小技巧:

  • resize 的生效,需要配合 overflow: scroll,当然,准确的说法是,overflow 不是 visible,或者可以直接作用于替换元素譬如图像、<video><iframe><textarea>
  • 我们可以通过 resizehorizontalverticalboth 来设置横向拖动、纵向拖动、横向纵向皆可拖动。
  • 可以配合容器的 max-widthmin-widthmax-heightmin-height 限制可拖拽改变的一个范围

将 resize 运用于图片拖拽切换

OK,接下来,我们将 resize 运用于图片拖拽切换。

首先,还是上述的代码,我们将 resize 作用于子元素试试:

<div class="g-outer">
    <div class="g-inner width-change"></div>
</div>
.g-outer {
    width: 650px;
    height: 340px;
    background-image: url(image1.png);
    overflow: hidden;
}

.g-inner {
    height: 340px;
    background: url(image2.png);
    resize: horizontal;
    overflow: scroll;
    max-width: 640px;
    min-width: 10px;
}

可以看到,g-inner 设置了 resize: horizontal,将允许被横向拖动,实际的效果如下:

CSS  使用 resize 实现图片拖拽切换预览功能(强大功能)

嗯,非常接近了,因为需要配合 overflow: scroll,所以出现了恼人的滚动条,非常的不美观,我们得想办法干掉滚动条。

借助多一层嵌套及绝对定位实现隐藏滚动条

隐藏滚动条的方式有很多,这里我们介绍其中一种巧妙的方式,我们对我们的结构进行一下改造,再叠加多一层 div:

<div class="g-outer">
    <div class="g-inner">
        <div class="g-resize"></div>
    </div>
</div>

我们将控制拖拽这个功能交给 g-resize,它负责改变元素的宽度,而 g-inner 改为绝对定位,当 g-resize 的宽度增大时,其父元素 g-inner 也会随之增大,最后设置 g-resizeopacity 为 0 即可隐藏滚动条。

核心代码如下:

.g-outer {
    position: relative;
    width: 650px;
    height: 340px;
    background-image: url(image1.png);
    overflow: hidden;
}
.g-inner {
    position: absolute;
    top: 0;
    left: 0;
    min-width: 0;
    max-width: 650px;
    height: 340px;
    background-image: url(image2.png);
}
.g-resize {
    position: relative;
    resize: horizontal;
    overflow: scroll;
    width: 0;
    height: 340px;
    max-width: 650px;
    min-width: 15px;
    animation: opacityChange 3s infinite alternate linear;
}
@keyframes opacityChange {
    0% {
        opacity: 0;
    }
    100% {
        opacity: 1;
    }
}

这里,为了方便示意,我将 opacity 设置了一个渐隐渐现的动画效果,方便示意:

CSS  使用 resize 实现图片拖拽切换预览功能(强大功能)

借助伪元素,显示拖拽条

最后一步,由于完全隐藏了滚动条,用户也就不知道可以拖拽了,所以我们还需要绘制一个更为好看的拖拽条,这里延续上述的布局,给 .g-inner 再添加一个伪元素,绝对定位在元素最后即可:

.g-inner:before {
    content: "↔";
    position: absolute;
    background: rgba(0, 0, 0, 0.5);
    top: 0;
    right: 0;
    height: 100%;
    line-height: 340px;
}

最终完美达成效果:

CSS  使用 resize 实现图片拖拽切换预览功能(强大功能)

完整详细的代码,你可以在我的 CSS 灵感上看到:

CSS 灵感 -- 利用 resize 实现图片切换预览功能

总结一下

通过本文,你可以学会:

  • 利用 resize 来实现容器大小的控制
  • 通过一些巧妙的方式来隐藏不太美观的滚动条
  • 以及配合上述的一些技巧,使用纯 CSS 实现图片拖拽切换预览功能

最后

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

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

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

到此这篇关于CSS 使用 resize 实现图片拖拽切换预览功能(强大功能)的文章就介绍到这了,更多相关css resize图片拖拽切换预览内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章,希望大家以后多多支持三水点靠木!

 
HTML / CSS 相关文章推荐
学做Bootstrap的第一个页面
May 15 HTML / CSS
CSS3中动画属性transform、transition和animation属性的区别
Sep 25 HTML / CSS
CSS3 Backgrounds属性相关介绍
May 11 HTML / CSS
CSS3 icon font完全指南(CSS3 font 会取代icon图标)
Jan 06 HTML / CSS
css3和jquery实现的可折叠导航菜单适合放在手机网页的导航菜单
Sep 02 HTML / CSS
详解CSS3的opacity属性设置透明效果的用法
May 09 HTML / CSS
使用CSS3滤镜的filter:blur属性制作毛玻璃模糊效果的方法
Jul 08 HTML / CSS
CSS3中的弹性布局em运用入门详解 1em等于多少像素
Feb 08 HTML / CSS
HTML5 对各个标签的定义与规定:body的介绍
Jun 21 HTML / CSS
HTML5实现晶莹剔透的雨滴特效
May 14 HTML / CSS
网站性能延迟加载图像的五种技巧(小结)
Aug 13 HTML / CSS
CSS 实现Chrome标签栏的技巧
Aug 04 HTML / CSS
如何使用 resize 实现图片切换预览功能
Aug 23 #HTML / CSS
css中z-index: 0和z-index: auto的区别
Aug 23 #HTML / CSS
CSS Transition通过改变Height实现展开收起元素
Aug 07 #HTML / CSS
css3中transform属性实现的4种功能
Aug 07 #HTML / CSS
从QQtabBar看css命名规范BEM的详细介绍
Aug 07 #HTML / CSS
css实现两栏布局,左侧固定宽,右侧自适应的多种方法
Aug 07 #HTML / CSS
CSS 实现Chrome标签栏的技巧
You might like
网页游戏开发入门教程二(游戏模式+系统)
2009/11/02 PHP
PHP常用字符串输出方法分析(echo,print,printf及sprintf)
2021/03/09 PHP
filemanage功能中用到的lib.js
2007/04/08 Javascript
IE的fireEvent方法概述及应用
2013/02/22 Javascript
javascript中的=等号个数问题两个跟三个有什么区别
2013/10/23 Javascript
淘宝网提供的国内NPM镜像简介和使用方法
2014/04/17 Javascript
JavaScript计算两个日期时间段内日期的方法
2015/03/16 Javascript
jQuery检测输入的字符串包含的中英文的数量
2015/04/17 Javascript
jQuery实现form表单元素序列化为json对象的方法
2015/12/09 Javascript
JS和jQuery通过this获取html标签中的属性值(实例代码)
2017/09/11 jQuery
React实践之Tree组件的使用方法
2017/09/30 Javascript
vue2.0 + ele的循环表单及验证字段方法
2018/09/18 Javascript
Vue项目中Api的组织和返回数据处理的操作
2019/11/04 Javascript
react中hook介绍以及使用教程
2020/12/11 Javascript
Vue仿百度搜索功能
2020/12/28 Vue.js
[57:55]EG vs Fnatic 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
一个计算身份证号码校验位的Python小程序
2014/08/15 Python
Python Tkinter简单布局实例教程
2014/09/03 Python
python将MongoDB里的ObjectId转换为时间戳的方法
2015/03/13 Python
Python实现读取TXT文件数据并存进内置数据库SQLite3的方法
2017/08/08 Python
python 获取指定文件夹下所有文件名称并写入列表的实例
2018/04/23 Python
基于PyQt4和PySide实现输入对话框效果
2019/02/27 Python
OpenCV图像颜色反转算法详解
2019/05/13 Python
Pandas之MultiIndex对象的示例详解
2019/06/25 Python
Python使用mongodb保存爬取豆瓣电影的数据过程解析
2019/08/14 Python
基于python实现雪花算法过程详解
2019/11/16 Python
tensorflow中tf.slice和tf.gather切片函数的使用
2020/01/19 Python
如何用Python编写一个电子考勤系统
2021/02/08 Python
用pip给python安装matplotlib库的详细教程
2021/02/24 Python
关于css中margin的值和垂直外边距重叠问题
2020/10/27 HTML / CSS
Marc Jacobs官方网站:美国奢侈品牌
2017/08/29 全球购物
初中新生军训方案
2014/05/13 职场文书
客房领班岗位职责
2015/02/11 职场文书
离婚案件答辩状
2015/05/22 职场文书
处罚决定书范文
2015/06/24 职场文书
新闻发布会新闻稿
2015/07/17 职场文书