
Приветствую вас дорогие мои читатели, а так же всех случайных посетителей моего блога, сегодня я хотел бы поделиться с вами способом стилизации файл-инпутов для горячо любимого всеми Twitter Bootstrap.
Я надеюсь на, то что вы знакомы с Twitter Bootstrap и знаете, что это за зверь и с чем его едят, поэтому приступлю сразу к делу.
Создание HTML разметки
На данном шаге все просто, для этого давайте создадим файл index.html с следующим содержимым:
<!DOCTYPE html>
<html>
<head>
<title>Twitter Bootstrap Input File</title>
<link href="/bootstrap/css/bootstrap.min.css" rel="stylesheet" type="text/css" />
<link href="/css/styles.css" rel="stylesheet" type="text/css">
</head>
<body>
<div class="container">
<div class="row-fluid">
<div class="control-group">
<label class="control-label">Picture:</label>
<div class="controls clearfix">
<span class="btn btn-success btn-file">
<i class="icon-plus"></i> <span>Choose picture...</span>
<input type="file" name="image" id="image" />
</span>
</div>
</div>
</div>
</div>
<script type="text/javascript" src="http://yandex.st/jquery/1.9.0/jquery.min.js"></script>
<script type="text/javascript" src="/bootstrap/js/bootstrap.min.js"></script>
</body>
</html>
Я хотел бы в вкратце пояснить, что и зачем я тут делаю. Особого внимание в данном коде заслуживает следующий код:
<span class="btn btn-success btn-file">
<i class="icon-plus"> </i><span>Choose picture...</span>
<input type="file" name="image" id="image" />
</span>
Специально для тех кто мало знаком с Twitter Bootstrap хотел бы выделить этот код, т.к. он является не стандартным и для Twitter Bootstrap и выступает в качестве обвязки над файл-инпутом с помощью которой мы далее будем производить его последующую стилизацию при помощи css.
Создание файла стилей
Давайте не будем тянуть кота за хвост и сразу посмотрим на код:
/** Layout **/
body{ padding-top: 50px; }
/** Styling input[type=file] **/
.btn-file { position: relative; overflow: hidden; margin-right: 4px; }
.btn-file input { position: absolute; top: 0; right: 0; margin: 0; opacity: 0; filter: alpha(opacity=0);
transform: translate(-300px, 0) scale(4); font-size: 23px; direction: ltr; cursor: pointer; }
/* Fix for IE 7: */
* + html .btn-file { padding: 2px 15px; margin: 1px 0 0 0; }
Как вы видите кода не так уж и много получилось, а так же то, что тут все достаточно просто и понятно. Не знаю как вы, а я бы на вашем месте уже нравное сгорал бы от любопытства увидеть то, что у нас получилось, поэтому давайте уже наверное просто взглянем на результат.
Ну собственно говоря цель достигнута, файл-инпут выглядит в стиле Twitter Bootstrap, но только не знаю как вам, а мне кажется, что данный вариант имеет один весьма серьезный недостаток! Мы не видим выбрали мы файл или нет, а так же то, что мы выбрали! К моему большому сожалению с помощью css мы исправить этот не достаток не сможем, но с помощью javascript это вполне возможно!
Улучшение с помощью javascript
Давайте вставим после подключения скриптов Twitter Bootstrap в файле HTML разметки следующий код:
<script type="text/javascript">
(function ($){
$(function (){
$('.btn-file').each(function (){
var self = this;
$('input[type=file]', this).change(function (){
// remove existing file info
$(self).next().remove();
// get value
var value = $(this).val();
// get file name
var fileName = value.substring(value.lastIndexOf('/')+1);
// get file extension
var fileExt = fileName.split('.').pop().toLowerCase();
// append file info
$('<span><i class="icon-file icon-' + fileExt + '"></i> ' + fileName + '</span>').insertAfter(self);
});
});
});
})(jQuery);
</script>
Код содержит подробные комментарии поэтому объяснять, что тут и как не имеет смыла, давайте просто еще раз взглянем на результат.
Ну вот собственно и все, теперь стилизованный файл-инпут в полной мере своим функционалом соответствует оригинальному и формлен в стиле Twitter Bootstrap.
Как убрать путь чтобы осталось только название?
Судя по всему вы используете Windows, поэтому в качестве разделителя путей у вас используется \ вместо /, поэтому нужно изменить способ получения имени файла в данный момент в статье используется:
var fileName = value.substring(value.lastIndexOf(‘/’)+1);
Как вариант можно сделать так:
var fileName = value.substring(value.lastIndexOf(‘\\’)+1);
Для windows, ну и поставить небольшой if для того, что бы определить как нужно разбивать строку, к примеру так:
var fileName = value.substring(value.lastIndexOf(value.indexOf(‘/’) == -1 ? ‘\\’ : ‘/’) + 1);
Как то так.
К сожалению, не работает в IE (11).
Возможно, ведь когда тестировался и выкладывался данный метод IE 11 еще не было.
Огромное спасибо!
Искал решение для стилизации у Вас нашел! Спасибо!
Вы не подскажете как реализовать программную часть? Те как оформить скрипт для отправки данных и файла на почту?
Здравствуйте, готового скрипта у меня нет, но могу подсказать смотрите в сторону использования библиотеки SwiftMailer с ее помощью накидать скрипт отправки файла на почту пяти минутное дело.
Лучше использовать регулярные выражения, а то в некоторых браузерах, например в IE9 добавляет путь «C:fakepath».
var reWin = /.*\(.*)/;
var reUnix = /.*/(.*)/;
var fileTitle = file.replace(reWin, «$1»);
fileTitle = fileTitle.replace(reUnix, «$1»);
rod.html(fileTitle);
Супер
var value = $(this).val();
возвращает только имя файла без его пути!
как получить путь?
вопрос касательно Android, проверено на MAC, результат тот же. Возвращается только имя файла вместо полного пути….
К сожадению я не знаю ответа и не имею ни MAC ни девайса с Android, что бы проверить. Думаю стоит воспользоваться Google, ответ на ваш вопрос скорее всего уже есть на stackoverflow.com или подобных ему ресурсах.
спасибо, пригодилось)
Большое спасибо, очень полезная статья!