当前位置: 首页 > 面试题库 >

文件上传按钮的跨浏览器自定义样式

林正平
2023-03-14
问题内容

我试图根据我的个人喜好设置文件上传按钮的样式,但是如果没有JS,我找不到任何真正可靠的方法来实现此目的。我确实找到了与此主题有关的另外两个问题,但是那里的答案要么涉及JavaScript,要么建议使用Quirksmode的方法

我使用Quirksmode方法的主要问题是文件按钮仍将具有浏览器定义的尺寸,因此它不会自动调整为位于其下方的按钮。我已经基于它编写了一些代码,但是它只会占用文件按钮通常会占用的空间,因此它根本不会像我想要的那样填满父div。

HTML:

<div class="myLabel">
    <input type="file"/>
    <span>My Label</span>
</div>

CSS:

.myLabel {
    position: relative;
}
.myLabel input {
    position: absolute;
    z-index: 2;
    opacity: 0;
    width: 100%;
    height: 100%;
}

演示了这种方法是多么有缺陷。在Chrome中,单击!!第二个演示按钮下方的按钮将始终打开文件对话框,但是在所有其他浏览器中,文件按钮也不会占用按钮的正确区域。

是否有更可靠的方式来设置文件上传按钮的样式,而不使用任何JavaScript,并且最好使用尽可能少的“
hacky”编码(因为hack通常会带来其他问题,例如小提琴中的问题)?


问题答案:

我发布这个是因为(令我惊讶)没有其他地方可以推荐这个。

有一种非常简单的方法来执行此操作,而不会限制您使用浏览器定义的输入尺寸。只需<label>在隐藏文件上传按钮周围使用标记即可。与通过webkit的内置样式1]允许的样式相比,这提供了更大的样式自由。

制作label标签的确切目的是将其上的所有单击事件定向到子输入[2],因此使用该标签,您将不再需要任何JavaScript即可将click事件定向到输入按钮。您将使用类似以下的内容:

label.myLabel input[type="file"] {

    position:absolute;

    top: -1000px;

}



/***** Example custom styling *****/

.myLabel {

    border: 2px solid #AAA;

    border-radius: 4px;

    padding: 2px 5px;

    margin: 2px;

    background: #DDD;

    display: inline-block;

}

.myLabel:hover {

    background: #CCC;

}

.myLabel:active {

    background: #CCF;

}

.myLabel :invalid + span {

    color: #A44;

}

.myLabel :valid + span {

    color: #4A4;

}


<label class="myLabel">

    <input type="file" required/>

    <span>My Label</span>

</label>

我使用了固定的位置来隐藏输入,以使其即使在较旧版本的Internet Explorer(模拟IE8-拒绝在a
visibility:hiddendisplay:none文件输入中使用)中也能正常工作。我已经在模拟IE7及更高版本中进行了测试,并且效果很好。

  1. 不幸的是,您不能使用<button>s内部<label>标签,因此您必须自己定义按钮的样式。对我来说,这是这种方法的唯一缺点。
  2. 如果for定义了属性,则其值将用于触发输入,其输入与上idfor属性相同<label>


 类似资料:
  • 本文向大家介绍跨浏览器拖放HTML文件上传?,包括了跨浏览器拖放HTML文件上传?的使用技巧和注意事项,需要的朋友参考一下 对于跨浏览器的HTML File Uploader,请使用FileDrop。它几乎可以在所有现代Web浏览器上使用。 根据官方规范- FileDrop是一个独立的跨浏览器,用于HTML5,旧版,AJAX,拖放,JavaScript文件上传

  • 问题内容: 您如何确定用户是否按下浏览器中的“后退”按钮? 您如何使用系统在单页Web应用程序内强制使用页内后退按钮? 到底为什么浏览器后退按钮不触发自己的事件!? 问题答案: (注意:根据Sharky的反馈,我提供了用于检测退格的代码) 因此,我经常在SO上看到这些问题,并且最近遇到了我自己控制后退按钮功能的问题。在为我的应用程序寻找最佳解决方案(带哈希导航的单页)几天后,我提出了一个简单的,跨

  • 问题内容: 我试图获取传递给JOptionPane的自定义按钮返回的值。但是,我通过的按钮根本不返回任何值。仅当按下退出按钮时,才返回-1的值。我需要这样做,因为我正在更改启用或禁用的按钮的属性。我假设我需要按钮以某种方式将某些信息返回给JOptionPane。任何想法? Nb这与我以前的问题有关-JOptionPane灰色输出一个按钮 我尝试像您说的那样设置按钮的值,但是它们从不返回OK或CAN

  • 本文向大家介绍如何自定义radio按钮的样式相关面试题,主要包含被问及如何自定义radio按钮的样式时的应答技巧和注意事项,需要的朋友参考一下 选择器 input[type=“radio”] 现在几乎不用原生的radio,一是原生样式改成设计稿的样子太浪费时间,二是不同浏览器对于原生radio的展示还不一样。 基于状态驱动的思想,用自定义按钮或其他元素来替代radio,很容易实现,也能保证浏览器兼

  • 本文向大家介绍Android自定义 WebView浏览器,包括了Android自定义 WebView浏览器的使用技巧和注意事项,需要的朋友参考一下 WebView是Android中一个非常实用的组件,它和Safai、Chrome一样都是基于Webkit网页渲染引擎,可以通过加载HTML数据的方式便捷地展现软件的界面。 在布局文件中添加<EditText/>和<Button/>控件, 在布局文件中添

  • 我正在开发一个客户端音乐播放器,并正在寻找一种方法来保存与mp3数据完整的播放列表。 localStorage localStorage的5mb限制排除了该选项。我想知道还有什么其他选项。 DataURIs我读过DataURIs,例如,在使用data:URI时,有没有办法指定建议的文件名?和跨浏览器另存为。txt,但不建议默认文件名,尤其是缺乏IE支持,这些都是破坏交易的因素。 IndexedDB