Rails 如何调整默认上传按钮的样式 (已解决)

levan · 2013年08月14日 · 最后由 runup 回复于 2018年02月11日 · 6700 次阅读

下面是三个按钮的代码,我需要的样式是第一个那样的,然后默认的样式是第二个,我尝试加入一样的 class,结果变成了第三个那样。 请问这该如何解决?那个默认的“选择文件”,没法去掉吗?

<a class="btn btn-info btn-block btn-large" href="#" title=""><i class="fa-icon-cloud-upload"></i>&nbsp;上传头像</a>

<%= f.file_field :avatar %>

<%= f.file_field :avatar, class:"btn btn-info btn-block btn-large" %>
<div id="uploadavatar">
    <div class="defaultupload">
        <%= f.file_field :avatar %>
    </div>
    <button class="btn btn-info btn-block btn-large" href="#" title=""><i class="fa-icon-cloud-upload"></i>&nbsp;上传头像</button>
</div>
#uploadavatar {
    position: relative;
}

#uploadavatar .defaultupload {
    opacity: 0;
    cursor: pointer;
    position: absolute;
    top: 0;
    z-index: 2;
}

#uploadavatar .defaultupload:hover {
    opacity: 0;
}

#uploadavatar button {
    position: relative;
    top: 0;
    z-index: 1;
}

.defaultupload select, input[type="file"] {
height: 45px;
line-height: 30px;
}

参考:http://stackoverflow.com/questions/7037154/customising-the-look-of-f-file-field-in-rails 试例:http://jsfiddle.net/JgDuh/ 通过 css 把框重叠,通过 z-index 参数确认分层,把默认的样式放前面,并隐藏。 缺点:原来按钮的 css“点击下压”的动画样式没了。。。

我是直接隐藏掉了原有的按钮,然后自己画一个按钮,通过处理自己画的按钮的点击事件,去触发隐藏了的按钮的点击事件。

  1. 放个自定义图片;
  2. 隐藏 upload 那个 input
  3. 点击自定义图片的时候,用 JS 调用 upload input 的 click 事件

Ruby China 的上传功能就是这么设计的

偷梁换柱之法

这种方法在 ie 下别的都好,当你保存的时候,结果就获取不到图片了,问题在 js 的 clilk 事件上(ie 安全性的考虑?),直接用 input 做的话,就需要调节大小,很麻烦,兼容性可以,但点击的范围个浏览器会有差别,支个招吧?!

@tdseed ,IE8 确实有问题

martin91 回复

按照这个思路,我这边通过函数触发了图片上传的动作,但是文件并没有上传,是否还需要其他操作?@huacnlee

@runup 你是怎么提交的?有没有发出网络请求?

martin91 回复

已经解决了,成功的代码和失败的代码分别如下:

#success
<script>
    $(document).ready(function(){
      var fileSelect = document.getElementById("button_trigger"),
          fileElem = document.getElementById("portrait_avatar");

      fileSelect.addEventListener("click", function (e) {
        if (fileElem) {
          fileElem.click();
        }
        e.preventDefault(); // prevent navigation to "#"
      }, false);
    });
  </script>

#error
<script>
  $(document).ready(function(){
    $("#button_trigger").click(function(){
      $("#portrait_avatar").trigger("click");
    });
  });
</script>

但是目前不知如何解决文件默认上传的提示,显示文件名称。是否可以帮忙?

martin91 回复

选择一张照片之后,默认的 file_field 中会提示照片名称已经被选择,如果自己进行自定义的话,如何写这个函数。 这是一个 modal,点击打开,一般默认是出现照片名称。如果要在点击打开这个函数中触发函数,如何写?如果获取 modal 中的结构?

12 楼 已删除
runup 回复

可以订阅控件的事件啊,参考 https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/file

我试验了一下,是可以的,可以查看下

martin91 回复

感激,问题解决了。请教,js 您这边是如何学习的?

需要 登录 后方可回复, 如果你还没有账号请 注册新账号